API REST

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, stack).

Respuesta
{
  "project": "chainmemory",
  "version": 3,
  "state": {
    "context": {
      "summary": "Plataforma de memoria IA con verificación blockchain",
      "goals": ["Memoria persistente cross-model", "Pista de auditoría criptográfica"]
    },
    "decisions": [
      {
        "id": "d001",
        "title": "Usar Clique PoA",
        "statement": "Consenso PoA para blockchain soberana",
        "status": "confirmed",
        "evidence": ["#12", "#45"]
      }
    ],
    "milestones": [
      {
        "id": "m001",
        "title": "MVP API desplegado",
        "status": "completed",
        "date": "2026-04-15",
        "evidence": ["#5", "#18"]
      }
    ],
    "risks": [
      {
        "id": "r001",
        "title": "Latencia del motor de consolidación a escala",
        "severity": "medium",
        "status": "open",
        "mitigation": "Evaluar modelos más grandes al escalar infra",
        "evidence": ["#33"]
      }
    ],
    "stack": [
      {
        "name": "Node.js",
        "category": "runtime",
        "evidence": ["#2"]
      },
      {
        "name": "Geth (Clique PoA)",
        "category": "blockchain",
        "evidence": ["#12"]
      }
    ]
  },
  "state_hash": "a7b3c9f2...",
  "anchor": {
    "status": "anchored",
    "tx_hash": "0xce55a800...",
    "block_number": 123539
  }
}

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
429Rate limit excedidoEsperá y reintentá. Límite: 30–600 req/min según plan
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
Ver Project State✓ Project Brain✓ 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.