Admaxxer Pixel API — Errors

Every API error response uses the same envelope. The HTTP status line indicates the class; the error.code string gives you a stable identifier you can branch on in client code.

Response Envelope

{
  "error": {
    "code": "insufficient_scope",
    "message": "This endpoint requires the 'pixel:write' scope",
    "details": { "required": "pixel:write", "available": ["pixel:read"] }
  },
  "meta": { "request_id": "req_abc123" }
}

Include the request_id in any support email — it lets us pull your exact request out of the server logs.

Error Codes

HTTPCodeMeaning & Fix
401missing_authorizationNo Authorization header. Add Authorization: Bearer YOUR_KEY.
401invalid_authorization_formatHeader was present but not in Bearer <key> form.
401invalid_api_keyKey does not match any stored hash. Check for trailing whitespace, env vars from the wrong environment, or a pasted hash vs raw key.
401api_key_revokedKey’s revoked_at is set. Create a new one.
401api_key_expiredKey’s expires_at has passed. Create a new one.
403insufficient_scopeKey exists but lacks the scope required for this route. details.required names the scope; add it and rotate.
400invalid_pipeThe pipe path segment was not in the allowlist. See Endpoints.
400invalid_visitorThe /visitors/{id} id was empty after trimming.
400invalid_bodyZod validation failed on POST body. details contains field-level errors.
429rate_limit_exceededCaller exceeded 60 req/minute. Respect the Retry-After header.
503ingest_unavailableTinybird ingest env var is missing on this server. Contact support.
503identify_unavailableIdentify ingest env var is missing. Contact support.
503tinybird_errorDownstream Tinybird config error. Retry after a short backoff.
500internal_errorUnhandled server error. The request_id is your best lead for support.

Retry Strategy

Common Troubleshooting

  1. “Works in dev, 401 in prod.” You deployed the dev key. Keys are environment-scoped because the hash table is different per database.
  2. “403 on every request.” The key exists but has no scopes. Recreate it with explicit scopes from Settings › API Keys.
  3. “JWT expired” from Tinybird. Minted JWTs live for 120 seconds. Re-mint on every request instead of caching.
  4. “Empty data on a fresh website.” Not an error — the pipe returns an empty array until the first pageview. Fire a test event with POST /pixel/events.

Related

Overview · Auth · Endpoints · Rate Limits