/api/v1/inventory/events read:inventory Cursor feed of the writes made by your API key — card.transferred, withdrawal.requested and declared_value.submitted — plus events we write: card.identity_corrected, recorded whenever a correction changes what one of your cards is after intake (its sports identity, or its TCG catalog card) and, usually, its declared value; card.removed, recorded when a card we added by mistake — the same physical card scanned in twice — is taken back out of your inventory: it stops appearing in GET /cards and GET /cards/unique-id returns 404 for it, so delete your copy; order.tracking_updated, recorded when we replace an order’s shipping label after you received its tracking number (a changed address, a label that failed to print) — the old number will never move, so update what your customer sees; order.tracking_status_changed, recorded as the carrier moves the parcel (in transit, delivered, returned); and graded_card.added, recorded when a graded slab of yours is scanned into the warehouse — worth consuming because GET /cards is raw-only unless you pass ?type=, so this is how you learn a slab arrived without re-sweeping with a different query. If you cache cards, names or values on your side, consume this feed: a correction payload carries the card’s unique_id, its old and new identity (sports.id for a sports card, card_id for a TCG card), the new identity block, and declared_value_cents when the value moved; a removal payload carries the unique_id to delete and, when known, the duplicate_of_unique_id we kept. A card you have already fetched is only ever removed within three hours of its intake. Other order activity (quotes, commits, cancellations) and service-credit requests are NOT in this feed; poll GET /orders/:id for order state. Note data is a bare array here, not an object. The feed is keyed to the API KEY, not to your account — a second key cannot see the first key’s history, and rotating a key starts the feed over, so drain the old key’s feed before retiring it. Correction, removal and tracking events are written to every key active at the time they happen.
GET /api/v1/inventory/events?limit=10 These inputs are shared across all docs pages, so an id entered here carries over.
Not run yet. Press Run to make a live call against https://service.rip.fun (through this demo's server-side proxy; the API key never reaches the browser).
curl -X GET 'https://service.rip.fun/api/v1/inventory/events?limit=10' \ -H 'X-API-Key: rip_…'
| Field | Type | Required | Description |
|---|---|---|---|
since | query int | — | Last event id received; only events with id > since are returned. Omit (or pass 0) to start from the beginning. A non-integer returns 400 rather than silently restarting the feed |
limit | query int | — | 1..100, default 50 |
data)| Field | Description |
|---|---|
data[].id / api_key_id | Event id (ascending — checkpoint the last one as your next since) + the key that wrote it |
data[].event_type | "card.transferred" | "withdrawal.requested" | "declared_value.submitted" | "card.identity_corrected" | "card.removed" | "graded_card.added" | "order.tracking_updated" | "order.tracking_status_changed" |
data[].payload (graded_card.added) | A graded slab of yours was scanned in: tenant_graded_card_id, unique_id (fetch it with GET /cards/unique-id/:unique_id, or find it under ?type=graded), card_id (the catalog card, null while the cert is still being resolved), grading_company, cert_number, grade_numeric (tenths — 100 is a 10), verification_status, sub_account ({ slug, name } or null for your own inventory) |
data[].payload (card.identity_corrected, sports card) | kind ("correction" = one card moved by an operator, "catalog_merge" = the provisional row it sat on was folded into a canonical one), tenant_card_id, unique_id, from_sports_card_id, to_sports_card_id, sports (the new identity, same shape as GET /cards), declared_value_cents (only when the value moved; null = cleared because the new row is unpriced), note |
data[].payload (card.identity_corrected, TCG card) | Same event, TCG shape — tell the two apart by which block is present: `card` here, `sports` above (there is no separate discriminator field). kind ("correction" = an operator refiled this one card), tenant_card_id, unique_id, from_card_id and to_card_id (catalog card ids, as card_id on GET /cards), card { id, name, set_id, card_number, variant ("Reverse" | "Holo" | "Non-foil", or null for a plain printing) }, declared_value_cents (only when the value moved to the new card’s price — a declared value you set yourself is never changed), note (why the operator changed it) |
data[].payload (card.removed) | kind ("duplicate_removed" = the same physical card was scanned in twice and this record is the extra one), tenant_card_id, unique_id (the card to delete on your side), duplicate_of_unique_id (the copy we kept — it stays in your inventory — or null when not recorded), removed_at, note (why). Written only for cards that were ever visible to you; a card we never published is removed silently because you cannot hold it |
data[].payload (order.tracking_updated) | order_id, reason ("label_replaced"), tracking_number + tracking_url (the label the parcel ships on now), carrier, carrier_service, previous_tracking_number (the number it replaced), previous_tracking_numbers (every replaced number, oldest first) |
data[].payload (order.tracking_status_changed) | order_id, tracking_number, status (TRANSIT | DELIVERED | RETURNED | FAILURE, or PRE_TRANSIT after a re-label), previous_status (null on the first sighting), status_details, location ("City, ST"), occurred_at (carrier time). Written each time the carrier status of the order’s current label changes; checked every 2 hours |
data[].payload / created_at | Event payload + when it was recorded |
pagination.cursor / has_more / limit | Pass cursor back as ?since for the next page |
| Status | Code | When |
|---|---|---|
| 400 | invalid since | since is not a non-negative integer |
| 403 | Tenant API key required | key is not tenant-scoped, or lacks read:inventory |
See Errors for the response envelope and the full code list.