Ir al contenido

Desarrolladores

Contabilidad

Libros de partida doble: diario, catálogo de cuentas, informes y exportaciones.

GET /books/{companyId}/journal-lines

Listar apuntes del libro diario

Apuntes contabilizados (POSTED) del diario en un rango de fechas, paginados y con filtro opcional por prefijo de cuenta. Sin fechas, se usa el trimestre en curso. Los importes son cadenas decimales.

Permiso exigido: accounting:journal.read (Contabilidad › Libro diario › Leer)

Paginación: Parámetros page y limit. La respuesta incluye total, page, limit, hasMore.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastringId de la empresa. Tiene que estar dentro del alcance del token: la lista está en accountIds de GET /auth/whoami.
fromquerystring (date)
toquerystring (date)
accountquerystringFiltro por prefijo de cuenta del PGC, p. ej. '400' o '7'.
pagequeryinteger
Por defecto: 1
limitqueryinteger
Por defecto: 100 · máximo: 500

Respuestas

200 Apuntes del diario, paginados · application/json

NombreTipoDescripción
dataobject[]
data[].idstring
data[].entryDatestring (date)
data[].entryNumberinteger
puede ser null
data[].periodstringPeriodo contable, p. ej. 2026-Q1
data[].referencestring
puede ser null
data[].entryDescriptionstring
data[].accountCodestring
data[].lineDescriptionstring
puede ser null
data[].debitstringCadena decimal, p. ej. 1234.56
data[].creditstringCadena decimal, p. ej. 0.00
data[].currencystring
paginationobject
pagination.pageinteger
pagination.limitinteger
pagination.totalinteger
pagination.hasMoreboolean
totalintegerTotal de elementos que cumplen el filtro.
pageintegerPágina devuelta (empieza en 1).
limitintegerTamaño de página aplicado.
hasMorebooleanHay más páginas después de esta.

400 Formato de fecha no válido · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/journal-lines?limit=50" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/journal-lines?limit=50", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/journal-lines?limit=50",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/accounts

Listar cuentas contables

Catálogo de cuentas con los saldos del periodo ya calculados (netBalance = openingBalance + debitTotal - creditTotal). Los importes son cadenas decimales.

Permiso exigido: accounting:ledger_accounts.read (Contabilidad › Plan de cuentas › Leer)

Paginación: Parámetros page y limit. La respuesta incluye total, page, limit, hasMore.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)
typequerystring
Valores: asset, liability, equity, income, expense
activequeryboolean
Por defecto: true
pagequeryinteger
Por defecto: 1
limitqueryinteger
Por defecto: 200 · máximo: 500

Respuestas

200 Catálogo de cuentas · application/json

NombreTipoDescripción
dataobject[]
data[].codestringCódigo de cuenta del PGC, p. ej. 400
data[].namestring
data[].typestring
Valores: asset, liability, equity, income, expense
data[].isActiveboolean
data[].openingBalancestring
data[].debitTotalstring
data[].creditTotalstring
data[].netBalancestringopeningBalance + debitTotal - creditTotal
paginationobject
pagination.pageinteger
pagination.limitinteger
pagination.totalinteger
pagination.hasMoreboolean
totalintegerTotal de elementos que cumplen el filtro.
pageintegerPágina devuelta (empieza en 1).
limitintegerTamaño de página aplicado.
hasMorebooleanHay más páginas después de esta.

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/accounts?limit=50" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/accounts?limit=50", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/accounts?limit=50",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/opening-balances

Consultar el asiento de apertura

Saldos de apertura por cuenta del ejercicio pedido. Los importes son cadenas decimales.

