Every endpoint is rate-limited per IP. When you cross a limit the API returns HTTP 429 with Retry-After: 60 and a JSON body that names the limit hit, the recommended retry delay, and a path-aware suggestion (typically: use the bulk download instead of paginating). Honor the header for clean back-off.
| Surface | Path prefix | Limit | Note |
| Tigzig V2 (recommended) |
/v2/* |
60 req/min |
Catalog + indicator + search + series |
| Tigzig V2 downloads |
/v2/download/*, /v2/downloads/* |
10 req/min |
Bulk file serving - downloads are heavy |
| Tremor V1 - indicators |
/tremor/v1/indicators |
30 req/min |
Legacy V1, kept alive for existing integrations |
| Tremor V1 - series |
/tremor/v1/series, /tremor/v1/market_series |
20 req/min |
Data endpoints, tighter limit |
| Tremor V1 - downloads |
/tremor/v1/download/* |
10 req/min |
Same files as V2 downloads |
| Vigil |
/vigil/v1/* |
30 req/min |
NSE corporate signals |
| Vigil downloads |
/vigil/v1/download/* |
10 req/min |
|
| MF NAV |
/mf/v1/* |
50 req/min |
AMFI mutual fund daily NAV |
| MF NAV downloads |
/mf/v1/download |
10 req/min |
Single full-NAV file |
Sample 429 response
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"detail": "Rate limit exceeded",
"limit": "60 per 1 minute",
"retry_after_seconds": 60,
"suggestion": "For multi-indicator or long-history pulls use the bulk download endpoints instead of paginating: GET /v2/download/all (sqlite | duckdb) for the full dataset, or /v2/download/{table}?format= for one table. One request vs many.",
"limits_doc": "https://api.tigzig.com/v2/"
}
Per-call caps (V2 series + indicators endpoints)
- Max 10 indicators per
/v2/series call - pass more by chunking, or hit /v2/download/{table} for the whole table in one file
- Max 10,000 rows per response - reduce the date range, or use a bulk download for full history
- TSV output carries a
# meta: count=N unknown=[...] empty=[...] comment line so the agent can detect typo'd ids in the body
Heavy pulls: use bulk downloads, not pagination
If you need many indicators or long history, do not paginate /v2/series - use bulk downloads instead. One bulk request avoids rate limits entirely and serves you a single file you can query locally.
GET /v2/download/all?format=sqlite (or duckdb) - every public table in one file
GET /v2/download/{table_name}?format=parquet - one table (macro_indicators, stock_prices, or indicator_config)
GET /v2/downloads/manifest - file sizes + last-refresh timestamp
Programmatic consumers: the live numbers are also available at GET https://api.tigzig.com/v2/ under the limits block (per_ip_per_minute, per_ip_downloads_per_minute, max_ids_per_series_call, max_rows_per_response). Read it once at startup; do not hard-code.