---
title: "Get a product"
method: GET
path: "/v1/products/{id}"
tags: ["public", "products"]
---

# Get a product

`GET /v1/products/{id}`

## Request

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

Returns a retired product too, with retired=true, so a server ordered on it still shows its plan and price. The list omits retired products, and a retired product cannot be ordered.

## Path parameters

- `id` string, required

## Response `200`

OK

- 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
- `404`: unknown product

---

[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)
