Freeport Seller API

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

SandboxProduction
Base URLhttps://sandbox-api.freeport.gg/v1https://api.freeport.gg/v1
Sitehttps://sandbox.freeport.gghttps://freeport.gg
Keysfp_test_…, minted by any approved sellerfp_live_…, after an operator approves your application
MoneyA fake payment provider; the synthetic buyer pays for youReal

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

  1. Register on the sandbox site, open Selling, then Integrations, and mint a key with the stock sync preset. Copy it: it is shown once.
  2. Prove it: GET /v1/ping with Authorization: Bearer fp_test_…. The answer names your key, its scopes and its environment.
  3. Read the catalog: GET /v1/catalog/games, then GET /v1/catalog/games/wow-classic for the lanes, realms and packages. Keep the ids or the slugs, whichever your system prefers; every route accepts both.
  4. Put stock up: POST /v1/listings with a game, category, server, price and quantity. Or land a whole sheet with POST /v1/listings/batch.
  5. Add a webhook endpoint from Integrations (or POST /v1/webhooks) and subscribe to order.paid.
  6. Buy from yourself: POST /v1/sandbox/orders with one of your listing ids. The synthetic buyer pays through the real checkout and your endpoint receives order.paid by the production path.
  7. Accept and deliver: POST /v1/orders/{id}/accept, then /deliver. Confirm as the buyer with POST /v1/sandbox/orders/{id}/confirm and 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.