Activity log

GET /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); 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; and inbound_shipment.received, recorded when the warehouse scans in a package you sent us (see Inbound shipments). 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, tracking and inbound_shipment.received events are written to every key active at the time they happen.

Try it GET /api/v1/inventory/events?limit=10

These inputs are shared across all docs pages, so an id entered here carries over.

response

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 (tracks the inputs above)
curl -X GET 'https://service.rip.fun/api/v1/inventory/events?limit=10' \
  -H 'X-API-Key: rip_…'

Request fields

FieldTypeRequiredDescription
sincequery 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
limitquery int—1..100, default 50

Response fields (data)

FieldDescription
data[].id / api_key_idEvent 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" | "inbound_shipment.created" | "inbound_shipment.updated" | "inbound_shipment.cancelled" | "inbound_shipment.attachment_added" | "inbound_shipment.attachment_removed" | "inbound_shipment.received"
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), inbound_shipment ({ id, tracking_number } of the package it arrived in, or null when no box was recorded)
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 (inbound_shipment.received)A package you sent us was scanned in at the warehouse: inbound_shipment_id, tracking_number, carrier, card_count (what you declared, or null), reference, sub_account (the slug you said the cards are for, or null), source ("tenant" = you announced it; "warehouse" = it arrived unannounced and was logged against your account), destination_site and received_site (site codes — they differ when the box arrived at the other warehouse), received_at. The box is on our floor; its cards appear in GET /cards as they are intaken, each carrying this shipment as inbound_shipment — list them with GET /cards?inbound_shipment_id=
data[].payload (inbound_shipment.created / .updated / .cancelled / .attachment_added / .attachment_removed)Your own calls, written to the calling key only. All carry inbound_shipment_id; created adds tracking_number, card_count and sub_account; updated adds tracking_number, sub_account and changed (the field names you sent); cancelled adds tracking_number; attachment_added adds attachment_id, type ("file" | "link"), kind and filename; attachment_removed adds attachment_id
data[].payload / created_atEvent payload + when it was recorded
pagination.cursor / has_more / limitPass cursor back as ?since for the next page

Errors

StatusCodeWhen
400invalid sincesince is not a non-negative integer
403Tenant API key requiredkey is not tenant-scoped, or lacks read:inventory

See Errors for the response envelope and the full code list.