Getting started
The seller API is one door into the same marketplace the console uses. Anything you can do from Selling in your browser, your software can do with a key: put stock on the shelf, hear about orders the moment they are paid, accept and deliver them, talk to the buyer, and keep a sheet of a thousand lines in step with your own system in one call.
Two environments, two kinds of key
| Sandbox | Production | |
|---|---|---|
| Base URL | https://sandbox-api.freeport.gg/v1 | https://api.freeport.gg/v1 |
| Site | https://sandbox.freeport.gg | https://freeport.gg |
| Keys | fp_test_…, minted by any approved seller | fp_live_…, after an operator approves your application |
| Money | A fake payment provider; the synthetic buyer pays for you | Real |
A test key never works on production and a live key never works on the sandbox; the prefix is refused before any lookup, so pointing the wrong key at the wrong host fails immediately and safely.
Five minutes to the first webhook
- Register on the sandbox site, open Selling, then Integrations, and mint a key with the stock sync preset. Copy it: it is shown once.
- Prove it:
GET /v1/pingwithAuthorization: Bearer fp_test_…. The answer names your key, its scopes and its environment. - Read the catalog:
GET /v1/catalog/games, thenGET /v1/catalog/games/wow-classicfor the lanes, realms and packages. Keep the ids or the slugs, whichever your system prefers; every route accepts both. - Put stock up:
POST /v1/listingswith a game, category, server, price and quantity. Or land a whole sheet withPOST /v1/listings/batch. - Add a webhook endpoint from Integrations (or
POST /v1/webhooks) and subscribe toorder.paid. - Buy from yourself:
POST /v1/sandbox/orderswith one of your listing ids. The synthetic buyer pays through the real checkout and your endpoint receivesorder.paidby the production path. - Accept and deliver:
POST /v1/orders/{id}/accept, then/deliver. Confirm as the buyer withPOST /v1/sandbox/orders/{id}/confirmand watch the balance move.
Conventions everywhere. Money is a decimal string in the row's currency, never a float and never a count of cents. Ids are prefixed ULIDs. Times are ISO 8601 in UTC. Keys are snake_case. Every list is paged by an opaque cursor. Every error is { "error": { "code", "message", "requestId" } }.
Going live
Apply for live access from Integrations with a sentence about what your software does. An operator reads your account, not your promise, so a seller with a history is approved faster than a new one. Live keys need a second factor on the account, and are minted behind a fresh code. From then on the only difference between your sandbox integration and your live one is the host and the key.