1. Get a free key
New accounts get 25,000 free credits a month, enough for about 1,000 price answers, no card. One key works for the API and for MCP, with a monthly spending cap you set.
No account? Pay per call with x402: call with no key, read the price in the 402 answer, sign the USDC payment and send the same call again. Live checks and market scans need a key.
2. Make the call
Put your key in AGORANTIS_KEY, then:
curl -X POST https://api.agorantis.com/v1/cheapest \
-H "Authorization: Bearer $AGORANTIS_KEY" \
-H "content-type: application/json" \
-d '{"product":"Nescafe Gold 200g","country":"EG"}'3. Or connect your AI over MCP
The MCP address is https://mcp.agorantis.com/mcp. Claude and ChatGPT sign in with your Agorantis account, so no key is pasted.
Claude
In Claude, open Customize, then Connectors, press + Add, then Add custom connector, paste the address and press Add. Then sign in.
https://mcp.agorantis.com/mcpClaude Code
claude mcp add --transport http agorantis https://mcp.agorantis.com/mcpChatGPT
In ChatGPT, open Plugins, press +, choose Add custom MCP server, name it Agorantis, paste the address and press Create. Then sign in.
https://mcp.agorantis.com/mcpAny MCP client, with a key
{
"mcpServers": {
"agorantis": {
"type": "http",
"url": "https://mcp.agorantis.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_AGORANTIS_KEY"
}
}
}
}Cursor, VS Code, Gemini and more, one press each: connect your AI.
What a real answer looks like
Shops come cheapest first, then by check time, and nothing else. Every price carries its currency, shipping (or unknown), stock, its shop, checked_at, a receipt_url anyone can open, match_confidence and ranked_for_money: false. A shop with no price says why instead, never a guess.
{
"ok": true,
"product": {
"id": 1042,
"name": "Nescafe Gold Instant Coffee 200g",
"brand": "Nescafe",
"size": "200g"
},
"results": [
{
"state": "priced",
"shop": {
"name": "Shop A",
"domain": "shop-a.example",
"country": "EG"
},
"address": "https://shop-a.example/nescafe-gold-200g",
"price": {
"minor": 39500,
"amount": "395.00",
"currency": "EGP",
"was_minor": 42000,
"from": false
},
"currency": "EGP",
"shipping": {
"state": "free",
"minor": 0,
"amount": "0.00"
},
"stock": "in_stock",
"checked_at": "2026-11-15T07:41:00.000Z",
"proof": {
"listing": "https://shop-a.example/nescafe-gold-200g",
"fingerprint": "pf_8c41e2",
"snippet": "EGP 395.00",
"checked_at": "2026-11-15T07:41:00.000Z"
},
"receipt": {
"v": "0.1",
"key_id": "21fe31dfa154a261",
"issued_at": "2026-11-15T09:12:03.000Z",
"read": "page",
"sig": "kOiq03shA3BWL9XCt0m26hHYS68zfzVI5YyHpJXLHXUS3mSA86vP_vaTX1dx9W-oTCfm85zsof5aKoBqLw5tBA"
},
"receipt_url": "https://api.agorantis.com/receipt/pf_8c41e2",
"match_confidence": 0.9,
"ranked_for_money": false,
"store": null,
"fresh": false,
"fresh_check": "not_available",
"why": "read from the shop's own page; last checked 2026-11-15T07:41:00.000Z; call live_check for a fresh check of this shop"
},
{
"state": "not_sold_here",
"shop": {
"name": "Shop B",
"domain": "shop-b.example",
"country": "EG"
},
"address": "https://shop-b.example/search?q=nescafe+gold",
"price": null,
"currency": null,
"shipping": {
"state": "unknown",
"minor": null,
"amount": null
},
"stock": "not_shown",
"checked_at": "2026-11-15T06:58:00.000Z",
"proof": null,
"receipt_url": null,
"match_confidence": 0.9,
"ranked_for_money": false,
"store": null,
"fresh": false,
"fresh_check": "not_available",
"why": "the shop's own search does not list it; last checked 2026-11-15T06:58:00.000Z; call live_check for a fresh check of this shop"
}
],
"cheapest": {
"state": "priced",
"shop": {
"name": "Shop A",
"domain": "shop-a.example",
"country": "EG"
},
"address": "https://shop-a.example/nescafe-gold-200g",
"price": {
"minor": 39500,
"amount": "395.00",
"currency": "EGP",
"was_minor": 42000,
"from": false
},
"currency": "EGP",
"shipping": {
"state": "free",
"minor": 0,
"amount": "0.00"
},
"stock": "in_stock",
"checked_at": "2026-11-15T07:41:00.000Z",
"proof": {
"listing": "https://shop-a.example/nescafe-gold-200g",
"fingerprint": "pf_8c41e2",
"snippet": "EGP 395.00",
"checked_at": "2026-11-15T07:41:00.000Z"
},
"receipt": {
"v": "0.1",
"key_id": "21fe31dfa154a261",
"issued_at": "2026-11-15T09:12:03.000Z",
"read": "page",
"sig": "kOiq03shA3BWL9XCt0m26hHYS68zfzVI5YyHpJXLHXUS3mSA86vP_vaTX1dx9W-oTCfm85zsof5aKoBqLw5tBA"
},
"receipt_url": "https://api.agorantis.com/receipt/pf_8c41e2",
"match_confidence": 0.9,
"ranked_for_money": false,
"store": null,
"fresh": false,
"fresh_check": "not_available",
"why": "read from the shop's own page; last checked 2026-11-15T07:41:00.000Z; call live_check for a fresh check of this shop"
},
"ranked_for_money": false,
"usage": {
"free": true,
"price_credits": 25,
"price_usd": "0.005",
"credits": 25,
"charged": true
}
}When you show a price, give its shop, its check time and its receipt_url. A saved price is never live: say when it was checked. Check a signed receipt at agorantis.com/receipts.
Prices in plain units
One saved price = USD 0.005 = 25 credits. A call that finds nothing costs nothing.
| Tool | Credits | US dollars | No account (x402) |
|---|---|---|---|
price_atA product at a shop you name | 25 | 0.005 | 0.005 |
cheapestA product across every shop of a country, cheapest first | 25 | 0.005 | 0.005 |
findWhich products a name may be, with sizes and ids | 50 | 0.01 | 0.01 |
match_productsWhether two products are the same (not sure is free) | 50 | 0.01 | 0.01 |
price_historyUp to 90 days, a point a day per shop | 50 | 0.01 | 0.01 |
live_checkOne product at one shop, checked again now | 50+ | 0.01+ | Key only |
market_scanEvery shop of a country for a kind of product | 1,250+ | 0.25+ | Key only |
get_proofThe proof behind a price, no key needed | Free | Free | Free |
account_usageThis key's month and balance | Free | Free | Key only |
live_check: 50, 150 or 400 credits, by how hard the shop's site is to read.
market_scan: 1,250 credits for up to 25 sellers, then 50 credits a seller.
With no key, a call answers 402 with its price and the USDC payment to sign. Send the same call again with the payment. Live checks and market scans need a key.
What the 402 answer looks like
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: <the same requirements, as base64 JSON>
{
"ok": false,
"error": "payment_required",
"cause": "This call needs a payment or an agent key.",
"fix": "Pay $0.005 in USDC by x402 (the requirements are in accepts) and send the call again, or make an agent key at https://agorantis-app.eyad-172.workers.dev/connections and send it as \"Authorization: Bearer <key>\".",
"message": "This call needs a payment or an agent key. Pay $0.005 in USDC by x402 (the requirements are in accepts) and send the call again, or make an agent key at https://agorantis-app.eyad-172.workers.dev/connections and send it as \"Authorization: Bearer <key>\".",
"price": {
"credits": 25,
"usd": "0.005",
"usdc_base_units": "5000"
},
"x402Version": 2,
"resource": {
"url": "https://mcp.agorantis.com/mcp#cheapest",
"description": "Agorantis cheapest, $0.005",
"mimeType": "application/json"
},
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"amount": "5000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"payTo": "<our wallet>",
"maxTimeoutSeconds": 60,
"extra": {
"name": "USD Coin",
"version": "2"
}
}
]
}When something is wrong
Every error is { ok: false, error, message }, the same over HTTP and MCP; these also carry cause and fix apart. Nothing is charged for an error.
too_many_requests: A rate limit. Wait retry_after seconds (also the Retry-After header), then send the same call.payment_needed: Out of credits. Add credits at agorantis.com/connections; the answer names the price.cap_reached: The key's monthly spending cap is met. Raise it at agorantis.com/connections, or wait for next month.payment_required: No key, paying by x402: pay the price in accepts and send the same call again.bad_input: The request is not right. cause says what, fix says what to send.
Read more
- llms-full.txt: every tool, field, price and error, for an agent to read
- openapi.json: the API as OpenAPI 3.1
- Agorantis for AI agents: what an agent can ask