Freeport Seller API

Freeport Seller API

Version 2026-09-09 · openapi.json

One API for every lane and every kind of seller software.

Send your key as Authorization: Bearer fp_live_…. Money is a decimal string in the row's currency, ids are prefixed ULIDs, times are ISO 8601 UTC. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 carries Retry-After. Errors are { "error": { "code", "message", "requestId" } }.

Conventions

Scopes

A key carries the scopes it was minted with. Every route names the one it needs; a key without it gets a 403 with the scope in the body.

  • catalog:read
  • listings:read
  • listings:write
  • orders:read
  • orders:write
  • chat:read
  • chat:write
  • account:read
  • account:write
  • webhooks:manage

Rate limits

Per key, per minute, sliding. New sellers get the base budget, standard sellers twice it, trusted sellers three times. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 carries Retry-After.

BucketBase per minute
reads600
writes120
bulk20
chat30

Idempotency

Send Idempotency-Key on any write you might retry. The same key with the same request replays the first answer for a day with Idempotent-Replayed: true; the same key with a different request is refused with idempotency_key_reused.

Errors

Every refusal is { "error": { "code", "message", "requestId" } }. The code is stable and worth switching on; the message is for a person; the request id is what to quote to support.

Meta

The document, and the key looking at it.

GET /v1/openapi.json

This document

No key needed.

Responses

StatusMeaningBody
200The OpenAPI document

GET /v1/ping

Is this key alive, what can it do, where are its limits

Any key. Spends the reads budget (600 a minute for a new seller).

bucket reads

Responses

StatusMeaningBody
200The key, the seller and the budgetsPing
401RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Account

The seller behind the key.

GET /v1/me/balance

Your balance

Summed from the ledger, never stored: what is spendable now, and what is still held while orders complete and the payout hold runs.

Scope account:read. Spends the reads budget (600 a minute for a new seller).

scope account:readbucket reads

Responses

StatusMeaningBody
200The balanceBalance
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/fees/quote

What an order would cost

Priced by the same resolver as checkout. The seller side is exact; the buyer side leaves out the first-order waiver, since which buyer is unknown. A tool pricing across marketplaces wants this before it lists, not after the first sale.

Any key. Spends the reads budget (600 a minute for a new seller).

bucket reads

Query

NameTypeRequiredNotes
categorycurrency · item · account · service · topup · giftcardyes
subtotalstringyes
currencystring
gamestring

Responses

StatusMeaningBody
200The quoteFeeQuote
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/me

The seller behind the key

Scope account:read. Spends the reads budget (600 a minute for a new seller).

scope account:readbucket reads

Responses

StatusMeaningBody
200The sellerMe
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

PATCH /v1/me

Holiday mode on or off

Holiday mode hides every listing at once: the switch a farm flips when the deliverers go home.

Scope account:write. Spends the writes budget (120 a minute for a new seller).

scope account:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
holiday_modeboolean
presenceonline · offline

Responses

StatusMeaningBody
200The seller, after the changeMe
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

Catalog

Games, lanes, realms and packages, by id and slug.

GET /v1/catalog/games

Every active game

Any key. Spends the reads budget (600 a minute for a new seller).

bucket readsETag

Responses

StatusMeaningBody
200Games, most popular firstobject
304Unchanged since the ETag you sent
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/catalog/games/{slug}

One game: lanes, realms with faction, packages, vocabulary

Any key. Spends the reads budget (600 a minute for a new seller).

bucket readsETag

Responses

StatusMeaningBody
200The gameGameDetail
304Unchanged
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/catalog/resolve

Your names to our ids

Ranks games, categories and servers against the names you keep. A named faction is decisive on a realm. Never creates anything.

Any key. Spends the reads budget (600 a minute for a new seller).

bucket reads

Body

FieldTypeRequiredNotes
gamestringyes
categorystring
serverstring
factionstring

Responses

StatusMeaningBody
200Up to five candidates each, best firstResolution
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/catalog/changes

Games, lanes, realms and packages added or renamed since a moment

