--- title: "Errors" description: "Every refusal uses a JSON body with code, status, debugMessage, and optional data, except the per-minute limit, which answers with no body." canonical: https://past.dev/docs/memory-api/errors last-updated: 2026-10-09 --- # Errors > Every refusal uses a JSON body with code, status, debugMessage, and optional data, except the per-minute limit, which answers with no body. Product: past.dev Memory API. Source: https://past.dev/docs/memory-api/errors ```400badrequest { "code": "content-required", "status": 400, "debugMessage": "Content is required", "data": null } ``` | Response | When | | --- | --- | | **400** (content-required) | A single send or one batch item has empty content. | | **400** (invalid-ingestion) | The send or batch shape is invalid, including an empty batch, duplicate source ids, or more than 1,000 items. | | **400** (audience-unknown) | The requested audience slug does not exist in the project. | | **400** (audience-ids-unsupported) | The retired integer-array audience form was sent instead of a slug. | | **400** (audience-slug-invalid) | The slug is outside 2 to 40 lowercase letters, digits and dashes with a letter or digit at each end. | | **400** (audience-slug-reserved) | The slug `project` was sent to a replace, delete or recompute. | | **400** (audience-name-invalid) | The audience name is empty or over 200 characters. | | **400** (audience-kind-invalid) | `kind` is neither `fixed` nor `rule`. | | **400** (audience-identities-required / audience-rule-required) | A `fixed` audience was sent without `identities`, or a `rule` audience without `rule`. | | **400** (audience-kind-mismatch) | `identities` was sent with `kind: rule`, or `rule` with `kind: fixed`. | | **400** (audience-kind-switch-invalid) | A replace changes the kind without the definition of the new kind. | | **400** (audience-rule-invalid) | A rule has no condition or more than 20, an unknown operator, the wrong number of values, or a blank value. | | **400** (identity-invalid) | An identity or trait does not satisfy its wire constraints. | | **400** (traits-invalid) | A trait value is neither a string nor null. | | **400** (identity-required) | Recall omitted `identity`. | | **400** (recall-query-required) | Recall omitted a non-empty `query`. | | **400** (recall-sort-invalid) | Recall `sort` is neither `relevance` nor `chronological`. | | **400** (recall-range-invalid) | Recall `occurredFrom` is after `occurredTo`. | | **400** (recall-level-invalid) | Recall `level` is not `low`, `medium`, `high` or `extra-high`. | | **400** (recall-level-conflict) | Recall sent both `level` and `maxTokens`. | | **400** (recall-budget-invalid) | Recall `maxTokens` is not a positive number. | | **400** (invalid-deletion) | A deletion names no id or more than 1,000 ids. | | **400** (bulk-empty / bulk-too-large / bulk-invalid-rows) | An identity bulk request is empty, over 1,000 rows, or contains malformed rows. | | **400** (project-required) | A management key called an identity route without `?project=`, or an agent token was sent without `X-Past-Project` in an organization with two or more live projects. | | **400** (project-mismatch) | A project key called an identity route with a `?project=` that names another project. | | **400** (project-name-invalid) | The project name is empty, over 255 characters, or has fewer than two letters or digits. | | **400** (key-name-invalid) | The key name is empty or over 64 characters. | | **401** (missing-api-key) | No `Authorization` header, or `Bearer` with no value. | | **401** (malformed-api-key) | The header does not read `Bearer `, or the bearer is not a past key. `debugMessage` says which. An agent token on a route that accepts keys only returns this code too. | | **401** (unauthorized) | The key is unknown, expired or revoked, or of the kind this route refuses. An agent token that is invalid or expired returns this code too. | | **402** (out-of-credits) | The organization's credits are spent. Sends stop on every plan, and recalls stop too on Pay as you go, which charges for them. Do not retry. | | **402** (webhooks-not-included) | A webhook received an event, and the plan of the organization does not include webhooks. | | **402** (project-limit-reached) | The plan's projects are all in use, archived projects included. Delete a project or upgrade the plan. | | **403** (project-archived) | The project of the key, or the project that an agent token names, is archived. Unarchive it in the console to resume. | | **403** (insufficient-scope) | The agent token does not carry the scope of the route: `memory:read` or `memory:write`. | | **400** (range-too-wide) | A request or timeline window is wider than 31 days. | | **400** (invalid-range) | A request or timeline window starts after it ends. | | **400** (invalid-reveal) | A lineage `reveal` is not `:inputs` or `:outputs`. | | **400** (invalid-estimate) | An estimate sent both `files` and `items`, or neither, or carries more than 10,000 files, a repeated path or a repeated source id. | | **400** (invalid-kind) | An estimate names a kind that is not `email`, `chat`, `transcript`, `table`, `records`, `code`, `documentation` or `notes`. | | **400** (invalid-points) | An estimate's `points` is not `none`, `summary` or `full`. | | **400** (invalid-time-zone) | An estimate's `timeZone` is not an IANA name such as `Europe/Paris`. | | **404** (not-found) | The requested ingestion, request, memory, source, identity, audience, project or key does not exist in the project. A webhook URL with a wrong id or token returns this code too. | | **404** (project-not-found) | The slug in `X-Past-Project` names no live project of the organization, or the organization has no live project. | | **404** (data-point-not-found) | A deletion names an id with no accepted, undeleted data point in the project. Nothing is deleted. | | **409** (idempotency-conflict) | The same idempotency key was used with another body. | | **409** (ingestion-not-stopped) | A retry named a send that has not stopped. It is left as it was. | | **409** (conflict) | An identity bulk request raced a concurrent write. Nothing was applied; retry the batch. | | **409** (audience-slug-taken) | Two creates raced on the same slug. Send the request again. | | **409** (webhook-paused) | The webhook is paused. Events sent during the pause are not kept. | | **413** (content-too-large) | The content of one request exceeds 16 MiB of UTF-8, a single send included. Split it into smaller requests. | | **413** (webhook-body-too-large) | The body of a webhook event is larger than 1 MiB. | | **429** (project-cap-reached) | The project's monthly cap, set in the console, is reached. | | **429** (spend-cap-reached) | The account's spend cap for the billing period is reached. Priced calls resume when the period resets or the cap is raised. | | **429** (no body) | The plan's requests per minute are exceeded for this key, or one webhook is past its limit of 600 events in one minute. This refusal carries no JSON body. Wait and retry. | | **503** (organization-not-ready) | The organization database is not ready. Retry within minutes. | | **503** (pipeline-disabled) | Background ingestion is disabled on the deployment. | Match application behavior on `code` and `status`. `debugMessage` is explanatory text and may change; a batch refusal names the item in it. `data` contains structured details only when the refusal provides them. On the managed service, a `401` also carries a `WWW-Authenticate` header that names the resource metadata for agent tokens. Every refusal also carries the `X-Request-Id` header. Quote it to support@past.dev when you report a problem, and find the call under it on the console's Requests screen.