Limits
Simplo API rate limits — 60 calls per minute per company on API-key billing, 120 per minute on MCP/agent tools, and how to handle them.
Rate limits
Section titled “Rate limits”Two separate budgets, both per company:
| Surface | Limit |
|---|---|
API-key billing (/api/v1/billing/* with X-Api-Key) |
60 calls/min |
MCP and agent tools (POST /api/v1/mcp, agent:read keys / OAuth) |
120 calls/min |
When you exceed a limit, the API responds 429 with the Retry-After
header. The two budgets don’t mix: your emission backend doesn’t compete
with your MCP-connected agents.
Two details of the key-surface budget that matter in real integrations:
- The limit is per company, not per key: every key of the same company shares the 60/min. If you run N systems with N keys, they split the same budget.
- Maximum payload 2 MiB on
POST /billing/dte(~1 MiB on other routes). Over the limit the API responds413with the standard JSON envelope (code: PAYLOAD_TOO_LARGE) — reduce the document size (fewerdetallelines or shorter glosas) and retry. Verified live: until 2026-09 this used to be a502with an HTML page from the CDN; not anymore.
How to handle it
Section titled “How to handle it”-
The SDK automatically retries
429s with exponential backoff and jitter, respecting theRetry-Afterheader. If the limit persists, you get aRateLimitErrorwithretryAfter:import { RateLimitError } from '@simplohq/sdk';try {await simplo.dtes.list();} catch (error) {if (error instanceof RateLimitError) {console.error(`Rate limited. Retry in ${error.retryAfter ?? '?'}s`);}} -
Batch work should pace itself instead of relying on retries: queue and space out calls — at 60/min per company, a large emission batch needs its own pacing.
-
Agents connected via MCP have their own budget (120/min) — they don’t compete with your emission backend.
Pagination limits
Section titled “Pagination limits”limit on list endpoints ranges from 1 to 100 items per page (default 20) —
see Pagination.
Related
Section titled “Related”- Errors —
RateLimitErrorand the retry rules