Any key. Spends the reads budget (600 a minute for a new seller).

bucket reads

Query

NameTypeRequiredNotes
sincestring (date-time)yes
limitinteger

Responses

StatusMeaningBody
200Oldest firstCatalogChanges
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

Listings

Your stock on the shelf.

GET /v1/listings

Your listings

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Query

NameTypeRequiredNotes
statusdraft · active · paused · removed
gamestring
external_idstring
cursorstring
limitinteger

Responses

StatusMeaningBody
200Newest change firstobject
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/listings

Create a listing

Game, category, server and package by our id or our slug. The title is generated when absent.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
gamestringyes
categorystringyes
serverstring
packagestring
titlestring
tiersarray of object
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes
descriptionstring
pricestringyes
currencystring
unit_labelstring
price_per_qtyinteger
min_qtyinteger
max_qtyinteger
stock_qtyinteger
low_stock_alert_qtyinteger
delivery_eta_minutesinteger
attributesmap of string
external_idstring
statusdraft · active

Responses

StatusMeaningBody
201CreatedListing
400RefusedError
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PUT /v1/listings/by-external-id/{externalId}

Create or update by your own id for the line

Creates on first sight, updates after. A listing never moves to another game, category, server or package: that is a new external id.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
gamestringyes
categorystringyes
serverstring
packagestring
titlestring
tiersarray of object
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes
descriptionstring
pricestringyes
currencystring
unit_labelstring
price_per_qtyinteger
min_qtyinteger
max_qtyinteger
stock_qtyinteger
low_stock_alert_qtyinteger
delivery_eta_minutesinteger
attributesmap of string
external_idstring
statusdraft · active

Responses

StatusMeaningBody
200UpdatedListing
201CreatedListing
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/listings/{id}

One listing

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Responses

StatusMeaningBody
200The listingListing
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PATCH /v1/listings/{id}

Change price, stock, status or anything else

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
titlestring
tiersarray of object
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes
descriptionstring
pricestring
currencystring
unit_labelstring
price_per_qtyinteger
min_qtyinteger
max_qtyinteger
stock_qtyinteger
low_stock_alert_qtyinteger
delivery_eta_minutesinteger
attributesmap of string
external_idstring
statusdraft · active · paused · removed

Responses

StatusMeaningBody
200The listing, after the changeListing
401No key, or a key that is not live hereError
404RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PUT /v1/listings/{id}/tiers

Replace the volume ladder

Up to three rungs, each starting above the one before and cheaper than it; the listing's own price is the price at its minimum order. Checkout picks the rung an order's quantity reaches and freezes that unit price on the order. An empty list clears the ladder.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
tiersarray of objectyes
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes

Responses

StatusMeaningBody
200The listing, with its ladderListing
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/listings/{id}/codes

The code vault, counted

How many codes a gift-card or top-up listing holds, by state. Never the codes themselves.

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Responses

StatusMeaningBody
200CountsCodeVault
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/listings/{id}/codes

Stock codes

Up to a thousand a call, encrypted at rest. A code already in the vault is a duplicate and not stocked twice; one withdrawn earlier comes back. Stock rises by what was added. From then on an order on this listing is accepted and delivered the moment it is paid, with the codes attached for the buyer; a vault short of the order quantity leaves that order for you to deliver by hand.

Scope listings:write. Spends the bulk budget (20 a minute for a new seller).

scope listings:writebucket bulkidempotency key

Body

FieldTypeRequiredNotes
codesarray of stringyes

Responses

StatusMeaningBody
200What landedCodeVaultAdded
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/listings/{id}/codes/withdraw

Take unsold codes off the shelf

The codes named, or every unsold one when none are. Stock falls by the same count.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writes

Body

FieldTypeRequiredNotes
codesarray of string

Responses

StatusMeaningBody
200What leftCodeVaultWithdrawn
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Orders

The order feed and the three moves a seller makes.

GET /v1/orders

Your orders, or everything that moved since a moment

Without updated_since: newest change first. With it: a feed, oldest first, that you walk forward with the cursor.

