{"id":"warm-memory","title":"WARM verifiable agent memory","description":"Persistent memory for AI agents as a pay-per-call API, no database to run. op=remember stores subject-predicate-object facts (or extracts them from free text; only facts whose subject and object appear verbatim are kept); a newer value for the same subject and predicate supersedes the old one, and the history stays queryable. op=recall searches by BM25 keyword ranking or exact triple pattern, now or as of any past date. op=forget deletes the content and leaves a tombstone; op=explain returns provenance and the supersession chain. Every fact has a ToIP SAID and every write returns a hash-chained receipt (signed when the hub has a signing key). Memory is private to the paying wallet (API-key callers pass a tenantId). Limits: 50 facts and 8,000 characters of text per call, 10,000 live facts per tenant. Retrieval is keyword-based, not semantic embeddings.","roi":"Agents that persist what they learned, answer 'what was true on date X', and prove what they stored or forgot, without running their own database.","audience":"agent-infra","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/warm-memory","path":"/api/v1/warm-memory","contentType":"application/json"},"price":{"amount":"0.10","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["op"],"properties":{"op":{"type":"string","enum":["remember","recall","forget","explain"]},"tenantId":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$","description":"Required for API-key callers (namespace as key:<tenantId>; keep it unguessable). Ignored when a wallet paid."},"facts":{"type":"array","maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["subject","predicate","object"],"properties":{"subject":{"type":"string","minLength":1,"maxLength":500},"predicate":{"type":"string","minLength":1,"maxLength":500,"description":"Single-valued slot per subject, e.g. lives_in; a newer fact supersedes the older."},"object":{"type":"string","minLength":1,"maxLength":500},"validFrom":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"validTo":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"source":{"type":"string","maxLength":500}}}},"text":{"type":"string","maxLength":8000,"description":"remember: free text; facts are extracted by a fast model and kept only if subject and object occur verbatim."},"source":{"type":"string","maxLength":500,"description":"remember: provenance label for facts extracted from text."},"query":{"type":"string","maxLength":500},"pattern":{"type":"object","additionalProperties":false,"description":"Exact (case- and whitespace-insensitive) match on any of subject, predicate, object.","properties":{"subject":{"type":"string","minLength":1,"maxLength":500},"predicate":{"type":"string","minLength":1,"maxLength":500},"object":{"type":"string","minLength":1,"maxLength":500}}},"said":{"type":"string","pattern":"^E[A-Za-z0-9_-]{43}$"},"asOf":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"limit":{"type":"integer","minimum":1,"maximum":50},"history":{"type":"string","enum":["current","all"],"description":"recall: only facts current at asOf (default) or every status."}}},"resultSchema":{"type":"object","properties":{"op":{"type":"string"},"tenant":{"type":"string"},"summary":{"type":"string","description":"One line: what happened, e.g. \"Stored 2 new facts, 1 earlier fact superseded.\""},"next":{"type":"string","description":"The most useful follow-up call."},"warnings":{"type":"array","items":{"type":"string"},"description":"Degraded steps, e.g. text extraction unavailable while structured facts were stored."},"remembered":{"type":"array","items":{"type":"object"}},"results":{"type":"array","items":{"type":"object"}},"forgotten":{"type":"array","items":{"type":"object"}},"receipt":{"type":"object","description":"{op, seq, saids, digest, at, prevReceiptDigest, signature?, signer?}"},"deterministic":{"type":"object"}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"op":{"type":"string"},"tenant":{"type":"string"},"summary":{"type":"string","description":"One line: what happened, e.g. \"Stored 2 new facts, 1 earlier fact superseded.\""},"next":{"type":"string","description":"The most useful follow-up call."},"warnings":{"type":"array","items":{"type":"string"},"description":"Degraded steps, e.g. text extraction unavailable while structured facts were stored."},"remembered":{"type":"array","items":{"type":"object"}},"results":{"type":"array","items":{"type":"object"}},"forgotten":{"type":"array","items":{"type":"object"}},"receipt":{"type":"object","description":"{op, seq, saids, digest, at, prevReceiptDigest, signature?, signer?}"},"deterministic":{"type":"object"}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"op":"remember","facts":[{"subject":"alice","predicate":"lives_in","object":"Paris","validFrom":"2020-01-01"},{"subject":"alice","predicate":"lives_in","object":"Berlin","validFrom":"2025-01-01"}]},"openapiOperation":{"operationId":"warm_memory","summary":"WARM verifiable agent memory","description":"Persistent memory for AI agents as a pay-per-call API, no database to run. op=remember stores subject-predicate-object facts (or extracts them from free text; only facts whose subject and object appear verbatim are kept); a newer value for the same subject and predicate supersedes the old one, and the history stays queryable. op=recall searches by BM25 keyword ranking or exact triple pattern, now or as of any past date. op=forget deletes the content and leaves a tombstone; op=explain returns provenance and the supersession chain. Every fact has a ToIP SAID and every write returns a hash-chained receipt (signed when the hub has a signing key). Memory is private to the paying wallet (API-key callers pass a tenantId). Limits: 50 facts and 8,000 characters of text per call, 10,000 live facts per tenant. Retrieval is keyword-based, not semantic embeddings.\n\nPrice: 0.10 USDC on Base (x402).","x-x402-price-usdc":"0.10","x-x402-amount":"100000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.10"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/warm-memory","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["op"],"properties":{"op":{"type":"string","enum":["remember","recall","forget","explain"]},"tenantId":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$","description":"Required for API-key callers (namespace as key:<tenantId>; keep it unguessable). Ignored when a wallet paid."},"facts":{"type":"array","maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["subject","predicate","object"],"properties":{"subject":{"type":"string","minLength":1,"maxLength":500},"predicate":{"type":"string","minLength":1,"maxLength":500,"description":"Single-valued slot per subject, e.g. lives_in; a newer fact supersedes the older."},"object":{"type":"string","minLength":1,"maxLength":500},"validFrom":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"validTo":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"source":{"type":"string","maxLength":500}}}},"text":{"type":"string","maxLength":8000,"description":"remember: free text; facts are extracted by a fast model and kept only if subject and object occur verbatim."},"source":{"type":"string","maxLength":500,"description":"remember: provenance label for facts extracted from text."},"query":{"type":"string","maxLength":500},"pattern":{"type":"object","additionalProperties":false,"description":"Exact (case- and whitespace-insensitive) match on any of subject, predicate, object.","properties":{"subject":{"type":"string","minLength":1,"maxLength":500},"predicate":{"type":"string","minLength":1,"maxLength":500},"object":{"type":"string","minLength":1,"maxLength":500}}},"said":{"type":"string","pattern":"^E[A-Za-z0-9_-]{43}$"},"asOf":{"anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","maxLength":40}],"description":"Epoch milliseconds or an ISO 8601 date/time (UTC when no offset)."},"limit":{"type":"integer","minimum":1,"maximum":50},"history":{"type":"string","enum":["current","all"],"description":"recall: only facts current at asOf (default) or every status."}}},"example":{"op":"remember","facts":[{"subject":"alice","predicate":"lives_in","object":"Paris","validFrom":"2020-01-01"},{"subject":"alice","predicate":"lives_in","object":"Berlin","validFrom":"2025-01-01"}]}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"op":{"type":"string"},"tenant":{"type":"string"},"summary":{"type":"string","description":"One line: what happened, e.g. \"Stored 2 new facts, 1 earlier fact superseded.\""},"next":{"type":"string","description":"The most useful follow-up call."},"warnings":{"type":"array","items":{"type":"string"},"description":"Degraded steps, e.g. text extraction unavailable while structured facts were stored."},"remembered":{"type":"array","items":{"type":"object"}},"results":{"type":"array","items":{"type":"object"}},"forgotten":{"type":"array","items":{"type":"object"}},"receipt":{"type":"object","description":"{op, seq, saids, digest, at, prevReceiptDigest, signature?, signer?}"},"deterministic":{"type":"object"}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/warm-memory/","docsJson":"https://agents.writerslogic.com/docs/warm-memory.json","sample":"https://agents.writerslogic.com/api/v1/samples/warm-memory","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}