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
  • disputes:read
  • disputes: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
currencyUSD
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

Send since for the first page, then the cursor it returns until it is null: the cursor continues the walk exactly, through rows that share one moment. next_since is a moment a later walk can start from without missing a row: it never points inside a group of rows sharing one moment, so that walk may repeat a few rows and cannot skip any.

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

bucket reads

Query

NameTypeRequiredNotes
sincestring (date-time)
cursorstring
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
currencyUSD
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
currencyUSD
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
currencyUSD
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
404RefusedError
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
404RefusedError
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
404RefusedError
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

POST /v1/orders/{id}/messages/image

Send a screenshot

Proof of delivery at the moment it happens, which is what most disputes turn on. One PNG, JPEG or WebP of 3 MB or less, as multipart/form-data in a part named file. The bytes decide the type, never the filename or the declared content type, and every image is re-encoded before it is stored. It carries no Idempotency-Key: a repeat is a second picture in the thread. Video goes on a dispute statement as a link.

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

scope chat:writebucket chat

Responses

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

GET /v1/orders/{id}/messages/image/{file}

Read one image from the thread

The bytes of an image a message carries, by the image name on that message: yours or the buyer’s. Only on an order you sold, and only a name that belongs to that order’s thread.

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

scope chat:readbucket reads

Responses

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

Disputes

A dispute, answered and settled from your own software. Alone you can only give up your own side: refund in full. Anything between takes both of you.

GET /v1/disputes

The disputes on your orders

Newest first. state=open is the queue to work: each row says who has to answer, by when, whether they have, and the offer on the table.

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

scope disputes:readbucket reads

Query

NameTypeRequiredNotes
stateopen · resolved · withdrawn
cursorstring
limitinteger

Responses

StatusMeaningBody
200A page of disputesobject
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}/dispute

One order's dispute

Both statements, every offer and how it ended. 404 no_dispute when the order never had one.

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

scope disputes:readbucket reads

Responses

StatusMeaningBody
200The disputeDispute
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}/dispute/quote

What a settlement would do

The split for a figure, from the same arithmetic that posts it if the figure is agreed. Refused with not_a_settlement at nothing and at the whole total: those two are the buyer releasing the payment and you refunding in full.

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

scope disputes:readbucket reads

Query

NameTypeRequiredNotes
buyer_refundstringyes

Responses

StatusMeaningBody
200The splitSettlementQuote
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/orders/{id}/dispute/statements

Put your side on the record

What happened and when, for the buyer and for the person who decides if you two cannot. Added, never edited or removed; up to ten. links carries up to three https addresses of evidence held elsewhere, which is where video goes: YouTube, Streamable, Medal, Twitch, Vimeo, Imgur, Gyazo, Lightshot, Steam, Google Drive, Dropbox, OneDrive or iCloud. Anywhere else is refused with 400 invalid_evidence_link. Screenshots can also go in the order chat. Answering inside respond_by is what keeps "did not answer" off your side of the record.

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

scope disputes:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
bodystringyes
linksarray of string

Responses

StatusMeaningBody
201The dispute, with your statementDispute
400RefusedError
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/orders/{id}/dispute/concede

Refund the buyer in full

Always yours to do, because the only money it moves is money you were claiming. The whole total goes back to the buyer, you keep nothing from the order, the stock returns to the listing, and it is recorded as your concession rather than as a dispute decided against you. It cannot be undone. order.dispute_resolved and order.refunded follow.

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

scope disputes:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
notestring

Responses

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

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

Propose a settlement

A figure that goes back to the buyer; you keep the rest, less fees. It replaces any offer standing, from either side, and moves no money until the buyer accepts that same figure. Five offers a side. While it stands the buyer can accept it at any moment, so offer what you mean.

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

scope disputes:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
buyer_refundstringyes
notestring

Responses

StatusMeaningBody
201The dispute, with your offer standingDispute
400RefusedError
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/orders/{id}/dispute/offers/{offerId}/accept

Accept the buyer's offer

Send the buyer_refund you are agreeing to. If the offer on the table is no longer that one (replaced, withdrawn, a different figure) the answer is 409 offer_changed and nothing moves: read the dispute again. On success the money moves at once and cannot be undone.

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

scope disputes:writebucket writesidempotency key

Body

FieldTypeRequiredNotes
buyer_refundstringyes

Responses

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

POST /v1/orders/{id}/dispute/offers/{offerId}/decline

Decline the buyer's offer

The dispute stays open, and a person decides it if nothing else is agreed.

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

