Una API que ya conoce la ley
Integra facturación compliant con Verifactu en tu producto con una sola llamada REST.Nosotros calculamos los impuestos, numeramos por serie y registramos cada factura con su huella encadenada; con VERI*FACTU activado la enviamos a la AEAT y el PDF lleva el QR de verificación.
- REST API con autenticación por API Key
- Webhooks para estado de facturas en tiempo real
- SDKs para Node.js, Python y PHP (próximamente)
- Entorno sandbox para pruebas sin coste
- Rate limit: 300 lecturas cada 5 min y 20 escrituras por minuto
Referencia de la API
Todo lo que necesitas para integrar Chiklin desde tu propio backend: autenticación por API Key, entornos de Pruebas/Real aislados, idempotencia en operaciones fiscales irreversibles y un endpoint por cada recurso de negocio (facturas, clientes, proveedores, series, recurrentes, gastos y productos).
Ejemplos de uso
/api/v1/seriesAutenticación
Toda petición (salvo /healthz) lleva la clave en la cabecera Authorization como Bearer token; la API requiere el plan Developer. Una clave está permanentemente ligada a un entorno (chk_test_… para Pruebas, chk_live_… para Real) y a los datos de ese entorno únicamente. Para comprobar que tu clave funciona, pide cualquier recurso, por ejemplo tus series: 200 si es válida, 401 si no (/healthz no mira la clave). Usa siempre https://www.chiklin.com: el dominio sin www redirige y la mayoría de clientes HTTP descartan la cabecera Authorization al seguir la redirección.
/api/v1/invoicesCrear una factura
Emite una factura Ordinaria o Simplificada: calcula IVA/IRPF, numera correlativamente por serie y la registra en VeriFactu. Añade una cabecera Idempotency-Key (un UUID por intento lógico) para que un reintento de red no emita una segunda factura. issue_date es opcional (por defecto, hoy en hora de Madrid); con una clave chk_live_ solo se admite la fecha de hoy. Si la operación se hizo otro día, indícalo en operation_date, que no puede ser posterior a issue_date. El cliente va como contact_id (uno existente) o como contact (objeto con los mismos campos que POST /clients, que lo da de alta); una Simplificada puede ir sin cliente; una Ordinaria (invoice_type por defecto) sin cliente responde 400. Opcionales: payment_method (TRANSFER, CASH, CARD, CHECK, DIRECT_DEBIT o NONE), payment_term_days (calcula el vencimiento) y, por línea, irpf_rate y surcharge_rate (recargo de equivalencia). Responde 201 con invoice_id e invoice_number. Por ahora, con una clave chk_live_ se responde 400 a una factura con alguna línea al 0 % de IVA o a un cliente con identificador extranjero (NIF-IVA, pasaporte…): el registro de VeriFactu todavía no sabe describir esas operaciones.
/api/v1/invoices/{id}/voidAnular una factura
No borra ni marca un flag: emite una factura rectificativa (R4/R5 según AEAT) que invierte el signo de cada línea y la registra en VeriFactu. La rectificativa se numera en la serie de rectificativas del entorno (se crea si no existe), nunca en la de la factura original. Solo si esa rectificativa queda correctamente registrada, la original pasa a voided. rectification_reason (obligatorio, hasta 150 caracteres) se imprime en el PDF de la rectificativa.
/api/v1/clientsCrear un cliente
Da de alta un contacto como cliente (is_customer=true). Valida el NIF/CIF según el país antes de guardarlo. Un NIF/CIF solo puede estar en un contacto por entorno: si ya existe (como cliente, proveedor o ambos) responde 409 con contact_id, el del contacto que ya lo tiene.
/api/v1/suppliersCrear un proveedor
Igual que /clients pero marca is_provider=true (is_customer queda a false). Un NIF/CIF solo puede estar en un contacto por entorno: si ya existe, aunque sea como cliente, responde 409 con contact_id. Un mismo contacto puede ser cliente y proveedor a la vez, pero ese segundo papel se le añade desde la app (Clientes o Proveedores).
/api/v1/seriesCrear una serie de facturación
El prefijo debe ser único dentro del entorno de la clave. Con "is_rectificativa": true crea una serie solo para rectificativas: la ley obliga a numerarlas en su propia serie, y en ella no se puede emitir ninguna otra factura. Sujeto al límite de series de tu plan, que cuenta aparte las de rectificativas.
/api/v1/recurring-invoicesCrear una plantilla recurrente
La plantilla queda congelada al entorno de la clave y necesita una serie normal (no de rectificativas). frequency: weekly, monthly, quarterly o yearly. Si no envías next_run_date se calcula a partir de la frecuencia. Opcionales: end_date, max_occurrences, payment_method y payment_term_days.
/api/v1/expensesRegistrar un gasto
total_gross_amount es la base imponible (sin IVA); el IVA, la retención y el total se calculan con tax_rate e irpf_rate. provider_id es opcional (un proveedor del mismo entorno). Otros campos opcionales: description, invoice_number (el número de la factura del proveedor), category e is_iva_deductible (por defecto true). Un ticket (document_type: RECEIPT) nunca es deducible de IVA aunque envíes is_iva_deductible: true — el servidor lo fuerza a false.
/api/v1/productsCrear un producto/servicio
Alta simple en el catálogo. El producto nace activo y en el entorno de la clave usada.
Todos los endpoints
Sistema
| GET | /healthz | Comprobación de estado (sin autenticación) | curl https://www.chiklin.com/api/v1/healthz |
Facturas
| GET | /invoices | Listar facturas (limit, offset) | curl "https://www.chiklin.com/api/v1/invoices?limit=50" -H "Authorization: Bearer $API_KEY" |
| POST | /invoices | Crear factura Ordinaria o Simplificada | curl -X POST https://www.chiklin.com/api/v1/invoices -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "series_id": "...", "contact_id": "...", "items": [...] }' |
| GET | /invoices/{id} | Obtener una factura y sus líneas | curl https://www.chiklin.com/api/v1/invoices/{id} -H "Authorization: Bearer $API_KEY" |
| POST | /invoices/{id}/void | Anular vía rectificativa (R4/R5) | curl -X POST https://www.chiklin.com/api/v1/invoices/{id}/void -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "rectification_reason": "..." }' |
Clientes
| GET | /clients | Listar clientes (limit, offset) | curl "https://www.chiklin.com/api/v1/clients?limit=50" -H "Authorization: Bearer $API_KEY" |
| POST | /clients | Crear cliente | curl -X POST https://www.chiklin.com/api/v1/clients -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "person_type_code": "J", "tax_identification_number": "...", ... }' |
| GET | /clients/{id} | Obtener un cliente | curl https://www.chiklin.com/api/v1/clients/{id} -H "Authorization: Bearer $API_KEY" |
| PATCH | /clients/{id} | Actualizar un cliente | curl -X PATCH https://www.chiklin.com/api/v1/clients/{id} -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "email": "nuevo@correo.es" }' |
Proveedores
| GET | /suppliers | Listar proveedores (limit, offset) | curl "https://www.chiklin.com/api/v1/suppliers?limit=50" -H "Authorization: Bearer $API_KEY" |
| POST | /suppliers | Crear proveedor | curl -X POST https://www.chiklin.com/api/v1/suppliers -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "person_type_code": "F", "tax_identification_number": "...", ... }' |
| GET | /suppliers/{id} | Obtener un proveedor | curl https://www.chiklin.com/api/v1/suppliers/{id} -H "Authorization: Bearer $API_KEY" |
| PATCH | /suppliers/{id} | Actualizar un proveedor | curl -X PATCH https://www.chiklin.com/api/v1/suppliers/{id} -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "phone": "600000000" }' |
Series
| GET | /series | Listar series de facturación | curl https://www.chiklin.com/api/v1/series -H "Authorization: Bearer $API_KEY" |
| POST | /series | Crear serie (prefijo único por entorno; is_rectificativa para la de rectificativas) | curl -X POST https://www.chiklin.com/api/v1/series -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "name": "Serie B", "prefix": "B-2026" }' |
| GET | /series/{id} | Obtener una serie | curl https://www.chiklin.com/api/v1/series/{id} -H "Authorization: Bearer $API_KEY" |
Facturas recurrentes
| GET | /recurring-invoices | Listar plantillas | curl https://www.chiklin.com/api/v1/recurring-invoices -H "Authorization: Bearer $API_KEY" |
| POST | /recurring-invoices | Crear plantilla recurrente | curl -X POST https://www.chiklin.com/api/v1/recurring-invoices -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "series_id": "...", "contact_id": "...", "frequency": "monthly", "items": [...] }' |
| GET | /recurring-invoices/{id} | Obtener una plantilla | curl https://www.chiklin.com/api/v1/recurring-invoices/{id} -H "Authorization: Bearer $API_KEY" |
| PATCH | /recurring-invoices/{id} | Activar / desactivar | curl -X PATCH https://www.chiklin.com/api/v1/recurring-invoices/{id} -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "active": false }' |
| DELETE | /recurring-invoices/{id} | Eliminar una plantilla | curl -X DELETE https://www.chiklin.com/api/v1/recurring-invoices/{id} -H "Authorization: Bearer $API_KEY" |
Gastos
| GET | /expenses | Listar gastos (limit, offset) | curl "https://www.chiklin.com/api/v1/expenses?limit=50" -H "Authorization: Bearer $API_KEY" |
| POST | /expenses | Registrar un gasto | curl -X POST https://www.chiklin.com/api/v1/expenses -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "expense_date": "2026-07-20", "document_type": "INVOICE", "total_gross_amount": 500, "tax_rate": 21 }' |
| GET | /expenses/{id} | Obtener un gasto | curl https://www.chiklin.com/api/v1/expenses/{id} -H "Authorization: Bearer $API_KEY" |
| PATCH | /expenses/{id} | Editar un gasto (solo los campos que envíes; los totales se recalculan). En Real, si es de un trimestre anterior, se guarda y la respuesta trae warning | curl -X PATCH https://www.chiklin.com/api/v1/expenses/{id} -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "total_gross_amount": 450 }' |
| DELETE | /expenses/{id} | Eliminar un gasto (en Real, con warning si es de un trimestre anterior) | curl -X DELETE https://www.chiklin.com/api/v1/expenses/{id} -H "Authorization: Bearer $API_KEY" |
Productos
| GET | /products | Listar productos/servicios (limit, offset) | curl "https://www.chiklin.com/api/v1/products?limit=50" -H "Authorization: Bearer $API_KEY" |
| POST | /products | Crear producto/servicio | curl -X POST https://www.chiklin.com/api/v1/products -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "name": "Hora de consultoria", "unit_price": 60, "tax_rate": 21 }' |
| GET | /products/{id} | Obtener un producto | curl https://www.chiklin.com/api/v1/products/{id} -H "Authorization: Bearer $API_KEY" |
| PATCH | /products/{id} | Actualizar nombre, descripción, precio, IVA o activo | curl -X PATCH https://www.chiklin.com/api/v1/products/{id} -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{ "active": false }' |
Códigos de respuesta
200 / 201 | Correcto / recurso creado |
400 | Cuerpo inválido (details indica qué campo) o regla fiscal incumplida |
401 | Falta la clave, o es inválida o está revocada |
403 | Tu plan no lo permite o la empresa no puede emitir (pago pendiente, archivada…) |
404 | No existe en el entorno de la clave |
409 | Conflicto: duplicado, factura ya anulada o petición idempotente aún en curso |
422 | La serie no corresponde al tipo de factura |
429 | Límite de peticiones superado; espera lo que indica Retry-After |