Skip to content

Inventory

GET /api/s2s/inventory lists the items a player has won — their vault. Use it when you drive everything from your backend and render your own “My Items” surface, offering cashback or shipping on each item.

Three companion endpoints back a richer surface for collectibles: item detail, price history and the portfolio aggregate.

Request

GET https://{operator}.app.lootboxsolutions.com/api/s2s/inventory?playerExternalId=u_8431
GET https://{operator}.app.lootboxsolutions.com/api/s2s/inventory?playerExternalId=u_8431&state=unresolved,cashed_back
QueryRequiredNotes
playerExternalId✅Whose items to list.
state—Comma-separated item states to include. Defaults to unresolved (the actionable ones). Unknown tokens are ignored. Items in an item payout (reserved, paid_out) are never listed, whatever you ask for.
currency—ISO-4217 code. Reprices every row’s valueMinor / cashbackMinor into it at current rates. Omit to get each item in its own operator currency.
cursor—Opaque page cursor from a previous response’s cursor.next / cursor.prev.

Response — 200

{
"items": [
{
"id": 88,
"itemId": 906,
"name": "Golden Sword",
"type": "physical",
"imageUrl": "https://cdn…/items/golden-sword-card.png",
"valueMinor": 320,
"currency": "EUR",
"state": "unresolved",
"acquisitionType": "game_win",
"cashbackMinor": 80,
"cashbackUncredited": { "priceFallMinor": 0, "priceRiseMinor": 0, "creditsShareMinor": 0 },
"shippable": true,
"wonAtRoundPublicId": "rnd_7b…",
"createdAt": "2026-06-16T12:00:00Z"
}
],
"cursor": { "next": "eyJpZCI6ODh9", "prev": null }
}
FieldNotes
idThe inventory id — the handle you pass to cashout (inventoryItemId) and shipping (inventoryItemIds[]).
itemIdThe catalog item id — the same id a purchase win and box detail carry.
name, imageUrlDisplay name (live, not snapshotted) and card-size image, or null when the item has none.
typeItem type (e.g. physical, digital, bonus).
valueMinor, currencyThe item’s value, in its own operator currency — not the player’s wallet currency. Format with this per-item currency.
stateCurrent lifecycle state. Only unresolved items are actionable.
acquisitionTypeHow the player came to own it: game_win (won in a box or the Upgrader) or bought_with_nuggets (granted as goods bought with Nuggets). A bought_with_nuggets item can only be shipped: no cashback, no item payout, no Upgrader stake.
cashbackMinorWhat the item would cash back for right now, in the item’s currency, or null when cashback isn’t offered for it. The Credits part of the offer.
cashbackUncreditedThe part of the item’s value the cashback would not pay in Credits, by cause, in the same currency: priceFallMinor, priceRiseMinor and creditsShareMinor, as on Cashout. All 0 unless the item is a collectible whose price moved or its cashback is below 100%; null when cashback isn’t offered. Whether you pay any of it in Nuggets is your choice.
shippabletrue when the item can be added to a shipping order.
wonAtRoundPublicIdThe round the item dropped from, or null for non-round sources.
createdAtWhen it landed in the vault (ISO-8601).

The list is newest-first and cursor-paginated: when cursor.next is non-null there are more items — pass it back as ?cursor= to fetch the next page.

Per-item currency. Without ?currency=, values come back in each item’s own operator currency, exactly as your catalog priced it. Pass ?currency= to have them repriced at current rates — each row is always tagged with the currency its values are in, so you never have to assume. The wallet currency is named separately when you actually cash an item back.

Collectible items

A collectible is a catalog item whose value tracks the market rather than being frozen at the moment it was won. Rows for those items carry three additional fields:

{
"id": 91,
"itemId": 1204,
"name": "Tarmogoyf — Modern Masters (NM)",
"valueMinor": 15200, // the item's CURRENT value
"currency": "EUR",
"cashbackMinor": 7600,
"cashbackUncredited": { "priceFallMinor": 0, "priceRiseMinor": 0, "creditsShareMinor": 0 },
"state": "unresolved",
// …the standard fields above, plus:
"isCollectible": true,
"currentRevisionId": 21979,
"wonValueMinor": 9574,
"currentValueMinor": 15200
}
FieldNotes
isCollectibletrue when the item was won as a collectible. Drives the badge / separate tab in your own surface.
currentRevisionIdThe identifier of the value currently in force. Pass it back as expectedRevisionId when you cash the item back so a value that moved mid-flow is refused instead of silently settling at a different amount.
wonValueMinorThe value the item was won at, pinned forever. valueMinor − wonValueMinor is the player’s profit/loss on that item.
currentValueMinorThe item’s value today, whatever valueMinor follows. Show it beside wonValueMinor next to the cash-back offer: together they explain the Credits and Nuggets the offer pays. null when the item has left the catalogue.

Treat all four as optional. They appear only on collectible rows — a normal item’s payload is byte-identical to what it has always been, so an existing integration needs no change until it wants to show collectibles.

For a collectible, valueMinor (and therefore cashbackMinor) is the item’s current value, which moves over time. For every other item both stay pinned to the win. name and type always come from the moment of the win.

Item detail

GET https://{operator}.app.lootboxsolutions.com/api/s2s/inventory/91?playerExternalId=u_8431

One item, in the same shape as a list row plus the fields a detail page needs. Serves any state — a cashed-back or shipped collectible stays viewable.

