Skip to content
cresvaDevelopers

Open Storefront Protocol

Your storefront, readable by agents. On your terms.

OSP is how a merchant publishes what an agent may see, what it may be offered, and what it may not do. Cresva serves the protocol, records every request, and never touches the money.

API referenceSDKsSpecification v3.0

terminal
# Find a storefront. No key, no account.
curl https://api.cresva.ai/.well-known/osp.json

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

# Response
{ "products": [{ "title": "The Videographer Snowboard",
  "price": { "amount": 885.95, "currency": "USD" },
  "availability": "in_stock", "rating": null }] }
  • ChatGPT
  • Claude
  • Gemini
  • Perplexity
  • + any agent

The agents this protocol is designed for. None of them consumes OSP today, and none is a Cresva partner or integration.

The protocol

Five capabilities. And a refusal for everything else.

A storefront declares what it supports and an agent reads that declaration before it asks for anything. An agent that asks for something outside them gets a refusal naming the capability that was missing, not a guess.

search
Keyword and structured search across a catalogue, returning product cards an agent can compare.
recommend
Related products for one item: similar, complementary, or an upgrade.
compare
Two or more products from one catalogue, side by side.
negotiate
A price an agent and a merchant agree, behind two merchant settings that both have to be open.
transact
A checkout session priced from the catalogue, never from the request. Completing it hands back a link to the merchant's own checkout, where the buyer pays the merchant.

Control

Every switch is off until a merchant turns it on.

Agent ordering is off

A merchant turns it on. Until they do, an agent can read the catalogue and cannot open a checkout session.

Negotiation needs two settings open

One enables it, the other decides whether an agent may bind a price without a person seeing it. A brand with no auto-optimization record is refused rather than defaulted, which is the safe direction.

No daily cap until one is set

No cap is stored as no cap, never as zero, so an unset field cannot silently refuse every order.

Prices come from the catalogue

There is no field in a checkout request a price can arrive in. The route that read prices from the request body was withdrawn.

Custody and measurement

Cresva never holds the money.

A buyer pays the merchant, on the merchant's own checkout. Completing an agent checkout session creates a draft order on the merchant's store and hands back a link to pay it. Cresva never takes the payment, never holds it, and never follows that link: handing it to the shopper is where an assistant stops and a purchaser would begin.

Transaction states

created_txn to confirmed_txn to paid_txn to fulfilling_txn to completed_txn

cancelled_txn / refunded_txn / disputed_txn

There is no escrowed state. It was removed in v3.0 because it described a custodial role Cresva has never had, and the specification says so in its own version history rather than quietly dropping it.

Every request is recorded. Refusals included.

A merchant can see what agents asked for, what came back empty, and where they were rate limited. An empty search is the most useful row in that table, because it is demand the catalogue could not answer.

Recorded per request

endpoint
Which verb was called.
statusCode
Including the 403s, 410s and 429s.
responseTimeMs
How long the answer took.
resultCount
How many results came back. Zero is a result.
createdAt
When.

Responses

Three calls, three real answers. Run them yourself.

Captured from production on 2026-09-16 and trimmed to fit. No value is edited. The CI live job re-runs the discovery and search calls against the live API on every push, and you can run them yourself from the commands above each block.

GET /.well-known/osp.json?brand={brandId}
{
  "osp_version": "3.0",
  "type": "storefront",
  "brand_name": "Cresva",
  "capabilities": ["search", "recommend", "compare", "negotiate"],
  "rate_limits": {
    "anonymous": "10/minute",
    "public": "60/minute",
    "authenticated": "300/minute"
  }
}

Trust

A score that says how much of itself was measured.

Trust is a composite from 0 to 100 across seven components, and any component with no evidence behind it is stored as unmeasured rather than as a plausible middle number. Below half the weight measured, no tier is published at all and the score is marked provisional.

Unrated
under 40
Bronze
40 to 59
Silver
60 to 74
Gold
75 to 89
Platinum
90 to 100

Seven components, each scored 0 to 100

A component with no evidence is stored as unmeasured. It is never given a plausible middle number.

Federated scoring is specified

The specification defines a score computed across participating platforms. Cresva is the reference implementation.

Bronze
40 to 59
Silver
60 to 74
Gold
75 to 89
Platinum
90 to 100
Conformance checks

Start with one command. No key, no account.

The discovery endpoint answers ten requests a minute, anonymously, from any IP. The specification is public and MIT licensed: read it, implement it, propose changes.