---
title: "Get one order"
method: GET
path: "/api/v1/commerce/orders/{id}"
tags: ["commerce"]
---

# Get one order

`GET /api/v1/commerce/orders/{id}`

## Request

- Base URL: `https://app.blueticked.com`
- URL: `https://app.blueticked.com/api/v1/commerce/orders/{id}`
- Auth: HTTP bearer

Fetch a single order in full: the re-fetch half of the webhook contract.

A malformed UUID answers 400 validation_failed before resource access; a well-formed unknown UUID or one outside your workspace answers 404.

`{id}` is the order's `id` (also the `order_id` on every commerce webhook payload).

`number` is the order's short number, sequential per business from 1001: the number its buyer and the dashboard see (#1043), and a search term for `GET /api/v1/commerce/orders?q=1043`. `reference` stays the payment reference and the key of the buyer's order page. `number` is `null` only for an order the numbering has not reached.

`payment` says how the order was paid: `provider` is `paystack`, `payfast` or `manual` (the shop marked it paid by hand in the dashboard, when the money came another way), and `method` is `cash`, `eft`, `card_machine` or `other` for a manual payment, `null` otherwise. Who marked it is never part of the API.

`fulfilment.tracking_reference` appears once a courier is booked; `fulfilment.note` flags a paid order that stock could not fully cover; `fulfilment.ready_for_collection_at` is when a collection order was marked ready for collection, `null` until then.

`failure_reason` says why an order was set aside, from a documented list that may grow: `link_not_delivered` means the order came from an automation's payment link whose message could not be delivered, so the customer never got the link (status `abandoned`). It is `null` otherwise, and once the order is paid.

`link_message_id` is the id of the message the order's payment link went out in (read it with `GET /api/v1/messages/{id}` for that message's own `failure_reason`); `null` for an order no payment link made.

`customer.sms_marketing_opt_in` is true when the buyer ticked "Send me reminders and offers by SMS" at a storefront checkout, with a cell number; it is false otherwise, and on orders placed before 16 Oct 2026, when the question was not asked. The yes is also recorded on the buyer's contact as an SMS opt-in (consent source `checkout`, naming the order), unless that number has opted out. An automation on commerce.order.abandoned sends its SMS only to a buyer who said yes, as a marketing message (it needs the opt-in and keeps to the SMS sending hours), and sends no WhatsApp; order updates need no yes.

`emails` says how each automatic order email went, by kind (`confirmation` and `sale_notification` when paid, `ready_for_collection` once a collection order is marked ready, `shipped`, `tracking`, `refunded`): `state` is `sent`, `retrying` (a send failed and it will be tried again), `failed` (it could not be sent after its last try) or `skipped`; `at` is when, `attempts` the sends tried so far, and `reason`: on a skip, one of `no_buyer_email`, `no_owner_email`, `no_tracking_reference` or `reserved_address`; on a failure, why its last try failed, one of `message_rejected` (the recipient address or the message was refused), `sender_not_allowed` (our sending setup was refused), `provider_rate_limited`, `provider_unavailable`, `send_error` (it failed on our side before an answer), `send_unconfirmed` (the email service never answered the last send, so it may have arrived: check with the buyer before sending it another way) or `provider_error` (any other answer); `null` otherwise (the lists may grow; anything else reads `null`). A kind appears once something was recorded for it. State only: no address or message content. On a webhook it is a snapshot at the moment of the event.

## Path parameters

- `id` string, required

## Response `200`

Success

- object
  - `ok` boolean, required
  - `order` object, required
    - `id` string, uuid, required
    - `reference` string, required
    - `number` number, nullable, required
    - `paystack_reference` string, nullable, required
    - `status` 'pending' | 'paid' | 'failed' | 'abandoned' | 'refunded', required
    - `amount_cents` number, required
    - `currency` string, required
    - `description` string, nullable, required
    - `customer` object, required
      - `name` string, nullable, required
      - `email` string, email, nullable, required
      - `phone` string, nullable, required
      - `sms_marketing_opt_in` boolean, required
    - `fulfilment` object, required
      - `method` string, nullable, required
      - `delivery_address` string, nullable, required
      - `delivery_zone` string, nullable, required
      - `delivery_fee_cents` number, required
      - `fulfilled_at` string, date-time, nullable, required
      - `ready_for_collection_at` string, date-time, nullable, required
      - `tracking_reference` string, nullable, required
      - `waybill_id` string, nullable, required
      - `note` string, nullable, required
    - `discount` object, nullable, required
      - `code` string, required
      - `amount_cents` number, required
    - `payment` object, required
      - `provider` 'paystack' | 'payfast' | 'manual', required
      - `method` 'cash' | 'eft' | 'card_machine' | 'other' | 'null', nullable, required
    - `items` object[], required
      - `id` string, uuid, required
      - `product_id` string, uuid, nullable, required
      - `variant_id` string, uuid, nullable, required
      - `variant_name` string, nullable, required
      - `name` string, required
      - `unit_price_cents` number, required
      - `quantity` number, required
    - `site_id` string, uuid, nullable, required
    - `paid_at` string, date-time, nullable, required
    - `refunded_at` string, date-time, nullable, required
    - `failure_reason` string, nullable, required
    - `link_message_id` string, nullable, required
    - `emails` object, required
      - `confirmation` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
      - `sale_notification` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
      - `ready_for_collection` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
      - `shipped` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
      - `tracking` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
      - `refunded` object
        - `state` 'sent' | 'retrying' | 'failed' | 'skipped', required
        - `at` string, date-time, required
        - `attempts` integer, required
        - `reason` 'no_buyer_email' | 'no_owner_email' | 'no_tracking_reference' | 'reserved_address' | 'message_rejected' | 'sender_not_allowed' | 'provider_rate_limited' | 'provider_unavailable' | 'send_error' | 'send_unconfirmed' | 'provider_error' | 'null', nullable, required
    - `created_at` string, date-time, required

## Other responses

- `400`: Validation failed
- `401`: Unauthorized: missing or invalid API key
- `402`: Insufficient wallet balance
- `403`: Forbidden: scope, plan limit, or suspension
- `404`: Not found
- `409`: Conflict (idempotency-key reuse or resource in use)
- `422`: Understood but refused: the request is well-formed, the action is not permitted for this resource
- `429`: Rate limited
- `500`: Internal error
- `502`: An upstream provider refused or failed the request
- `503`: Channel or send queue unavailable

---

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