Permiso exigido: accounting:opening_balances.read (Contabilidad › Saldos de apertura › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
yearqueryinteger

Respuestas

200 Saldos de apertura

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/opening-balances" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/opening-balances", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/opening-balances",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

POST /books/{companyId}/opening-balances

Registrar el asiento de apertura

Permiso exigido: accounting:opening_balances.create (Contabilidad › Saldos de apertura › Crear)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
replacequeryboolean
Por defecto: false

Cuerpo de la petición application/json

NombreTipoDescripción
yearobligatoriointeger
balancesobligatorioobject[]
balances[].accountCodestring
balances[].amountstringCadena decimal

Respuestas

200 Saldos de apertura guardados

400 Error de validación · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X POST "https://app.bm.consulting/api/v1/books/<companyId>/opening-balances" \
  -H "Authorization: Bearer $BMC_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"year":2026,"balances":[{"accountCode":"570","amount":"string"}]}'
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/opening-balances", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "year": 2026,
    "balances": [
      {
        "accountCode": "570",
        "amount": "string"
      }
    ]
  }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.post(
    "https://app.bm.consulting/api/v1/books/<companyId>/opening-balances",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    json={
        "year": 2026,
        "balances": [{
            "accountCode": "570",
            "amount": "string",
        }],
    },
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/consolidation

Consultar la consolidación del grupo

Saldos consolidados de las empresas de la cuenta. Los importes son cadenas decimales.

Permiso exigido: accounting:reports.read (Contabilidad › Informes (PyG, balance, mayor) › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)

Respuestas

200 Resultado de la consolidación

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/consolidation" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/consolidation", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/consolidation",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/cost-centers/allocations

Consultar el reparto por centros de coste

Reparto por centro de coste, con un resumen. Los importes son cadenas decimales.

Permiso exigido: accounting:reports.read (Contabilidad › Informes (PyG, balance, mayor) › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)

Respuestas

200 Reparto y resumen

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/cost-centers/allocations" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/cost-centers/allocations", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/cost-centers/allocations",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/reports/profit-loss

Cuenta de pérdidas y ganancias

Cuenta de pérdidas y ganancias de un periodo. Sin fechas, se usa el trimestre en curso. Los importes son cadenas decimales.

Permiso exigido: accounting:reports.read (Contabilidad › Informes (PyG, balance, mayor) › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)

Respuestas

200 Cuenta de pérdidas y ganancias · application/json

NombreTipoDescripción
companyIdstring
fromstring (date)
tostring (date)
rowsobject[]
rows[].accountCodestring
rows[].labelstring
rows[].amountstringCadena decimal

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/reports/balance-sheet

Balance de situación

Balance de situación (activo y pasivo) de un periodo. Los importes son cadenas decimales.

Permiso exigido: accounting:reports.read (Contabilidad › Informes (PyG, balance, mayor) › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)

Respuestas

200 Balance de situación · application/json

NombreTipoDescripción
companyIdstring
fromstring (date)
tostring (date)
rowsobject[]
rows[].accountCodestring
rows[].labelstring
rows[].amountstringCadena decimal

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/reports/balance-sheet" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/reports/balance-sheet", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/reports/balance-sheet",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/reports/trial-balance

Balance de sumas y saldos

Balance de sumas y saldos de un periodo. Los importes son cadenas decimales.

Permiso exigido: accounting:reports.read (Contabilidad › Informes (PyG, balance, mayor) › Leer)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
fromquerystring (date)
toquerystring (date)

Respuestas

200 Balance de sumas y saldos · application/json

NombreTipoDescripción
companyIdstring
fromstring (date)
tostring (date)
rowsobject[]
rows[].accountCodestring
rows[].labelstring
rows[].amountstringCadena decimal

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/reports/trial-balance" \
  -H "Authorization: Bearer $BMC_TOKEN"
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/reports/trial-balance", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/reports/trial-balance",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
data = res.json()

GET /books/{companyId}/reports/{report}/export

Exportar un informe en CSV, XLSX o PDF

Devuelve el informe elegido como fichero. `report` es uno de `profit-loss`, `balance-sheet`, `trial-balance`, `libro-diario` o `libro-mayor`.

Permiso exigido: accounting:reports.export (Contabilidad › Informes (PyG, balance, mayor) › Exportar)

Paginación: Sin paginación: devuelve el conjunto completo.

Parámetros

NombreEnTipoDescripción
companyIdobligatoriorutastring
reportobligatoriorutastring
Valores: profit-loss, balance-sheet, trial-balance, libro-diario, libro-mayor
formatobligatorioquerystring
Valores: csv, xlsx, pdf
fromquerystring (date)
toquerystring (date)

Respuestas

200 El fichero del informe · text/csv

400 Falta ?format= o no es válido · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

401 Falta el token Bearer o no es válido. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

403 El token no tiene el permiso exigido o el recurso queda fuera de su alcance. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

429 Se ha alcanzado un límite de uso. · application/json

NombreTipoDescripción
errorstringMensaje de error legible
required_permissionstringSolo en el 403: el permiso que falta (área:recurso.acción)

Ejemplos

curl
curl -X GET "https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss/export?format=csv" \
  -H "Authorization: Bearer $BMC_TOKEN" \
  -o fichero
TypeScript (fetch)
const res = await fetch("https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss/export?format=csv", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.BMC_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const file = Buffer.from(await res.arrayBuffer());
Python (requests)
import os
import requests

res = requests.get(
    "https://app.bm.consulting/api/v1/books/<companyId>/reports/profit-loss/export?format=csv",
    headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
    timeout=30,
)
res.raise_for_status()
contenido = res.content
Email
Contacto