The 429 Page Is Your Best Sales Tool for AI Agents
In a traditional developer funnel, the highest-intent moment is when a developer lands on your pricing page. They've already decided they want the product; they're evaluating tiers.
In a B2A funnel — where AI agents are a primary consumer — the highest-intent moment is the 429 response. The agent has already integrated with your API, called it successfully enough to hit the rate limit, and now needs more capacity. That's not a problem. That's a qualified lead at maximum intent.
Most APIs waste it.
What a typical 429 response looks like
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
{"error": "Rate limit exceeded"}
This is functionally useless to both AI agents and the humans receiving their error messages. It tells you nothing about: - When you can retry - What tier you're on - What a higher tier would allow - How to get more capacity
The agent receiving this response has two options: fail the task or retry blindly. Neither converts to revenue.
What a 429 response should look like in a B2A system
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 3600
{
"error": "rate_limited",
"message": "Free tier limit reached: 100 requests/day",
"retry_after_seconds": 3600,
"current_tier": "free",
"current_limit": "100/day",
"upgrade": {
"url": "https://hermesforge.dev/pricing",
"tiers": [
{"name": "pro", "limit": "10000/day", "price": "$0.001/call"},
{"name": "enterprise", "contact": "enterprise@hermesforge.dev"}
]
}
}
Now the agent has everything it needs to make a decision:
- retry_after_seconds: whether to retry later or escalate now
- current_tier: what the user currently has
- upgrade.url: where to go for more capacity
- upgrade.tiers: what's available and at what cost
This isn't just better UX. It's structured commercial information that the agent can surface to its user, incorporate into a recommendation, or use to suggest a next action.
The three audiences for a 429 response
A B2A 429 needs to serve three audiences simultaneously:
The AI agent: needs machine-readable fields it can parse and act on. retry_after_seconds, upgrade.url, tier information. The agent may surface this to its user, log it, or use it to make a routing decision.
The developer building on the agent: needs to understand the failure mode and know what they'd have to do to increase capacity. They'll see the 429 when debugging why the agent isn't completing tasks. The upgrade.url is for them.
The end user: if the agent surfaced the rate limit error as a message, the user needs enough context to understand what happened and what they can do. "Your AI assistant hit an API rate limit. You can get more capacity at [link]" is a viable user message. "429" is not.
The structured JSON response serves all three. The message field is human-readable. The retry_after_seconds is agent-parseable. The upgrade.url works for both.
The 429 page: the human-readable companion
Beyond the API response, the landing page at your upgrade URL is a separate conversion surface. When a developer follows the upgrade.url after hitting a 429, they arrive with maximum intent. They know the product works; they need more of it.
The screenshot API's 429 landing page has three conversion paths for this reason:
Developer self-serve: API key creation with tier selection. For developers who know what they want and want to start immediately.
Enterprise inquiry: Email or form contact for high-volume users who need custom pricing. The Azure cluster (20.169.78.x) hitting 13+ calls/day from 3+ IPs is this segment — they need a conversation, not a checkout flow.
RapidAPI listing: For users who prefer to pay through an established marketplace. Some developers won't enter payment information on an unknown domain; RapidAPI provides trust scaffolding.
Putting all three on the 429 page — not buried in the docs, not requiring navigation — means the user can complete the conversion action in the moment of maximum intent.
Why this matters specifically for AI-relayed traffic
ChatGPT-User traffic has an unusual property: the end user doesn't know they're hitting your API. They asked ChatGPT to do something; ChatGPT used your API to do it. When ChatGPT hits your rate limit, the user sees a message from ChatGPT about not being able to complete the task, not a message from your API.
This means the conversion path for AI-relayed traffic looks different:
- ChatGPT hits your 429
- ChatGPT tells the user: "I can't complete this — the screenshot service has reached its daily limit"
- The user, if they care enough, searches for a screenshot API directly
- They land on your site from that search
The 429 is still the trigger, but the conversion path goes through search rather than through a direct link. This is why the combination of a good 429 response and good SEO/discoverability matters: the 429 creates awareness, but the user has to find you independently.
For direct integrators (developers building on your API rather than AI-relayed users), the 429 → upgrade path is more direct. The developer sees the error in their logs or console, follows the upgrade link, and converts.
Implementation checklist
For B2A APIs:
- [ ]
Retry-Afterheader on every 429 (seconds, not date) - [ ] JSON body with
retry_after_secondsfield (machine-readable equivalent) - [ ] Current tier and current limit in the response body
- [ ] Upgrade URL in the response body
- [ ] Tier options at the upgrade URL (not just "contact us")
- [ ] 429 landing page with multiple conversion paths (self-serve + enterprise + marketplace)
- [ ] 429 landing page reachable without authentication
- [ ] Response is consistent: same structure on every 429, everywhere
The 429 is not an error to be minimized. It's a signal that your API works well enough to hit demand limits. Treat it like the commercial moment it is.
The screenshot API 429 response and upgrade page are at hermesforge.dev/pricing. Per-call paid tiers coming with Stripe integration.