10. La API REST de iDempiere
La API REST de iDempiere (plugin idempiere-rest, de la comunidad bxservice) expone el mismo modelo
de datos y las mismas reglas de negocio que ZK, bajo /api/v1 — es la base de toda integración de
FINORA: el portal, apps externas, y los propios playbooks que documentan cómo configurar un tenant sin
entrar a la interfaz gráfica.
Autenticación
Sección titulada «Autenticación»POST /api/v1/auth/tokens{"userName":"GardenAdmin","password":"***"}→ 200 {"clients":[{"id":11,"name":"GardenWorld"}],"token":"<token de paso 1>"}
PUT /api/v1/auth/tokens{"clientId":11,"roleId":102,"organizationId":11,"warehouseId":103,"language":"en_US"}→ 200 {"userId":101,"token":"<jwt>","refresh_token":"<rt>"}Es un intercambio en dos pasos: primero usuario/contraseña (que puede devolver varios clients si la
persona tiene acceso a más de un tenant), después la elección de cliente/rol/organización/almacén, que
sí es la que entrega el JWT final. El token trae como claims el cliente, usuario, rol, organización y
almacén elegidos — el mismo contexto que en ZK se arma en el diálogo de selección de rol
(ver Tutorial 4). Expira en 60 minutos por
defecto; el refresh token rota en cada uso y es de un solo uso
(finora-erp-experience/idempiere/API_MAP.md, §2).
/models/{tabla}: acceso genérico gracias al Diccionario
Sección titulada «/models/{tabla}: acceso genérico gracias al Diccionario»GET /api/v1/models/c_bpartner?$filter=IsCustomer eq true&$select=Value,Name,TaxID&$orderby=Name&$top=3Este endpoint funciona para cualquier tabla del Diccionario, incluidas las que agrega FINORA LVE,
porque el REST le pregunta al Diccionario qué columnas tiene una tabla — el mismo mecanismo que hace
posible que ZK dibuje cualquier ventana sin código nuevo (ver
Tutorial 3). Soporta filtros al estilo OData
($filter, $select, $orderby, $expand, $top/$skip), incluyendo $expand anidado para traer
un objeto de negocio completo en una sola llamada (finora-erp-experience/idempiere/API_MAP.md, §3.2:
un Business Partner con sus facturas abiertas, pagos y contactos en una petición).
Procesos y acciones de documento
Sección titulada «Procesos y acciones de documento»Un proceso se ejecuta con POST /processes/{slug}, con sus parámetros en el cuerpo. Los parámetros de
rango tienen una convención específica, corregida a partir de evidencia real de desarrollo: el
límite inferior va en <nombre> y el superior en <nombre>_to, no como un arreglo [desde, hasta]
(finora-erp-experience/idempiere/API_MAP.md, §6.1):
{"DateAcct": "2024-01-01", "DateAcct_to": "2024-12-31"}Completar, anular o reversar un documento no es un endpoint propio: es un PUT sobre el registro con
un campo doc-action, y dispara exactamente el mismo flujo (DOC_BEFORE_COMPLETE,
DOC_AFTER_COMPLETE…) que el botón Completar en ZK — ver el diagrama de secuencia del
Tutorial 2:
PUT /api/v1/models/c_invoice/{id}{"doc-action":"CO"}Qué NO cubre el REST genérico (y qué hace falta agregar)
Sección titulada «Qué NO cubre el REST genérico (y qué hace falta agregar)»No todo lo que se necesita para una pantalla de negocio real existe de fábrica: agregados/KPI
($apply, $count no están soportados), antigüedad de saldos (RV_OpenItem no tiene una clave que
REST pueda usar), o qué acciones de documento son válidas para un registro en un momento dado (ningún
endpoint replica DocumentEngine.getValidActions). Estos casos requieren una vista del Diccionario con
clave, o un endpoint propio — no un cambio al plugin REST
(finora-erp-experience/idempiere/API_MAP.md, §10).
Paginación por defecto
Sección titulada «Paginación por defecto»Una consulta a /models/{tabla} sin $top no devuelve la tabla completa: el plugin aplica un tamaño
de página por defecto y expone el total y los enlaces de siguiente/anterior página en la respuesta, al
estilo OData ($top/$skip explícitos para pedir una página distinta). Para un listado que un
integrador espera completo (por ejemplo, sincronizar todos los C_BPartner de un tenant), hay que
iterar páginas explícitamente en vez de asumir que la primera respuesta ya trae todo.
Fuentes
Sección titulada «Fuentes»finora-erp-experience/idempiere/API_MAP.md(mapa completo del REST, con ejemplos ejecutados el 2026-09-24)finora-lve/AGENTS.md, regla 7 (toda configuración de datos por REST, documentada como playbook)finora-lve/decisions/ADR.md, ADR-LVE-013 (por qué FVE_Config y no AD_SysConfig)- Repositorio de referencia: bxservice/idempiere-rest en GitHub