---
title: "List products"
method: GET
path: "/v1/products"
tags: ["public", "products"]
---

# List products

`GET /v1/products`

## Request

- Base URL: `https://api.vozora.io`
- URL: `https://api.vozora.io/v1/products`
- Auth: API key in header `Authorization`

## Response `200`

OK

- CatalogPublicProductList
  - `products` CatalogPublicProduct[]
    - `addons` CatalogPublicAddon[]
      - `id` string
      - `name` string
      - `price_delta_minor` integer
      - `slug` string
      - `stripe_price_id` string
    - `billing_interval` string
    - `billing_mode` string: BillingMode is "fixed" or "metered"; a metered product bills per running minute (MeteredPricing) instead of a fixed recurring PriceMinor.
    - `currency` string
    - `id` string
    - `kind` string: Kind is what the product delivers. Today always "vps". More kinds will be added, so this is deliberately not a closed enum: treat an unknown value as a product this client does not know how to present.
    - `metered_pricing` CatalogPublicMeteredPricing
      - `currency` string
      - `estimated_monthly_minor` integer
      - `rate_minor_per_minute_micros` integer
      - `stripe_meter_id` string
    - `name` string
    - `options` CatalogPublicOption[]
      - `id` string
      - `key` string
      - `kind` string
      - `label` string
      - `max` integer
      - `min` integer
      - `required` boolean
      - `step` integer
      - `values` CatalogPublicOptionValue[]
        - `id` string
        - `is_default` boolean
        - `label` string
        - `price_delta_minor` integer
        - `value` string
    - `price_minor` integer
    - `pricing_shape` string: PricingShape is how money moves. Current values: "metered" (no checkout, billed monthly in arrears per usage — billing_mode "metered"), "recurring" (a subscription billed each billing_interval — billing_mode "fixed") and "one_time" (one standalone invoice per order — not yet sold). Deliberately not a closed enum: clients must tolerate values added later. billing_mode is unchanged.
    - `retired` boolean: Retired is true for a plan no longer sold. Only the get-by-id read returns one (the list never does): a server ordered on it keeps running, and is still billed, at that plan's price. It cannot be ordered.
    - `slug` string
    - `spec_summary` CatalogPublicSpecSummary
      - `cpu_millicores` integer: Thousandths of a vCPU, unrounded. vcpu above is ceil(this / 1000); this is the figure a sub-vCPU plan is described and prorated by.
      - `disk_gb` integer: Disk for display. Named for gigabytes but the value is GIBIbytes. Do not compute with it — use disk_gib.
      - `disk_gib` integer: Disk in gibibytes, exact. Compare against an offering min_disk_gib directly: same unit, no rounding on either side.
      - `memory_mib` integer: RAM in mebibytes, exact. Compare against an offering min_memory_mib directly: same unit, no rounding on either side.
      - `ram_gb` integer: RAM for display, rounded UP. Named for gigabytes but the value is GIBIbytes. Do not compute with it — use memory_mib.
      - `vcpu` integer: vCPU, rounded UP. Safe to compute with: the VM is created with this many cores, billing charges for this many, and it is what an offering min_cpu is compared against at both the availability and the order gate.
    - `stripe_price_id` string
    - `tier_key` string: TierKey groups a tier's billing options: the hourly (metered), monthly and yearly products of one tier carry the same key, which is the metered product's slug. Omitted for a product that stands on its own; treat an absent key as a tier with no siblings.

## Other responses

- `401`: invalid or missing API key
- `403`: the key lacks catalog:read

---

[API](https://skmtc.dev/vozora/apis/vozora-api.md) · [All operations](https://skmtc.dev/vozora/apis/vozora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/vozora/apis/vozora-api/revisions/56f15734fc5a?raw)
