Usage & Rate Limits
Pod Engine tracks API usage and enforces rate limits to ensure fair access for all users. Every API response includes headers with your current usage and limits.
Response Headers
Every API response includes these headers to help you monitor your usage:
| Header | Description |
|---|---|
X-RateLimit-Limit | Your monthly limit for this endpoint (or "unlimited") |
X-RateLimit-Remaining | Number of requests remaining before you hit the limit |
X-RateLimit-Reset | Unix timestamp (seconds) when your limit resets |
X-Usage-Monthly | Your current monthly usage count for this endpoint type |
X-Plan-Tier | Your current plan tier (e.g., free, business, agency) |
X-PodEngine-Team-Id | The ID of the team this request bills |
X-PodEngine-Team | The slug of the team this request bills (e.g., legendary-podcasts) |
Check which team your API key bills on your first call. Every authenticated response carries
X-PodEngine-Team-Id
and
X-PodEngine-Team, including calls that don't count
toward a limit. If they name the wrong team, switch to a key from the team you pay for before your usage adds
up there.
Limits apply per monthly usage period. For paid plans the period is
anchored to your subscription renewal day (a team that subscribed on the 8th has an 8th-to-8th allowance, on
quarterly and annual plans too); teams without a subscription use the UTC calendar month. The exact reset
instant is always in
X-RateLimit-Reset
— don't assume the 1st.
What counts against a lookup allowance
Podcast and episode lookups are counted once per resource per usage period. The first time you fetch a given podcast, it uses one podcast lookup. Every later request for that same podcast in the same usage period is free, however many times you make it.
- Counting is by resource, not by request — fetching the same podcast by Pod Engine id, slug or Apple id all resolve to the same podcast and are counted once.
- Episode lookups work the same way, so polling an episode while you wait for a transcript costs a single lookup.
-
Requests that fail are never counted. A
404for a podcast that does not exist uses none of your allowance. - Allowances reset at the start of each usage period, so the first lookup of a resource in a new period counts again.
Searches and transcript downloads are counted per request — distinct searches are distinct work, so the once-per-period rule does not apply to them.
Raise a monthly limit with usage packs
If your team needs more than its plan includes, add usage packs. Each pack raises one monthly limit, and you can hold up to 10 packs of each kind.
| Limit | One pack adds each month | Price per pack, monthly billing |
|---|---|---|
| Transcript downloads | 500 | $50 a month |
| Podcast lookups | 5,000 | $50 a month |
| Searches | 10,000 | $25 a month |
-
Teams on the Core plan buy packs on the
team billing page
in the app. These teams show
businessin theX-Plan-Tierheader. - Adding packs is charged when you confirm, and the higher limit applies as soon as the payment goes through. Monthly plans pay a full month for the new packs. Quarterly and annual plans pay for the rest of the term.
- Removing packs takes effect at the end of the time you've paid for. You keep the higher limit until then.
-
The new limit shows in
X-RateLimit-LimitandX-RateLimit-Remainingfrom then on.
Core teams aren't blocked at a monthly limit today. Requests over the limit still succeed, and
X-RateLimit-Remaining
reads 0. Add packs when it gets close, so your usage
stays inside what you pay for.
See every plan and pack price on the pricing page.
Per-IP rate limit
On top of the per-plan monthly limits, all API traffic is throttled per IP at the edge:
- 3 requests/second sustained
- Short bursts up to 10 requests are allowed before throttling kicks in
Exceeding the per-IP limit returns
429 Too Many Requests. Spread load across requests
or implement exponential backoff (see below).
Rate Limit Errors
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Monthly limit of 100 search requests exceeded"
}
}
Use the X-RateLimit-Reset header to determine when
you can retry:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const resetTime = response.headers.get('X-RateLimit-Reset');
const waitMs = resetTime
? (parseInt(resetTime) * 1000) - Date.now()
: Math.pow(2, attempt) * 1000; // Exponential backoff
console.log(`Rate limited. Waiting ${waitMs}ms before retry...`);
await new Promise(resolve => setTimeout(resolve, Math.max(waitMs, 1000)));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
} Best Practices
- 1. Monitor remaining requests
- Check the
X-RateLimit-Remainingheader to avoid hitting limits - 2. Implement retry logic - Use exponential backoff when you receive a 429 response
- 3. Cache responses - Store and reuse API responses where appropriate to reduce unnecessary requests
- 4. Batch requests efficiently - Use bulk endpoints where available instead of making many individual requests
- 5. Add packs before you run out - If you regularly need more, raise the limit with usage packs (see above), or contact support to discuss a custom plan
Get started with the API and MCP server
One plan, everything included
- Full Pod Engine web app access
- Full API access — same data, programmatic
- MCP server
- 10,000 searches / mo
- 10,000 podcast and episode lookups / mo
- 1,000 transcripts / mo
- Historical podcast charts
- Contacts, emails, social & YouTube data
- 30 alerts
Available Discounts
We believe great tools should be accessible to everyone building amazing things.
Eligible for a discount? Contact us to learn more.
Bootstrapped Startups
Students & Educators
Nonprofits
Pay Annually
Need Guest Booking, an Agency plan, or higher limits?
See the full pricing page for addons and Agency options, or schedule a call.
Need more than 10,000 searches / mo? Get in touch and we'll tailor a plan.