Rate limits & errors
Request limits and what to expect when a call fails.
Rate limits
The default limit is 100 requests per minute, tracked per IP address. It applies globally across endpoints: there's no separate budget for reads versus writes, and no per-endpoint override right now.
Go over the limit and you'll get a 429:
{
"type": "https://peleka.io/errors/429",
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded",
"instance": "/api/v1/contacts"
}There's no Retry-After header on this response yet, so back off with a fixed interval (a couple of seconds is enough for a normal integration) rather than retrying immediately in a loop. If your integration is syncing a large batch of contacts, batch endpoints exist for this reason: use them instead of looping single-record calls, both to stay under the limit and because they're just faster.
Error format
Every error, regardless of status code, follows RFC 7807:
{
"type": "https://peleka.io/errors/{status}",
"title": "Short, human-readable summary",
"status": 422,
"detail": "What specifically went wrong",
"instance": "/api/v1/contacts"
}type is a stable URL you can match against in code. It won't change even if the wording of title or detail does. Some errors add extra fields alongside these four (a validation error might include a fields array pointing at which inputs failed); anything beyond the base four is endpoint-specific, so check the reference page for the endpoint you're calling.
Status codes you'll actually see
| Status | Meaning | Typical cause |
|---|---|---|
400 | Bad request | Malformed JSON, missing required field |
401 | Unauthorized | Missing or invalid API key |
403 | Forbidden | Valid key, wrong scope (read key on a write call) |
404 | Not found | Resource doesn't exist, or belongs to a different workspace |
409 | Conflict | Duplicate resource: creating a contact with an email that already exists |
422 | Unprocessable | Field present but invalid: bad email format, tag that doesn't exist |
429 | Too many requests | Rate limit exceeded |
500 | Server error | Something broke on our end — retry with backoff, and if it persists, get in touch |
A 409 on contact creation is worth planning around explicitly: Peleka doesn't silently upsert on duplicate email. See Syncing contacts for the create-then-update pattern this implies.