CDK Bot Orders API
The Orders API from CDK Bot — 2 operation(s) for orders.
The Orders API from CDK Bot — 2 operation(s) for orders.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/cdk-bot:cdk-bot-orders-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: CDK Bot — Digital Products Orders API
version: 1.0.0
termsOfService: https://api.cdk.bot/terms
contact:
name: CDK Bot
email: info@cdk.bot
url: https://cdk.bot
description: 'Agent-native API for purchasing digital products (game keys, gift cards, and more) via USDC on Base chain.
## Quick Start
**One-shot (wallet-native agents):** `POST /purchase {"game_id":"..."}` with an `X-PAYMENT` header — a signed EIP-3009 "exact" authorization for the accepts[] returned in the 402 — and a facilitator settles it gaslessly, returning the key in one call (no tx_hash/quote_id).
**Two-step (any agent):**
1. **Browse**: `GET /games?q=battlefield` — search products, filter by platform/region/product_type
2. **Get price**: `POST /purchase {"game_id":"..."}` — returns 402 with exact USDC amount, wallet address, and standard x402 accepts[]
3. **Pay & get key**: Send USDC onchain, then `POST /purchase {"game_id":"...","tx_hash":"0x...","quote_id":"..."}` — returns product key
## Key facts
- All prices are in USD (USDC on Base chain)
- Only in-stock products are returned (in_stock: true)
- Payment address: `0x0b321A0F1294431347f98e10a2275F23B11BBfFb`
- No authentication required for browsing or purchasing
- Double-spend protection via unique tx_hash constraint
- Agent discovery: `GET /.well-known/agent.json`
- Liveness check: `GET /health`
## Sandbox Mode
Test the full purchase flow without spending real money:
1. Get free test USDC from Circle Faucet and Sepolia ETH from Alchemy Faucet
2. Add `"chain": "base-sepolia"` to your `POST /purchase` request
3. Pay with test USDC on Base Sepolia — receive a mock key (`SANDBOX-XXXXX-XXXXX-XXXXX`)
Same API, same URL, same flow — just add the chain parameter. See `GET /.well-known/agent.json` for full sandbox docs.'
x-guidance: 'CDK Bot sells game keys, gift cards, and digital products for AI agents. Flow: (1) GET /games?q=<query> to search the catalog. (2) POST /purchase {"game_id":"..."} to get an HTTP 402 with a price-locked USDC quote on Base. (3) Pay one-shot by retrying with an X-PAYMENT header (signed EIP-3009 authorization, gasless), or send USDC onchain and retry with tx_hash + quote_id. (4) The response contains the product key; poll GET /orders/{id} if delivery is pending. Sandbox: add "chain":"base-sepolia" to test without real money.'
servers:
- url: https://api.cdk.bot
tags:
- name: Orders
paths:
/orders/{id}:
get:
tags:
- Orders
summary: Get order status
description: Get order details. Provide wallet_address query param to retrieve the product key — without it, key_code is redacted. Pending orders are automatically checked for fulfillment.
parameters:
- schema:
type: string
required: true
name: id
in: path
- schema:
type: string
description: Buyer wallet address. Required to retrieve key_code.
required: false
description: Buyer wallet address. Required to retrieve key_code.
name: wallet_address
in: query
responses:
'200':
description: Order details
content:
application/json:
schema:
type: object
properties:
id:
type: string
description: Order ID (UUID)
example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
game_id:
type: string
description: Purchased game ID
wallet_address:
type: string
nullable: true
description: Buyer wallet address (from onchain tx)
tx_hash:
type: string
nullable: true
description: USDC payment transaction hash
key_code:
type: string
nullable: true
description: Game activation key. Null if order is pending fulfillment.
example: XXXXX-XXXXX-XXXXX
status:
type: string
enum:
- completed
- pending
- failed
- fulfillment_timeout
description: Order status
example: completed
retry_after:
type: number
description: Seconds to wait before polling GET /orders/{id} again. Only present when status is "pending".
example: 5
estimated_delivery:
type: number
description: Estimated seconds until key is delivered (P95). Only present when status is "pending".
example: 30
refund_id:
type: string
nullable: true
description: Refund claim ID. Present when a refund has been auto-created (for failed/timed-out orders) or manually submitted.
refund_status:
type: string
nullable: true
description: 'Refund lifecycle: "pending" (awaiting review), "approved" (USDC payout pending), "refunded" (USDC sent back), "denied". Present when refund_id exists.'
refund_tx_hash:
type: string
nullable: true
description: Onchain tx hash proving USDC was returned to buyer. Present when refund_status is "refunded".
refund_amount:
type: number
nullable: true
description: USD amount refunded via USDC. Present when refund_status is "refunded".
sandbox:
type: boolean
description: True if this is a sandbox/testnet order. Sandbox orders receive mock keys (SANDBOX-XXXXX-...) and do not trigger real supplier orders.
created_at:
type: number
description: Order timestamp (Unix ms)
required:
- id
- game_id
- wallet_address
- tx_hash
- key_code
- status
- created_at
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
error:
type: string
description: Machine-readable error code
example: not_found
message:
type: string
description: Human-readable error description
diagnosis:
type: object
properties:
code:
type: string
enum:
- tx_not_found
- tx_failed
- insufficient_confirmations
- wrong_contract
- wrong_recipient
- insufficient_amount
- no_transfer_logs
- no_erc20_logs
description: Machine-readable diagnosis code for payment verification failure
expected_chain:
type: string
description: Chain name we verified on
example: base
expected_chain_id:
type: number
description: Chain ID we verified on
example: 8453
expected_usdc_contract:
type: string
description: USDC contract address we looked for
example: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
expected_recipient:
type: string
description: Payment recipient address we looked for
example: '0x0b321A0F1294431347f98e10a2275F23B11BBfFb'
found:
type: object
properties:
contract:
type: string
description: Token contract found in tx (if different from expected)
recipient:
type: string
description: Recipient found in tx (if different from expected)
amount_usdc:
type: number
description: Amount transferred (if found)
description: What was actually found in the transaction
hint:
type: string
description: Actionable hint for the agent to fix the issue
required:
- code
- expected_chain
- expected_chain_id
- expected_usdc_contract
- expected_recipient
- hint
description: Structured payment diagnosis (only on 422 payment_verification_failed)
fields:
type: array
items:
type: object
properties:
path:
type: string
example: limit
message:
type: string
example: limit must be an integer between 1 and 100
code:
type: string
example: invalid_format
required:
- path
- message
- code
description: Per-field validation errors (only on 400 validation_error)
required:
- error
'404':
description: Not found
content:
application/json:
schema:
type: object
properties:
error:
type: string
description: Machine-readable error code
example: not_found
message:
type: string
description: Human-readable error description
diagnosis:
type: object
properties:
code:
type: string
enum:
- tx_not_found
- tx_failed
- insufficient_confirmations
- wrong_contract
- wrong_recipient
- insufficient_amount
- no_transfer_logs
- no_erc20_logs
description: Machine-readable diagnosis code for payment verification failure
expected_chain:
type: string
description: Chain name we verified on
example: base
expected_chain_id:
type: number
description: Chain ID we verified on
example: 8453
expected_usdc_contract:
type: string
description: USDC contract address we looked for
example: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
expected_recipient:
type: string
description: Payment recipient address we looked for
example: '0x0b321A0F1294431347f98e10a2275F23B11BBfFb'
found:
type: object
properties:
contract:
type: string
description: Token contract found in tx (if different from expected)
recipient:
type: string
description: Recipient found in tx (if different from expected)
amount_usdc:
type: number
description: Amount transferred (if found)
description: What was actually found in the transaction
hint:
type: string
description: Actionable hint for the agent to fix the issue
required:
- code
- expected_chain
- expected_chain_id
- expected_usdc_contract
- expected_recipient
- hint
description: Structured payment diagnosis (only on 422 payment_verification_failed)
fields:
type: array
items:
type: object
properties:
path:
type: string
example: limit
message:
type: string
example: limit must be an integer between 1 and 100
code:
type: string
example: invalid_format
required:
- path
- message
- code
description: Per-field validation errors (only on 400 validation_error)
required:
- error
security: []
operationId: getOrdersById
x-operation-id-source: derived
/orders/{id}/receipt:
get:
tags:
- Orders
summary: Get purchase receipt
description: Returns a structured receipt for a completed order. Requires wallet_address for authorization. Only available for completed orders.
parameters:
- schema:
type: string
required: true
name: id
in: path
- schema:
type: string
description: Buyer wallet address. Required — must match the order.
required: true
description: Buyer wallet address. Required — must match the order.
name: wallet_address
in: query
responses:
'200':
description: Purchase receipt
content:
application/json:
schema:
type: object
properties:
receipt_id:
type: string
description: Receipt identifier (= transaction hash)
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
receipt_date:
type: string
description: Purchase date (ISO 8601)
example: '2025-01-15T12:30:00.000Z'
seller:
type: object
properties:
name:
type: string
description: Seller legal name
example: CDK Bot
address:
type: string
description: Seller registered address
example: see /terms
email:
type: string
description: Seller contact email
example: info@cdk.bot
required:
- name
- address
- email
description: Seller details
buyer:
type: object
properties:
wallet_address:
type: string
description: Buyer wallet address (from onchain tx)
example: 0xabc123...
required:
- wallet_address
description: Buyer details
items:
type: array
items:
type: object
properties:
description:
type: string
description: Game title
example: Battlefield 2042 (PC) (Steam)
platform:
type: string
description: Digital storefront
example: Steam
quantity:
type: number
enum:
- 1
unit_price_usd:
type: number
description: Unit price in USD
example: 29.99
total_usd:
type: number
description: Line total in USD
example: 29.99
required:
- description
- platform
- quantity
- unit_price_usd
- total_usd
description: Purchased items
payment:
type: object
properties:
method:
type: string
enum:
- USDC on Base
tx_hash:
type: string
description: Onchain transaction hash
example: 0x1234...
chain:
type: string
enum:
- base
chain_id:
type: number
enum:
- 8453
required:
- method
- tx_hash
- chain
- chain_id
description: Payment details
total_usd:
type: number
description: Total amount in USD
example: 29.99
status:
type: string
enum:
- paid
required:
- receipt_id
- receipt_date
- seller
- buyer
- items
- payment
- total_usd
- status
description: Structured purchase receipt. The tx_hash is a verifiable onchain proof of payment on Base chain.
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
error:
type: string
description: Machine-readable error code
example: not_found
message:
type: string
description: Human-readable error description
diagnosis:
type: object
properties:
code:
type: string
enum:
- tx_not_found
- tx_failed
- insufficient_confirmations
- wrong_contract
- wrong_recipient
- insufficient_amount
- no_transfer_logs
- no_erc20_logs
description: Machine-readable diagnosis code for payment verification failure
expected_chain:
type: string
description: Chain name we verified on
example: base
expected_chain_id:
type: number
description: Chain ID we verified on
example: 8453
expected_usdc_contract:
type: string
description: USDC contract address we looked for
example: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
expected_recipient:
type: string
description: Payment recipient address we looked for
example: '0x0b321A0F1294431347f98e10a2275F23B11BBfFb'
found:
type: object
properties:
contract:
type: string
description: Token contract found in tx (if different from expected)
recipient:
type: string
description: Recipient found in tx (if different from expected)
amount_usdc:
type: number
description: Amount transferred (if found)
description: What was actually found in the transaction
hint:
type: string
description: Actionable hint for the agent to fix the issue
required:
- code
- expected_chain
- expected_chain_id
- expected_usdc_contract
- expected_recipient
- hint
description: Structured payment diagnosis (only on 422 payment_verification_failed)
fields:
type: array
items:
type: object
properties:
path:
type: string
example: limit
message:
type: string
example: limit must be an integer between 1 and 100
code:
type: string
example: invalid_format
required:
- path
- message
- code
description: Per-field validation errors (only on 400 validation_error)
required:
- error
'404':
description: Not found
content:
application/json:
schema:
type: object
properties:
error:
type: string
description: Machine-readable error code
example: not_found
message:
type: string
description: Human-readable error description
diagnosis:
type: object
properties:
code:
type: string
enum:
- tx_not_found
- tx_failed
- insufficient_confirmations
- wrong_contract
- wrong_recipient
- insufficient_amount
- no_transfer_logs
- no_erc20_logs
description: Machine-readable diagnosis code for payment verification failure
expected_chain:
type: string
description: Chain name we verified on
example: base
expected_chain_id:
type: number
description: Chain ID we verified on
example: 8453
expected_usdc_contract:
type: string
description: USDC contract address we looked for
example: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
expected_recipient:
type: string
description: Payment recipient address we looked for
example: '0x0b321A0F1294431347f98e10a2275F23B11BBfFb'
found:
type: object
properties:
contract:
type: string
description: Token contract found in tx (if different from expected)
recipient:
type: string
description: Recipient found in tx (if different from expected)
amount_usdc:
type: number
description: Amount transferred (if found)
description: What was actually found in the transaction
hint:
type: string
description: Actionable hint for the agent to fix the issue
required:
- code
- expected_chain
- expected_chain_id
- expected_usdc_contract
- expected_recipient
- hint
description: Structured payment diagnosis (only on 422 payment_verification_failed)
fields:
type: array
items:
type: object
properties:
path:
type: string
example: limit
message:
type: string
example: limit must be an integer between 1 and 100
code:
type: string
example: invalid_format
required:
- path
- message
- code
description: Per-field validation errors (only on 400 validation_error)
required:
- error
security: []
operationId: getOrdersByIdReceipt
x-operation-id-source: derived