Scope orders:read. Spends the reads budget (600 a minute for a new seller).

scope orders:readbucket reads

Query

NameTypeRequiredNotes
statepaid · accepted · delivering · delivered · completed · disputed · refunded · partially_refunded · cancelled · expired
updated_sincestring (date-time)
cursorstring
limitinteger

Responses

StatusMeaningBody
200A page of ordersobject
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/orders/changes

Has anything moved

Send back the ETag as If-None-Match. A 304 costs no database work, so poll at the pace in Poll-Interval with a clear conscience.

Scope orders:read. Spends the reads budget (600 a minute for a new seller).

scope orders:readbucket readsETag

Responses

StatusMeaningBody
200Something movedOrderChanges
304Nothing moved
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/orders/{id}

One order

Scope orders:read. Spends the reads budget (600 a minute for a new seller).

scope orders:readbucket reads

Responses

StatusMeaningBody
200The orderOrder
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/orders/{id}/events

The order's timeline

Scope orders:read. Spends the reads budget (600 a minute for a new seller).

scope orders:readbucket reads

Responses

StatusMeaningBody
200Oldest firstobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/orders/{id}/accept

Take the order

Starts the delivery window from the listing's quoted time.

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writesidempotency key

Responses

StatusMeaningBody
200AcceptedOrder
401No key, or a key that is not live hereError
403RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/orders/{id}/deliver

Mark delivered

Refused with credentials_required on an account order without a handover.

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writesidempotency key

Responses

StatusMeaningBody
200Delivered; the buyer's confirmation window has startedOrder
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/orders/{id}/decline

Decline a paid order

The buyer is refunded in full.

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writesidempotency key

Responses

StatusMeaningBody
200RefundedOrder
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/orders/{id}/credentials

The account handover

Stored encrypted, readable by the buyer of this order alone. Never put a password in the chat.

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
account_usernamestringyes
account_passwordstringyes
email_usernamestring
email_passwordstring
notestring

Responses

StatusMeaningBody
200StoredOrder
401No key, or a key that is not live hereError
404RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Chat

The thread with the buyer.

GET /v1/orders/{id}/messages

The thread with the buyer

Scope chat:read. Spends the reads budget (600 a minute for a new seller).

scope chat:readbucket reads

Responses

StatusMeaningBody
200Oldest firstobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/orders/{id}/messages

Send a message

The same contact detection as the site. Warnings come back to you; the message still goes.

Scope chat:write. Spends the chat budget (30 a minute for a new seller).

scope chat:writebucket chatidempotency key

Body

FieldTypeRequiredNotes
bodystringyes

Responses

StatusMeaningBody
201SentMessagePosted
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Boosting

Your price curves on the services the platform standardises.

GET /v1/boost-templates

The services a game standardises

Every boost template for one game, with the knobs a curve prices: a range or number option takes a per-unit rate, a choice option takes basis points per value, a flags option takes basis points per extra you offer. offer_id is your curve on it, if you have one.

Any key. Spends the reads budget (600 a minute for a new seller).

bucket reads

Query

NameTypeRequiredNotes
gamestringyes

Responses

StatusMeaningBody
200In the hub orderobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/boost-offers

Your curves

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Responses

StatusMeaningBody
200Every curve, across gamesobject
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

PUT /v1/boost-offers/{template}

Publish or replace your curve on a template

One curve per template: a second call replaces it and sets it active. Every rate must name an option the template defines. The cheapest configuration the curve prices is the "from" price on the hub and must be above zero. Prices are decimal USD.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
pricingobjectyes
fields
FieldTypeRequiredNotes
basestringyes
per_unitmap of string
choice_bpsmap of map of integer
flag_bpsmap of integer
min_totalstring
eta_hoursintegeryes

Responses

StatusMeaningBody
200The offerBoostOffer
400RefusedError
401No key, or a key that is not live hereError
403RefusedError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PATCH /v1/boost-offers/{id}

Pause or resume a curve

