Buy accounts
Charge your balance and get the accounts back in the same response.
/api/v1/cs2Buy CS2 accounts/api/v1/rustBuy Rust accounts/api/v1/extraBuy accounts for other games/cs2, /rust and /extra share one shape. Pass type and quantity as query parameters. POST and GET both work and read the same query string; a POST body is only read for extended_warranty.
curl -X POST "https://www.nfa.pub/api/v1/cs2?type=prime&quantity=1&result=json" \ -H "X-Api-Key: rsk_..." \ -H "Idempotency-Key: order-1001"{ "ok": true, "order_id": "4b53000e7b4677d2-c69a8e94132d75e8", "accounts": ["76561198168801886----eyAid..."], "count": 1, "charged_eur": 0.3, "cached": false}Keep order_id. /order, /replace, /orders and the webhooks all use it.
Parameters
| Parameter | Description |
|---|---|
typerequired | The product type, such as prime. Each endpoint sells its own; see Types below. |
quantity | Whole number from 1 to 100. Default 1. |
result | json for a JSON body. Anything else gives plain text, one account per line. |
Idempotency-Key | Header, up to 200 characters. A retry with the same key and parameters returns the first result (cached: true) instead of charging again. A longer key is ignored, so that call is not protected. Clients that cannot set headers can send idempotency_key on the query string; the header wins. |
extended_warranty | 1 or true adds the extended warranty: 12 hours of cover instead of 6 on every account in the order, for €0.30 per account, outside volume pricing. On the query string, or {"extended_warranty": true} in a POST JSON body (the query string wins). 0, false or absent: the normal warranty. Anything else is E1101, before anything is charged. |
preorder | 1 or true to pre-order when the product is sold out. See Pre-orders below. Only 1, true, 0 and false are accepted (any case); anything else is E1101. |
deliver_from | With preorder=1 only: the start of your delivery hours, HH:MM (24-hour). Send it with deliver_to and tz, or none of the three for any time. |
deliver_to | With preorder=1 only: the end of your delivery hours, HH:MM. At least 2 hours after the start; it may run past midnight (22:00 to 02:00). |
tz | With preorder=1 only: the time zone of your delivery hours, an IANA name such as Europe/Berlin or America/New_York. |
Types
| Endpoint | Types |
|---|---|
/cs2 | prime, premier, premier-4-medals, premier-10-medals, premier-inactive, premier-10k, premier-15k, premier-20k, premier-rare |
/rust | 1-99, 100-199, 200-499, 500-999, 1000-plus, inactive, premium-1-99, premium-100-199, premium-200-499, premium-500-999, premium-1000-plus, premium-inactive |
/extra | r6, dayz, bf6, wardogs-0-100, wardogs-100-201, wardogs-201-301, arc-0-100, arc-100-200, arc-200-plus, apex-0-100, apex-100-200, apex-200-plus, r6-100-201, r6-201-301, r6-ranked, dayz-100-plus, bf6-100-plus, arc-50-100, tarkov-0-100, tarkov-100-200, tarkov-200-plus, ark-0-100, ark-100-plus, ark-inactive, mw4-0-50, mw4-50-100, mw4-100-200, mw4-200-plus |
The Rust premium- types come with a Rust skin inventory worth $15 or more.
Charging
- You pay the
priceCentsthat/productsshows you, per account delivered. - Your balance is checked before anything is reserved, so a shortfall costs nothing (
E1401). - Only delivered accounts are charged. A short fill is refunded down to what shipped. If nothing can be delivered, the whole charge is reversed and you get an error, never a silent loss.
- With
extended_warranty=1the JSON answer also has"warranty_hours": 12and"warranty_extended": true, andcharged_eurincludes €0.30 for every account delivered. An account that is not delivered gets its €0.30 back with its price. - Send an
Idempotency-Keyon every buy, so a retry after a timeout never charges twice. The extended warranty and the delivery hours are part of the parameters: the same key with different ones isE1301, never a second charge. - Rate limited to 30 buys a minute per account: every key on the account shares the same 30, across all three endpoints. Separately, 120 requests a minute per IP address.
Pre-orders
Pre-orders are charged now, filled oldest-first when stock returns, only inside your delivery hours if you set them; cancel any time before it's filled for a full refund to your balance.
Add preorder=1. If the product is sold out, with nothing at all on the shelf, you get a pre-order instead of E1501. If there is stock, the flag changes nothing: you get your accounts, or E1501 with nothing charged if you asked for more than there is.
curl -X POST "https://www.nfa.pub/api/v1/cs2?type=prime&quantity=2&preorder=1&deliver_from=09:00&deliver_to=23:00&tz=Europe/Berlin&result=json" \ -H "X-Api-Key: rsk_..." \ -H "Idempotency-Key: order-1182"{ "ok": true, "order_id": "4b53000e7b4677d2-c69a8e94132d75e8", "state": "preorder", "preorder": true, "quantity": 2, "accounts": [], "count": 0, "charged_eur": 0.9, "deliveryWindow": { "from": "09:00", "to": "23:00", "timezone": "Europe/Berlin" }, "cached": false}stateispreorder,accountsis empty andcountis 0. Withoutresult=jsonthe body is the single wordpreorder, and the order id is in theX-Order-Idheader.charged_euris taken from your balance now, at exactly the price a normal buy would charge.deliveryWindowis your delivery hours, ornullfor any time. The warranty (6 hours, 12 withextended_warranty=1) starts at delivery, so hours keep a pre-order from landing while you sleep.- Your balance, your API protection limits and
Idempotency-Keywork exactly as for a normal buy. Read-only keys cannot place one (E1701). - At most 10 accounts and one product per pre-order (
E1505), and only while pre-orders are switched on (E1504). - How the queue fills them, partial fills and supplier outages are in the Pre-orders guide. Change the hours with
/preorder/hoursand cancel with/preorder/cancel.
Errors
| Code | HTTP | Meaning |
|---|---|---|
E1001 | 401 | The key is missing, malformed, revoked or unknown. |
E1002 | 429 | Too many requests. Wait for the minute to roll over and retry. See Rate limits. |
E1003 | 413 | The request body is over 4 KB. Only the buy endpoints answer this. |
E1101 | 400 | A required parameter is missing, or one is not valid (a bad limit, date or cursor on the list endpoints, for example). |
E1102 | 400 | The type is missing, or not one this endpoint sells. |
E1103 | 400 | Quantity must be a whole number from 1 to 100. |
E1104 | 400 | No product matches that id or type. |
E1105 | 400 | The delivery hours are not valid. Send a start and an end as HH:MM (24-hour), at least 2 hours apart and not the same time, and a real IANA time zone such as Europe/Berlin. Nothing was charged or changed. |
E1201 | 409 | The shop is closed for the moment. Try again later. |
E1202 | 409 | The product is misconfigured on our side. Contact support. |
E1301 | 409 | That Idempotency-Key was already used with different parameters. |
E1302 | 409 | A call with the same Idempotency-Key is still running. Retry shortly. |
E1401 | 402 | Your balance does not cover the purchase. Nothing was charged. Top up and retry. |
E1501 | 409 | Not enough stock, and nothing was charged. With preorder=1 it means there was some stock but less than you asked for, or, rarely, that the supplier had nothing after all. |
E1502 | 503 | Delivery failed and your balance was refunded. Retry. |
E1503 | 503 | Our supplier is briefly unavailable. Nothing was charged. Retry shortly. |
E1504 | 409 | The product is sold out and pre-orders are switched off right now. Nothing was charged. |
E1505 | 409 | The product is sold out and a pre-order can hold at most 10 accounts. Ask for fewer. Nothing was charged. |
E1506 | 503 | The supplier's account checks are down for this product. Nothing was charged. Retry after the Retry-After seconds, or send preorder=1 to queue it. |
E1612 | 403 | Purchases and replacements are blocked for this customer. |
E1701 | 403 | This key is read-only. It can look things up, but not buy, replace, change or cancel a pre-order, export logins with include=accounts or change webhooks. |
E1702 | 403 | The request came from an IP that is not on your allowlist. |
E1703 | 403 | You paused API purchases on your account. |
E1704 | 403 | That product is not on your allowed products list. |
E1705 | 400 | More accounts in one request than your maximum per request. |
E1706 | 403 | The order costs more than your per-order limit. |
E1707 | 429 | You reached your purchases-per-hour limit. |
E1708 | 403 | The order would go over your daily spending limit. It resets at 00:00 UTC. |
E1000 | 500 | Something went wrong on our side. Retry, and contact support if it keeps happening. |