La API REST que Dolibarr debería traer de serie
EasyAPI reimplementa los 32 dominios del core de Dolibarr (ventas, compras, stock, contabilidad, proyectos, RRHH, asociación…) sobre un contrato único: el mismo envelope de respuesta, la misma taxonomía de errores, idempotencia en toda escritura y un servidor MCP para agentes de IA. Tus permisos y tu ACL de Dolibarr siguen mandando.
|
32
dominios del core reimplementados
|
98
recursos EAPI auto-descubiertos
|
MCP
servidor nativo para agentes de IA
|
V15–V24
Dolibarr compatible · PHP 7.4–8.3
|
El problema que resuelve
La API que Dolibarr trae de serie resuelve el caso básico. Los problemas aparecen cuando la integración tiene que aguantar producción: reintentos por corte de red, permisos que de verdad se comprueban, varias sociedades en la misma instalación y documentos que tienen que totalizar bien. Son cinco fallos concretos, y ninguno avisa cuando ocurre.
| Lo que te encuentras |
Lo que te cuesta |
| Un POST devuelve el id en crudo y el GET el objeto: cada dominio responde a su manera |
Una capa de normalización en tu código, distinta para cada recurso, que hay que mantener para siempre |
| Un reintento por timeout vuelve a crear el documento: no existe la cabecera Idempotency-Key |
Facturas y cobros duplicados que alguien tiene que anular y cuadrar a mano |
| Borrar un pago por API responde 500 en Dolibarr 20 o superior: la firma de Paiement::delete() cambió en la 20 |
El único camino documentado para deshacer un cobro no funciona justo cuando lo necesitas |
| En multiempresa, una DOLAPIKEY válida de otra entidad responde 503 «módulo no activo» |
La API solo habla con la entidad 1: cada sociedad acaba necesitando su propia instalación |
| Una línea de factura con recargo de equivalencia o IRPF se guarda con el impuesto a 0 |
El documento totaliza mal: cobras de menos o retienes de menos, y no salta ningún error |
| El error solo dice «socid field missing», sin el campo exacto ni un request_id |
Soporte a ciegas: hay que reproducir a mano lo que ya falló en producción |
El mismo envelope, los mismos códigos y los mismos filtros en los 32 dominios. Se aprende una vez y sirve para todos: no hay una forma distinta de paginar, de filtrar ni de leer el error según el recurso que toques.
NOVEDAD 2.28
Lo que pide el agente de IA espera a que tú lo confirmes
Con la confirmación humana activa, una escritura que un agente pide por MCP no se ejecuta. Queda en Herramientas › Acciones pendientes (IA) con sus datos y una vista previa, y solo se hace cuando la persona que conectó al agente pulsa Confirmar.
- Tú decides qué espera. Todas las escrituras, o solo los envíos de correo y los borrados. La opción viene apagada, así que actualizar no cambia nada.
- El agente no puede confirmarse a sí mismo. La confirmación no existe para el MCP: se hace en Dolibarr o por la API REST (POST /mcp/pending/{token}/confirm), y solo la da quien pidió la acción.
- Una sola vez y con caducidad. Cada acción se confirma una vez y caduca a los 10 minutos; el plazo se amplía hasta 24 horas.
- Correos marcados. Un correo enviado tras confirmarlo lleva X-AI-Generated y X-AI-Reviewed.
EN LA 2.25
Cuánto te deben y desde cuándo, y el precio que el ERP pondría a cada cliente
La versión 2.25 trajo lecturas de negocio que antes había que montar sumando facturas a mano. El MCP, además, le dice al agente qué hace cada operación antes de que la llame.
- Antigüedad de la deuda. GET /invoices/kpis/aging y GET /supplier-invoices/kpis/aging reparten lo pendiente en sin vencer, 1-30, 31-60, 61-90 y más de 90 días. Los tramos se cambian con ?buckets=0,15,45 y ?group=thirdparty da el desglose por tercero. Respetan la ACL de los listados: el comercial que solo ve a sus clientes solo ve la deuda de esos clientes.
- Días de cobro y pago, y el pendiente real. /invoices/kpis añade dso y /supplier-invoices/kpis añade dpo, los días medios de cobro y de pago de los últimos 90 días. Los KPI outstanding y overdue suman lo que queda pendiente de verdad: descuentan cobros parciales, abonos y anticipos con el mismo cálculo que getRemainToPay() del core.
- Precio efectivo por cliente. GET /products/{id}/price?socid=&qty= devuelve el precio que pondría el ERP en la línea para ese cliente y esa cantidad, con IVA, recargo e IRPF, los totales y de dónde sale: base, price_level, customer_price o quantity.
- Errores sin SQL. El texto del motor de base de datos se queda en el syslog con el request_id, y la respuesta trae un código con el que se puede hacer algo: un duplicado es un 409 con reason: duplicate_record, y un bloqueo, un 503 con Retry-After: 2 para reintentar.
- Cada operación declara su efecto. x-effect dice si lee (read), escribe en el ERP (internal), sale fuera (external) o no tiene vuelta atrás (irreversible), y el MCP lo traduce a readOnlyHint y destructiveHint. Los borrados por MCP se pueden prohibir en el setup (EASYAPI_MCP_ALLOW_DELETE) o usuario a usuario, y manda lo más restrictivo.
- IBAN enmascarado. Por MCP, el IBAN, el número de cuenta y la referencia del mandato de las cuentas bancarias de terceros salen con solo los 4 últimos caracteres. Por REST no cambia nada.
Un vistazo al resultado
La especificación OpenAPI se genera sola desde los recursos y se sirve dentro del módulo, filtrada según los permisos del usuario que la consulta.
Los 32 dominios navegables, con selector de servidor y autenticación por DOLAPIKEY. Cada operación trae su esquema y un ejemplo listo para lanzar.
Comparativa frente a la API nativa
| Dimensión |
API nativa de Dolibarr |
EasyAPI |
| Cobertura |
Más de 50 clases API repartidas por los módulos del core, con cobertura desigual: en contabilidad, por ejemplo, el único endpoint es el volcado de datos |
32 dominios del core completos, con sus sub-recursos: líneas, contactos, pagos, descuentos… |
| Forma de responder |
Heterogénea: un POST devuelve un entero crudo, otro el objeto |
Envelope uniforme {success, data, meta}: el POST responde 201 con el registro creado |
| Errores |
Códigos y mensajes dispares, sin taxonomía y sin nada que puedas citar en un ticket |
Taxonomía de 16 tipos, el campo exacto en error.fields, y request_id + doc_url en todos |
| Idempotencia |
No existe |
Reserva atómica por Idempotency-Key en toda escritura, incluidas las transiciones de estado |
| Operaciones masivas |
No existen |
207 Multi-Status en alta, modificación y borrado, hasta 100 elementos por lote y con el resultado de cada uno |
| Consultas |
Filtros SQL en crudo para escribir a mano, sin ordenar ni elegir campos |
Filtros y orden en JSON, búsqueda, selección de campos, recursos embebidos, paginación por página y por cursor |
| Resiliencia |
No existe |
Límite de peticiones, reintento de bloqueos de base de datos, concurrencia optimista y modo mantenimiento |
| Seguridad |
Derechos nativos, con fallos reales: la consulta de comerciales devuelve 401 donde corresponde un 403 |
Los mismos derechos nativos, con la ACL por registro corregida y uniforme: 403 correcto y sin fugas entre terceros ni entre entidades |
| Documentación |
Explorador Swagger básico |
OpenAPI generado desde el código, con Scalar, Swagger UI y Redoc embebidos y filtrado por permisos |
| Extensibilidad |
Hay que tocar el core para añadir endpoints |
Auto-descubrimiento: creas una carpeta en tu propio módulo y tus endpoints aparecen documentados |
Así se usa
Autenticación con la DOLAPIKEY de tu usuario en la cabecera. La misma clave vale como Authorization: Bearer si tu servidor se come las cabeceras propias. Factura con su línea en una sola llamada:
FACTURA CON LÍNEA, EN UNA PETICIÓN
curl -X POST "https://tu-dolibarr.com/custom/easyapi/api/invoices" \
-H "DOLAPIKEY: tu_clave" \
-H "Idempotency-Key: pedido-4417" \
-H "Content-Type: application/json" \
-d '{"socid": 128, "lines": [{"fk_product": 55, "qty": 2, "subprice": 49.90}]}'
201 · LA FACTURA NACE EN BORRADOR CON SU REF PROVISIONAL
{
"success": true,
"data": {
"id": 902,
"ref": "(PROV902)",
"socid": 128,
"statut": 0,
"total_ttc": 119.76,
"lines": [ { "id": 3311, "qty": 2, "subprice": 49.90 } ]
}
}
422 · EL ERROR TE DICE EL CAMPO, NO SOLO QUE ALGO FALLÓ
{
"success": false,
"error": {
"type": "validation_error",
"code": 422,
"message": "Validation failed",
"fields": { "socid": "does not exist" },
"request_id": "req_7f3a91c2",
"doc_url": "https://easysoft.es/docs/api#validation_error"
}
}
La ref definitiva la asigna la validación, que es como funciona Dolibarr: POST /invoices/902/validate reemplaza el (PROV902) por el número de la serie y recalcula los totales. Reenvía la misma petición con la misma Idempotency-Key y recibirás la factura de antes, no una segunda, con la cabecera Idempotent-Replayed: true avisando de que no se ha vuelto a ejecutar.
Qué incluye
Escrituras que no se duplican
Idempotency-Key con reserva atómica y replay anunciado en toda escritura, también en las transiciones de estado (validar, pagar, cerrar).
Errores que se explican solos
Una taxonomía única de 16 tipos, el detalle por campo y dos datos para el ticket: el identificador de la petición y el enlace al documento del error.
Consultas sin SQL a mano
Filtros, orden, búsqueda y selección de campos en JSON; paginación por página y por cursor para recorrer tablas grandes sin perder filas.
Tus permisos, tal cual
Los derechos nativos de Dolibarr más la ACL por registro corregida: un comercial no ve lo que no es suyo, y el 403 aparece donde toca.
Servidor MCP para agentes
Endpoint POST /mcp para Claude, Cursor o cualquier cliente MCP, autenticado con tu clave y acotable a los dominios que quieras.
Resiliencia configurable
Límite de peticiones, reintento de bloqueos de base de datos, concurrencia optimista con ETag, modo mantenimiento y un límite de tamaño de cuerpo. Todo por constantes.
Para qué se usa
- Sincronizar una tienda online o un marketplace: pedidos, stock y precios contra tu base de datos, sin escribir SQL
- Una app móvil para comerciales con sesión por cookie HttpOnly, donde la clave del ERP no llega nunca al navegador
- Cuadros de mando y BI que leen los 32 dominios con filtros y paginación por cursor
- Automatizaciones y agentes de IA conectados por MCP a tu propio ERP, con las reglas de escritura que tú decidas
- Varias sociedades servidas desde una sola API, cada usuario en su entidad
- Un ERP externo que necesita crear facturas y cobros sabiendo que un reintento no duplica nada
Puesta en marcha
1
Descomprime el ZIP en custom/easyapi y ejecuta composer install --no-dev --optimize-autoloader.
2
Activa EasyAPI en Configuración → Módulos y abre su pantalla de configuración: CORS, sesión, límites y MCP se ajustan desde ahí.
3
Copia la clave de tu usuario (Usuario → pestaña API) y comprueba que responde: GET /me te devuelve quién eres.
4
Abre /docs y navega los 32 dominios. Si tu servidor es nginx, aplica el bloque de la guía incluida antes de dar nada por bueno.
Requisitos
| Dolibarr |
V15 a V24 (probado en la 18 y la 24; las firmas del core se comprueban de la 10 a la 24) |
| PHP |
7.4 a 8.3, con curl, json y mbstring |
| Base de datos |
MySQL 5.7+ · MariaDB 10.2+ · PostgreSQL 10+ |
| Actualizaciones |
365 días de acceso a actualizaciones |
Antes de comprar
¿Puedo adaptarlo a mi caso?
Sí. Recibes todo el código fuente y puedes leerlo, modificarlo y adaptarlo sin pedir permiso. Además los recursos se auto-descubren, así que lo normal es que añadas tus propios endpoints desde tu módulo en vez de tocar el nuestro.
¿Cómo lo pruebo sin arriesgar mis datos?
Instálalo en una copia de tu Dolibarr y llama a GET /status: responde sin tocar un solo registro. Todas las lecturas son inocuas. Las escrituras sí crean datos reales, así que pruébalas en esa copia: lo que garantiza Idempotency-Key es que un reintento por corte de red no te duplique el registro, no que la operación sea reversible.
¿Y si algo no encaja con mi instalación?
Escríbenos a
info@easysoft.es antes de comprar y lo miramos contigo: versión de Dolibarr, PHP, hosting y qué necesitas integrar. Preferimos decirte que no encaja a venderte algo que no te sirve.
¿Se me romperá la integración al actualizar?
El contrato es una API v1 estable y cada respuesta lo declara en la cabecera X-EasyAPI-Version. Dentro de v1 solo entran cambios compatibles: campos opcionales nuevos, endpoints nuevos, cabeceras nuevas. Un cambio que rompa contrato saldría como v2, y tu integración seguiría en v1 mientras migras cuando te venga bien.
¿Qué pasa cuando venzan los 365 días?
El módulo que ya tienes sigue funcionando: no se desactiva ni se bloquea nada. Lo que termina es el acceso a las actualizaciones y a las descargas nuevas, y el soporte por correo. Si más adelante quieres retomarlo, se renueva.
Mantenimiento activo
EasyAPI no es un módulo publicado y olvidado: la versión actual es la 2.28.0 y cada entrega añade pruebas que sujetan lo que arregla. La 2.28 trae una prueba por cada regla de la confirmación humana, comprobada rompiendo la regla a propósito, una prueba en navegador de la página de acciones pendientes y la comprobación por HTTP en Dolibarr 15, 18 y 24. Además de las pruebas, cada release pasa QA contra instancias reales de Dolibarr antes de publicarse.
|
31
módulos publicados en Dolistore
|
100 %
código fuente completo
|
8
idiomas en la interfaz
|
365
días de actualizaciones
|
¿Te encaja para lo que necesitas integrar?
Cuéntanos tu caso y te decimos si EasyAPI te sirve — y si no, te lo decimos igual.
info@easysoft.es www.easysoft.es