PelekaPeleka Developers

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

StatusMeaningTypical cause
400Bad requestMalformed JSON, missing required field
401UnauthorizedMissing or invalid API key
403ForbiddenValid key, wrong scope (read key on a write call)
404Not foundResource doesn't exist, or belongs to a different workspace
409ConflictDuplicate resource: creating a contact with an email that already exists
422UnprocessableField present but invalid: bad email format, tag that doesn't exist
429Too many requestsRate limit exceeded
500Server errorSomething 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.

On this page