Get one order
/api/v1/orders/{order_id}orders:readRead the state and the result of one order. This is the source of truth for order state, so check here rather than relying on callbacks alone: a callback is a convenience that tells you when something changed, but if one never reaches you the real answer is still readable here. Three fields carry the whole answer: status = how far the order has got · charged = whether the wallet was actually charged · delivery = the goods, which appear once status is completed. The shape of delivery depends on the type of that order — cdkey/account1 return keys, account2 returns account credentials.
delivery has two shapes, and the type on the same order decides which
The shape of delivery is decided by the type field on the same order, not by the endpoint you called and not by the status — the two shapes have no field in common whatsoever: cdkey and account1 give you { keys: [{ serial }] }, while account2 gives you login · password · email · email_password · extra · Branch your parser on type and nothing else, never on the contents — branching the wrong way reads undefined across the board, which looks exactly like the goods not having arrived even though you paid and they did · The same rule applies to the object a webhook delivers, because it is this very object.
The authentication refusals reach this endpoint too
The five refusals at the authentication gate — invalid_key (401) · key_revoked (401) · insufficient_scope (403) · quota_exceeded (429) · too_many_inflight (429) — can happen on every endpoint, this one included, because they are thrown before the request reaches a single line of this endpoint's own logic (the scope it needs is the one declared at the top of this page). The response tabs above therefore list only what this endpoint itself answers; that is not a claim that those five cannot happen here. All of the detail lives in one place, on the identity endpoint page at /developers/access/me: the HTTP status of each one, which of them spend your daily quota, which headers come back, and why the two 429s need opposite handling. It is deliberately not copied onto every page, because the second copy is the one nobody remembers to update the day the rules change.
Request parameters
Path
| Name | Type | How to use it |
|---|---|---|
| order_idRequired | string | The order_id you were given when you placed the orderDetails and caveats
|
Header
| Name | Type | How to use it |
|---|---|---|
| AuthorizationRequired | string | Your key as Bearer <key> — required on every request. |
Response fields
| Name | Type | How to use it |
|---|---|---|
| order_id | string or null | The order id: ord_ followed by 24 hexadecimal charactersDetails and caveats
|
| status | string or null | Where the order stands: queued = accepted, waiting for us to buy it (account2 only)Details and caveats
|
| type | string or null | The type you ordered — this is what tells you which shape delivery takes, not the endpoint you called and not the status. |
| product_id | string or null | The product you ordered. |
| price | number or null | The agreed price in THB, equal to the expected_price you sent when ordering. |
| charged | object or null | { amount, currency }, what was actually taken from your wallet, and the only field that answers whether this order was paid for: null while the order carries no record of a charge, an object once it doesDetails and caveats
|
| delivery | object or null | The goods, present only while status is completed, in one of two shapes that share no field at all, chosen by the type of this same orderDetails and caveats
|
| error | object or null | Why it did not succeed. Details and caveats
|
| created_at | ISO 8601 string (UTC) or null | When the order was created. |
| updated_at | ISO 8601 string (UTC) or null | When the order was last modified. |
Possible statuses
| Status | Code | Meaning |
|---|---|---|
| 200 | — | queued — not its turn yet, read it again laterWe have not started buying this one Details and caveats
|
| 200 | — | failed — unsuccessful, and the order carries no record of a chargeRead the reason from error.codeDetails and caveats
|
| 200 | — | failed — unsuccessful, but charged holds a valueThis order and the one above carry the very same status while the money got different distances Details and caveats
|
| 200 | — | refunded — refunded, with charged left exactly as it wasA refund neither clears nor rewrites charged, so it still tells you what was taken; the thing that tells you an order was refunded is status being refundedDetails and caveats
|
| 200 | — | completed — delivered (the keys shape)type is cdkey or account1, so the goods are at delivery.keys[].serial, which is the value you pass straight on to your buyer. |
| 200 | — | completed — but delivery.keys is empty (not normal)An empty keys together with completed means the key has not been recorded on the order yetDetails and caveats
|
| 200 | — | completed — delivered (the account shape)type is account2, so the goods are the four credential fields, and those are what you hand to your buyerDetails and caveats
|
| 200 | — | completed — but the account details cannot be read (not normal)An order that is completed while its details are still incomplete keeps this same shapeDetails and caveats
|
| 400 | bad_request | No order_id in the URLThe order_id segment of the URL is empty, or holds only whitespace — put a real value in it and send the request again. |
| 404 | order_not_found | No such order Three cases reach this: a malformed order_id, an order that does not exist, or an order belonging to another resellerDetails and caveats
|