scope disputes:writebucket writesidempotency key

Responses

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

POST /v1/orders/{id}/dispute/offers/{offerId}/withdraw

Take your offer back

Only while it stands. An offer the buyer already accepted has moved the money.

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

scope disputes:writebucket writesidempotency key

Responses

StatusMeaningBody
200The dispute, the offer withdrawnDispute
401No key, or a key that is not live hereError
403RefusedError
404RefusedError
409RefusedError
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
bandsmap of map of string
ratesmap of map of string
rate_bandsmap of map of map of string
choice_bpsmap of map of integer
choice_pricesmap of map of string
flag_bpsmap of integer
flag_pricesmap of string
laddermap of map of string
not_offeredmap of array of string
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
currencyUSD
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
currencyUSD
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/orders/{id}/dispute/statements

The buyer puts their side on the record

The buyer's half of a dispute lives at your own dispute routes with /sandbox in front, so you can rehearse all of one: order.dispute_updated reaches your endpoint by the production path. Sandbox only.

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

scope disputes:writebucket writessandbox only

Body

FieldTypeRequiredNotes
bodystringyes
linksarray of string

Responses

StatusMeaningBody
201The dispute, as you then read itDispute
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/offers

The buyer proposes a settlement

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

scope disputes:writebucket writessandbox only

Body

FieldTypeRequiredNotes
buyer_refundstringyes
notestring

Responses

StatusMeaningBody
201The dispute, the buyer's offer standingDispute
400RefusedError
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/offers/{offerId}/accept

The buyer accepts your offer

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

scope disputes:writebucket writessandbox only

Body

FieldTypeRequiredNotes
buyer_refundstringyes

Responses

StatusMeaningBody
200The dispute, settledDispute
400RefusedError
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/offers/{offerId}/decline

The buyer declines your offer

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

scope disputes:writebucket writessandbox only

Responses

StatusMeaningBody
200The dispute, your offer declinedDispute
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/offers/{offerId}/withdraw

The buyer takes their offer back

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

scope disputes:writebucket writessandbox only

Responses

StatusMeaningBody
200The dispute, the buyer's offer withdrawnDispute
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/release

The buyer drops the dispute and releases the payment

The one move that is only ever the buyer's: you are paid as if they had confirmed the delivery. order.dispute_resolved and order.completed follow.

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

scope disputes:writebucket writessandbox only

Responses

StatusMeaningBody
200The dispute, closed in your favourDispute
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 · disputes:read · disputes: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
rankskiff · sloop · brigantine · frigate · galleon · flagshipyes
rank_levelintegeryes1 to 6, lowest first. The rank this month’s sales hold, and what a sale costs.
month_salesstringyesA decimal string in the row's currency. Never a float.
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_bpsintegeryesThe rate charged at the key owner’s rank.
seller_rankskiff · sloop · brigantine · frigate · galleon · flagshipyes
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 objectyesThe attributes listings in this lane are described by, each with the values it takes. A currency lane in a game with delivery methods lists them under deliveryMethods; that one is required on a listing there and takes one or more of its options joined with ", ".
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
next_cursorstring 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
statepaid · accepted · delivering · delivered · disputed · completed · cancelled · expired · refunded · partially_refundedyes
state_updated_atstring (date-time)yes
last_event_seqinteger or nullyesThe newest event's seq, so a poller can tell whether the webhooks it holds are behind the order it is looking at.
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
delivery_methodsarray or nullyesHow the seller offered to hand the currency over, copied from the listing at checkout. The buyer picks one in the order chat. Null when the listing is not currency or its game has no method list.
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, in one series across every order on the platform rather than per order, so gaps between one order's events are normal; the number a consumer orders by.
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

DisputeOffer

FieldTypeRequiredNotes
idstringyesA prefixed ULID
bybuyer · selleryes
buyer_refundstringyesWhat goes back to the buyer. The seller keeps the rest of the order total, less fees.
notestring or nullyes
stateopen · accepted · declined · withdrawn · superseded · voidyes
created_atstring (date-time)yes
decided_atstring or nullyes

Dispute