QueryRequiredNotes
playerExternalId✅Must own the item, or the call 404s.
currency—Same repricing as the list.
{
"item": {
"id": 91,
"itemId": 1204,
"name": "Tarmogoyf — Modern Masters (NM)",
"type": "physical",
"imageUrl": "https://cdn…/items/tarmogoyf.png",
"valueMinor": 15200,
"currency": "EUR",
"state": "unresolved",
"cashbackMinor": 7600,
"cashbackUncredited": { "priceFallMinor": 0, "priceRiseMinor": 0, "creditsShareMinor": 0 },
"shippable": true,
"wonAtRoundPublicId": "rnd_7b…",
"createdAt": "2026-07-25T09:14:00Z",
"isCollectible": true,
"currentRevisionId": 21979,
"wonValueMinor": 9574,
"wonAt": "2026-07-25T09:14:00Z",
"sourceBoxName": "Black Lotus Hunt",
"collectibleCategory": "mtg_card",
"metadata": {
"category": "mtg_card",
"schema_version": 1,
"card_name": "Tarmogoyf",
"set_code": "MMA",
"collector_number": "165",
"condition": "nm",
"foil": false,
"language": "en",
"grading_company": null
}
}
}
FieldNotes
wonAtWhen the item was won (ISO-8601) — the same instant as createdAt, named for the “Won {date}” line.
sourceBoxNameThe name of the box it dropped from, as the player saw it at the time. null for non-box sources (e.g. an Upgrader win).
collectibleCategoryThe collectible family (e.g. mtg_card, coin, sports_card), or null for a non-collectible. Drives which metadata keys to expect.
metadataDescriptive attributes for the item, keyed per category — render as a spec table. Read from the item’s current description, so a corrected attribute shows without the player having to re-win it. Keys vary by category (plus the reserved category / schema_version pair); render whatever is present rather than hard-coding a list. Internal admin-only keys (e.g. third-party pricing cross-references) are never included. null for an item with no attributes.

Price history

GET https://{operator}.app.lootboxsolutions.com/api/s2s/inventory/91/price-history?playerExternalId=u_8431&currency=EUR

The value series behind a collectible’s price chart.

QueryRequiredNotes
playerExternalId✅Must own the item.
currency—ISO-4217 code, from your configured currencies. Every point and wonValueMinor convert at the current rate. Defaults to the operator currency.
{
"inventoryItemId": 91,
"itemId": 1204,
"currency": "EUR",
"points": [
{ "revisionId": 21901, "valueMinor": 9000, "recordedAt": "2026-05-02T00:00:00Z" },
{ "revisionId": 21940, "valueMinor": 9574, "recordedAt": "2026-06-11T00:00:00Z" },
{ "revisionId": 21979, "valueMinor": 15200, "recordedAt": "2026-07-25T08:00:00Z" }
],
"wonAt": "2026-07-25T09:14:00Z",
"wonValueMinor": 9574
}
  • Points are ascending (oldest first) and are sparse step data — one point per value change, not one per day. Render them step-after (hold the previous value until the next point), not as a smooth curve.
  • Only value changes appear; a value that was re-confirmed unchanged does not add a point. A brand-new item can legitimately return a single point — draw a flat line, not an empty chart.
  • The series is capped at the most recent 500 points and is not paginated.
  • The series can predate the win — value history belongs to the item, not to the copy this player owns. Use wonAt / wonValueMinor to draw the “Won” marker.
  • Every point is converted at today’s rate, so the chart reads as “what this would be worth to the player now” rather than mixing historical FX.

Collectibles portfolio

GET https://{operator}.app.lootboxsolutions.com/api/s2s/inventory/collectibles/portfolio?playerExternalId=u_8431

The summary header for a player’s collectibles — totals across all of their collectibles, not just the page you happen to be showing.

QueryRequiredNotes
playerExternalId✅Whose portfolio to total.
state—Same comma-separated item states as the list. Defaults to unresolved, so the header matches the default list.
currency—ISO-4217 code; totals are repriced into it at current rates.
{
"count": 2,
"currency": "EUR",
"totalCurrentValueMinor": 24574,
"totalWonValueMinor": 19574
}
FieldNotes
countHow many collectibles match the state filter.
totalCurrentValueMinorSum of every matching item’s current value.
totalWonValueMinorSum of the values they were won at.

Overall profit/loss is totalCurrentValueMinor − totalWonValueMinor — derive it rather than expecting a field.

Never sum a page. The inventory list is cursor-paginated, so a total added up client-side is only the totals of the rows you fetched. This endpoint is a server-side aggregate over the whole portfolio — use it for the header and keep the rows for the list.

Errors

codeHTTPwhen
INVENTORY_ITEM_NOT_FOUND404the item doesn’t exist, or isn’t owned by playerExternalId
UNSUPPORTED_CURRENCY422price history was asked for a currency outside your configured set, or one with no usable rate — the series is refused rather than served with mixed currencies

The signed request returns 401 on a bad signature (see authentication); a malformed query returns 422 with the standard { "error": { "code", "message", "fields" } } envelope.

Same data, two callers. The game app reads the equivalent in-iframe Items tab with a session token. This S2S endpoint is the backend-driven equivalent — same item shape, signed with your API key. The item detail, price history and portfolio endpoints are S2S-only: the in-iframe game app deliberately has no collectible detail view or chart.