Four commands
No key, no account, no SDK. Anonymous callers get 10 requests a minute, which is enough to finish this page several times over.
The brand id below is Cresva's own storefront. It is live, and every response on this page was taken from it rather than written by hand.
Find out what a storefront is
Start at the platform address. It needs nothing at all, and it is the document an agent reads before it knows how to ask you anything.
curl https://api.cresva.ai/.well-known/osp.jsonThe reply tells you three things: the spec version it implements, that this address is a platform rather than a shop, and the form of a storefront address.
{
"osp_version": "3.0",
"type": "platform",
"is_storefront": false,
"catalogue": {
"present": false,
"reason": "This is the platform address. Products belong to a storefront, and a storefront is named by its brand id."
},
"addressing": {
"storefront_root": "https://cresva.ai/api/storefront/<brandId>"
},
"brand_lookup": {
"available": false,
"endpoint": null,
"reason": "There is no public endpoint that maps a domain to a brand id, and this says so rather than leaving the question open."
}
}Note the brand_lookupblock. There is no way to turn a merchant's domain into a brand id, and the document says so rather than leaving you to discover it. Ask the merchant for their storefront URL; the id is in it.
Read a catalogue
Set the brand id, then ask for products.
export BRAND_ID=cmqmr1f6j0003la04nu93f4k4
curl "https://cresva.ai/api/storefront/$BRAND_ID/products?limit=1"Real product cards come back.
{
"products": [
{
"id": "cmtpqwhit001ajv04e1vvv5j6",
"title": "The Videographer Snowboard",
"price": { "amount": 885.95, "currency": "USD", "formatted": "$885.95" },
"availability": "in_stock",
"rating": null,
"purchase_url": "https://cresva-pilot-two.myshopify.com/products/the-videographer-snowboard",
"images": ["https://cdn.shopify.com/s/files/1/0803/1135/3541/files/Main.jpg?v=1787511528"]
}
]
}rating is null rather than 0, and that distinction runs through the whole API: a value we could not measure is never given a plausible-looking number. The same is true of price.amount, which is null when the shop's currency could not be established, because an agent reading a zero tells a shopper the product is free.
Make the server confirm our rate limits
Do not take our documentation on trust. Every response carries the ceiling it was checked against, so the server will tell you directly.
curl -sI "https://cresva.ai/api/storefront/$BRAND_ID/products" | grep -i ratelimitx-ratelimit-limit: 10
x-ratelimit-remaining: 3
x-ratelimit-reset: 1789499641That matches the anonymous tier on the rate limits page, because both come from the same constant. The CI live job runs this exact command against production on every push and fails if they ever disagree.
Search it
curl "https://cresva.ai/api/storefront/$BRAND_ID/search?q=snowboard&limit=1"{
"query": "snowboard",
"products": [
{
"id": "cmtpqwhge000wjv049l5iij9q",
"title": "The Complete Snowboard",
"price": { "amount": 699.95, "currency": "USD", "formatted": "$699.95" },
"availability": "in_stock",
"attributes": { "best_for": ["superduper awesome"], "features": ["premium"] }
}
],
"meta": {
"total": 1,
"page": 1,
"authority_score": 19.3,
"response_time_ms": 19,
"data_freshness": "2026-09-15T19:13:35.313Z"
}
}A search that matches nothing returns 200 with an empty array, not a 404. The catalogue answered; the answer was that it holds nothing matching.
One thing you will notice if you ask this storefront about itself
GET /api/storefront/$BRAND_ID returns a catalogue block that contradicts what you just read:
"catalogue": {
"product_count": 0,
"present": false,
"reason": "15 of 15 products are Shopify's development-store samples, so this is a test store rather than a merchant catalogue."
}It is not a bug and it is not a contradiction. The products endpoint returns what is in the catalogue. The root endpoint answers a different question, which is whether an agent should treat this as a shop worth buying from, and it has noticed that every item is a Shopify sample. We left it in the quickstart rather than picking a storefront that would not say it.