Pausing is always allowed. Resuming is starting to sell again, which a suspended account cannot do.

Scope listings:write. Spends the writes budget (120 a minute for a new seller).

scope listings:writebucket writes

Body

FieldTypeRequiredNotes
statusactive · pausedyes

Responses

StatusMeaningBody
200The offerBoostOffer
401No key, or a key that is not live hereError
403RefusedError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Stock syncs

A whole sheet of stock, landed as one decision.

POST /v1/listings/batch

Up to a thousand lines in one call

The sync engine in merge mode, opened, staged and committed for you. Answers at once with a result per line for the staging; poll the sync for the result per line of the apply.

Scope listings:write. Spends the bulk budget (20 a minute for a new seller).

scope listings:writebucket bulk

Body

FieldTypeRequiredNotes
linesarray of objectyes
fields
FieldTypeRequiredNotes
gamestringyes
categorystringyes
serverstring
packagestring
titlestring
tiersarray of object
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes
descriptionstring
pricestringyes
currencystring
unit_labelstring
price_per_qtyinteger
min_qtyinteger
max_qtyinteger
stock_qtyinteger
low_stock_alert_qtyinteger
delivery_eta_minutesinteger
attributesmap of string
external_idstringyes
statusdraft · active · paused

Responses

StatusMeaningBody
202Staged and committed; the worker applies itStaged
400RefusedError
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/stock/syncs

Your last fifty syncs

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Responses

StatusMeaningBody
200Newest firstobject
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/stock/syncs

Open a sync

Replace mode pauses every listing with an external id the sync does not mention; merge mode touches only the lines sent. An open sync expires after an hour.

Scope listings:write. Spends the bulk budget (20 a minute for a new seller).

scope listings:writebucket bulk

Body

FieldTypeRequiredNotes
modereplace · merge

Responses

StatusMeaningBody
201OpenStockSync
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/stock/syncs/{id}

One sync, with its summary once committed

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Responses

StatusMeaningBody
200The syncStockSync
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PUT /v1/stock/syncs/{id}/lines

Stage up to a thousand lines

Each line is validated on its own and its game, category, server and package resolved; a bad line is reported here and counted as failed at commit, and the rest go on. The same external id staged again keeps the later line.

Scope listings:write. Spends the bulk budget (20 a minute for a new seller).

scope listings:writebucket bulk

Body

FieldTypeRequiredNotes
linesarray of objectyes
fields
FieldTypeRequiredNotes
gamestringyes
categorystringyes
serverstring
packagestring
titlestring
tiersarray of object
fields
FieldTypeRequiredNotes
min_qtyintegeryes
pricestringyes
descriptionstring
pricestringyes
currencystring
unit_labelstring
price_per_qtyinteger
min_qtyinteger
max_qtyinteger
stock_qtyinteger
low_stock_alert_qtyinteger
delivery_eta_minutesinteger
attributesmap of string
external_idstringyes
statusdraft · active · paused

Responses

StatusMeaningBody
200A result per lineStaged
400RefusedError
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/stock/syncs/{id}/lines

The lines, with the result each got

Scope listings:read. Spends the reads budget (600 a minute for a new seller).

scope listings:readbucket reads

Query

NameTypeRequiredNotes
actioncreated · updated · unchanged · paused · failed
cursorstring
limitinteger

Responses

StatusMeaningBody
200In staging orderobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/stock/syncs/{id}/commit

Apply the sync

Returns at once; the worker applies it in short transactions, recounts your catalog pages once, and stamps a result on every line.

Scope listings:write. Spends the bulk budget (20 a minute for a new seller).

scope listings:writebucket bulk

Responses

StatusMeaningBody
202CommittingStockSync
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Webhooks

Where events go, signed, retried, logged.

GET /v1/webhooks

Your endpoints

Scope webhooks:manage. Spends the reads budget (600 a minute for a new seller).

scope webhooks:managebucket reads

Responses

StatusMeaningBody
200Every endpoint, never a secretobject
401No key, or a key that is not live hereError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/webhooks

Add an endpoint

