Appearance
Compressed payloads
Offer and item catalogues are not plain JSON. The HTTP body is JSON with a Base64 field that is a gzip of the real payload.
Applies to:
GET /v1/spaces/{spaceId}/items/all→compressedItemsGET /v1/spaces/{spaceId}/offers/all→compressedOffersGET /v1/spaces/{spaceId}/offers(also compressed)
Decode
ts
import { gunzipSync } from 'node:zlib'
function decodeCatalogue(b64: string) {
const json = gunzipSync(Buffer.from(b64, 'base64')).toString('utf8')
const parsed = JSON.parse(json)
return parsed.items // catalogue arrays live under .items
}Python equivalent: gzip.decompress(base64.b64decode(b64)) then json.loads.
After decode
Each item is a CatalogueItem: itemId, name, tags[], item_type.
Offers decode to a list of offer objects keyed by offerId (used when redeeming). Keep a map itemId → name if you are labelling inventory.
Catalogues are large. Cache them (they change on patches, not per request) and do not fetch /all on every user lookup.