Skip to content

CheapCord API

Buy any item in the shop, top up your balance and pick up gift links from your own code. The API is open to reseller accounts.

For reseller accounts

API keys only work on accounts with the Reseller tag. To apply, contact support with your CheapCord account email and a few words about where you sell. Once your account is tagged, you can create keys on your account page.

Apply through supportReseller? Log inBase URLhttps://api.cheapcord.com/v1

Getting started

1. Get the Reseller tag. The API is for reseller accounts, so contact support to apply and we add the tag to your account.

2. Log in and open your account. Under API keys, create a key and copy it. We only show it once.

3. Add balance on the same page. Purchases through the API are paid from your balance, so there is nothing to approve per order.

4. Send the key with every request in the Authorization header. Everything is JSON over HTTPS, and every amount is a string in US dollars, like "4.06".

Python
import requests

API = "https://api.cheapcord.com/v1"
KEY = "cc_live_..."  # Account > API keys

s = requests.Session()
s.headers["Authorization"] = f"Bearer {KEY}"

Authentication

Send your key as Authorization: Bearer cc_live_... (or in an X-API-Key header). Keys belong to your account: they see your orders and spend your balance, so keep them on your server and never put them in a website or app that other people can open.

You can have up to 10 keys. Revoke a key on the account page and it stops working right away. Keys also stop working if the account loses its Reseller tag.

Prices and resellers

Every price in the API is your price. Your reseller discount is already taken off price_usd, and list_price_usd shows the normal shop price.

Paying from your balance has no network fee. Questions about your discount? Message us on the Support page.

Orders and gift links

A purchase is paid the moment you create it. Then each item is bought for you and its gift link shows up in gifts[].gift_url, usually within a few minutes. Poll GET /orders/{ref} every 15 to 30 seconds until every gift is ready.

Order status: paid, then fulfilling, then delivered. needs_attention means one gift is taking longer and our team is on it. refunded means the money went back to your balance.

