Ir al contenido
FINORA Academy
SistemaFINORA Core

FINORA Core · Referencia

API contable del core

ImplementadoImplementado

La API contable vive en el core bajo /api/v1/ext/gl y se publica hacia afuera por el gateway de API bajo /v1. Esta página usa las rutas del gateway, que son las que usa un sistema externo, y anota la del core cuando difieren.

Método y ruta en el gatewayEn el coreAlcanceQué hace
GET /v1/glaccountsGET /api/v1/ext/gl/accountsgl:readLista el plan de cuentas
GET /v1/glaccounts/{glCode}GET …/accounts/{glCode}gl:readUna cuenta, con su saldo si se pide
GET /v1/transactionchannelsGET …/transaction-channelsgl:readCanales con su cuenta del mayor
POST /v1/gljournalentriesPOST …/journal-entriesgl:writePostea un asiento manual
POST /v1/gljournalentries:searchPOST …/journal-entries:searchgl:readBusca líneas del mayor
GET /v1/gljournalentries/{voucher}GET …/journal-entries/{voucher}gl:readUn asiento por comprobante
POST /v1/gljournalentries/{voucher}:reversePOST …/journal-entries/{voucher}:reversegl:writeReversa un asiento de esta API
GET /v1/gltrialbalanceGET …/trial-balancegl:readBalance de comprobación
POST /v1/accounting/reportsPOST …/reportsgl:readEncola un reporte contable
GET /v1/accounting/reports/{reportKey}GET …/reports/{reportKey}gl:readEstado y resultado del reporte
No expuesta en /v1POST …/fx-revaluations:preview, POST …/fx-revaluations, GET …/fx-revaluationsgl:read / gl:writeRevaluación cambiaria

En el core, gl:write es un alcance crítico: una credencial con acceso general no lo tiene si no se le da de forma expresa. Toda escritura exige Idempotency-Key. Un interruptor del core apaga la API completa: entonces toda ruta responde 404 gl-api-disabled (en el gateway, CORE_GL_API_DISABLED).

Paginación. offset (0) y limit (50, hasta 1000). El cuerpo es un arreglo; las cabeceras Items-Total, Items-Offset e Items-Limit describen la página (en el gateway, con paginationDetails=ON).

Operaciones que no existen a propósito. POST /v1/glaccounts (el plan de cuentas se administra en la consola), PATCH y DELETE /v1/gljournalentries/{voucher} (un asiento contabilizado se reversa): las tres responden 501 CORE_NO_SOPORTA con la alternativa.

ParámetroValores
typeASSET, LIABILITY, EQUITY, INCOME, EXPENSE
postabletrue o false
currencyISO 4217 de tres letras
detailsLevelBASIC (defecto) o FULL
offset, limitPaginación

balanceDate (yyyy-MM-dd) o detailsLevel=FULL agregan el saldo. Sin balanceDate, a la fecha operativa.

CampoQué es
glCode, nameCódigo y nombre de la cuenta
typeClase: ASSET, LIABILITY, EQUITY, INCOME o EXPENSE
natureD deudora o C acreedora
postable, usageDETAIL (postable, recibe asientos) o HEADER (sumaria, agrupa)
allowManualJournalEntriesSi esta API acepta asientos manuales contra la cuenta
activeSi su ciclo de vida está activo
currencySu moneda; null = multimoneda
ciaCompañía
parentCode, level, lifecycleStateSolo con FULL
balance.asOf, balance.byCurrency[]Por moneda: debits, credits y balance acumulados hasta asOf, con signo por naturaleza (positivo = saldo normal). Incluye las líneas pendientes del cierre del día

Canales con code, name, description, glCode (su cuenta del mayor), currency (null = cualquiera), usage (CASH, TRANSFER, CARD, MOBILE, INTERNAL) y active. Una línea de asiento con useChannel: true usa la cuenta del canal en lugar de un glCode.