HTTPS only, to a public address. Up to five per account. An empty events list subscribes to everything. The secret is in this one response and nowhere else.

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writesidempotency key

Body

FieldTypeRequiredNotes
urlstringyes
eventsarray of string
labelstring

Responses

StatusMeaningBody
201Created, with the secretWebhookWithSecret
400RefusedError
401No key, or a key that is not live hereError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/webhooks/{id}

One endpoint

Scope webhooks:manage. Spends the reads budget (600 a minute for a new seller).

scope webhooks:managebucket reads

Responses

StatusMeaningBody
200The endpointWebhook
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

PATCH /v1/webhooks/{id}

Change the URL, the events, the label, or re-enable it

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writesidempotency key

Body

FieldTypeRequiredNotes
urlstring
eventsarray of string
labelstring
statusactive · disabled

Responses

StatusMeaningBody
200The endpoint, after the changeWebhook
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

DELETE /v1/webhooks/{id}

Remove an endpoint and its delivery log

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writes

Responses

StatusMeaningBody
204Gone
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/webhooks/{id}/test

Send a ping through the real pipeline

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writes

Responses

StatusMeaningBody
202Queued; it arrives within a few seconds and shows in the delivery logQueued
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/webhooks/{id}/rotate-secret

New secret, with a day of overlap

Deliveries carry two signatures for 24 hours, one with each secret, so the receiver can be switched over without a gap.

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writesidempotency key

Responses

StatusMeaningBody
200The endpoint, with the new secretWebhookWithSecret
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

GET /v1/webhooks/{id}/deliveries

The delivery log

Scope webhooks:manage. Spends the reads budget (600 a minute for a new seller).

scope webhooks:managebucket reads

Query

NameTypeRequiredNotes
statuspending · succeeded · failed · exhausted
cursorstring
limitinteger

Responses

StatusMeaningBody
200Newest firstobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/webhooks/{id}/deliveries/{deliveryId}/replay

Send a delivery again, now

Scope webhooks:manage. Spends the writes budget (120 a minute for a new seller).

scope webhooks:managebucket writes

Responses

StatusMeaningBody
200Queued as a fresh attemptDelivery
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Sandbox

The synthetic buyer, on the sandbox only.

POST /v1/sandbox/orders

Buy from yourself

The synthetic buyer places and pays for an order on one of your listings through the real checkout, so order.paid reaches your endpoint by the production path. Then accept and deliver it as you would any order, and drive the buyer from the routes below. Sandbox only.

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writesidempotency keysandbox only

Body

FieldTypeRequiredNotes
listing_idstringyes
quantityintegeryes
character_namestring

Responses

StatusMeaningBody
201The order, paidOrder
400RefusedError
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/sandbox/orders/{id}/confirm

The buyer confirms delivery

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writessandbox only

Responses

StatusMeaningBody
200The order, completedOrder
401No key, or a key that is not live hereError
404RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/sandbox/orders/{id}/cancel

The buyer cancels before you accept

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writessandbox only

Responses

StatusMeaningBody
200The order, refundedOrder
401No key, or a key that is not live hereError
404RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/sandbox/orders/{id}/dispute

The buyer opens a dispute

Scope orders:write. Spends the writes budget (120 a minute for a new seller).

scope orders:writebucket writessandbox only

Body

FieldTypeRequiredNotes
reason_codenot_delivered · partially_delivered · wrong_item · recalled · other
detailstring

Responses

StatusMeaningBody
200The order, disputedOrder
401No key, or a key that is not live hereError
404RefusedError
409RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

POST /v1/sandbox/reset

Wipe your slate

Listings off the shelf, syncs and deliveries gone, the outbox cleared. Keys and endpoints stay; orders stay, because the ledger under them is append-only.

Scope account:write. Spends the bulk budget (20 a minute for a new seller).

scope account:writebucket bulksandbox only

Responses

StatusMeaningBody
200What wentobject
401No key, or a key that is not live hereError
404RefusedError
429The budget for the minute is spent; wait for Retry-AfterError

