Rate Limiting & Error Handling Guide
This guide provides comprehensive documentation on rate limiting policies and error handling for the Transcript Downloader API. Understanding these policies will help you build a robust and reliable integration.
Rate Limiting Overview
Our API implements rate limiting to ensure fair usage and maintain service stability for all users. Rate limits are applied at multiple levels to protect both individual endpoints and the overall system.
Global API Rate Limit
| Scope |
Limit |
Window |
Identifier |
| Per User |
120 requests |
1 minute |
User API Token |
| Per IP (unauthenticated) |
120 requests |
1 minute |
IP Address |
📋 Note: Rate limits are applied per authenticated user. If you exceed the limit, you’ll receive a 429 Too Many Requests response.
Endpoint-Specific Rate Limits
Download Endpoints
| Endpoint |
Limit |
Cooldown Period |
Scope |
| Single Transcript Download |
1 request |
5 minutes |
Per video |
| Bulk Transcript Download |
1 request |
5 minutes |
Per channel |
| Single Audio Download |
1 request |
5 minutes |
Per video |
| CSV Export |
1 request |
60 minutes |
Per user |
Authentication Endpoints
| Endpoint |
Limit |
Cooldown Period |
Notes |
| Login |
5 attempts |
30 minutes |
Per email + IP combination |
| Email Verification |
6 requests |
1 minute |
Per user |
| Password Reset |
6 requests |
1 minute |
Per email |
YouTube API Quotas
YouTube API access is subject to daily quota limits to comply with YouTube’s terms of service.
Quota Consumption
| Operation |
Quota Units |
Notes |
| Channel Profile Fetch |
1 unit |
Initial channel lookup |
| Video List (per 50 videos) |
2 units |
Pagination uses additional quota |
| Video Metadata |
1 unit |
Per video info request |
Quota Limits
| Limit Type |
Default Value |
Reset Time |
| Daily Quota |
Configurable per account |
24 hours (midnight UTC) |
⚠️ Important: When your daily quota is exhausted, you’ll receive a 429 error. Quota resets automatically at midnight UTC.
Instagram API Considerations
Instagram content fetching operates asynchronously due to the nature of data retrieval.
Processing Behavior
| Operation |
Typical Duration |
Maximum Wait |
Poll Interval |
| Profile Fetch |
5-30 seconds |
60 minutes |
30 seconds |
| Content Metadata |
5-60 seconds |
60 minutes |
30 seconds |
| Posts/Reels List |
3-60 minutes |
3 hours |
3 minutes (180 seconds) |
| Audio Extraction |
10 seconds - 5 minutes |
15 minutes |
30 seconds |
đź“‹ Technical Details:
- Profile/Content jobs: 120 attempts Ă— 30s = 60 minutes maximum
- List jobs: 60 attempts Ă— 180s = 3 hours maximum
- These intervals are optimized for Instagram’s data retrieval patterns
Polling Recommendations
| Status |
Recommended Action |
Interval |
pending |
Continue polling |
30-60 seconds for profile/content, 60-180 seconds for lists |
success |
Process response |
N/A |
failed |
Check error, retry if applicable |
N/A |
Error Codes Reference
HTTP Status Codes
| Code |
Meaning |
Retryable |
Recommended Action |
| 400 |
Bad Request |
No |
Fix request parameters |
| 401 |
Unauthorized / Insufficient Credits |
No |
Check API key or add credits |
| 403 |
Forbidden |
No |
Check permissions |
| 404 |
Not Found |
No |
Verify resource ID exists |
| 429 |
Too Many Requests |
Yes |
Wait and retry with backoff |
| 500 |
Internal Server Error |
Yes |
Retry with exponential backoff |
| 503 |
Service Unavailable |
Yes |
Wait for maintenance to complete |
Common Error Messages
Authentication Errors
| Error Message |
HTTP Code |
Cause |
Solution |
Invalid API key |
401 |
API key is incorrect or revoked |
Regenerate API key in settings |
Unauthenticated |
401 |
Missing or malformed Authorization header |
Include valid Bearer token |
Balance Errors
| Error Message |
HTTP Code |
Cause |
Solution |
Insufficient credits |
401 |
Account balance too low |
Add funds to your account |
Rate Limit Errors
| Error Message |
HTTP Code |
Cause |
Solution |
Too many requests |
429 |
Rate limit exceeded |
Wait and retry |
Daily usage limit reached |
429 |
YouTube quota exhausted |
Wait 24 hours for reset |
Download again in X minute(s) |
429 |
Download cooldown active |
Wait for cooldown |
Content Errors
| Error Message |
HTTP Code |
Cause |
Solution |
Invalid Instagram URL |
400 |
Malformed or unsupported URL |
Use valid Instagram URL format |
Invalid YouTube URL |
400 |
Malformed or unsupported URL |
Use valid YouTube URL format |
Incorrect media ID or media access restricted |
400 |
Content is private/deleted |
Verify content is publicly accessible |
Item does not exist |
404 |
Resource not found |
Check the ID is correct |
Unable to process. Required metadata unavailable |
500 |
Content cannot be scraped |
Content may be restricted |
Processing Errors
| Error Message |
HTTP Code |
Cause |
Solution |
You already have a pending download |
200 |
Duplicate request |
Use existing download ID |
Failed to fetch profile |
500 |
Service temporarily unavailable |
Retry after a few minutes |
Audio download in progress |
200 |
Prerequisite not complete |
Wait for audio processing |
Retry Strategies
Exponential Backoff
For retryable errors (429, 500, 503), implement exponential backoff with the following recommended values:
- Base delay: 1 second
- Max delay: 60 seconds
- Max attempts: 5
With each failed attempt, double the wait time until reaching the maximum delay.
Polling Best Practices
For asynchronous operations (Instagram content, audio processing), use the recommended polling intervals below. Continue polling while the status is pending, and stop when you receive success or failed.
Polling Intervals by Operation
| Operation Type |
Recommended Interval |
Max Duration |
| Profile Fetch |
30 seconds |
60 minutes |
| Content Metadata |
30 seconds |
60 minutes |
| Posts/Reels List |
60-180 seconds |
6 hours |
| Audio Processing |
30 seconds |
15 minutes |
| Transcription |
15 seconds |
35 minutes |
When approaching or exceeding rate limits, the API returns helpful headers:
| Header |
Description |
X-RateLimit-Limit |
Maximum requests allowed in window |
X-RateLimit-Remaining |
Requests remaining in current window |
Retry-After |
Seconds to wait before retrying (on 429) |
Best Practices Summary
Do’s ✅
- Implement exponential backoff for failed requests
- Cache successful responses to reduce API calls
- Use polling for async operations instead of repeated submissions
- Monitor your quota usage in the dashboard
- Handle all error codes gracefully in your application
Don’ts ❌
- Don’t retry immediately after receiving a 429 error
- Don’t submit duplicate requests for the same content
- Don’t poll more frequently than recommended intervals
- Don’t ignore error responses - they contain useful debugging info
- Don’t hardcode retry limits - make them configurable
All error responses follow a consistent JSON format with an error field containing the error message and a status field set to "error".
Validation errors include a message field with a general description and an errors object containing field-specific validation messages.
Support
If you’re experiencing persistent errors or need assistance with rate limiting issues: