List pre-owned accounts for sale
/api/v1/products/{product_id}/itemscatalog:readSee the individual pre-owned accounts genuinely on sale under one account2 product, so you can pick one before ordering. This endpoint is for account2 only: cdkey and account1 are ordered with product_id alone and have nothing to pick from. Think of an account2 product as a box holding many individual accounts, each with its own games, level and price. The routine is: pick one entry, then send that entry's item_id and that entry's price as expected_price when you create the order — never the price of the product it sits under.
Per-account prices are already discounted — never discount them again
Each entry's price is the number of baht this key pays, not the shop's shelf price, and discount_percent says how many percent already came off the shelf price. Taking your discount off it a second time produces a price the system will never accept, and then every order is refused on price with nothing to tell you why. The price of an account2 is only ever worked out per individual account: this type has a discount cap of its own, and that account's own price floor can lift the price further, which is why two accounts under the same product routinely report different discount_percent. The value to send as expected_price is the price of the account you picked from this list, not the price of the product, which is only the cheapest listing the shop knows of. Prices move all the time — fetch the list again immediately before ordering.
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 |
|---|---|---|
| product_idRequired | string | The id of the account2 product whose accounts you want to seeDetails and caveats
|
Header
| Name | Type | How to use it |
|---|---|---|
| AuthorizationRequired | string | Your key as Bearer <key>. Required on every request; there is no other way to authenticate. |
Response fields
| Name | Type | How to use it |
|---|---|---|
| items | array | The accounts genuinely on sale under that product Details and caveats
|
| items.item_id | string | The id of that account Details and caveats
|
| items.price | number | That account's price in baht, with the discount and that account's own price floor already applied Details and caveats
|
| items.discount_percent | number | The discount you actually got on that account, in percent Details and caveats
|
Possible statuses
| Status | Code | Meaning |
|---|---|---|
| 200 | — | Accounts are on sale — pick one Every entry always carries three fields Details and caveats
|
| 200 | — | Nothing is on sale right now — not an error An empty list is the normal answer for a product whose accounts have all just been bought Details and caveats
|
| 400 | unsupported_type | That product is not an account2, so it has nothing to listOnly call this endpoint on products whose type is account2 · cdkey and account1 have no individual accounts, because product_id alone is enough to order them. |
| 400 | bad_request | No product_id in the URLThe product_id segment of the URL is empty, or holds only whitespace (we always trim it before use) · Put a real value in it and send the request again. |
| 404 | product_not_found | No such product, or it has been delisted Drop this product from your own catalogue Details and caveats
|
| 502 | supplier_unavailable | We could not load the accounts right now — retry shortly Wait a moment and retry, and ⚠️ never take this as proof that the product has nothing for sale Details and caveats
|
| 503 | supplier_unavailable | We could not reach the source at all — retry shortly Handle it exactly like the 502: wait and retry rather than concluding the product is sold out Details and caveats
|