Schemas

Error

FieldTypeRequiredNotes
errorobjectyes
fields
FieldTypeRequiredNotes
codestringyesStable, snake_case. What a client branches on.
messagestringyes
requestIdstringyesQuote this when asking for help.
detailsanyField-level detail where there is any.

Ping

FieldTypeRequiredNotes
okbooleanyes
environmentlive · testyes
server_timestring (date-time)yes
keyobjectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
labelstringyes
scopesarray of catalog:read · listings:read · listings:write · orders:read · orders:write · chat:read · chat:write · account:read · account:write · webhooks:manageyes
ip_allowlistarray of stringyes
expires_atstring or nullyes
created_atstring (date-time)yes
sellerobjectyes
fields
FieldTypeRequiredNotes
handlestringyes
tiernew · standard · trustedyes
trading_statusstringyes
holiday_modebooleanyes
limitsobjectyes
fields
FieldTypeRequiredNotes
reads_per_minuteintegeryes
writes_per_minuteintegeryes
bulk_per_minuteintegeryes
chat_per_minuteintegeryes

Me

FieldTypeRequiredNotes
idstringyesA prefixed ULID
handlestringyes
display_namestring or nullyes
tiernew · standard · trustedyes
trading_statusstringyes`active`, or `suspended`: reads keep working, writes that start something are refused.
holiday_modebooleanyes
presenceonline · away · offlineyes
payout_hold_daysintegeryes
qualifying_ordersintegeryes

Balance

FieldTypeRequiredNotes
currencystringyes
availablestringyesA decimal string in the row's currency. Never a float.
pendingstringyesA decimal string in the row's currency. Never a float.
payout_hold_daysintegeryes

FeeQuote

FieldTypeRequiredNotes
currencystringyes
categorystringyes
subtotalstringyesA decimal string in the row's currency. Never a float.
buyer_feestringyesA decimal string in the row's currency. Never a float.
buyer_totalstringyesA decimal string in the row's currency. Never a float.
seller_feestringyesA decimal string in the row's currency. Never a float.
seller_fee_bpsintegeryes
reservestringyesA decimal string in the row's currency. Never a float.
seller_netstringyesA decimal string in the row's currency. Never a float.

Game

FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
platformstring or nullyes
updated_atstring (date-time)yes

GameDetail

FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
platformstring or nullyes
updated_atstring (date-time)yes
categoriesarray of objectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
kindcurrency · item · account · service · topup · giftcardyes
vocabularyarray of objectyes
fields
FieldTypeRequiredNotes
keystringyes
labelstringyes
optionsarray of stringyes
packagesarray of objectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
labelstringyes
amountinteger or nullyes
unitstring or nullyes
regionstring or nullyes
popularbooleanyes
serversarray of objectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
regionstring or nullyes
factionstring or nullyes
attributesmap of stringyes

Candidate

FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
scorenumberyes

Resolution

FieldTypeRequiredNotes
gamearray of Candidateyes
categoryarray of Candidateyes
serverarray of Candidateyes

Tier

FieldTypeRequiredNotes
min_qtyintegeryesFrom this order quantity up, in units.
pricestringyesA decimal string in the row's currency. Never a float.

CatalogChanges

FieldTypeRequiredNotes
changesarray of objectyes
fields
FieldTypeRequiredNotes
typegame · category · server · packageyes
actioncreated · updatedyes
idstringyesA prefixed ULID
slugstringyes
namestringyes
game_idstring or nullyesA prefixed ULID
updated_atstring (date-time)yes
next_sincestring or nullyes

Listing

FieldTypeRequiredNotes
idstringyesA prefixed ULID
external_idstring or nullyes
statusdraft · active · paused · removedyes
taken_downbooleanyes
gameobjectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
categoryobjectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
kindstringyes
serverobject or nullyes
packageobject or nullyes
pathstringyesThe catalog page the listing appears on.
titlestringyes
descriptionstring or nullyes
pricestringyesA decimal string in the row's currency. Never a float.
tiersarray of Tieryes
currencystringyes
price_per_qtyintegeryesHow many units the price buys, for example 1000 gold.
unit_labelstringyes
min_qtyintegeryes
max_qtyinteger or nullyes
stock_qtyintegeryes
low_stock_alert_qtyinteger or nullyes
delivery_eta_minutesintegeryes
attributesmap of stringyes
created_atstring (date-time)yes
updated_atstring (date-time)yes

