API pública — Facturas (customerInvoices)
Consulta las facturas emitidas a clientes de tu cuenta mediante la API pública de Buky, con datos fiscales, líneas de detalle, impuestos y estado VeriFactu
Esta página explica cómo consultar las facturas emitidas a clientes de tu cuenta mediante la API pública de Buky. Cada factura contiene los datos fiscales del emisor y receptor, las líneas de detalle, los impuestos aplicados y, si tu cuenta tiene VeriFactu activado, el estado de la declaración ante Hacienda.
Antes de empezar
- Necesitas un API Token activo. Si aún no lo has creado, sigue la guía Conectar Buky con herramientas externas (API Tokens).
- El token es de solo lectura: puedes listar y consultar facturas, pero no crearlas, modificarlas ni anularlas.
- La función está en fase beta. Si no ves la pestaña "API Tokens" en tu configuración, contacta con soporte.
Autenticación
El token se envía en cada petición de una de estas dos formas:
Opción 1 — Cabecera `auth` (recomendado):
curl "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN"Opción 2 — Parámetro `token` en la URL:
curl "https://app.bukyapp.com/api/customerInvoices?token=bk_TU_TOKEN"Usa la cabecera siempre que puedas — las URLs suelen quedarse en logs y expuestas.
Listar facturas
curl "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN"La respuesta es un array JSON de facturas, ordenado por fecha de creación descendente por defecto (la más reciente primero):
[
{
"_id": "66a1b2c3d4e5f67890abcdef",
"prefix": "FA",
"number": 42,
"issuedDate": "2026-03-15T00:00:00.000Z",
"total": 125.40,
"mode": "normal",
"customer": "5f0e1d2c3b4a5968778695a4",
"orders": ["66b2c3d4e5f67890abcdef01"],
"from_business_name": "Marea Surf Co.",
"from_vat": "B12345678",
"to_business_name": "Laura García",
"to_vat": "12345678A",
"items": [
{
"label": "Clase de surf grupal",
"quantity": 2,
"subtotal": 103.64,
"total": 125.40,
"taxes": [{"name": "IVA", "rate": 21, "amount": 21.76}]
}
],
"isCancelled": null,
"verifactu_estado": "Aceptado",
"createdAt": "2026-03-15T10:30:00.000Z"
},
...
]Paginación
En las cabeceras de la respuesta recibes el total de resultados y el número de páginas:
X-Count: total de facturas que coinciden con el filtro.X-Page-Count: número de páginas.
Por defecto el endpoint devuelve como máximo 100 facturas por página. Para paginar:
curl "https://app.bukyapp.com/api/customerInvoices?page=1&limit=50" \
-H "auth: bk_TU_TOKEN"limit: facturas por página (máximo 100).page: número de página, empezando en 1.
Filtrar facturas
El parámetro filter acepta un objeto JSON con sintaxis MongoDB. Envíalo codificado en la URL.
Por fecha de emisión
# Facturas del primer trimestre de 2026
curl -G "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN" \
--data-urlencode 'filter={"issuedDate":{"$gte":"2026-01-01","$lt":"2026-04-01"}}'Por serie (prefix)
# Solo facturas de la serie "FA"
curl -G "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN" \
--data-urlencode 'filter={"prefix":"FA"}'Facturas de un cliente concreto
Si conoces el _id del cliente (customerClient):
curl -G "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN" \
--data-urlencode 'filter={"partner":"65f1a2b3c4d5e6f7a8b9c0d1"}'El campo partner es la referencia a la ficha de cliente (customerClient) que aparece como destinatario de la factura.
Solo facturas activas (no anuladas)
--data-urlencode 'filter={"isCancelled":null}'Solo facturas anuladas
--data-urlencode 'filter={"isCancelled":{"$ne":null}}'Por número de factura
--data-urlencode 'filter={"number":42}'Por estado de VeriFactu
# Solo las aceptadas por Hacienda
--data-urlencode 'filter={"verifactu_estado":"Aceptado"}'
# Las que tuvieron error
--data-urlencode 'filter={"verifactu_estado":"Error"}'Facturas rectificativas
# Solo rectificativas (tienen referencia a la factura original)
--data-urlencode 'filter={"isRectification":{"$ne":null}}'Combinando filtros
Cualquier combinación funciona — se aplica como AND:
--data-urlencode 'filter={"prefix":"FA","issuedDate":{"$gte":"2026-01-01"},"isCancelled":null}'Ordenar los resultados
Con sort, también en formato JSON:
# Por fecha de emisión, más antiguas primero
--data-urlencode 'sort={"issuedDate":1}'
# Por número de factura descendente
--data-urlencode 'sort={"number":-1}'
# Por total, de mayor a menor
--data-urlencode 'sort={"total":-1}'1 = ascendente, -1 = descendente.
Traer solo los campos que necesites
Con fields reduces el tamaño de la respuesta pidiendo solo las columnas que usas:
--data-urlencode 'fields={"prefix":1,"number":1,"issuedDate":1,"total":1,"to_business_name":1,"isCancelled":1}'Útil cuando exportas facturas y solo necesitas un resumen contable.
Expandir relaciones (populate)
Las referencias a otros recursos vienen como IDs. Para obtener el objeto completo en la misma respuesta:
curl -G "https://app.bukyapp.com/api/customerInvoices" \
-H "auth: bk_TU_TOKEN" \
--data-urlencode 'populate=partner'Relaciones expandibles:
partner— ficha del cliente destinatario (customerClient).orders— reservas asociadas a la factura.order— reserva individual (campo legacy, usarorderspreferiblemente).isRectification— factura original si esta es una rectificativa.
Úsalo con moderación: expandir relaciones en consultas grandes puede hacer la respuesta muy pesada.
Consultar una factura concreta
curl "https://app.bukyapp.com/api/customerInvoices/66a1b2c3d4e5f67890abcdef" \
-H "auth: bk_TU_TOKEN"Devuelve la factura completa con todos sus campos.
Campos útiles del objeto CustomerInvoice
| Campo | Tipo | Qué es |
|---|---|---|
_id | string | Identificador único de la factura |
prefix | string | Serie de la factura (ej: FA, RE) |
number | número | Número correlativo dentro de la serie |
issuedDate | fecha | Fecha de emisión |
total | número | Importe total con impuestos incluidos |
totalDefault | número | Importe total en la divisa por defecto de la cuenta |
mode | string | Modo de factura: simple o normal |
note | string | Notas internas de la factura |
items | array | Líneas de detalle (ver tabla siguiente) |
partner | ID | Ficha del cliente destinatario (customerClient) |
orders | array de IDs | Reservas asociadas |
order | ID | Reserva individual (legacy — usar orders) |
isRectification | ID | Si es rectificativa, referencia a la factura original |
version | número | null = pre-VeriFactu, 2 = post-VeriFactu (sustitutivas) |
isCancelled | fecha | null si activa, fecha de anulación si está anulada |
from_business_name | string | Razón social del emisor |
from_vat | string | NIF/CIF del emisor |
from_street_address | string | Dirección del emisor |
from_city | string | Ciudad del emisor |
from_zip | string | Código postal del emisor |
from_state | string | Provincia del emisor |
from_country | string | País del emisor |
to_business_name | string | Nombre/razón social del destinatario |
to_vat | string | NIF/DNI del destinatario |
to_vat_type | string | Tipo de documento fiscal del destinatario |
to_street_address | string | Dirección del destinatario |
to_city | string | Ciudad del destinatario |
to_zip | string | Código postal del destinatario |
to_state | string | Provincia del destinatario |
to_country | string | País del destinatario |
verifactu_estado | string | Estado en VeriFactu: Aceptado, Pendiente, Error... |
verifactu_url | string | URL de verificación en la AEAT |
verifactu_qr | string | Código QR de VeriFactu |
createdAt | fecha | Cuándo se creó el registro |
author | objeto | Quién creó la factura ({_id, name}) |
lastEditor | objeto | Último usuario que la modificó ({_id, name}) |
Líneas de detalle (items)
Cada factura tiene un array items con las líneas:
| Campo | Tipo | Qué es |
|---|---|---|
label | string | Concepto de la línea |
description | string | Descripción adicional |
quantity | número | Cantidad |
subtotal | número | Importe sin impuestos |
total | número | Importe con impuestos |
taxes | array | Impuestos aplicados (ej: [{"name":"IVA","rate":21,"amount":21.76}]) |
VeriFactu
Si tu cuenta tiene VeriFactu activado, las facturas incluyen campos adicionales que reflejan el estado de la declaración ante la AEAT:
verifactu_estado: estado actual (Aceptado,Pendiente,Error...).verifactu_url: enlace para verificar la factura en la web de la AEAT.verifactu_qr: código QR que puedes incluir en la factura impresa.verifactu_uuid: identificador único de la declaración.
Si tu cuenta no tiene VeriFactu, estos campos estarán vacíos.
Consejos
- Filtra por fecha de emisión. La mayoría de consultas contables necesitan un rango de fechas. Usa
issuedDatecon$gtey$ltpara acotar el trimestre, mes o año fiscal que necesites. - Distingue activas de anuladas. Una factura anulada tiene
isCancelledcon una fecha. Si estás haciendo cálculos contables, recuerda excluirlas con"isCancelled": null. - Usa `fields` para exportaciones. Si solo necesitas serie, número, fecha y total para un libro de facturas, no pidas la factura completa con todos los datos fiscales.
- Cuidado con `order` vs `orders`. El campo
orderes legacy y apunta a una sola reserva. El campoorderses un array y es el que se usa actualmente. Si una factura agrupa varias reservas (por ejemplo, de una agencia), todas estarán enorders. - Las rectificativas tienen referencia. Si
isRectificationtiene valor, esa factura es una rectificativa de otra. Puedes expandirla conpopulate=isRectificationpara ver la original.
Preguntas frecuentes
¿Puedo crear o anular facturas por la API?
No. Los API Tokens son de solo lectura. Sirven para consultar datos, no para modificarlos. La creación y anulación de facturas se hace desde el panel de Buky.
¿Cómo sé si una factura es rectificativa?
Si el campo isRectification tiene un valor (el ID de otra factura), es una rectificativa. Si es null, es una factura original.
¿Por qué hay facturas sin número?
Las facturas sin number son borradores que aún no se han emitido. No tienen validez fiscal y no deberían incluirse en tus cálculos contables. Puedes excluirlas con filter={"number":{"$ne":null}}.
¿Qué significa el campo `version`?
Indica el formato de la factura. null corresponde al formato anterior a VeriFactu, donde las rectificativas anulaban en negativo. 2 es el formato actual, donde las facturas rectificativas son sustitutivas. Si tu cuenta activó VeriFactu recientemente, puedes tener facturas con ambos formatos.
¿Los datos fiscales (from/to) siempre están completos?
Depende de cómo se configuró la factura. Las facturas en modo simple pueden tener menos datos del destinatario que las de modo normal. Si necesitas datos fiscales completos, verifica que mode sea normal.
