API REST
Contrato legible por máquinas: OpenAPI 3.1. Orientación para LLMs: api.chainmemory.ai/llms.txt.
Autenticación
Todas las llamadas a la API requieren autenticación mediante API Key en el header:
HTTP
x-api-key: tu-api-key
Base URL: https://api.chainmemory.ai/v1
Memorias
Crea una nueva memoria.
bash
curl -X POST https://api.chainmemory.ai/v1/memory \
-H "x-api-key: tu-api-key" \
-H "Content-Type: application/json" \
-d '{
"summary": "Decidimos usar PostgreSQL en vez de MongoDB",
"category": "decision",
"importance": 8,
"platform": "manual"
}'
javascript
const res = await fetch('https://api.chainmemory.ai/v1/memory', {
method: 'POST',
headers: {
'x-api-key': 'tu-api-key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
summary: 'Decidimos usar PostgreSQL en vez de MongoDB',
category: 'decision',
importance: 8,
platform: 'api'
})
});
const memory = await res.json();
// { id: 207, hash: '0x4f2a...', memory_number: 42 }
python
import requests
res = requests.post(
'https://api.chainmemory.ai/v1/memory',
headers={'x-api-key': 'tu-api-key'},
json={
'summary': 'Decidimos usar PostgreSQL en vez de MongoDB',
'category': 'decision',
'importance': 8,
'platform': 'api'
}
)
memory = res.json()
# {'id': 207, 'hash': '0x4f2a...', 'memory_number': 42}
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
| summary* | string | Texto de la memoria. El único campo obligatorio |
| project | string | Proyecto al que vincularla. Opcional: sin esto, los tags se infieren de las palabras clave de tus proyectos |
| tags | string[] | Tags para organización (máximo 10) |
| platform | string | Etiqueta de origen: manual, extension, mcp, api. Por defecto api |
| category | string | DECISION, LEARNING, INTERACTION, STATE, ERROR, MILESTONE o CUSTOM. Por defecto CUSTOM |
| importance | number | De 1 a 10, acotado a ese rango. Por defecto 5 |
Lista memorias con filtros opcionales.
| Parámetro | Tipo | Descripción |
|---|---|---|
| project | string | Filtrar por proyecto |
| tags | string | Filtrar por tags (separados por coma) |
| search | string | Búsqueda en contenido |
| limit | number | Cantidad máxima (default: 20) |
| offset | number | Paginación |
Búsqueda semántica por contenido, tags, proyecto o rango de fechas.
Proyectos
Lista todos los proyectos del usuario.
Obtiene el estado consolidado del proyecto (decisiones, hitos, riesgos, prioridades, preguntas abiertas, entorno).
Respuesta (recortada)
{
"project": "sistema-pagos",
"schema_version": 2,
"version": 4,
"state_hash": "0x3f8c2a…e91d",
"generated_at": "2026-09-13T22:02:35.000Z",
"anchor": { "status": "anchored", "onchain_anchor_id": 12, "tx_hash": "0x…", "block_number": 681919 },
"state": {
"phase": "beta",
"current_focus": "Revisión PCI antes de abrir a los primeros tenants",
"decisions": [
{ "id": "dec_0002", "title": "PostgreSQL con RLS para multi-tenancy",
"statement": "La seguridad por fila saca el filtrado por tenant de la capa de aplicación",
"status": "confirmed", "superseded_by": null,
"evidence_root": "0x9a41…c07e", "created_version": 2, "updated_version": 3 }
],
"milestones": [
{ "id": "mil_0001", "title": "Schema de BD", "status": "done",
"evidence_root": "0x5b2d…81fa", "created_version": 1, "updated_version": 2 }
],
"risks": [
{ "id": "risk_0001", "title": "Performance de RLS con 100K tenants", "severity": "med", "status": "open",
"evidence_root": "0xd7e0…2a19", "created_version": 3, "updated_version": 3 }
],
"state_meta": { "version": 4, "consolidated_until_event": 150, "previous_state_hash": "0x7b2e…f4c0" }
}
}
Siempre la versión más reciente; requiere la API key del dueño. Los valores de severidad son low, med y high.
El Brain del proyecto como texto listo para pegar en un chat, ordenado por relevancia y recortado a un presupuesto de caracteres. Gratis.
| Parámetro | Tipo | Descripción |
|---|---|---|
| budget | number | Máximo de caracteres, de 1.000 a 50.000 (7.000 por defecto). Las secciones más relevantes se mantienen enteras; el resto se acorta para entrar |
| lang | string | en (por defecto) o es: el idioma de los títulos. Los ítems se devuelven como se escribieron |
| since | number | Versión contra la que se calcula la sección "qué cambió". Por defecto, la versión anterior |
| task | string | El id de una prioridad, como pri_0015. Devuelve todo lo necesario para trabajar en esa prioridad en lugar del panorama: la prioridad completa con su criterio de cumplimiento, los riesgos que mitiga, lo demás que la menciona, y cada regla de trabajo y restricción |
| level | string | public (por defecto) o full. Ver abajo |
Respuesta (recortada)
{
"project": "payment-system",
"version": 4,
"state_hash": "0x3f8c2a…e91d",
"level": "public",
"budget": 7000,
"lang": "es",
"since": 3,
"length": 2841,
"text": "[ChainMemory · Project State: payment-system v4]
…"
}
Con task, la respuesta trae task en lugar de since. Siempre la versión más reciente; requiere la clave del dueño o una clave de organización con acceso al proyecto (una clave de proyecto solo lee su propio proyecto).
public, las direcciones, puertos, rutas de servidor y reglas de seguridad se reemplazan por [withheld] y se cuentan, así que el texto es seguro para pegar en cualquier chat. Cómo se resguardan los AIC de un proyecto no se incluye nunca, en ningún nivel. El nivel full agrega lo reservado; solo se sirve a la clave personal del dueño (una clave de organización recibe 403), y cada pedido queda registrado con una huella de la clave, el proyecto, la versión, la tarea, el cliente y la cantidad de líneas sensibles. Su respuesta agrega sensitive_lines: exactamente las líneas que el nivel público habría reservado, para que el cliente se las muestre al dueño antes de pegar nada. Si el registro no se puede escribir, el nivel completo no se sirve (503). Mandá el header x-cm-client para que tu cliente figure con su nombre en ese registro.
Los últimos 100 pedidos de nivel completo de este proyecto: versión, tarea, cliente, cantidad de líneas sensibles y fecha. Solo con la clave del dueño.
Inyección
Obtiene memorias relevantes formateadas para inyección en un prompt.
| Parámetro | Tipo | Descripción |
|---|---|---|
| memory_ids* | number[] | Tus números de memoria (#N), de 1 a 50. Las archivadas y en cuarentena se excluyen solas |
| project_filter | string | Etiqueta de proyecto opcional que queda registrada con la inyección |
| target_platform | string | Etiqueta de destino opcional (chatgpt, claude, gemini...) |
| optimistic | boolean | Devolver el texto enseguida y confirmar el pago on-chain en segundo plano |
Respuesta
El endpoint devuelve las memorias seleccionadas formateadas para inyección. Cada memoria llega con su número visible para el usuario y una referencia de verificación, de modo que una IA puede citar la memoria exacta detrás de cualquier afirmación — y vos podés rastrear esa cita hasta su evidencia on-chain. Una afirmación deja de ser "confiá en mí" y pasa a ser "acá está la memoria, verificala vos mismo."
Verificación
Verifica el ancla on-chain del estado de un proyecto. Endpoint público, no requiere autenticación.
| Parámetro | Tipo | Descripción |
|---|---|---|
| version | number | Versión específica (default: última) |
Respuesta
{
"project": "chainmemory",
"projectId": "0x77f7d980...",
"version": 3,
"state_hash": "a7b3c9f2...",
"anchor": {
"status": "anchored",
"tx_hash": "0xce55a800a2a4e30b...",
"block_number": 123539,
"contract": "0xa7A8BA51950255b3e223a6745597C67009Fe7875"
}
}
state_hash con el registrado en el contrato on-chain. No necesita cuenta ni API key.
Códigos de error
| Código | Significado | Solución |
|---|---|---|
| 401 | API Key inválida o ausente | Verificá tu header x-api-key |
| 402 | insufficient_aic — saldo insuficiente para una operación paga | La respuesta incluye balance_aic, required_aic y faucet_url. Cargá en el faucet |
| 403 | Sin permisos para este recurso | Verificá que el proyecto te pertenece |
| 404 | Recurso no encontrado | Verificá el nombre del proyecto o ID |
| 422 | evidence_unresolved — una memoria citada no existe, no es tuya o todavía no está anclada | Esperá ~30 s al anclaje o corregí los números de memoria. No se escribió ni se cobró nada |
| 429 | Demasiadas peticiones desde tu IP | Esperá y reintentá. El único límite aplicado hoy es 30 peticiones por segundo por IP en el proxy; los requests por minuto por plan todavía no se aplican (ver Límites) |
| 429 | key_creation_limit — POST /v1/keys | Como máximo 3 claves nuevas por IP y 100 en total cada 24 horas. La respuesta incluye retry_after_seconds |
| 500 | Error interno | Reintentá. Si persiste, contactá soporte |
Equivalencia de funciones: Extensión ↔ MCP ↔ API
No todas las funciones están disponibles en todos los métodos de integración. Esta tabla muestra qué hay disponible dónde:
| Función | Extensión | MCP | API REST |
|---|---|---|---|
| Guardar memoria | ✓ 1-clic | ✓ chainmemory_remember | ✓ POST /v1/memory |
| Recordar memorias | ✓ Lista | ✓ chainmemory_recall | ✓ GET /v1/memories/list |
| Buscar memorias | ~ Filtro básico | ✓ search_memories | ✓ GET /v1/memories/search |
| Inyectar contexto | ✓ Auto-inyección | ✓ inject_memories | ✓ POST /v1/inject |
| Resumen del Brain (panorama o una tarea) | ✓ Inject project state | ✓ get_project_brief | ✓ GET /v1/project/:name/inject |
| Project State completo (JSON) | ✗ No disponible | ✓ get_project_state | ✓ GET /v1/project/:name/state |
| Seal (anclar on-chain) | ✗ No disponible | ✓ chainmemory_seal | ✓ POST /v1/seal/:id |
| Estadísticas de cuenta | ✓ Dashboard | ✓ chainmemory_stats | ✓ GET /v1/stats |
| Info de perfil | ✓ Configuración | ✓ chainmemory_profile | ✓ GET /v1/profile |
| Listar proyectos | ✓ Selector | ✓ list_projects | ✓ GET /v1/projects |
| Crear proyecto | ✓ New Project | ✓ create_project | ✓ POST /v1/projects |
| Verificar ancla | ~ Vía Explorer | ✓ verify_project_state, get_memory_proof | ✓ GET /v1/project/:name/state/anchor |
| Archivar memoria | ✓ | ✓ archive_memory | ✓ POST /v1/memories/:id/archive |
| Actualizar tags | ✓ | ✓ update_memory_tags | ✓ PUT /v1/memories/:id/tags |
Confianza y Gobierno
Cada memoria lleva un estado de confianza desde el momento en que se escribe: trusted, tentative (marcada al escribirse por reglas de evaluación deterministas), o quarantined (condenada por el dueño). Las tentative siempre se entregan marcadas — el agente ve la marca y decide. Las quarantined se excluyen de context, inject, quotes y consultas al oracle, mientras su huella on-chain permanece como evidencia inmutable. Todas las respuestas de lectura incluyen el campo trust.
Gobernar el estado de confianza de una memoria. Solo el dueño.
bash
curl -X POST https://api.chainmemory.ai/v1/memories/487/trust \
-H "x-api-key: tu-api-key" \
-H "Content-Type: application/json" \
-d '{"action": "quarantine"}'
Acciones: approve → trusted · quarantine → quarantined · tentative → tentative. La respuesta incluye el estado anterior para auditoría.
Biografía completa de una memoria como línea de tiempo ordenada. Solo el dueño.
bash
curl https://api.chainmemory.ai/v1/memory/485/forensics \
-H "x-api-key: tu-api-key"
Eventos: born, trust, batched, checkpoint_anchored, recalled (cada lectura, con endpoint y consulta), injected (cada entrega, con plataforma destino), cited_as_evidence (ítems del Project Brain que citan esta memoria). Incluye contadores con verificación cruzada y prueba de anclaje on-chain. Responde la pregunta forense: qué memoria causó qué, cuándo entró, quién la leyó y a dónde llegó.
Restaurar el estado de un proyecto a una versión anterior, de forma verificable. Fee: 0.1 AIC
bash
curl -X POST https://api.chainmemory.ai/v1/project/miproyecto/state/rollback \
-H "x-api-key: tu-api-key" \
-H "Content-Type: application/json" \
-d '{"to_version": 35}'
Restauración append-only: volver a la versión N jamás borra nada — crea una versión nueva cuyo contenido es byte-idéntico a N. Como los hashes se computan sobre bytes canónicos, el hash de la versión nueva es igual al ya anclado on-chain para N: la fidelidad de la restauración es un hecho matemático, no una promesa. Antes de restaurar, el servidor recomputa el hash del contenido almacenado y se niega (HTTP 409) si no coincide — la corrupción nunca puede restaurarse. La historia jamás se muta.