{
"date": "2026-09-19",
"currency": "VES",
"branchCode": "AG-001",
"notes": "Cobro de comisión por servicio",
"transactionId": "erp-000123",
"channelCode": "CAJA",
"debits": [ { "useChannel": true, "amount": "116.00" } ],
"credits": [ { "glCode": "5110110001", "amount": "100.00" },
{ "glCode": "2810110001", "amount": "16.00", "branchCode": "AG-002" } ]
}
CampoObligatorioRegla
currencysíCoherente con cada cuenta y con el canal
datenoSin ella, la fecha operativa. No puede ser posterior a la fecha operativa ni caer en un día cerrado
branchCodenoAgencia principal del asiento
notesnoGlosa
transactionIdnoTu referencia de origen; se puede buscar
channelCodenoCanal para las líneas con useChannel
debits[], credits[]síAl menos una línea por lado. Suma de débitos = suma de créditos, mayor que cero
línea glCode o useChannelsíCuenta postable, activa, de la compañía y con asientos manuales permitidos
línea amountsíMayor que cero
línea branchCodenoOtra agencia para esa línea. Si el asiento mezcla agencias, el core agrega solo las piernas inter-sucursal según la regla del par de agencias; sin regla, 422 interbranch-rule-missing

Respuesta 201 (o 200 si es una repetición con la misma clave):

CampoQué es
voucherComprobante, con la forma GL-<fecha>-<sufijo>
date, currency, branchCode, notes, transactionIdLos del asiento
statusDRAFT (en el mayor, pendiente del cierre), POSTED, REVERSED o MIXED
reversalOf, reversedByEl original que anula o el reverso que lo anula
entries[]entryId, glCode, glName, type (DEBIT/CREDIT), amount, currency, branchCode, reversalEntryKey

La base de datos vuelve a comprobar el cuadre y la fecha al guardar: ver Partida doble garantizada por la base de datos.

Devuelve líneas del mayor (no asientos), con entryId, voucher, bookingDate, glCode, glName, type, amount, currency, transactionId, branchCode, notes, status, createdBy y createdDate.

{
"filterCriteria": [
{ "field": "bookingDate", "operator": "BETWEEN", "value": "2026-09-01", "secondValue": "2026-09-30" },
{ "field": "glCode", "operator": "STARTS_WITH", "value": "1101" },
{ "field": "amount", "operator": "MORE_THAN", "value": "1000" }
],
"sortingCriteria": { "field": "bookingDate", "order": "DESC" }
}
ElementoValores
Campos de filterCriteriabookingDate, creationDate, glCode, voucher, type, amount, transactionId, branchCode
OperadoresEQUALS, IN (con values: [...]), BETWEEN (con value y secondValue), MORE_THAN, LESS_THAN, STARTS_WITH
CombinaciónTodos los criterios con Y
Rango obligatorioUn BETWEEN de hasta 366 días. El core lo acepta sobre bookingDate o creationDate; el gateway exige que sea sobre bookingDate
sortingCriteria.fieldbookingDate, creationDate, glCode, voucher, type, amount, transactionId
sortingCriteria.orderASC o DESC

El asiento completo, con su estado y la relación con su reverso.

Cuerpo opcional { "notes": "…" }. Postea en la fecha operativa un contra-asiento espejo (débito por crédito, mismas cuentas e importes) con comprobante REV-<voucher>. Solo para asientos creados por esta API. Responde 201, o 200 si es una repetición con la misma clave; uno ya reversado responde 409.

from y to son obligatorios (yyyy-MM-dd, ambos inclusive). Solo cuenta las líneas ya contabilizadas por el cierre del día: un asiento de hoy no aparece hasta que cierre.

CampoQué es
from, to, currencyEl rango pedido
balancedtrue si todas las monedas cuadran
lines[]glCode, name, currency, openingBalance, debits, credits, closingBalance
checks[]Por moneda: accounts, opening, debits, credits, closing y balanced

Para rangos largos o planes grandes, pide el cálculo y vuelve por él.

sequenceDiagram
  participant S as Tu sistema
  participant G as Gateway
  S->>G: POST /v1/accounting/reports {startDate, endDate, …}
  G-->>S: 202 {reportKey, status: QUEUED} + Location
  loop hasta COMPLETE o ERROR
    S->>G: GET /v1/accounting/reports/{reportKey}
    G-->>S: QUEUED · IN_PROGRESS · COMPLETE · ERROR
  end