Order

FieldTypeRequiredNotes
idstringyesA prefixed ULID
statedraft · payment_pending · paid · accepted · delivering · delivered · disputed · completed · cancelled · expired · refunded · partially_refundedyes
state_updated_atstring (date-time)yes
created_atstring (date-time)yes
listingobject or nullyes
boostobject or nullyes
gameobject or nullyes
serverobject or nullyes
category_kindstring or nullyes
quantityintegeryes
unit_labelstring or nullyes
price_per_qtyintegeryes
unit_pricestringyesA decimal string in the row's currency. Never a float.
subtotalstringyesA decimal string in the row's currency. Never a float.
buyer_feestringyesA decimal string in the row's currency. Never a float.
seller_feestringyesA decimal string in the row's currency. Never a float.
totalstringyesA decimal string in the row's currency. Never a float.
currencystringyes
buyerobjectyes
fields
FieldTypeRequiredNotes
handlestring or nullyes
character_namestring or nullyes
deadlinesobjectyes
fields
FieldTypeRequiredNotes
accept_bystring or nullyes
deliver_bystring or nullyes
auto_confirm_atstring or nullyes
fee_schedule_idsobjectyes
fields
FieldTypeRequiredNotes
buyerstring or nullyesA prefixed ULID
sellerstring or nullyesA prefixed ULID

OrderEvent

FieldTypeRequiredNotes
idstringyesA prefixed ULID
seqintegeryesStrictly increasing per order; the number a webhook consumer keys on.
typestringyes
from_statestring or nullyes
to_statestring or nullyes
actoruser · admin · systemyes
created_atstring (date-time)yes

OrderChanges

FieldTypeRequiredNotes
changedbooleanyes
countsmap of anyyes

Message

FieldTypeRequiredNotes
idstringyesA prefixed ULID
bodystring or nullyes
imagestring or nullyes
authorobjectyes
fields
FieldTypeRequiredNotes
roleseller · buyer · systemyes
handlestring or nullyes
created_atstring (date-time)yes

MessagePosted

FieldTypeRequiredNotes
idstringyesA prefixed ULID
created_atstring (date-time)yes
warningsarray of stringyes

Webhook

FieldTypeRequiredNotes
idstringyesA prefixed ULID
urlstring (uri)yes
labelstring or nullyes
eventsarray of order.paid · order.accepted · order.delivering · order.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.message · listing.low_stock · listing.sold_out · listing.taken_down · listing.reinstated · account.trading_status_changed · pingyes
statusactive · disabledyes
disabled_reasonstring or nullyes
failing_sincestring or nullyes
previous_secret_untilstring or nullyesWhile set, deliveries carry a second signature made with the secret before the last rotation.
created_atstring (date-time)yes
updated_atstring (date-time)yes

WebhookWithSecret

FieldTypeRequiredNotes
secretstringyesShown once. Verify every delivery with it.
idstringyesA prefixed ULID
urlstring (uri)yes
labelstring or nullyes
eventsarray of order.paid · order.accepted · order.delivering · order.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.message · listing.low_stock · listing.sold_out · listing.taken_down · listing.reinstated · account.trading_status_changed · pingyes
statusactive · disabledyes
disabled_reasonstring or nullyes
failing_sincestring or nullyes
previous_secret_untilstring or nullyes
created_atstring (date-time)yes
updated_atstring (date-time)yes

Delivery

