Memory API

When something looks wrong

Four reads answer the questions an integration raises: where a send got to, what a memory was built from, what an import will cost, and why a call was refused.

Copy page
View as Markdown

My data is not showing up

Read the send first: GET /v1/memory/ingest/{ingestionId} returns status, settled, blocked, readiness and failure.

  • processing means at least one item is still waiting in the retry queue.
  • failed means at least one item was set aside after repeated failures.
  • completed means every item finished.

readiness counts the whole memory of the user, not only this send: raw is queued with no attempt yet, comprehension is queued with an attempt, consolidation is always 0, and failed is set aside. settled is true when the first three are 0 and failed is 0. blocked is true when the first three are 0 and failed is above 0. failure is null or {code, message} with content-rejected, model-unavailable, index-unavailable or internal. A 404 not-found means the id is not a send of this user.

When a send is stuck, GET /v1/memory/ingest/{ingestionId}/explain answers in one call where the send got to and what to do about it. POST /v1/memory/ingest/{ingestionId}/retry re-runs a send that stopped. A retry is free.

Where did this memory come from

Every result in a recall names its sources. For the full path, the trace reads walk back from a memory to the data points behind it:

  • GET /v1/memory/trace/roots lists the roots.
  • GET /v1/memory/trace/nodes/{id} returns one node.
  • GET /v1/memory/trace/lineage/{rootId} returns what a root was built from.
  • GET /v1/memory/trace/timeline/{rootId} returns the same, in time order.

What will this import cost

POST /v1/memory/ingest/estimate cuts and batches your files without sending them, so you see the batches before any data leaves your side. Harny meters monthly-active end users, not data volume, so an import costs nothing until the people in it use your app. GET /v1/memory/usage reports the month's count as balance.spent and project.credits, and the plan allowance as balance.included.

Why was my send refused

Every response carries an X-Request-Id header. Keep it with the call.

  • GET /v1/memory/requests lists calls, filtered by from, to, status, endpoint, keyName and search.
  • GET /v1/memory/requests/histogram counts calls per time bucket.
  • GET /v1/memory/requests/{requestId} returns one call in full.

A refusal uses the body {"code", "status", "debugMessage", "data"}. Read code and debugMessage first. A per-minute 429 has an empty body and a Retry-After header. Errors lists every code.