POST /v1/accounting/reports es lectura (alcance gl:read) y no lleva Idempotency-Key:

CampoObligatorioRegla
startDate, endDatesíyyyy-MM-dd, ambos inclusive, hasta 366 días
branchCodenoUna agencia
currencyCodenoUna moneda
glTypesnoClases de cuenta, p. ej. ["ASSET","LIABILITY"]

Responde 202 con reportKey (32 caracteres hexadecimales), status: QUEUED y la cabecera Location: /v1/accounting/reports/{reportKey}. El GET trae status, las fechas de creación y fin, error (solo en ERROR) e items (solo en COMPLETE): glCode, name, type, currency, openingBalance, debits, credits, netChange y closingBalance. netChange lleva signo (por naturaleza de la cuenta), no es un valor absoluto. El saldo es el mismo que el de las cuentas de esta API: todas las líneas del mayor.

Por ahora solo en la API del core (/api/v1/ext/gl), no en /v1. Recalcula a la tasa de cierre el valor en moneda funcional de los saldos en moneda extranjera, según las reglas de revaluación que define el contador.

Ruta en el coreAlcanceQué hace
POST /fx-revaluations:preview {date, cia}gl:readPor regla activa: saldo en moneda extranjera, valor en libros a la tasa histórica, valor a la tasa de cierre y diferencia. No escribe nada
POST /fx-revaluations {date, cia} + Idempotency-Keygl:writePostea por regla el asiento FXREV-<fecha>-<regla> y su reverso FXREV-R-<fecha>-<regla> en la fecha operativa siguiente. Idempotente por fecha y regla
GET /fx-revaluations?date&ciagl:readLas revaluaciones registradas (POSTED o NO_DIFFERENCE) con su detalle

Del core, con su tipo. A través del gateway llegan como CORE_<TIPO> en mayúsculas y con guion bajo (unbalanced-entry → CORE_UNBALANCED_ENTRY), con el mismo estado. Los del propio gateway están en Códigos de error del gateway de API.

EstadoTipoCuándo
400validation-errorFalta un campo o tiene un formato inválido
400invalid-account-type, invalid-details-level, invalid-paginationFiltro de cuentas, detailsLevel o paginación fuera de rango
400date-range-required, date-range-too-wideBúsqueda sin BETWEEN de fechas, o de más de 366 días
400invalid-filter-criteria, invalid-filter-field, invalid-filter-operatorUn criterio mal formado, un campo o un operador fuera de la lista
400invalid-sorting-field, invalid-sorting-orderOrdenamiento no admitido
400invalid-trial-balance-range, invalid-report-rangeRango del balance o del reporte ausente, invertido o demasiado ancho
404gl-account-not-found, journal-entry-not-found, report-not-foundNo existe
404gl-api-disabled, gl-reports-disabledLa API o los reportes están apagados en ese core
409journal-entry-already-reversedEl asiento ya tiene su reverso
409idempotency-key-reusedMisma clave con otra petición (directo al core; el gateway lo detecta antes)
422unbalanced-entryDébitos ≠ créditos, o un lado vacío
422gl-account-not-postable, gl-account-inactive, gl-account-other-company, gl-account-manual-entries-not-allowedLa cuenta no admite el asiento
422currency-mismatchMoneda distinta de la de la cuenta o del canal
422transaction-channel-inactiveEl canal está inactivo
422branch-not-foundLa agencia no existe
422future-booking-date, period-closedFecha posterior a la operativa o de un día cerrado
422interbranch-disabled, interbranch-rule-missingAsiento con varias agencias sin la función encendida o sin regla para el par
422manual-concept-unavailableLa institución no tiene el concepto de asientos manuales
422journal-entry-not-reversibleEl asiento no fue creado por esta API
422fx-revaluation-no-rules, fx-revaluation-missing-rate, fx-revaluation-missing-historical-rate, fx-revaluation-concept-unavailableRevaluación sin reglas, sin tasa de cierre o histórica, o sin su concepto