Skip to content
cresvaDevelopers
Quickstart

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.

1

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.

bash
curl https://api.cresva.ai/.well-known/osp.json

The 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.

JSON
{
  "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.

2

Read a catalogue

Set the brand id, then ask for products.

bash
export BRAND_ID=cmqmr1f6j0003la04nu93f4k4

curl "https://cresva.ai/api/storefront/$BRAND_ID/products?limit=1"

Real product cards come back.

JSON
{
  "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.

3

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.

bash
curl -sI "https://cresva.ai/api/storefront/$BRAND_ID/products" | grep -i ratelimit
bash
x-ratelimit-limit: 10
x-ratelimit-remaining: 3
x-ratelimit-reset: 1789499641

That 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.

4

Search it

bash
curl "https://cresva.ai/api/storefront/$BRAND_ID/search?q=snowboard&limit=1"
JSON
{
  "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:

JSON
"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.