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
My data is not showing up
Read the send first: GET /v1/memory/ingest/{ingestionId} returns status, settled, blocked, readiness and failure.
processingmeans at least one item is still waiting in the retry queue.failedmeans at least one item was set aside after repeated failures.completedmeans 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/rootslists 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/requestslists calls, filtered byfrom,to,status,endpoint,keyNameandsearch.GET /v1/memory/requests/histogramcounts 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.