---
title: "Get an order"
method: GET
path: "/v1/orders/{id}"
tags: ["public", "orders"]
---

# Get an order

`GET /v1/orders/{id}`

## Request

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

The poll target for an order placed through POST /v1/instances. Carries no Stripe id, checkout state, client secret or price line.

## Path parameters

- `id` string, required

## Response `200`

OK

- OrderingPublicOrder
  - `billing_mode` string
  - `checkout_id` string
  - `created_at` string
  - `deny_reason` string: DenyReason is the machine-readable reason an order was blocked or could not be delivered (cap_breached, release_fenced, fulfilment_failed, a moderation code, …) and is empty otherwise. A poller needs it: it is the difference between "still working" and "stopped, and here is why". Deliberately NOT an enum: the held path stores the moderation engine's own code, which is not a closed set this module owns. Publishing a closed list that the API can exceed would be a worse contract than publishing none.
  - `id` string
  - `installed_offering` OrderingInstalledOfferingResponse
    - `display_name` string
    - `icon_asset_digest` string
    - `kind` string
    - `legacy_slug` string: LegacySlug is the order's retained os_image provenance, verbatim, and is set only for Source "legacy". The same slug is already customer-visible on the instance spec, so it discloses nothing new.
    - `lifecycle_ownership` string
    - `offering_id` string
    - `public_version_label` string
    - `source` string: Source is "installed" or "legacy". It is always present so a client branches on a value rather than on which optional members happen to be set.
  - `instance_ids` string[]
  - `instances` OrderingPublicOrderInstance[]
    - `display_name` string
    - `id` string
    - `progress` object: Progress is the live provisioning-steps blob (percent/current/failed/steps). swaggertype keeps swag from choking on json.RawMessage.
    - `status` string
  - `items` OrderingPublicOrderItem[]: Items is the order's frozen price lines. Omitted when the order has none AND when the read fails: nothing on this response depends on them, and a lines read must not turn a working poll into a 500.
    - `component_key` string
    - `currency` string
    - `description` string
    - `quantity` integer
    - `unit` string
    - `unit_amount_minor` string: UnitAmountMinor is per UNIT and Unit says which: a metered line is a per-minute rate, a plan line a per-interval price. A decimal STRING because a metered rate is a fraction of a penny per minute.
  - `kind` string: Kind, PricingShape and Operation are ADR 0016 §4.1's generic columns, carried straight off the order row (BAN-1600 wrote them). Product taxonomy, not billing internals — a caller already knows what it ordered. CheckoutID is the cart submission this order came from (ADR 0016 §4.3), written by SubmitCart (BAN-1605). Null for an order placed directly, and rendered as an explicit null rather than omitted. Orders sharing a checkout_id were placed together; they are still paid, fulfilled, failed and refunded independently, so one submission may produce more than one card charge.
  - `operation` string
  - `pricing_shape` string
  - `status` 'pending_payment' | 'held' | 'blocked' | 'fulfilled' | 'failed' | 'paid_but_quota_blocked' | 'paid_but_release_fenced' | 'reconciling' | 'cancelled' | 'expired': Status is the order's lifecycle state. The enum is the set the code actually WRITES, pinned by TestPublicOrderStatusEnumsMatchTheDocumentedWriterList — not the wider set read-side switches accept and not the stale list in the column comment, which still names a 'paid' nothing has ever written (BAN-1314). fulfilled, failed, cancelled and expired are terminal. pending_payment is the only one that advances on its own — held, blocked and the two paid_but_* parks are non-terminal but need an operator, so a client should stop polling and surface them rather than wait for a change that needs a human.

## Other responses

- `401`: invalid or missing API key
- `403`: the key lacks orders:read
- `404`: no such order

---

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