GET
Get a normalized catalog aggregate
Returns a CatalogAggregate: the item, its variants and its availability, as they stand after the ingested signals.

Three shapes that surprise you the first time

item.title and variant.title are { [lang]: string } objects with at least one key:
No language is guaranteed: pick one and have a fallback. primary_media.alt has the same shape.
availability[].sellable is an open string (the fixture uses "in_stock"). A boolean can’t say “I don’t know”, and CrossUp doesn’t guess what the provider didn’t say: the unknown stays unknown. Treat it as opaque and display it as is.
If the provider didn’t report inventory, quantity isn’t there: it’s unknown. quantity ?? 0 turns “I don’t know” into “out of stock”, a business decision the API didn’t make.

An item from another store returns 404, not 403

A missing item_id and one from another store are indistinguishable: both return not_found. An unexpected 404 with a valid token is almost always another store’s token.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

item_id
string
required

CrossUp catalog item identifier.

Minimum string length: 1

Response

Catalog aggregate found

item
object
required
variants
object[]
required
availability
object[]
required
refresh_revision
integer

Which look at the store this aggregate came from. A client that caches can tell a newer read from a stale one without comparing every field, and a bug report that quotes it says exactly what the caller saw.

Required range: x >= 1