Credits and rate limits
How IGramAPI credits work, what each endpoint costs, when credits renew, the per-minute rate limit for each plan, and the headers that report both.
Two things limit your usage: credits (how much you can use per month) and the rate limit (how fast you can call per minute).
Credits
Each successful request costs credits, depending on the endpoint.
| Endpoint | Credits | Plans |
|---|---|---|
| Profile, profile picture, posts, reels | 1 | All |
Post and reel data (/v1/media) |
1 | All |
| Search, audio | 1 | All |
| Comments | 2 | All |
| Stories, highlights, hashtag feed | 3 | Paid |
| Downloader: image or MP3 | 1 | All |
| Downloader: video | 2 | All |
| Downloader: merged HD video | 5 | All |
Failed requests are free. Any response with a status of 400 or above (a missing profile, an invalid parameter, a temporary failure) is refunded automatically.
When credits renew
- On the Free plan, credits renew at the start of every calendar month (UTC).
- On paid plans, credits renew with your billing period.
Unused credits do not roll over.
Running out
When credits are used up, requests return HTTP 402 with the code quota_exceeded. The details object says how many credits you have and when they reset:
{
"error": {
"code": "quota_exceeded",
"message": "Your credits for this billing period are used up. Upgrade your plan to continue.",
"request_id": "req_8c2f9d4e1a7b3c50",
"details": { "credits_limit": 100, "credits_used": 100, "resets_at": "2026-12-01T00:00:00+00:00" }
}
}
Rate limits
The rate limit is the number of requests per minute your account can make, across all of its keys.
| Plan | Requests per minute |
|---|---|
| Free | 30 |
| Starter | 120 |
| Pro | 200 |
| Ultra | 350 |
| Mega | 500 |
Go over it and you receive HTTP 429 with the code rate_limit_exceeded and a Retry-After header with the number of seconds to wait.
Response headers
Every successful response includes:
| Header | Meaning |
|---|---|
X-Credits-Limit |
Credits in your plan for this period. |
X-Credits-Remaining |
Credits left. |
X-Credits-Charged |
Credits this request used. |
X-RateLimit-Limit |
Requests allowed per minute. |
X-RateLimit-Remaining |
Requests left in the current window. |
X-RateLimit-Reset |
Seconds until you can send more. |
Backing off correctly
import time
import requests
def get(url, key, retries=3):
for attempt in range(retries):
r = requests.get(url, headers={"Authorization": f"Bearer {key}"}, timeout=30)
if r.status_code == 429:
time.sleep(int(r.headers.get("Retry-After", "5")))
continue
return r
return r
Do not retry a 402 (credits are gone) or a 4xx caused by your input. Retry 429, 502 and 503 with a pause.
Something unclear or missing? Tell us and we will fix the page.