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

Seguridad Nunca expongas tu API Key en código frontend o repositorios públicos. Usala solo en backend o en variables de entorno.

Memorias

POST /v1/memory

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ámetroTipoDescripción
summary*stringTexto de la memoria. El único campo obligatorio
projectstringProyecto al que vincularla. Opcional: sin esto, los tags se infieren de las palabras clave de tus proyectos
tagsstring[]Tags para organización (máximo 10)
platformstringEtiqueta de origen: manual, extension, mcp, api. Por defecto api
categorystringDECISION, LEARNING, INTERACTION, STATE, ERROR, MILESTONE o CUSTOM. Por defecto CUSTOM
importancenumberDe 1 a 10, acotado a ese rango. Por defecto 5
GET /v1/memories/list

Lista memorias con filtros opcionales.

ParámetroTipoDescripción
projectstringFiltrar por proyecto
tagsstringFiltrar por tags (separados por coma)
searchstringBúsqueda en contenido
limitnumberCantidad máxima (default: 20)
offsetnumberPaginación
GET /v1/memories/search

Búsqueda semántica por contenido, tags, proyecto o rango de fechas.

Proyectos

GET /v1/projects

Lista todos los proyectos del usuario.

GET /v1/project/:name/state

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.

GET /v1/project/:name/inject

El Brain del proyecto como texto listo para pegar en un chat, ordenado por relevancia y recortado a un presupuesto de caracteres. Gratis.

ParámetroTipoDescripción
budgetnumberMá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
langstringen (por defecto) o es: el idioma de los títulos. Los ítems se devuelven como se escribieron
sincenumberVersión contra la que se calcula la sección "qué cambió". Por defecto, la versión anterior
taskstringEl 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
levelstringpublic (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).

Público por defecto, completo solo con la aprobación del dueño En el nivel 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.
GET /v1/project/:name/inject/log

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

POST /v1/inject

Obtiene memorias relevantes formateadas para inyección en un prompt.

ParámetroTipoDescripción
memory_ids*number[]Tus números de memoria (#N), de 1 a 50. Las archivadas y en cuarentena se excluyen solas
project_filterstringEtiqueta de proyecto opcional que queda registrada con la inyección
target_platformstringEtiqueta de destino opcional (chatgpt, claude, gemini...)
optimisticbooleanDevolver 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

GET /v1/project/:name/state/anchor

Verifica el ancla on-chain del estado de un proyecto. Endpoint público, no requiere autenticación.

ParámetroTipoDescripción
versionnumberVersió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"
  }
}
Verificación independiente Cualquier persona puede verificar el estado llamando a este endpoint y comparando el state_hash con el registrado en el contrato on-chain. No necesita cuenta ni API key.

Códigos de error

CódigoSignificadoSolución
401API Key inválida o ausenteVerificá tu header x-api-key
402insufficient_aic — saldo insuficiente para una operación pagaLa respuesta incluye balance_aic, required_aic y faucet_url. Cargá en el faucet
403Sin permisos para este recursoVerificá que el proyecto te pertenece
404Recurso no encontradoVerificá el nombre del proyecto o ID
422evidence_unresolved — una memoria citada no existe, no es tuya o todavía no está ancladaEsperá ~30 s al anclaje o corregí los números de memoria. No se escribió ni se cobró nada
429Demasiadas peticiones desde tu IPEsperá 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)
429key_creation_limit — POST /v1/keysComo máximo 3 claves nuevas por IP y 100 en total cada 24 horas. La respuesta incluye retry_after_seconds
500Error internoReintentá. 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ónExtensiónMCPAPI 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
Paridad total de la API Todas las funciones de esta tabla se pueden usar desde la API REST. Las brechas que quedan están del lado de la Extensión: no sella memorias, y su búsqueda es un filtro local sobre la lista, no la búsqueda semántica. Las dos están disponibles por el servidor MCP y por la API.

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.

POST /v1/memories/:id/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.

GET /v1/memory/:id/forensics

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ó.

POST /v1/project/:name/state/rollback

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.