Fazy → Developers
Fazy API and MCP server
Just want Fazy inside ChatGPT, Claude or Muse? Follow the two-minute steps.
For developers and AI agents: a price-checked deals catalogue for US shoppers, searchable in one request. Free, no key, nothing to install, 60 requests a minute per address. Every result carries the current price read from the retailer, the retailer’s reference price, a dated fact from Fazy’s own price record when one backs the price, a ready picture of the deal, and two links: the deal on Fazy and the deal at the retailer.
1 · Search
curl "https://fazy.com/api/v1/deals/search?q=standing+desk&max_price=300" \
-H "X-Fazy-Agent: my-agent"Parameters: q (required), brand, max_price (dollars), limit (≤ 50), cursor. The answer is { object: "list", data: [deal…], has_more, next_cursor, total }.
Say what the shopper wants in plain words (“men’s running shoes under 100”); the search reads them. Then narrow it: category, gender (men, women), min_discount_pct, fresh_only=true (prices read today), has_price_fact=true, and order it with sort (relevance, discount, price_low, price_high). These narrow the page a search returns, never widen it; applied in the answer names what was used. Every deal also carries short_title, save_amount and freshness.
Narrow a search with type (a product type), min_price and in_stock=true. Without search words, /api/v1/deals?category=home (or brand, type, a price band) returns a slice of up to 24; every category, brand, guide and product page names its own in a <link rel="alternate" type="application/json">.
2 · One deal, its price history, and similar deals
curl "https://fazy.com/api/v1/deals/9a1e0d3c-0000-4000-8000-000000000000" \
-H "X-Fazy-Agent: my-agent"curl "https://fazy.com/api/v1/deals/9a1e0d3c-0000-4000-8000-000000000000/price-history"The history answers “is this a good price?” from Fazy’s own price record: the lowest price recorded, the previous price, and dated facts such as “Down $40 from $199 on 3 Sep 2026”. No fact is given for a price read more than a day ago. /similar returns deals like it.
3 · MCP
Streamable HTTP, read-only, eight tools: search_deals, get_deal, get_price_history, similar_deals, show_deals (the deals your agent chose, as tiles in a row, grid, single card or compare table), list_categories, catalog_slice (a filtered slice with price-record reliability, for writing about products) and post_brief (the day’s creative brief and house rules). Your client’s own name (clientInfo.name) attributes its clicks; X-Fazy-Agent overrides it. Add it to Cursor or any MCP client:
{
"mcpServers": {
"fazy": { "url": "https://fazy.com/mcp", "headers": { "X-Fazy-Agent": "my-agent" } }
}
}In VS Code, .vscode/mcp.json:
{
"servers": {
"fazy": { "type": "http", "url": "https://fazy.com/mcp" }
}
}Nothing to install. Fazy’s MCP server is hosted at https://fazy.com/mcp; every client connects to that URL. Fazy publishes no npm, PyPI or other package, so a package that claims to be Fazy’s MCP server is not ours.
curl -X POST https://fazy.com/mcp -H "content-type: application/json" \
-H "X-Fazy-Agent: my-agent" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_deals","arguments":{"q":"nike running shoes","limit":5}}}'4 · Show deals as tiles
Hosts that run MCP Apps (ChatGPT, Claude) show search_deals and similar_deals as a row of cards with no work on your side. Anywhere else, every deal carries tile_image, a ready picture of the deal with Fazy’s mark, so a tile is one line of markdown:
[](https://fazy.com/p/9a1e0d3c-0000-4000-8000-000000000000?utm_source=ai-my-agent&utm_medium=agent)Group a longer answer by one thing (product type, brand, shop, or the biggest drops) and lead with the best few. Repeat price_fact exactly as written: it is the one line that may call a price a record low or a real drop, and it is null when Fazy’s record backs no claim. Say once that prices are checked by Fazy and that links may earn Fazy a commission.
When the shop runs an offer, the deal carries it as merchant.promo: text (the offer in the store’s terms, such as “20% off sitewide”), code, ends_at and terms_note. Repeat it exactly as written, with its code and end date when given, and its note. Offers change and end, so never reuse one from an earlier answer.
5 · The tile kit: the same deals, as every surface’s own card
Do not rebuild a card from JSON. /api/v1/deals/render returns the deals already built in the format your surface takes, with the links, price_fact and the disclosure in place. Pick deals by ids (up to 12, shown in your order) or by a search (q and the search filters).
curl "https://fazy.com/api/v1/deals/render?q=standing+desk&format=slack" \
-H "X-Fazy-Agent: my-agent"format | What you get | Where it goes |
|---|---|---|
markdown | The tile picture, price, earlier price, shop, fact, two links | Chat answers, Muse, Discord, GitHub, Notion |
text | One line per deal and its link | SMS, voice, plain notifications |
slack | { blocks } in Block Kit: photo, buttons, disclosure | Slack bots and workflows |
adaptive | An Adaptive Card 1.5 | Microsoft Teams, Copilot, Outlook |
html | A self-contained snippet, inline styles, no script; layout: row, grid, list, single, compare | Any HTML surface, your own app |
The answer is { object: "render", format, layout, content_type, payload, ids }: send payload as it is. Add raw=1 to get the payload alone, with its own content type.
6 · Pick, then present (MCP)
search_deals shows what it found. After your agent has chosen the deals worth showing, it calls show_deals with their ids, in its own order, and a layout: row, grid, single or compare (a side-by-side table of price, earlier price, shop and Fazy’s price fact). Prices are re-read, so what it shows is current. In ChatGPT and Claude the tiles draw themselves.
{"name":"show_deals","arguments":{
"ids":["<id from search_deals>","<id>","<id>"],
"layout":"compare",
"title":"Three standing desks under $300"}}7 · Embed deals on any page
Like a video embed: an iframe of live, price-checked tiles. Every tap opens the deal on Fazy or at the shop, credited to the agent you name. oEmbed clients find it on their own: each deal page names https://fazy.com/api/oembed?url=https://fazy.com/p/<id>.
<iframe src="https://fazy.com/embed/deals?q=standing+desk&layout=grid&agent=my-site"
width="100%" height="460" style="border:0" loading="lazy" title="Deals from Fazy"></iframe>8 · From your own code
Any framework that takes a remote MCP server takes Fazy: the URL is https://fazy.com/mcp, the transport is Streamable HTTP, there is no authentication. With OpenAI’s Responses API, for example:
{
"model": "<model>",
"tools": [{ "type": "mcp", "server_label": "fazy",
"server_url": "https://fazy.com/mcp", "require_approval": "never" }],
"input": "Find me a standing desk under $300 and show the best three."
}Without MCP, the OpenAPI document below describes every call, including the tile kit: import it as a GPT Action, a Gemini tool, or into any agent framework.
9 · Limits, errors and access
| Limit | 60 calls a minute per address, across the API, MCP, the tile kit, embeds and oEmbed. Calls from the published addresses of ChatGPT, Claude, Perplexity and Google’s agents get 300 a minute and an hourly budget of their own, because many readers share those few addresses. Each tools/call in an MCP batch counts once; a batch holds at most 20. A search pages at most 10 deep. |
| Pacing | Every answer carries RateLimit-Policy: 60;w=60. A 429 carries Retry-After and X-RateLimit-Reset in seconds: wait that long, then retry once. |
| Errors (API) | { "error": { "type", "message" } }. invalid_request 400, not_found 404 (no live deal with that id: it sold out or was retired), rate_limited 429, server_error 500. |
| Errors (MCP) | JSON-RPC: -32700 parse error (400), -32600 invalid request (400), -32022 a protocol version we do not speak, with the ones we do (400), -32020 headers that do not match the body (400), -32601 unknown method, -32000 rate limited (429). A body over 64 KB is a 413. |
| MCP versions | 2026-07-28 (stateless: no initialize, server/discover, the version and Mcp-Method / Mcp-Name on every request) and the handshake revisions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05, on the same endpoint. |
| Reads only | Every tool and endpoint reads. Nothing writes, nothing spends, nothing needs a login or a key. |
| From a browser | /api/v1, /mcp and /api/oembed answer any origin (CORS), with no cookies. A web page, a widget or an artifact can call them directly. |
| From a server | Scripts and agents are welcome on the API, MCP, embeds, oEmbed, llms.txt and /.well-known. Some HTML pages check for a browser: use the API for data, not the pages. |
| Not for programs | /go/ links are for people: hand them over, never fetch them. Crawlers that only gather training data are refused (robots.txt). |
Use Fazy in Muse
Paste this one message into Meta Muse. It builds the integration, tests it and keeps it:
Build a custom integration for Fazy's deal catalogue. MCP URL: https://fazy.com/mcp. No login needed. Test every tool and save it as a skill.Use Fazy in ChatGPT
- Settings → Apps & Connectors → Advanced settings: turn on Developer mode.
- Create a connector. Name:
Fazy. MCP server URL:https://fazy.com/mcp. Authentication: none. - In a chat, add Fazy from the + menu and ask for a deal.
Use Fazy in Claude
- Settings → Connectors → Add custom connector.
- Name:
Fazy. Remote MCP server URL:https://fazy.com/mcp. No sign-in is needed. - In a chat, turn Fazy on from the tools menu and ask for a deal.
The rules
Give the shopper the links unchanged: page_url opens the deal on Fazy, with its price record and similar deals; url redirects to the retailer’s product page. Both attribute the shopper to the name your client sent. Do not rewrite them, do not link the retailer directly, do not cache a deal longer than an hour: prices move and dead deals are retired.
Answering a person with Fazy’s deals is welcome. Training or fine-tuning a model on Fazy’s data, or copying it in bulk, is not (terms).
Reference
- OpenAPI 3.1 document — import it as a GPT Action or into any agent framework
- llms.txt
- How deals are verified
- Terms · Privacy
API version 2026-10-12. Field names are a contract; a change is a new version, never an edit.