Gift status: queued, buying, ready (gift_url is set), delayed (we're delivering it by hand) or cancelled. Gift links are also emailed to you, and sent in Discord DMs if you connected Discord.

Errors and limits

Errors come back with a JSON body like {"detail": "Item not found."} and one of these status codes:

401
Missing or wrong API key
402
Your balance doesn't cover the order
403
The account isn't a reseller account (contact support to apply) or is disabled
404
Item or order not found
409
Item not for sale right now, or pick a style first
422
Something in the request is off (the detail says what)
429
Too many requests: wait for the seconds in Retry-After
502
The payment page couldn't be created (top-ups): try again

Limits: 120 requests a minute per key, 30 purchases a minute and 10 top-ups every 5 minutes. Each order holds up to 20 different items and up to 10 of each.

Endpoints

GET/me

Your account

Who the key belongs to, your balance and your reseller discount.

Example · Python
me = s.get(f"{API}/me").json()
print(me["balance_usd"], me["discount_pct"])
Response
{
  "id": 42,
  "email": "you@example.com",
  "balance_usd": "25.00",
  "reseller": true,
  "discount_pct": 10
}
GET/balance

Balance

Just your balance.

Example · Python
balance = s.get(f"{API}/balance").json()["balance_usd"]
Response
{ "balance_usd": "25.00" }
GET/transactions

Balance history

Every top-up, purchase and refund on your balance, newest first.

Parameters

limit
1 to 200, default 50
offset
Skip this many, for paging
Example · Python
for tx in s.get(f"{API}/transactions", params={"limit": 20}).json()["transactions"]:
    print(tx["created_at"], tx["kind"], tx["amount_usd"], tx["order_ref"])
Response
{
  "transactions": [
    {
      "amount_usd": "-4.06",
      "kind": "purchase",
      "order_ref": "CC-7K2M9QXA",
      "note": "",
      "created_at": "2026-10-24T10:12:03+00:00"
    }
  ]
}
GET/products

List items

Everything for sale right now, one entry per style, in the shop's order. Use the slug to buy.

Parameters

type
avatar_decoration, profile_effect, nameplate, profile_frame or bundle
q
Part of the item name
collection
A collection slug or name
limit
1 to 500, default 100
offset
Skip this many, for paging
Example · Python
r = s.get(f"{API}/products", params={"type": "avatar_decoration", "q": "bloodweb"})
for p in r.json()["products"]:
    print(p["slug"], p["name"], p["price_usd"])
Response
{
  "total": 1, "limit": 100, "offset": 0,
  "products": [
    {
      "slug": "bloodweb-avatar-decoration",
      "name": "Bloodweb",
      "type": "avatar_decoration",
      "variant": null,
      "collection": { "slug": "dead-by-daylight", "name": "Dead by Daylight" },
      "price_usd": "1.91",
      "list_price_usd": "2.12",
      "discord_price_usd": "8.99",
      "image": "https://cdn.discordapp.com/...",
      "url": "https://cheapcord.com/p/bloodweb-avatar-decoration"
    }
  ]
}
GET/products/{slug}

One item

The same fields as the list, for one slug.

Example · Python
item = s.get(f"{API}/products/bloodweb-avatar-decoration").json()
Response
{ "slug": "bloodweb-avatar-decoration", "price_usd": "1.91", ... }
POST/orders

Buy items

Pays from your balance and starts buying straight away. Send a client_ref (your own order id) so a retry never buys twice: the same client_ref returns the first order with "duplicate": true.

Request body

items
1 to 20 lines of {slug, quantity}. Quantity 1 to 10, default 1
client_ref
Optional. Your reference, up to 64 letters, digits and . _ : -
Example · Python
order = s.post(f"{API}/orders", json={
    "items": [{"slug": "bloodweb-avatar-decoration", "quantity": 2}],
    "client_ref": "my-order-1001",
}).json()
print(order["ref"], order["status"], order["total_usd"])
Response
{
  "ref": "CC-7K2M9QXA",
  "client_ref": "my-order-1001",
  "kind": "purchase",
  "status": "paid",
  "total_usd": "3.82",
  "items": [
    { "slug": "bloodweb-avatar-decoration", "name": "Bloodweb",
      "quantity": 2, "unit_price_usd": "1.91" }
  ],
  "gifts": [
    { "name": "Bloodweb", "status": "queued", "gift_url": null },
    { "name": "Bloodweb", "status": "queued", "gift_url": null }
  ],
  "duplicate": false,
  ...
}
GET/orders

List orders

Your purchases and top-ups, newest first, with gift links once they're ready.

Parameters

kind
purchase or topup
status
e.g. delivered
limit
1 to 100, default 25
offset
Skip this many, for paging
Example · Python
r = s.get(f"{API}/orders", params={"kind": "purchase", "limit": 10})
for o in r.json()["orders"]:
    print(o["ref"], o["status"], [g["gift_url"] for g in o["gifts"]])
Response
{ "orders": [ { "ref": "CC-7K2M9QXA", "status": "delivered", ... } ] }
GET/orders/{ref}

One order

Status and gift links for one order. Poll this after buying.

Example · Python
order = s.get(f"{API}/orders/CC-7K2M9QXA").json()
links = [g["gift_url"] for g in order["gifts"] if g["status"] == "ready"]
Response
{
  "ref": "CC-7K2M9QXA",
  "status": "delivered",
  "gifts": [
    { "name": "Bloodweb", "status": "ready", "gift_url": "https://discord.gift/..." },
    { "name": "Bloodweb", "status": "ready", "gift_url": "https://discord.gift/..." }
  ],
  ...
}
POST/topups

Top up

Creates a crypto payment for your balance and returns the link to its payment page. Open it, pick a coin, and the amount lands in your balance once the payment confirms. A flat 2% processing fee is added in the payment step, as on the site.

Request body

amount_usd
2 to 500
Example · Python
t = s.post(f"{API}/topups", json={"amount_usd": "50"}).json()
print("Pay here:", t["invoice_url"])
Response
{
  "ref": "CC-Q4T8ZP2M",
  "status": "awaiting_payment",
  "amount_usd": "50.00",
  "fee_usd": "0.00",
  "total_usd": "50.00",
  "invoice_url": "https://cheapcord.com/order/...",
  "order_url": "https://cheapcord.com/order/..."
}

Full example: buy and wait for the links

Buys one item, then checks every 20 seconds until every gift link is ready.

buy.py
import requests

API = "https://api.cheapcord.com/v1"
KEY = "cc_live_..."  # Account > API keys

s = requests.Session()
s.headers["Authorization"] = f"Bearer {KEY}"
import time


def buy(slug, quantity=1, client_ref=None):
    r = s.post(f"{API}/orders", json={
        "items": [{"slug": slug, "quantity": quantity}],
        "client_ref": client_ref,
    })
    if r.status_code == 402:
        raise SystemExit("Not enough balance. Top up first.")
    r.raise_for_status()
    return r.json()


def wait_for_links(ref, every=20, timeout=1800):
    end = time.time() + timeout
    while time.time() < end:
        order = s.get(f"{API}/orders/{ref}").json()
        if all(g["status"] in ("ready", "cancelled") for g in order["gifts"]):
            return [g["gift_url"] for g in order["gifts"] if g["gift_url"]]
        time.sleep(every)
    raise TimeoutError(f"{ref} is still in progress. Check it again later.")


order = buy("bloodweb-avatar-decoration", client_ref="my-order-1001")
print("Bought", order["ref"], "for", order["total_usd"])
for link in wait_for_links(order["ref"]):
    print(link)

Questions about the API or reseller pricing? Message us on the Support page.Support