FieldTypeRequiredNotes
idstringyesA prefixed ULID
event_idstringyesA prefixed ULID
event_typeorder.paid · order.accepted · order.delivering · order.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.message · listing.low_stock · listing.sold_out · listing.taken_down · listing.reinstated · account.trading_status_changed · pingyes
statuspending · succeeded · failed · exhaustedyes
attemptsintegeryes
next_attempt_atstring or nullyes
last_attempt_atstring or nullyes
response_statusinteger or nullyes
response_snippetstring or nullyesThe first kilobyte of what your server answered.
last_errorstring or nullyes
duration_msinteger or nullyes
created_atstring (date-time)yes

Queued

FieldTypeRequiredNotes
queuedbooleanyes

CodeVault

FieldTypeRequiredNotes
availableintegeryesUnsold, on the shelf. Also the listing stock the vault maintains.
deliveredintegeryes
withdrawnintegeryes

CodeVaultAdded

FieldTypeRequiredNotes
addedintegeryes
duplicatesintegeryes
availableintegeryes
deliveredintegeryes
withdrawnintegeryes

CodeVaultWithdrawn

FieldTypeRequiredNotes
removedintegeryes
availableintegeryes
deliveredintegeryes
withdrawnintegeryes

BoostOption

FieldTypeRequiredNotes
keystringyes
labelstringyes
typerange · number · choice · flagsyes
mininteger
maxinteger
unitstring
choicesarray of object
fields
FieldTypeRequiredNotes
valuestringyes
labelstringyes
flagsarray of object
fields
FieldTypeRequiredNotes
valuestringyes
labelstringyes

BoostTemplate

FieldTypeRequiredNotes
idstringyesA prefixed ULID
slugstringyes
namestringyes
categoryobjectyes
fields
FieldTypeRequiredNotes
slugstringyes
namestringyes
optionsarray of BoostOptionyes
offer_idstring or nullyesA prefixed ULID

BoostPricing

FieldTypeRequiredNotes
basestringyesA decimal string in the row's currency. Never a float.
per_unitmap of stringyesA rate per unit, keyed by a range or number option.
choice_bpsmap of map of integeryesBasis points per chosen value, keyed by a choice option then its value.
flag_bpsmap of integeryesBasis points per extra offered. An extra missing here is not for sale.
min_totalstring or nullyesA decimal string in the row's currency. Never a float.

BoostOffer

FieldTypeRequiredNotes
idstringyesA prefixed ULID
statusactive · pausedyes
templateobjectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
namestringyes
categorystringyes
gameobjectyes
fields
FieldTypeRequiredNotes
slugstringyes
namestringyes
pricingBoostPricingyes
currencystringyes
eta_hoursintegeryes
from_pricestringyesA decimal string in the row's currency. Never a float.

StockSync

FieldTypeRequiredNotes
idstringyesA prefixed ULID
modereplace · mergeyes
statusopen · committing · committed · expired · failedyes
line_countintegeryes
summaryobject or nullyes
errorstring or nullyes
expires_atstring (date-time)yesAn open sync not committed by then expires.
committed_atstring or nullyes
created_atstring (date-time)yes
updated_atstring (date-time)yes

StagingResult

FieldTypeRequiredNotes
external_idstring or nullyes
statusstaged · invalidyes
errorobject
fields
FieldTypeRequiredNotes
codestringyes
messagestringyes

Staged

FieldTypeRequiredNotes
syncStockSyncyes
stagedintegeryes
invalidintegeryes
resultsarray of StagingResultyes

SyncLine

FieldTypeRequiredNotes
idstringyesA prefixed ULID
external_idstringyes
listing_idstring or nullyesA prefixed ULID
actionstring or nullyes
errorobject or nullyes
linemap of anyyesThe line as staged.

WebhookEvent

FieldTypeRequiredNotes
idstringyesA prefixed ULID
typeorder.paid · order.accepted · order.delivering · order.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.message · listing.low_stock · listing.sold_out · listing.taken_down · listing.reinstated · account.trading_status_changed · pingyes
created_atstring (date-time)yes
api_versionstringyes
datamap of anyyesFor order.* the order as GET /v1/orders/{id} returns it under `order`; for listing.* the listing under `listing`; for order.message the message under `message`.