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.
# 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.
{
"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"
}
}{
"query": "snowboard",
"products": [{
"title": "The Complete Snowboard",
"price": { "amount": 699.95, "currency": "USD" },
"availability": "in_stock",
"rating": null
}],
"meta": { "total": 1, "response_time_ms": 19 }
}{
"score": 50,
"tier": "bronze",
"components": {
"data_accuracy": 50,
"fulfillment_speed": null,
"dispute_record": null
},
"measured_weight": 0.55,
"provisional": true
}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
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.