Replacements and warranty
Every order is covered for 6 hours from delivery. If an account stops working in that time, you swap it yourself with one API call. No ticket, no waiting for staff.
What is covered
An account that stops working inside the warranty. Before we swap it, we check it with the supplier. If it still works, it is not replaced and nothing is used up.
Not covered
These are not faults, so we never replace them:
- CS2 cooldowns. The account works, and the cooldown runs out on its own. Wait it out.
- VAC bans on CS2 and Rust accounts. Not covered at any point.
- Bans after delivery on CS2 and Rust accounts. Treated the same as a VAC ban.
On every other game a VAC ban or a cooldown does not affect play, so it is never held against the account.
Asking to replace one of these ends the warranty on that account for good. Every later request for it is refused with E1617, on the website too. The other accounts on the order keep their cover. Your account is also put in front of a person, and replacement requests get E1614 until they have looked.
How long it lasts
The clock starts when the order is delivered, not when it is paid. A pre-order is covered from the moment its stock arrives.
| Warranty | Cover | Price |
|---|---|---|
| Standard | 6 hours | Included |
| Extended | 12 hours | €0.30 per account |
To get 12 hours, add extended_warranty=1 to the buy. It covers every account in the order and is charged for each one, outside volume pricing. An account that is never delivered gets its €0.30 back.
curl -X POST \ "https://www.nfa.pub/api/v1/cs2?type=prime&quantity=5&extended_warranty=1" \ -H "X-Api-Key: rsk_..." \ -H "Idempotency-Key: order-1002"To see how long an order has left, call GET /order. It returns warranty_hours and warranty_ends_at.
Asking in time is what counts. If we have no replacement in stock, nothing is used up, and the time you had left is kept while the product is out of stock, for up to 14 days. Ask again once it restocks.
Three per order
- Each order gets three replacements in total, however many accounts are on it. Replacements made on the website count toward the same three.
- A replacement can be replaced. That uses another of the three.
- The same account is only replaced once.
- Only a real swap uses one. A working account or an empty shelf costs you nothing.
An order with one account, step by step:
| You report | What happens | Used |
|---|---|---|
| Account A | A is faulty. You get account B. | 1 of 3 |
| Account B | B is faulty too. You get account C. | 2 of 3 |
| Account C | Our check finds C working. E1610, nothing changes. | 2 of 3 |
Request a replacement
Send the order and the steam id of the faulty account to POST /replace. The new account comes back in the same response. Any full key can do this. Read-only keys cannot.
curl -X POST "https://www.nfa.pub/api/v1/replace?result=json" \ -H "X-Api-Key: rsk_..." \ -H "Content-Type: application/json" \ -d '{ "order": "4b53000e7b4677d2-c69a8e94132d75e8", "account": "76561199...", "reason": "cannot log in" }'| Field | Description |
|---|---|
orderrequired | The order_id from the buy. order_id and invoice also work. |
accountrequired | The steam id of the faulty account. steam_id also works. |
reason | Optional free text, kept with the request. |
result | Query parameter. json for a JSON body. Without it you get the new account line as plain text. |
order, account and reason also work as query parameters. Prefer a JSON body.
The response
{ "ok": true, "account": "76561199...----...", "replaced": "76561199...", "used": 1, "remaining": 2, "warranty_ends_at": "2026-10-25T20:31:04.472Z", "paused_ms": 0, "reason": "login_failed"}accountis the new account line, in the same format as a purchase.replacedis the steam id of that new account, not of the one you reported.usedandremainingcount this order's three replacements.warranty_ends_atis when the order's cover ends, in UTC.reasonis what our check found wrong. It is also in theX-Replace-Reasonheader, in both formats.
API protection
API protection is the set of limits you choose for your keys on your account page. Two of them apply to replacements:
- Read-only keys cannot replace. The request is refused with
E1701. - The IP allowlist. A request from an address that is not on it is refused with
E1702.
Pause, the spending limits, purchases per hour, max accounts per request and allowed products only apply to purchases. They never block a replacement. With alerts on, you get a Discord DM when a request is blocked.
Fair use
Replacements per account also have hourly, daily and weekly limits, which grow with what you buy, and a limit on the share of your purchases that gets replaced. Past them, your account is held for a person to review, and replacement requests get E1614 until they have looked.
Common errors
A refusal carries a stable code in the X-Error-Code header. With result=json the body has it too.
{ "ok": false, "code": "E1608", "error": "That order has used all of its replacements. Reference E1608."}| Code | HTTP | Meaning |
|---|---|---|
E1605 | 409 | The warranty on that order has run out. |
E1607 | 409 | That account was already replaced. Report the new one instead. |
E1608 | 409 | That order has used all of its replacements. |
E1609 | 409 | No replacement in stock. Nothing was used. Try again when it restocks. |
E1610 | 409 | Our check says the account works, so it was not replaced. Nothing was used. |
E1611 | 503 | The account check was inconclusive. Try again in a few minutes. |
E1614 | 409 | Held for review. A person has to look before more replacements go through. |
E1616 | 409 | A CS2 cooldown is not a fault and runs out on its own, so it is not replaced. |
E1617 | 409 | The warranty on that account ended with an earlier cooldown or ban claim. Other accounts on the order keep theirs. |
E1618 | 409 | A VAC ban, or a ban after delivery, is not covered, so the account is not replaced. |
E1621 | 409 | Another replacement on that order is still running. Retry in a few seconds. |
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. |
Every other code is in Error codes. Replacements are limited to 60 requests a minute per IP and 20 a minute per key.