FieldTypeRequiredNotes
idstringyesA prefixed ULID
order_idstringyesA prefixed ULID
stateopen · resolved · withdrawnyes
reason_codestringyes
detailstring or nullyesWhat the person who opened it wrote.
opened_bybuyer · selleryes
opened_atstring (date-time)yes
respondentbuyer · selleryes
respond_bystring or nullyesWhen the respondent's time to answer ends. A dispute nobody answered says so on the record the person deciding it reads.
answeredbooleanyesWhether the respondent has said anything or put a figure down. Derived from the record on every read.
resolutionstring or nullyes
decided_viastring or nullyesHow it ended: a person at Freeport decided, the seller refunded in full, the buyer released the payment, or the two sides agreed a settlement.
resolution_notestring or nullyesThe reason given with the decision.
buyer_refundstring or nullyesWhat went back to the buyer when the dispute ended: the whole total, nothing, or the share a split or settlement returned. Null while it is open.
resolved_atstring or nullyes
currencystringyes
totalstringyesA decimal string in the row's currency. Never a float.
statementsarray of objectyes
fields
FieldTypeRequiredNotes
idstringyesA prefixed ULID
bybuyer · selleryes
bodystringyes
linksarray of stringyes
created_atstring (date-time)yes
offersarray of DisputeOfferyes
standing_offerDisputeOfferyesThe offer on the table. At most one is ever open.

SettlementQuote

FieldTypeRequiredNotes
currencystringyes
totalstringyesA decimal string in the row's currency. Never a float.
buyer_refundstringyesA decimal string in the row's currency. Never a float.
seller_netstringyesWhat you keep, after fees.
feesstringyesThe order's own fees, never more than what the seller keeps. A settlement never makes you owe fees on money you gave back.

Webhook

FieldTypeRequiredNotes
idstringyesA prefixed ULID
urlstring (uri)yes
labelstring or nullyes
eventsarray of order.paid · order.accepted · order.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.dispute_updated · 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.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.dispute_updated · 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.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.dispute_updated · 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 · flags · ladderyes
mininteger
maxinteger
unitstring
bandsarray of integerA range or count whose unit price changes along it: the first unit of each stretch, ascending from min. A count of n pays its units as a range from 0 to n would, and its first stretch also covers the units below its start. Priced in `bands` (or `rate_bands` with `rate_by`).
rate_bystringThe key of a choice option whose chosen value sets this option's unit price. Priced in `rates` (or `rate_bands` with `bands`).
perintegerRates for this option are quoted per this many units.
stepintegerValues move in steps of this many units from min.
repeatbooleanA count that repeats the whole job: the price of one is multiplied by it, and it has no rate of its own.
pricingpercent · flatHow a choice, or the extras by default, move the price: basis points (`choice_bps`, `flag_bps`) or money (`choice_prices`, `flag_prices`).
choicesarray of object
fields
FieldTypeRequiredNotes
valuestringyes
labelstringyes
flagsarray of object
fields
FieldTypeRequiredNotes
valuestringyes
labelstringyes
pricingpercent · flat
tiersarray of object
fields
FieldTypeRequiredNotes
valuestringyes
labelstringyes
ranksarray of objectyes
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 with no `bands` and no `rate_by`.
bandsmap of map of stringyesThe rate per unit in each stretch of a banded range or count, keyed by the option then the stretch's first unit. A range from 78 to 83 pays units 78 to 82, each at its stretch's rate. A stretch missing here is not for sale.
ratesmap of map of stringyesThe rate per unit by the value chosen on the option named in `rate_by`, keyed by the option then that value. A value missing here is not for sale.
rate_bandsmap of map of map of stringyesBoth at once, for a banded range or count with `rate_by`: keyed by the option, then the chosen value, then the stretch's first unit.
choice_bpsmap of map of integeryesBasis points per chosen value, keyed by a percent choice option then its value.
choice_pricesmap of map of stringyesMoney added per chosen value, keyed by a flat choice option then its value. A value missing here is not for sale.
flag_bpsmap of integeryesBasis points per percent extra offered. An extra missing here is not for sale.
flag_pricesmap of stringyesMoney per flat extra offered. An extra missing here is not for sale.
laddermap of map of stringyesThe price of each division of a ladder option, keyed by the option then by the rank the step climbs out of (gold_ii is Gold II to Gold I). A climb costs the sum of its divisions. A division missing here is not for sale.
not_offeredmap of array of stringyesValues of a choice option this booster does not take, keyed by the option.
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.delivered · order.completed · order.cancelled · order.refunded · order.expired · order.disputed · order.dispute_resolved · order.dispute_updated · 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`, in the shape GET /v1/orders/{id}/messages returns (id, body, image, author with role and handle, created_at); for order.disputed, order.dispute_updated and order.dispute_resolved the case under `dispute`, as GET /v1/orders/{id}/dispute returns it.