Free REST API with 1,493+ developer tool deals across 60 categories. No API key needed. Search deals, compare vendors, track pricing changes. JSON responses, OpenAPI spec, zero rate limits.
Free, open, and ready to use. No API key, no signup, and no rate limits on the read endpoints. Query 1,493+ deals across 60 categories with plain HTTP requests.
Three examples to get you started. Every endpoint returns JSON.
Every endpoint below is read-only (GET) except the 1 marked POST in the Method column. Responses are JSON. Every one of them is described in our OpenAPI document, browsable as interactive Swagger documentation.
| Method | Endpoint | Description | Parameters |
|---|---|---|---|
GET | /api/offers | Search and browse offers | q, category, limit, offset |
GET | /api/categories | List all categories with counts, what each name holds, and the other names answering the same question | — |
GET | /api/new | Recently added or updated offers | days |
GET | /api/newest | Newest deals by verification date | limit |
GET | /api/changes | Pricing and deal changes | since, type, vendor, vendors, category, categories, limit, offset, include_retracted, include_index_housekeeping |
GET | /api/details/:vendor | Vendor detail with alternatives | — |
GET | /api/compare | Compare two vendors side by side | a, b |
GET | /api/audit-stack | Audit your infrastructure stack | services |
GET | /api/vendor-risk/:vendor | Check vendor pricing risk | — |
GET | /api/deadlines | Future-dated changes with countdown | type |
GET | /api/ai-coding-pricing | AI coding tools pricing comparison data | type (ide, cli, cloud-agent, app-builder) |
GET | /api/hosting-pricing | Cloud hosting & PaaS pricing comparison data | type (traditional-paas, edge-serverless, full-featured, static-specialized) |
GET | /api/llm-pricing | LLM API pricing comparison data | type (frontier, inference, open-source-host, specialized) |
GET | /api/startup-credits | Startup credits & programs comparison data | type (cloud-infrastructure, fintech-banking, developer-tools, ai-tools) |
GET | /api/referral-programs | Developer tools with referral/affiliate programs | category |
GET | /api/expiring | Get expiring deals | days |
GET | /api/freshness | Data freshness metrics | — |
GET | /api/digest | Weekly pricing digest | — |
GET | /api/digest/weekly | Formatted weekly digest with multiple output formats | format (json|markdown|html), limit, weeks_ago |
GET | /api/stack | Free-tier stack recommendation | use_case, requirements |
GET | /api/costs | Check free tier coverage per service | services, scale |
GET | /api/query-log | Recent request log | limit |
GET | /api/pageviews | Page view analytics | path, period |
GET | /api/traffic | Traffic attributed by client class (AI agent / crawler / browser), with web-vs-MCP comparison | — |
GET | /api/stats | Service statistics | — |
GET | /api/feed | Atom feed of pricing changes | — |
POST | /api/signal | Report a vendor you recommended, or that your user signed up | event, vendor, note (body) |
Full OpenAPI 3.0 spec: /api/openapi.json · Interactive docs: Swagger UI
/api/changes/api/changes returns 20 records by default. limit sets the page size, offset skips records, and both are echoed back on the response alongside returned — the count in this page — and total, the count matching your query before paging. There is no maximum: ?limit=1000 returns the whole window in one response. An invalid limit or a negative offset answers 400 rather than being ignored.
Records we have withdrawn as our own error are not served here, and total counts what you received rather than what the log holds. retracted_excluded reports how many your query matched and we held back. ?include_retracted=true returns them alongside the rest, each carrying standing: "retracted" and impact: "none" — and every record carries a standing, so a live record and a withdrawn one are told apart without a null check. A value other than true or false answers 400.
Our own index housekeeping is not served here either. These records say we stopped listing an offer of ours because the page we imported it from stopped resolving — the vendor's terms did not move — so counting them as vendor activity overstates it. They carry reports: "our_index", index_housekeeping_excluded reports how many your query matched and we held back, and ?include_index_housekeeping=true returns them alongside the rest. A value other than true or false answers 400. This is why ?type=product_deprecated and the same count taken off the whole log agree: both leave them out.
With no filter, /api/changes returns the last 30 days. Name a type, vendor, vendors or category and you are answered from the whole change log however old the record — a vendor you ask for by name is never reported as having changed nothing because the last thing it changed was six months ago. since overrides both. Every response carries date_window naming which of the three ran and the date it opens on, so a total of 0 can be read as "we hold no such record" rather than guessed at.
Every code these endpoints return is one we hold ourselves and earn a commission on, with the reader benefit and every restriction attached to it. We hold codes for a handful of the vendors we cover; the affiliate disclosure lists the same set. Agent-submitted codes are retired — ?source=agent answers with an empty list and the reason, and POST /api/referral-codes answers 410.
| Method | Endpoint | Description | Parameters |
|---|---|---|---|
GET | /api/referral-codes | List every referral code we hold, with the reader benefit and restrictions on each | category |
GET | /api/referral-codes/:vendor | Get the referral code we hold for a specific vendor | — |
Referral codes are also inlined on every /api/offers, /api/compare, /api/details/:vendor, and /api/newest result as a referral_code field (null if no code available) — so agents get codes without a second call.
Query /api/offers?category=CI/CD in your pipeline to compare build-minute pricing across providers. Use /api/changes to alert when a vendor changes their free tier.
Use /api/stack to get free-tier recommendations for your use case, then /api/costs to check free tier coverage. Feed results into architecture decision records.
Build internal tools that pull from /api/compare?a=vercel&b=netlify for side-by-side feature comparison. Use /api/vendor-risk/:vendor to surface stability concerns.
Subscribe to the Atom feed or poll /api/changes to monitor free tier removals, restrictions, and expansions across 456 tracked changes. Filter by vendor or category for personalized alerts.
When a vendor shuts down or changes pricing, use /api/offers + /api/compare to evaluate alternatives with real free tier data. See our Firebase Studio migration guide for an example of how we use this data to compare cloud IDE alternatives.
Agents that recommend developer tools can route users through active referral codes. Call /api/referral-codes once at session start to prefetch all our codes, or rely on the inline referral_code field on every /api/offers result.
Query /api/offers?category=AI+Coding to get pricing data for 14+ AI coding tools. See our definitive AI coding tools comparison for side-by-side pricing, hidden costs, and recommendations across IDE, CLI, cloud agent, and app builder categories.
All responses return JSON with consistent structure. Offers include vendor name, category, description, tier, URL, tags, verification date, and stability indicators.
Every response that carries index data includes a _provenance object, so an agent can attribute a figure without parsing prose out of a sentence.
| Field | Meaning |
|---|---|
source | Always AgentDeals. |
url | The page on agentdeals.dev that publishes this data. |
checked | The oldest verification date among the records in this response. Omitted where the response holds no dated record. |
verified | The same date as checked. Kept for callers written before checked existed. |
cite_as | A citation sentence built from the three fields above, ready to use as written. |
note | Our request that you cite the source if you use a figure from the response. |
Operational endpoints — /api/stats, /api/traffic, /api/query-log, /api/pageviews and /api/freshness — carry no provenance block. They report on this service rather than on the index.
If you use a figure, cite url and checked. The index is free and we keep it current; attribution is how the people who need it find their way here.
The read endpoints above have no rate limits. We trust developers to be reasonable.
One write path is limited. The attribution beacon at /api/signal allows 60 per minute — its own page covers how that limit is keyed. Over the limit you get a 429 with Retry-After.
Swagger UI (Interactive Docs) · OpenAPI Spec (JSON) · MCP Server Setup · State of Free Tiers Report · Vendor Stability Dashboard · Weekly Digest · Subscribe via RSS · Embeddable Badges · GitHub