Para Desarrolladores
API, Webhooks y MCP de FacturaCR
Integre su tienda, CRM o asistente de IA con la facturación electrónica de Costa Rica. Funciona en modo demostración con los datos de ejemplo ya cargados.
Autenticación
Cree una clave en el panel (API y Webhooks, solo dueño o administrador). Se muestra una sola vez. Envíela en cada petición; las claves pueden ser de solo lectura o de lectura y escritura.
Authorization: Bearer fcr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEndpoints de la API v1
GET /api/v1/clientes?pagina=1&por_pagina=20&q=texto
GET /api/v1/clientes/{id}
POST /api/v1/clientes
PATCH /api/v1/clientes/{id}
GET /api/v1/productos (mismos parámetros)
POST /api/v1/productos
PATCH /api/v1/productos/{id}
GET /api/v1/documentos?estado=aceptado
GET /api/v1/documentos/{id | clave de 50 dígitos}
POST /api/v1/documentos (emite; los comprobantes no se editan)
GET /api/v1/metricas (ventas, IVA y por cobrar del mes en colones)Las listas responden { datos, paginacion: { pagina, por_pagina, total, paginas } }. por_pagina máximo 100.
Ejemplos con curl
curl https://SU-DOMINIO/api/v1/clientes?q=Soda -H "Authorization: Bearer $CLAVE"curl -X POST https://SU-DOMINIO/api/v1/clientes -H "Authorization: Bearer $CLAVE" -H "Content-Type: application/json" \
-d '{"nombre":"Soda La Esquina S.A.","tipo_identificacion":"02","identificacion":"3101123456","correo":"facturas@soda.cr","telefono":"22223333","dias_credito":30}'curl -X PATCH https://SU-DOMINIO/api/v1/productos/ID -H "Authorization: Bearer $CLAVE" -H "Content-Type: application/json" \
-d '{"precio":12500}'curl -X POST https://SU-DOMINIO/api/v1/documentos -H "Authorization: Bearer $CLAVE" -H "Content-Type: application/json" -d '{
"tipo":"04","cliente_id":null,"condicion_venta":"01","medio_pago":"01","moneda":"CRC","tipo_cambio":1,
"lineas":[{"cabys":"8314100000000","descripcion":"Servicio","unidad":"Sp","cantidad":1,"precio_unitario":10000,
"descuento":0,"tarifa":13,"tarifa_codigo":"08","exoneracion":0,"es_servicio":true}]}'Errores
400 JSON o identificador inválido · regla de negocio
401 Falta la clave o está revocada
403 La clave no tiene permiso de escritura
404 Recurso o registro no encontrado
405 Operación no permitida (editar un comprobante)
422 Datos inválidos → { "error": "Datos inválidos", "detalle": [{ "campo": "correo", "mensaje": "..." }] }Webhooks Salientes
Eventos: documento.creado, documento.aceptado, documento.rechazado, cliente.creado, cliente.actualizado, producto.creado, producto.actualizado, webhook.recibido. Se reintenta hasta 3 veces ante errores 5xx, 429 o de red; cada entrega queda en el registro del panel.
POST https://su-sistema.com/webhook
X-Event: documento.aceptado
X-Signature: sha256=5f2c...e9
{
"evento": "documento.aceptado",
"fecha": "2026-10-05T14:03:11.000Z",
"datos": { "id": "…", "clave": "50605102600310112345600100001010000000123100000001", "estado": "aceptado" }
}Cómo Verificar la Firma
// Node.js
import crypto from "node:crypto";
const esperada = "sha256=" + crypto.createHmac("sha256", SECRETO).update(cuerpoCrudo).digest("hex");
const valida = crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(req.headers["x-signature"]));# Python
import hmac, hashlib
esperada = "sha256=" + hmac.new(SECRETO.encode(), cuerpo_crudo, hashlib.sha256).hexdigest()
valida = hmac.compare_digest(esperada, request.headers["X-Signature"])Webhooks Entrantes
Envíe eventos a FacturaCR firmando el cuerpo con el secreto de entrada que aparece en el panel. Cada evento queda registrado y dispara webhook.recibido.
CUERPO='{"evento":"pedido.pagado","pedido":"A-1001","monto":25000}'
FIRMA=$(printf '%s' "$CUERPO" | openssl dgst -sha256 -hmac "$SECRETO_ENTRADA" -hex | sed 's/^.* //')
curl -X POST "https://SU-DOMINIO/api/v1/webhooks/in?empresa=ID_EMPRESA" \
-H "Content-Type: application/json" -H "X-Signature: sha256=$FIRMA" -d "$CUERPO"Conectar el MCP a Claude
El servidor MCP está en /mcp (HTTP) y usa la misma clave API. Herramientas: listar, buscar, ver, crear, actualizar y resumen_metricas. Con una clave de solo lectura, crear y actualizar quedan bloqueadas.
{
"mcpServers": {
"facturacr": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://SU-DOMINIO/mcp", "--header", "Authorization: Bearer ${FACTURACR_CLAVE}"],
"env": { "FACTURACR_CLAVE": "fcr_su_clave" }
}
}
}Pegue esto en claude_desktop_config.json (Claude Desktop → Ajustes → Desarrollador) y reinicie Claude. En clientes con soporte HTTP directo use la URL /mcp con la cabecera Authorization.
curl -X POST https://SU-DOMINIO/mcp -H "Authorization: Bearer $CLAVE" -H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"resumen_metricas","arguments":{}}}'