Desarrolladores
Facturas de venta, rectificativas y presupuestos.
GET /billing Listar documentos de ventaPOST /billing Crear un documento de ventaGET /billing/{id} Consultar un documento de venta/billingListar documentos de venta
Devuelve las facturas de venta, rectificativas, presupuestos y proformas de tu cuenta. Las fechas filtran por `issueDate` (incluidas).
Permiso exigido:
sales:invoices.read (Ventas › Facturas, proformas y rectificativas › Leer)
Paginación: Parámetros page y limit. La respuesta incluye total, page, limit, hasMore.
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
kind | query | string | Valores: INVOICE, CREDIT_NOTE, QUOTE, PROFORMA, DELIVERY_NOTE |
status | query | string | Valores: DRAFT, ISSUED, PAID, PARTIALLY_PAID, OVERDUE, CANCELLED, VOID |
dateFrom | query | string (date) | Fecha de emisión (issueDate) desde la que filtrar, incluida (AAAA-MM-DD). |
dateTo | query | string (date) | Fecha de emisión (issueDate) hasta la que filtrar, incluida (AAAA-MM-DD). |
page | query | integer | Por defecto: 1 |
limit | query | integer | Por defecto: 50 · máximo: 500 |
200 Lista de documentos de venta · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
documents | object[] | |
documents[].id | string | |
documents[].number | string | |
documents[].kind | string | Valores: INVOICE, CREDIT_NOTE, QUOTE, PROFORMA, DELIVERY_NOTE |
documents[].status | string | Valores: DRAFT, ISSUED, PAID, PARTIALLY_PAID, OVERDUE, CANCELLED, VOID |
documents[].accountName | stringpuede ser null | |
documents[].accountNif | stringpuede ser null | |
documents[].issuerName | string | |
documents[].issueDate | string (date) | |
documents[].dueDate | string (date)puede ser null | |
documents[].subtotal | number | |
documents[].ivaAmount | number | |
documents[].irpfAmount | number | |
documents[].total | number | |
documents[].amountPaid | number | |
documents[].currency | string | |
documents[].items | object[] | |
documents[].items[].id | string | |
documents[].items[].description | string | |
documents[].items[].quantity | number | |
documents[].items[].unitPrice | number | |
documents[].items[].discount | numberpuede ser null | |
documents[].items[].ivaRate | number | |
documents[].items[].irpfRate | number | |
documents[].items[].lineTotal | number | |
documents[].items[].taxCode | stringpuede ser null | Código de régimen del SII, p. ej. S1 |
documents[].items[].accountCode | stringpuede ser null | Código de cuenta del PGC, p. ej. 700 |
total | integer | Total de elementos que cumplen el filtro. |
page | integer | Página devuelta (empieza en 1). |
limit | integer | Tamaño de página aplicado. |
hasMore | boolean | Hay más páginas después de esta. |
401 Falta el token Bearer o no es válido. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo 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
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
429 Se ha alcanzado un límite de uso. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
curl -X GET "https://app.bm.consulting/api/v1/billing?limit=50" \
-H "Authorization: Bearer $BMC_TOKEN" const res = await fetch("https://app.bm.consulting/api/v1/billing?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(); import os
import requests
res = requests.get(
"https://app.bm.consulting/api/v1/billing?limit=50",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
timeout=30,
)
res.raise_for_status()
data = res.json() /billingCrear un documento de venta
Permiso exigido:
sales:invoices.create (Ventas › Facturas, proformas y rectificativas › Crear)
Paginación: Sin paginación: devuelve el conjunto completo.
application/json| Nombre | Tipo | Descripción |
|---|---|---|
kindobligatorio | string | Valores: INVOICE, CREDIT_NOTE, QUOTE, PROFORMA |
issueDate | string (date) | |
dueDate | string (date)puede ser null | |
currency | string | |
notes | stringpuede ser null | |
itemsobligatorio | object[] | |
items[].descriptionobligatorio | string | |
items[].quantityobligatorio | number | |
items[].unitPriceobligatorio | number | |
items[].ivaRate | number | p. ej. 21 |
items[].irpfRate | numberpuede ser null | |
items[].accountCode | stringpuede ser null | Cuenta del PGC, p. ej. 700 |
201 Documento creado · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
id | string | |
number | string | |
kind | string | Valores: INVOICE, CREDIT_NOTE, QUOTE, PROFORMA, DELIVERY_NOTE |
status | string | Valores: DRAFT, ISSUED, PAID, PARTIALLY_PAID, OVERDUE, CANCELLED, VOID |
accountName | stringpuede ser null | |
accountNif | stringpuede ser null | |
issuerName | string | |
issueDate | string (date) | |
dueDate | string (date)puede ser null | |
subtotal | number | |
ivaAmount | number | |
irpfAmount | number | |
total | number | |
amountPaid | number | |
currency | string | |
items | object[] | |
items[].id | string | |
items[].description | string | |
items[].quantity | number | |
items[].unitPrice | number | |
items[].discount | numberpuede ser null | |
items[].ivaRate | number | |
items[].irpfRate | number | |
items[].lineTotal | number | |
items[].taxCode | stringpuede ser null | Código de régimen del SII, p. ej. S1 |
items[].accountCode | stringpuede ser null | Código de cuenta del PGC, p. ej. 700 |
400 Error de validación · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
401 Falta el token Bearer o no es válido. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo 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
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
429 Se ha alcanzado un límite de uso. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
curl -X POST "https://app.bm.consulting/api/v1/billing" \
-H "Authorization: Bearer $BMC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"kind":"INVOICE","items":[{"description":"string","quantity":1,"unitPrice":1}]}' const res = await fetch("https://app.bm.consulting/api/v1/billing", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BMC_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"kind": "INVOICE",
"items": [
{
"description": "string",
"quantity": 1,
"unitPrice": 1
}
]
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); import os
import requests
res = requests.post(
"https://app.bm.consulting/api/v1/billing",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
json={
"kind": "INVOICE",
"items": [{
"description": "string",
"quantity": 1,
"unitPrice": 1,
}],
},
timeout=30,
)
res.raise_for_status()
data = res.json() /billing/{id}Consultar un documento de venta
Documento completo, con sus líneas y sus líneas de impuestos.
Permiso exigido:
sales:invoices.read (Ventas › Facturas, proformas y rectificativas › Leer)
Paginación: Sin paginación: devuelve el conjunto completo.
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string |
200 Documento de venta · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
id | string | |
number | string | |
kind | string | Valores: INVOICE, CREDIT_NOTE, QUOTE, PROFORMA, DELIVERY_NOTE |
status | string | Valores: DRAFT, ISSUED, PAID, PARTIALLY_PAID, OVERDUE, CANCELLED, VOID |
accountName | stringpuede ser null | |
accountNif | stringpuede ser null | |
issuerName | string | |
issueDate | string (date) | |
dueDate | string (date)puede ser null | |
subtotal | number | |
ivaAmount | number | |
irpfAmount | number | |
total | number | |
amountPaid | number | |
currency | string | |
items | object[] | |
items[].id | string | |
items[].description | string | |
items[].quantity | number | |
items[].unitPrice | number | |
items[].discount | numberpuede ser null | |
items[].ivaRate | number | |
items[].irpfRate | number | |
items[].lineTotal | number | |
items[].taxCode | stringpuede ser null | Código de régimen del SII, p. ej. S1 |
items[].accountCode | stringpuede ser null | Código de cuenta del PGC, p. ej. 700 |
401 Falta el token Bearer o no es válido. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo 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
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
404 El recurso no existe o queda fuera del alcance del token. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
429 Se ha alcanzado un límite de uso. · application/json
| Nombre | Tipo | Descripción |
|---|---|---|
error | string | Mensaje de error legible |
required_permission | string | Solo en el 403: el permiso que falta (área:recurso.acción) |
curl -X GET "https://app.bm.consulting/api/v1/billing/<id>" \
-H "Authorization: Bearer $BMC_TOKEN" const res = await fetch("https://app.bm.consulting/api/v1/billing/<id>", {
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(); import os
import requests
res = requests.get(
"https://app.bm.consulting/api/v1/billing/<id>",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
timeout=30,
)
res.raise_for_status()
data = res.json()