Documentación oficial · API v1.1.2 · Webhooks v1.1.1

Conecta tus aplicaciones con FacturaOne mediante API REST y webhooks

Consulta clientes, artículos, proveedores, facturas, pagos, cobros, ventas y catálogos auxiliares mediante una API REST de solo lectura, y recibe cambios relevantes en tiempo real mediante webhooks salientes en formato JSON.

API de solo lectura HTTPS + JSON X-API-Key o Bearer Paginación estable Webhooks salientes

Última revisión: 30 de julio de 2026 · API: https://api.facturaone.com/v1/ · Webhooks: URL configurable

Activar la API, generar el token y configurar la URL de webhooks no tiene coste adicional.

El uso efectivo se factura según el consumo realizado y las tarifas vigentes. FacturaOne registra tanto las consultas de lectura como los intentos de entrega de webhooks, y permite revisar el mes actual y periodos anteriores desde el ERP.

URL basehttps://api.facturaone.com/v1/Todos los recursos se consultan mediante parámetros GET.
Versión API1.1.2Se devuelve en el JSON y en X-API-Version. Los webhooks conservan su esquema 1.1.1.
MétodoGET API · POST webhookLa API de lectura usa GET; FacturaOne entrega los eventos salientes mediante POST JSON.
Autenticación APIX-API-Key o BearerPara consultas API; el receptor webhook usa un secreto propio.
Formatoapplication/jsonContenido UTF-8 y estructura uniforme de errores.
Límite predeterminado50 registrosSe modifica con el parámetro limit.
Límite máximo200 registrosLos valores fuera de 1–200 se rechazan.
Periodo máximo366 díasProtección aplicada a facturas, pagos y ventas.
Novedad de la API v1.1.2: consulta independiente de pagos
El nuevo recurso resource=payments permite consultar pagos y cobros por fecha, factura, albarán, cliente, usuario, forma de pago, banco, remesa y estado. La ampliación es aditiva: invoices&include_payments=1 conserva exactamente su estructura compacta anterior.
01 · Integración

Inicio rápido

La primera llamada recomendada consulta cinco clientes activos. El token se obtiene dentro de FacturaOne y debe guardarse como un secreto del servidor.

Primera petición

Utilice la cabecera X-API-Key y sustituya TU_TOKEN_API por el valor generado en su instalación.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=clients&active=1&limit=5&fields=client_id,client_name,client_nif,client_email"
Más ejemplos de autenticación y códigoBearer, PHP y Node.js

Authorization Bearer

Alternativa estándar para clientes que ya trabajan con autenticación Bearer.

curl -sS \
  -H "Authorization: Bearer TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=resources"

Cabecera directa

La opción recomendada en Postman, PHP, Node.js y procesos de servidor.

X-API-Key: TU_TOKEN_API

PHP con cURL

<?php
$url = 'https://api.facturaone.com/v1/?resource=clients&active=1&limit=5';
$token = getenv('FACTURAONE_API_TOKEN');

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 20,
    CURLOPT_HTTPHEADER => [
        'X-API-Key: ' . $token,
        'Accept: application/json',
    ],
]);

$body = curl_exec($ch);
if ($body === false) {
    throw new RuntimeException(curl_error($ch));
}

$status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
$payload = json_decode($body, true, 512, JSON_THROW_ON_ERROR);

if ($status < 200 || $status >= 300 || empty($payload['ok'])) {
    $message = $payload['message'] ?? ('Error HTTP ' . $status);
    $requestId = $payload['request_id'] ?? 'sin request_id';
    throw new RuntimeException($message . ' [' . $requestId . ']');
}

foreach ($payload['data'] as $client) {
    echo $client['client_id'] . ' - ' . $client['client_name'] . PHP_EOL;
}

Node.js 18+ con fetch

// Node.js 18+ — utilícelo en backend, nunca en JavaScript público.
const url = 'https://api.facturaone.com/v1/?resource=clients&active=1&limit=5';
const token = process.env.FACTURAONE_API_TOKEN;

const response = await fetch(url, {
  method: 'GET',
  headers: {
    'X-API-Key': token,
    'Accept': 'application/json'
  }
});

const payload = await response.json();

if (!response.ok || payload.ok !== true) {
  throw new Error(
    `${payload.message || `Error HTTP ${response.status}`} ` +
    `[${payload.request_id || 'sin request_id'}]`
  );
}

for (const client of payload.data) {
  console.log(client.client_id, client.client_name);
}
No coloque el token de lectura de la API en la URL
La API exige una cabecera HTTP. Use cURL, Postman, Insomnia o código de servidor. Enviar el token como parámetro lo expondría en historiales, analítica y registros.
02 · Convenciones

Reglas globales de consulta

Todos los recursos comparten una estructura coherente de autenticación, filtros, límites y errores.

ParámetroAliasFormatoComportamiento
resourcerecursoNombre de recursoSelecciona el recurso. Si se omite, se devuelve resources.
limitlimiteEntero de 1 a 200Por defecto devuelve 50 registros. Se combina con after_id o cursor.
searchbuscarTexto de hasta 100 caracteresBúsqueda parcial en los campos autorizados de cada recurso.
date_fromfecha_desde, fechaini, desde_fechaYYYY-MM-DDFecha inicial para recursos complejos. Debe enviarse con date_to.
date_tofecha_hasta, fechafin, hasta_fechaYYYY-MM-DDFecha final inclusiva. El intervalo no puede superar 366 días.

Fechas seguras

Si no se indican fechas, invoices, sales y los listados generales de payments consultan desde el primer día del mes actual hasta hoy. En payments, las búsquedas por id, invoice_id, aquote_id o remittance_id no aplican ese periodo predeterminado.

Identificadores

Los filtros de ID usan normalmente enteros positivos. El valor 0 o la ausencia del parámetro suele equivaler a no filtrar; payments.user_id también admite -1 para registros automáticos o especiales.

Un solo valor

Cada parámetro debe contener un valor escalar. Formatos como id[]=1 generan BAD_PARAMETER.

Estructura común de una respuesta correcta

ok
true cuando la consulta se ha completado.
read_only
Siempre true.
version
Versión de la API que respondió.
account
Cuenta o instalación identificada por el token.
resource
Nombre canónico del recurso consultado.
filters
Filtros normalizados y realmente aplicados.
pagination
Estado de la página y clave de continuación.
data
Registros devueltos.
request_id
Identificador de diagnóstico, también enviado en X-Request-ID.
La instalación se identifica mediante el token
El consumidor no envía el nombre de la base de datos ni un identificador de empresa. La API localiza la instalación asociada y devuelve su nombre en account. Las fechas predeterminadas se calculan con la zona horaria Europe/Madrid.
03 · Datos disponibles

Recursos y catálogos

La API expone maestros de clientes, artículos y proveedores; catálogos auxiliares; facturas emitidas; pagos y cobros; y líneas de venta procedentes de facturas y albaranes.

Descubrimiento automático: resource=resources

Esta llamada devuelve los recursos autorizados, su clave primaria, campos, filtros, paginación y límites. Es la primera consulta recomendada para un conector.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=resources"

Resumen de recursos

RecursoAliasClave primariaactiveFinalidad
clientsclientesclient_idMaestro de clientes, datos fiscales y comerciales actuales.
itemsarticulositem_lookup_idCatálogo actual de artículos, descripción, precios, stock y clasificación.
suppliersproveedoresproveedor_idMaestro de proveedores y sus datos fiscales, de contacto y contables.
familiesfamiliasfamilia_idNoCatálogo de familias utilizado por los artículos y por el filtro family_id de ventas.
item_typestipos_articulotipo_articulo_idClasificación por tipo de artículo utilizada por item_type_id.
invoice_seriesseries_facturaseriesinvoice_group_idSeries o grupos de facturación utilizados por series_id.
invoice_typestipos_facturatipo_factura_idCatálogo de tipos de factura utilizado por invoice_type_id.
routesrutasruta_idRutas comerciales o de reparto utilizadas por route_id.
usersusuariosuser_idNoUsuarios disponibles para filtros comerciales. Excluye usuarios configurados como solo catálogo.
tax_ratesimpuestostax_rate_idTipos impositivos utilizados por artículos, facturas y el filtro tax_rate_id.
payment_methodsformas_pagopayment_method_idNoCatálogo de formas de pago utilizado por facturas y pagos.
paymentspaymentpagospagocobroscobropayment_idNoPagos y cobros vinculados a facturas, albaranes o clientes, con trazabilidad del documento de origen y del saldo actual.
invoicesissued_invoicesfacturasfacturas_emitidasinvoice_idNoFacturas emitidas con importes, impuestos, validez y pagos opcionales.
salessales_linesitem_salesventasventas_articulossalida_articuloscursor compuestoNoLíneas vendidas desde facturas y/o albaranes, con coste, beneficio y margen históricos.

Filtros de los recursos simples

FiltroValoresDescripción
idEntero > 0Devuelve un registro concreto por la clave primaria.
active / activo0, 1, allSolo está disponible en recursos con una columna activa configurada.
search / buscarTexto ≤ 100Búsqueda parcial sobre los campos documentados de cada recurso.
fields / camposLista separada por comasReduce la respuesta. La clave primaria se añade automáticamente.
after_id / desde_idEntero ≥ 0Continúa después de la última clave. No puede combinarse con id.
limit / limite1–200Por defecto 50. La API consulta un registro adicional para calcular has_more.
fields solo existe en recursos simples
invoices, payments y sales devuelven siempre una estructura fija y documentada.

Cómo obtener los identificadores usados por los filtros

FiltroRecurso que debe consultarCampo a utilizar
client_idclientsclient_id
user_id, owner_user_idusersuser_id
route_idroutesruta_id
series_idinvoice_seriesinvoice_group_id
invoice_type_idinvoice_typestipo_factura_id
family_idfamiliesfamilia_id
item_iditemsitem_lookup_id
item_type_iditem_typestipo_articulo_id
tax_rate_idtax_ratestax_rate_id
payment_method_idpayment_methodspayment_method_id
payment_idpaymentspayment_id
No fije los IDs de las formas de pago en el código
Obtenga siempre payment_method_id mediante resource=payment_methods. Una instalación puede contener nombres personalizados o incluso etiquetas repetidas con identificadores distintos; el recurso payments devuelve tanto el ID como el nombre real almacenado.
Descripción actual e histórica del artículo
items.item_description devuelve la descripción actual del catálogo. En cambio, sales.item.description conserva la descripción guardada en la línea del documento.

Diccionario completo de recursos simples

Abra cada recurso para ver alias, búsqueda, llamada recomendada y campos autorizados.

Clientes — clients24 campos autorizados

Maestro de clientes, datos fiscales y comerciales actuales.

Recurso
clients
Alias
clientes
Clave primaria
client_id
Filtro active
0, 1, all o todos

Campos usados por search

client_nameclient_name_comercialclient_nifclient_email

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=clients&active=1&limit=5&fields=client_id,client_name,client_nif,client_email,client_active"

Campos permitidos en fields

CampoSignificado
client_idIdentificador interno del cliente.
client_date_createdFecha de creación del cliente.
client_date_modifiedFecha de la última modificación.
client_numidNúmero o código interno asignado al cliente.
client_nameNombre fiscal o razón social.
client_name_comercialNombre comercial.
client_nifNIF, CIF o identificador fiscal.
client_address_1Primera línea de dirección.
client_address_2Segunda línea de dirección.
client_cityPoblación.
client_stateProvincia, estado o región.
client_zipCódigo postal.
client_countryPaís.
client_contactoPersona de contacto.
client_phoneTeléfono principal.
client_mobileTeléfono móvil.
client_emailCorreo electrónico.
client_webSitio web.
client_activeIndicador de cliente activo.
client_tarifaTarifa de precios asignada.
client_ruta_idIdentificador de la ruta actual del cliente.
user_idIdentificador del propietario actual del cliente.
recargoequivalenciaConfiguración de recargo de equivalencia.
retencionprofesionalConfiguración de retención profesional.
Artículos — items29 campos autorizados

Catálogo actual de artículos, descripción, precios, stock y clasificación.

Recurso
items
Alias
articulos
Clave primaria
item_lookup_id
Filtro active
0, 1, all o todos

Campos usados por search

item_nameitem_skuitem_barcode

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=items&active=1&limit=5&fields=item_lookup_id,item_name,item_description,item_sku,item_barcode,item_stock,item_price,item_familia"

Campos permitidos en fields

CampoSignificado
item_lookup_idIdentificador interno del artículo.
item_create_dateFecha de creación del artículo.
item_date_ultima_compraFecha de la última compra registrada.
item_date_ultima_ventaFecha de la última venta registrada.
item_activeIndicador de artículo activo.
item_web_activateIndicador de publicación o uso web.
item_erp_activateIndicador de disponibilidad en el ERP.
item_pos_activateIndicador de disponibilidad en el punto de venta.
item_nosaleIndicador de artículo no vendible.
item_is_stockIndica si el artículo se controla por stock.
item_stockStock actual almacenado en el catálogo.
item_nameNombre actual del artículo; en algunas cuentas se utiliza como código interno.
item_descriptionDescripción actual de la ficha del artículo; se diferencia de la descripción histórica guardada en cada línea de venta.
item_skuReferencia o SKU.
item_barcodeCódigo de barras.
item_unidadUnidad de medida.
item_cost_pricePrecio de coste actual.
item_pricePrecio principal de venta.
item_tarifa2Precio de la tarifa 2.
item_tarifa3Precio de la tarifa 3.
item_tarifa4Precio de la tarifa 4.
item_tarifa5Precio de la tarifa 5.
item_tax_rate_idIdentificador del impuesto asignado.
item_familiaIdentificador de la familia actual.
item_subfamiliaIdentificador de la subfamilia actual.
item_tipoarticuloidIdentificador del tipo de artículo actual.
item_formato_idIdentificador del formato predeterminado.
imageNombre o referencia de imagen guardada.
item_imageurlURL de imagen asociada.
Proveedores — suppliers23 campos autorizados

Maestro de proveedores y sus datos fiscales, de contacto y contables.

Recurso
suppliers
Alias
proveedores
Clave primaria
proveedor_id
Filtro active
0, 1, all o todos

Campos usados por search

client_nameclient_name_comercialclient_nifclient_email

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=suppliers&active=1&limit=5&fields=proveedor_id,client_name,client_nif,client_email,client_active"

Campos permitidos en fields

CampoSignificado
proveedor_idIdentificador interno del proveedor.
client_date_createdFecha de creación.
client_date_modifiedFecha de la última modificación.
client_numidNúmero o código interno.
client_nameNombre fiscal o razón social.
client_name_comercialNombre comercial.
client_nifNIF, CIF o identificador fiscal.
client_address_1Primera línea de dirección.
client_address_2Segunda línea de dirección.
client_cityPoblación.
client_stateProvincia, estado o región.
client_zipCódigo postal.
client_countryPaís.
client_contactoPersona de contacto.
client_phoneTeléfono principal.
client_mobileTeléfono móvil.
client_emailCorreo electrónico.
client_webSitio web.
client_activeIndicador de proveedor activo.
client_comprasIndicador de uso del proveedor en compras.
client_gastosIndicador de uso del proveedor en gastos.
client_contableIndicador de uso contable del proveedor.
recargoequivalenciaConfiguración de recargo de equivalencia.
Familias de artículos — families4 campos autorizados

Catálogo de familias utilizado por los artículos y por el filtro family_id de ventas.

Recurso
families
Alias
familias
Clave primaria
familia_id
Filtro active
No admitido

Campos usados por search

familia_name

Filtro active no disponible
Enviar active=0 o active=1 en este recurso produce FILTER_NOT_SUPPORTED.

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=families&limit=100&fields=familia_id,familia_name,familia_web_activate"

Campos permitidos en fields

CampoSignificado
familia_idIdentificador de la familia.
familia_web_activateIndicador de publicación o uso web.
familia_nameNombre interno de la familia.
familia_name_tiendaNombre de la familia mostrado en tienda.
Tipos de artículo — item_types4 campos autorizados

Clasificación por tipo de artículo utilizada por item_type_id.

Recurso
item_types
Alias
tipos_articulo
Clave primaria
tipo_articulo_id
Filtro active
0, 1, all o todos

Campos usados por search

tipo_articulo_nametipo_articulo_descripcion

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=item_types&active=1&limit=100"

Campos permitidos en fields

CampoSignificado
tipo_articulo_idIdentificador del tipo de artículo.
tipo_articulo_activateIndicador de tipo activo.
tipo_articulo_nameNombre del tipo.
tipo_articulo_descripcionDescripción del tipo.
Series de factura — invoice_series7 campos autorizados

Series o grupos de facturación utilizados por series_id.

Recurso
invoice_series
Alias
series_facturaseries
Clave primaria
invoice_group_id
Filtro active
0, 1, all o todos

Campos usados por search

invoice_group_nameinvoice_group_name_menuinvoice_group_prefix

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoice_series&active=1&limit=100"

Campos permitidos en fields

CampoSignificado
invoice_group_idIdentificador de la serie o grupo.
invoice_group_activateIndicador de serie activa.
invoice_group_nameNombre de la serie.
invoice_group_name_menuNombre corto o mostrado en menús.
invoice_group_prefixPrefijo de numeración.
invoice_group_prefix_yearConfiguración de inclusión del año en el prefijo.
invoice_group_prefix_monthConfiguración de inclusión del mes en el prefijo.
Tipos de factura — invoice_types4 campos autorizados

Catálogo de tipos de factura utilizado por invoice_type_id.

Recurso
invoice_types
Alias
tipos_factura
Clave primaria
tipo_factura_id
Filtro active
0, 1, all o todos

Campos usados por search

tipo_factura_nametipo_factura_descripcion

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoice_types&active=1&limit=100"

Campos permitidos en fields

CampoSignificado
tipo_factura_idIdentificador del tipo de factura.
tipo_factura_activateIndicador de tipo activo.
tipo_factura_nameNombre del tipo de factura.
tipo_factura_descripcionDescripción del tipo.
Rutas — routes3 campos autorizados

Rutas comerciales o de reparto utilizadas por route_id.

Recurso
routes
Alias
rutas
Clave primaria
ruta_id
Filtro active
0, 1, all o todos

Campos usados por search

ruta_name

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=routes&active=1&limit=100"

Campos permitidos en fields

CampoSignificado
ruta_idIdentificador de la ruta.
ruta_activeIndicador de ruta activa.
ruta_nameNombre de la ruta.
Usuarios y comerciales — users4 campos autorizados

Usuarios disponibles para filtros comerciales. Excluye usuarios configurados como solo catálogo.

Recurso
users
Alias
usuarios
Clave primaria
user_id
Filtro active
No admitido

Campos usados por search

user_nameuser_company

Filtro active no disponible
Enviar active=0 o active=1 en este recurso produce FILTER_NOT_SUPPORTED.
Usuarios solo catálogo excluidos
El recurso aplica internamente acceso_solo_catalogo = 0.

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=users&limit=100&fields=user_id,user_name,user_company,user_type"

Campos permitidos en fields

CampoSignificado
user_idIdentificador del usuario.
user_nameNombre del usuario o comercial.
user_companyEmpresa asociada al usuario.
user_typeTipo de usuario.
Impuestos — tax_rates6 campos autorizados

Tipos impositivos utilizados por artículos, facturas y el filtro tax_rate_id.

Recurso
tax_rates
Alias
impuestos
Clave primaria
tax_rate_id
Filtro active
0, 1, all o todos

Campos usados por search

tax_rate_name

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=tax_rates&active=1&limit=100"

Campos permitidos en fields

CampoSignificado
tax_rate_idIdentificador del tipo impositivo.
tax_rate_activeIndicador de impuesto activo.
tax_rate_nameNombre del impuesto.
tax_rate_tipoClasificación interna del impuesto.
tax_rate_percentPorcentaje impositivo.
recargoequivalenciaPorcentaje de recargo de equivalencia asociado.
Formas de pago — payment_methods2 campos autorizados

Catálogo de formas de pago utilizado por facturas y pagos.

Recurso
payment_methods
Alias
formas_pago
Clave primaria
payment_method_id
Filtro active
No admitido

Campos usados por search

payment_method_name

Filtro active no disponible
Enviar active=0 o active=1 en este recurso produce FILTER_NOT_SUPPORTED.

Ejemplo recomendado

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payment_methods&limit=100"

Campos permitidos en fields

CampoSignificado
payment_method_idIdentificador de la forma de pago.
payment_method_nameNombre de la forma de pago.
Ejemplo de respuesta de resourcesFragmento ilustrativo
{
  "ok": true,
  "read_only": true,
  "version": "1.1.2",
  "account": "Empresa de ejemplo",
  "defaults": {
    "limit": 50,
    "maximum_limit": 200,
    "complex_date_range": "mes_actual",
    "maximum_date_range_days": 366
  },
  "resources": [
    {
      "resource": "clients",
      "nombre": "clientes",
      "description": "Maestro de clientes.",
      "primary_key": "client_id",
      "fields": ["client_id", "client_name", "..."],
      "filters": ["id", "active", "search", "after_id", "limit", "fields"],
      "pagination": "after_id",
      "maximum_limit": 200
    }
  ],
  "request_id": "a1b2c3d4e5f60708"
}
Ejemplo de respuesta de un recurso simpleclients con fields y paginación
{
  "ok": true,
  "read_only": true,
  "version": "1.1.2",
  "account": "Empresa de ejemplo",
  "resource": "clients",
  "nombre": "clientes",
  "filters": {
    "id": null,
    "active": "1",
    "search": null,
    "after_id": 0,
    "limit": 1,
    "fields": ["client_id", "client_name", "client_nif", "client_email"]
  },
  "pagination": {
    "returned": 1,
    "has_more": true,
    "next_after_id": 12
  },
  "data": [
    {
      "client_id": 12,
      "client_name": "CLIENTE DE EJEMPLO, S.L.",
      "client_nif": "B12345678",
      "client_email": "[email protected]"
    }
  ],
  "request_id": "a1b2c3d4e5f60708"

}
04 · Documentos

Facturas emitidas — resource=invoices

Consulta estructurada de cabeceras de factura, cliente, serie, estado, validez, importes, impuestos y pagos opcionales.

Alias aceptados

invoicesissued_invoicesfacturasfacturas_emitidas

Para nuevas integraciones use preferentemente el nombre canónico invoices.

Periodo predeterminado

Sin fechas y sin id: desde el primer día del mes actual hasta hoy.

Impuestos

Siempre se devuelven en data[].taxes como colección estructurada.

Pagos

Solo aparecen con include_payments=1 para evitar carga innecesaria. Para filtros, albaranes, remesas y trazabilidad completa use resource=payments.

Dos formas compatibles de leer pagos
invoices&include_payments=1 añade una colección compacta a cada factura devuelta y mantiene su esquema anterior. resource=payments es el recurso completo para sincronizar pagos, localizar cobros de albaranes, consultar devueltos o conservar la trazabilidad cuando un albarán se transforma en factura.

Filtros disponibles

ParámetroAliasFormatoPredeterminadoDescripción
idinvoice_idEntero mayor que 0Sin filtroObtiene una factura concreta. Cuando se usa, no se aplica el periodo predeterminado.
after_iddesde_idEntero igual o mayor que 00Paginación ascendente por invoice_id. No puede combinarse con id.
date_fromfecha_desde fechaini desde_fechaYYYY-MM-DDPrimer día del mes actualFecha de emisión inicial, inclusiva. Debe enviarse junto con date_to.
date_tofecha_hasta fechafin hasta_fechaYYYY-MM-DDFecha actualFecha de emisión final, inclusiva. El intervalo máximo es de 366 días.
client_idclienteEntero mayor que 0Sin filtroFiltra por el cliente de la factura.
user_idusuarioEntero mayor que 0Sin filtroFiltra por el usuario o comercial guardado en la factura.
owner_user_idpropietario_user_idEntero mayor que 0Sin filtroFiltra por el propietario actual del cliente.
route_idruta_idEntero mayor que 0Sin filtroFiltra por la ruta actual del cliente.
series_idserie invoice_group_idEntero mayor que 0Sin filtroFiltra por serie o grupo de facturación.
invoice_type_idtipo_factura tipofacturaEntero mayor que 0Sin filtroFiltra por tipo de factura.
statusestadoEnumallall, draft, sent, viewed, paid o pending. También admite 1 a 6 como alias históricos.
validityvalidezEnumallall, valid, cancelled, substituted o invalid.
searchbuscarTexto, máximo 100 caracteresSin búsquedaBusca por número, referencia, nombre o NIF del cliente, tanto en la factura como en el maestro actual.
include_paymentsincluir_pagosBooleano 0/10Añade data[].payments. También acepta true/false, yes/no y si/sí.
limitlimiteEntero de 1 a 20050Número máximo de facturas por página.

Valores de status

ValorComportamiento
allSin filtro de estado.
draft / 1invoice_status_id = 1.
sent / 2invoice_status_id = 2.
viewed / 3invoice_status_id = 3.
paid / 4Saldo absoluto menor o igual que 0,01.
pending / 5 / 6Saldo absoluto mayor que 0,01; incluye saldo pendiente y saldo a favor.

Valores de validity

ValorComportamiento
allIncluye válidas, anuladas y sustituidas.
validNo anulada y no sustituida.
cancelledAnulada.
substitutedSustituida.
invalidAnulada o sustituida.
Alias de valores por compatibilidad
status: todo, todos, borrador, enviados, vistos, pagados y pendientes. validity: todos, válidas, canceled, anuladas, sustituidas e inválidas. Para integraciones nuevas utilice los valores canónicos en inglés.
status=6 no elimina el límite de fechas
El valor histórico 6 se normaliza a pending. Para pendientes antiguos recorra periodos explícitos de hasta 366 días.
Estado documental y estado de cobro son distintos
status.code representa el estado documental. El cobro se informa en status.payment_status: paid, pending o credit.

Ejemplos de consulta

Consultas habituales de facturasPeriodo, ID, pagos, pendientes, búsqueda y página siguiente

Facturas del periodo

Hasta 100 facturas emitidas entre dos fechas.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&date_from=2026-07-01&date_to=2026-07-26&limit=100"

Factura exacta por ID

Permite recuperar una factura antigua sin enviar fechas.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&id=12345"

Factura con pagos

Añade la colección payments.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&id=12345&include_payments=1"

Facturas válidas y pendientes

Combina saldo pendiente con exclusión de anuladas y sustituidas.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&date_from=2026-01-01&date_to=2026-12-31&status=pending&validity=valid&limit=100"

Cliente y serie

Los ID se obtienen desde clients e invoice_series.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&date_from=2026-01-01&date_to=2026-12-31&client_id=949&series_id=1"

Búsqueda por texto

Busca por número, referencia, nombre o NIF.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&date_from=2026-01-01&date_to=2026-12-31&search=garcia"

Página siguiente

Conserve exactamente los mismos filtros y añada next_after_id.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=invoices&date_from=2026-01-01&date_to=2026-12-31&status=pending&validity=valid&limit=100&after_id=12345"

Datos históricos y actuales

  • Nombre, NIF y datos fiscales principales priorizan la instantánea guardada en la factura.
  • Dirección estructurada, propietario y ruta proceden del maestro actual del cliente.
  • Importes e impuestos corresponden al documento.
  • Anuladas y sustituidas no se ocultan por defecto: se identifican en validity.

Origen de impuestos

La fuente principal es fi_invoice_tax_rates. Para facturas históricas sin desglose, la API agrupa las líneas y marca el origen.

source=invoice_tax_ratessource=invoice_items_fallback

Diccionario de campos de data[]

Identificación y fechas11 rutas documentadas
Ruta JSONTipoSignificado
invoice_idintegerIdentificador de la factura.
numberstringNúmero completo de factura.
referencestring|nullReferencia externa o interna.
descriptionstring|nullDescripción de la operación.
originstring|nullOrigen indicado en la factura.
incotermsstring|nullIncoterm asociado.
dates.issueddate|nullFecha de emisión.
dates.operationdate|nullFecha de operación.
dates.duedate|nullFecha de vencimiento.
dates.modified_atdatetime|nullÚltima modificación.
dates.confirmed_atdatetime|nullFecha y hora de confirmación.
Estado y validez11 rutas documentadas
Ruta JSONTipoSignificado
status.idintegerEstado interno de la factura.
status.codestringdraft, sent, viewed o unknown según status.id.
status.confirmedbooleanIndica si la factura está confirmada.
status.payment_statusstringpaid, pending o credit según el saldo.
validity.is_validbooleantrue cuando no está anulada ni sustituida.
validity.cancelledbooleanIndica anulación TicketBAI/VeriFactu u otra anulación registrada.
validity.cancellation_systemstring|nullverifactu, ticketbai, unspecified o null.
validity.substitutedbooleanIndica que la factura fue sustituida.
validity.rectifies_invoice_idinteger|nullID de la factura original que este documento rectifica, almacenado en invoice_rec_id.
validity.rectified_from_invoice_idinteger|nullID adicional relacionado con el origen de la rectificación, almacenado en invoice_rec_from_invoice_id.
validity.rectification_typeintegerCódigo interno del tipo de rectificación.
Factura electrónica, serie y tipo10 rutas documentadas
Ruta JSONTipoSignificado
electronic_invoice.ticketbai_typestring|nullTipo TicketBAI.
electronic_invoice.ticketbai_numberstring|nullNúmero o identificador TicketBAI.
electronic_invoice.verifactu_statusstring|nullEstado VeriFactu almacenado.
electronic_invoice.verifactu_csvstring|nullCSV VeriFactu.
electronic_invoice.verifactu_qr_urlstring|nullURL del QR VeriFactu.
electronic_invoice.verifactu_validationstring|nullURL de validación VeriFactu.
series.invoice_group_idintegerID de serie o grupo.
series.namestring|nullNombre de la serie.
invoice_type.invoice_type_idintegerID del tipo de factura.
invoice_type.namestring|nullNombre del tipo de factura.
Participantes y cliente25 rutas documentadas
Ruta JSONTipoSignificado
sellerobject|nullComercial de la factura.
seller.user_idinteger|nullID del comercial cuando seller no es null.
seller.namestring|nullNombre del comercial.
ownerobject|nullPropietario actual del cliente.
owner.user_idinteger|nullID del propietario cuando owner no es null.
owner.namestring|nullNombre del propietario actual.
routeobject|nullRuta actual del cliente.
route.route_idinteger|nullID de la ruta cuando route no es null.
route.namestring|nullNombre de la ruta actual.
client.client_idintegerID del cliente.
client.namestring|nullNombre guardado en la factura; si falta, nombre actual. En factura simplificada de contado se devuelve una etiqueta genérica.
client.nifstring|nullNIF guardado en la factura; si falta, NIF actual. En factura simplificada de contado se devuelve vacío/null.
client.fiscal_datastring|nullDatos fiscales textuales guardados en la factura.
client.address_1string|nullDirección actual del maestro de clientes.
client.address_2string|nullSegunda línea de dirección actual.
client.postal_codestring|nullCódigo postal actual.
client.citystring|nullPoblación actual.
client.provincestring|nullProvincia o región actual.
client.countrystring|nullPaís actual.
client.phonestring|nullTeléfono actual.
client.mobilestring|nullMóvil actual.
client.emailstring|nullEmail actual.
issuer.namestring|nullNombre del emisor guardado en la factura.
issuer.nifstring|nullNIF del emisor guardado en la factura.
issuer.fiscal_datastring|nullDatos fiscales del emisor guardados en la factura.
Configuración e importes23 rutas documentadas
Ruta JSONTipoSignificado
payment_method_idintegerForma de pago de la factura.
bank_method_idintegerCuenta o método bancario asociado.
tax_exemption_causestring|nullCausa de exención fiscal.
display_options.hide_taxesbooleanIndica que la factura oculta impuestos en su presentación.
display_options.hide_line_pricebooleanIndica que la factura oculta precios de línea.
amounts.item_subtotalnumberSubtotal de líneas.
amounts.item_tax_totalnumberImpuesto calculado en líneas.
amounts.tax_totalnumberTotal de impuestos de la factura.
amounts.surcharge_totalnumberRecargo de equivalencia.
amounts.irpf_totalnumberImporte de IRPF.
amounts.irpf_percentnumberPorcentaje de IRPF.
amounts.retention_totalnumberImporte de retención.
amounts.retention_percentnumberPorcentaje de retención.
amounts.suppliesnumberSuplidos.
amounts.irpf_on_totalnumberIRPF calculado sobre el total.
amounts.irpf_on_total_percentnumberPorcentaje de IRPF sobre el total.
amounts.totalnumberTotal de la factura.
amounts.paidnumberImporte pagado.
amounts.balancenumberSaldo pendiente; negativo implica saldo a favor.
amounts.profitnumberBeneficio almacenado.
currency.symbolstring|nullSímbolo de la divisa.
currency.exchange_ratenumber|nullTipo de cambio; null cuando no se aplica.
currency.converted_totalnumber|nullTotal convertido; null cuando no se aplica.
Impuestos y pagos24 rutas documentadas
Ruta JSONTipoSignificado
taxes[]arrayDesglose fiscal de la factura.
taxes[].invoice_tax_rate_idinteger|nullID del desglose; null en recuperación histórica.
taxes[].tax_rate_idintegerID del tipo impositivo.
taxes[].namestring|nullNombre del impuesto.
taxes[].percentnumberPorcentaje de impuesto.
taxes[].basenumberBase del tipo impositivo.
taxes[].tax_amountnumberCuota del impuesto.
taxes[].surcharge_percentnumberPorcentaje de recargo.
taxes[].surcharge_amountnumberCuota de recargo.
taxes[].include_item_taxbooleanIndicador almacenado en el desglose.
taxes[].sourcestringinvoice_tax_rates o invoice_items_fallback.
payments[]array opcionalSolo aparece con include_payments=1.
payments[].payment_idintegerID del pago.
payments[].numberstring|nullNúmero o referencia del pago.
payments[].datedate|nullFecha del pago.
payments[].amountnumberImporte del pago.
payments[].paidbooleanIndicador de pago realizado.
payments[].returnedbooleanIndicador de pago devuelto.
payments[].payment_method_idintegerID de forma de pago.
payments[].payment_method_namestring|nullNombre de la forma de pago.
payments[].bank_method_idintegerID del método o cuenta bancaria.
payments[].bank_method_namestring|nullNombre del método bancario.
payments[].bank_accounting_codestring|nullCódigo contable bancario.
payments[].notestring|nullNota del pago, limitada a 1.000 caracteres.
Ejemplo completo de respuesta de una facturaIncluye impuestos y payments
Valores ilustrativos
La colección payments solo aparece con include_payments=1.
{
  "ok": true,
  "read_only": true,
  "version": "1.1.2",
  "account": "Empresa de ejemplo",
  "resource": "invoices",
  "nombre": "facturas_emitidas",
  "filters": {
    "id": 12345,
    "date_from": null,
    "date_to": null,
    "date_defaulted": false,
    "client_id": null,
    "user_id": null,
    "owner_user_id": null,
    "route_id": null,
    "series_id": null,
    "invoice_type_id": null,
    "status": "all",
    "validity": "all",
    "search": null,
    "include_payments": true,
    "after_id": 0,
    "limit": 50
  },
  "pagination": {
    "returned": 1,
    "has_more": false,
    "next_after_id": null
  },
  "data": [
    {
      "invoice_id": 12345,
      "number": "F/2026/00125",
      "reference": "PED-7781",
      "description": "Venta de material",
      "origin": null,
      "incoterms": null,
      "dates": {
        "issued": "2026-07-10",
        "operation": "2026-07-10",
        "due": "2026-08-09",
        "modified_at": "2026-07-10 12:41:03",
        "confirmed_at": "2026-07-10 12:40:55"
      },
      "status": {
        "id": 2,
        "code": "sent",
        "confirmed": true,
        "payment_status": "pending"
      },
      "validity": {
        "is_valid": true,
        "cancelled": false,
        "cancellation_system": null,
        "substituted": false,
        "rectifies_invoice_id": null,
        "rectified_from_invoice_id": null,
        "rectification_type": 0
      },
      "electronic_invoice": {
        "ticketbai_type": null,
        "ticketbai_number": null,
        "verifactu_status": "REGISTRADA",
        "verifactu_csv": "CSV-DE-EJEMPLO",
        "verifactu_qr_url": "https://ejemplo.test/qr",
        "verifactu_validation": "https://ejemplo.test/validar"
      },
      "series": {"invoice_group_id": 1, "name": "FACTURAS"},
      "invoice_type": {"invoice_type_id": 1, "name": "FACTURA COMPLETA"},
      "seller": {"user_id": 3, "name": "ANA COMERCIAL"},
      "owner": {"user_id": 3, "name": "ANA COMERCIAL"},
      "route": {"route_id": 2, "name": "RUTA NORTE"},
      "client": {
        "client_id": 949,
        "name": "CLIENTE DE EJEMPLO, S.L.",
        "nif": "B12345678",
        "fiscal_data": "Calle Ejemplo 1, 28000 Madrid",
        "address_1": "Calle Ejemplo 1",
        "address_2": null,
        "postal_code": "28000",
        "city": "Madrid",
        "province": "Madrid",
        "country": "España",
        "phone": "910000000",
        "mobile": null,
        "email": "[email protected]"
      },
      "issuer": {
        "name": "EMPRESA EMISORA, S.L.",
        "nif": "B87654321",
        "fiscal_data": "Avenida Principal 10, Madrid"
      },
      "payment_method_id": 2,
      "bank_method_id": 1,
      "tax_exemption_cause": null,
      "display_options": {"hide_taxes": false, "hide_line_price": false},
      "amounts": {
        "item_subtotal": 100.0,
        "item_tax_total": 21.0,
        "tax_total": 21.0,
        "surcharge_total": 0.0,
        "irpf_total": 0.0,
        "irpf_percent": 0.0,
        "retention_total": 0.0,
        "retention_percent": 0.0,
        "supplies": 0.0,
        "irpf_on_total": 0.0,
        "irpf_on_total_percent": 0.0,
        "total": 121.0,
        "paid": 50.0,
        "balance": 71.0,
        "profit": 34.5
      },
      "currency": {"symbol": "€", "exchange_rate": null, "converted_total": null},
      "taxes": [
        {
          "invoice_tax_rate_id": 987,
          "tax_rate_id": 1,
          "name": "IVA 21%",
          "percent": 21.0,
          "base": 100.0,
          "tax_amount": 21.0,
          "surcharge_percent": 0.0,
          "surcharge_amount": 0.0,
          "include_item_tax": false,
          "source": "invoice_tax_rates"
        }
      ],
      "payments": [
        {
          "payment_id": 4567,
          "number": "REC-4567",
          "date": "2026-07-12",
          "amount": 50.0,
          "paid": true,
          "returned": false,
          "payment_method_id": 2,
          "payment_method_name": "TRANSFERENCIA",
          "bank_method_id": 1,
          "bank_method_name": "BANCO PRINCIPAL",
          "bank_accounting_code": "572000001",
          "note": null
        }
      ]
    }
  ],
  "request_id": "a1b2c3d4e5f60708"
}
05 · Cobros

Pagos y cobros — resource=payments

Consulta independiente de los registros de fi_payments, con forma de pago, banco, remesa, usuario, cliente y documentos relacionados. El recurso identifica dónde está aplicado actualmente cada pago y conserva el albarán de origen cuando posteriormente se factura.

Alias aceptados

paymentspaymentpagospagocobroscobro

Para nuevas integraciones use preferentemente el nombre canónico payments.

Periodo predeterminado

Un listado general sin fechas consulta el mes actual. Las búsquedas por id, invoice_id, aquote_id o remittance_id recorren todo el historial sin exigir fechas.

Aplicación actual

Cuando invoice_id > 0, el pago está aplicado a la factura. Si además existe aquote_id, ese albarán se conserva como origen.

Paginación

Orden ascendente por payment_id, mediante after_id, con un máximo de 200 registros por petición.

Un pago transferido no se duplica
Si un pago se registró inicialmente en un albarán y después ese albarán se facturó, el recurso devuelve un único registro. allocation.current_document_type será invoice, allocation.origin_document_type será delivery_note y allocation.transferred_from_delivery_note será true.
La forma de pago se resuelve desde el catálogo real
El nombre se obtiene mediante fi_payment_methods. No se presupone que un ID concreto signifique siempre EFECTIVO, VISA, BIZUM o DOMICILIADO; consulte antes resource=payment_methods.

Filtros disponibles

ParámetroAliasFormatoPredeterminadoDescripción
idpayment_idEntero mayor que 0Sin filtroObtiene un pago concreto. No aplica el periodo predeterminado y no puede combinarse con after_id.
after_iddesde_idEntero igual o mayor que 00Continúa después del último payment_id procesado.
date_fromfecha_desde fechaini desde_fechaYYYY-MM-DDPrimer día del mes actual en listados generalesFecha inicial del pago, inclusiva. Debe enviarse junto con date_to.
date_tofecha_hasta fechafin hasta_fechaYYYY-MM-DDFecha actual en listados generalesFecha final del pago, inclusiva. El intervalo máximo es de 366 días.
invoice_idfactura_idEntero mayor que 0Sin filtroDevuelve los pagos aplicados a una factura. Sin fechas, consulta todo el historial de esa factura.
aquote_iddelivery_note_id albaran_id albarán_idEntero mayor que 0Sin filtroDevuelve los pagos relacionados con un albarán, incluidos los que después quedaron aplicados a una factura.
client_idclienteEntero mayor que 0Sin filtroFiltra por el cliente resuelto desde la factura, el albarán o, en último lugar, payment_client_id.
user_idusuarioEntero igual o mayor que -10, sin filtroFiltra por el usuario que registró el pago. El valor -1 permite consultar registros automáticos o especiales.
payment_method_idforma_pago_idEntero mayor que 0Sin filtroFiltra por la forma de pago. Obtenga el ID mediante resource=payment_methods.
bank_method_idbanc_method_id banco_idEntero mayor que 0Sin filtroFiltra por la cuenta o método bancario asociado.
remittance_idpayment_remesa_id remesa_idEntero mayor que 0Sin filtroFiltra por remesa. Sin fechas, consulta todo el historial de esa remesa.
document_typetipo_documentoEnumallall, invoice, delivery_note, client o unassigned.
paidpagadoall, 0 o 1allFiltra por payment_pagado. También admite true/false, yes/no y si/sí.
returneddevueltoall, 0 o 1allFiltra por payment_devuelto. También admite true/false, yes/no y si/sí.
searchbuscarTexto, máximo 100 caracteresSin búsquedaBusca en número, banco, nota, forma de pago, factura, albarán, cliente, NIF y usuario.
limitlimiteEntero de 1 a 20050Número máximo de pagos por página.

Valores de document_type

ValorPago seleccionado
allNo aplica filtro de asignación documental.
invoiceinvoice_id > 0. Incluye pagos transferidos desde albaranes.
delivery_noteinvoice_id = 0 y aquote_id > 0: el pago sigue actualmente en el albarán.
clientSin factura ni albarán, pero con payment_client_id > 0.
unassignedSin factura, albarán ni cliente auxiliar.

Valores de paid y returned

ValorComportamiento
all, todos, todo o *No filtra ese indicador.
1, true, yes, si o Exige indicador verdadero.
0, false o noExige indicador falso.
Alias de document_type por compatibilidad
invoice admite invoices, factura y facturas; delivery_note admite delivery_notes, aquote, aquotes, albaran, albarán y albaranes; client admite clients, cliente y clientes; unassigned admite none, sin_asignar y sin-asignar.
delivery_note significa asignación actual, no origen histórico
Un pago con invoice_id > 0 y aquote_id > 0 pertenece actualmente a la factura y, por tanto, no aparece con document_type=delivery_note. Para localizarlo por su albarán de origen utilice aquote_id=ID_ALBARAN.

Ejemplos de consulta

Consultas habituales de pagosPeriodo, factura, albarán, forma de pago, devueltos y página siguiente

Pagos de un periodo

Devuelve hasta 100 pagos registrados entre dos fechas.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&date_from=2026-07-01&date_to=2026-07-31&limit=100"

Historial de una factura

No necesita fechas y devuelve todos los pagos vinculados a la factura.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&invoice_id=12345"

Pagos originados en un albarán

Incluye el pago aunque después haya sido transferido a una factura.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&aquote_id=6789"

Pagos cobrados por una forma de pago

El ID 4 es meramente ilustrativo; consulte antes payment_methods.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&date_from=2026-01-01&date_to=2026-12-31&payment_method_id=4&paid=1"

Pagos que siguen en albaranes

Excluye los que ya están aplicados a una factura.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&date_from=2026-01-01&date_to=2026-12-31&document_type=delivery_note"

Recibos devueltos

Puede combinarse con cliente, remesa, banco o forma de pago.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&date_from=2026-01-01&date_to=2026-12-31&returned=1"

Pago exacto

Recupera un registro antiguo sin indicar periodo.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&id=4567"

Página siguiente

Conserve los filtros y añada next_after_id.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=payments&date_from=2026-01-01&date_to=2026-12-31&limit=200&after_id=5000"

Resolución del cliente

La API prioriza el cliente de la factura; si no existe, usa el del albarán; y solo después utiliza payment_client_id. Así, un pago transferido conserva el cliente correcto del documento actual.

Importes del documento

invoice.amounts y delivery_note.amounts son resúmenes completos del documento relacionado. No representan únicamente el importe del registro de pago actual.

paid y returned son indicadores independientes
status.counts_towards_balance reproduce exactamente la regla usada por FacturaOne para los saldos y coincide con status.paid. No deduzca ese valor a partir de returned; lea siempre los tres campos.
Compatibilidad con bases antiguas
En instalaciones que todavía no tengan la columna fi_payments.payment_client_id, el recurso sigue funcionando. En ese caso no puede existir una asignación exclusiva de tipo client, pero las relaciones con factura y albarán se mantienen.

Diccionario de campos de data[]

Identificación, estado y nota13 rutas documentadas
Ruta JSONTipoSignificado
payment_idintegerIdentificador interno del pago.
numberstring|nullNúmero o referencia del pago.
datedate|nullFecha registrada en payment_date.
amountnumberImporte del pago, con hasta 4 decimales.
payment_client_idinteger|nullCliente auxiliar guardado directamente en el pago; puede diferir del cliente resuelto desde el documento.
statusobjectIndicadores del estado del pago.
status.paidbooleanValor de payment_pagado.
status.returnedbooleanValor de payment_devuelto.
status.counts_towards_balancebooleanIndica si el pago interviene en el pagado y el saldo del documento; coincide con status.paid.
maturity_daysintegerDías de vencimiento registrados en payment_vencimiento.
notestring|nullNota del pago, limitada a 4.000 caracteres.
note_truncatedbooleantrue cuando la nota original superaba 4.000 caracteres.
inmovbooleanIndicador almacenado en payment_inmov.
Forma de pago, banco y remesa11 rutas documentadas
Ruta JSONTipoSignificado
payment_methodobjectForma de pago relacionada.
payment_method.payment_method_idintegerID de fi_payment_methods.
payment_method.namestring|nullNombre real de la forma de pago.
bank_methodobjectCuenta o método bancario relacionado.
bank_method.bank_method_idintegerID del método bancario.
bank_method.namestring|nullNombre del método bancario.
bank_method.accounting_codestring|nullCódigo contable bancario.
bank_method.payment_bank_namestring|nullNombre bancario libre guardado directamente en el pago.
remittanceobject|nullRemesa asociada; null si no hay ID ni fecha.
remittance.remittance_idinteger|nullID de la remesa.
remittance.datedate|nullFecha registrada de la remesa.
Aplicación, usuario y cliente11 rutas documentadas
Ruta JSONTipoSignificado
allocation.current_document_typestringinvoice, delivery_note, client o unassigned según la aplicación actual.
allocation.origin_document_typestringdelivery_note cuando existe aquote_id; en otro caso coincide con el tipo actual.
allocation.transferred_from_delivery_notebooleantrue cuando coexisten invoice_id y aquote_id.
userobject|nullUsuario que registró el pago.
user.user_idinteger|nullID del usuario; puede ser -1 en registros especiales.
user.namestring|nullNombre del usuario cuando existe en el maestro.
clientobject|nullCliente resuelto por prioridad documental.
client.client_idinteger|nullID del cliente resuelto.
client.namestring|nullNombre fiscal actual del cliente.
client.commercial_namestring|nullNombre comercial actual.
client.nifstring|nullNIF o identificador fiscal actual.
Factura relacionada11 rutas documentadas
Ruta JSONTipoSignificado
invoiceobject|nullFactura indicada por invoice_id; null cuando el pago no está aplicado a una factura.
invoice.invoice_idintegerID guardado en el pago.
invoice.existsbooleanIndica si la fila de factura relacionada existe actualmente.
invoice.numberstring|nullNúmero de factura.
invoice.referencestring|nullReferencia de la factura.
invoice.datedate|nullFecha de emisión.
invoice.status_idinteger|nullEstado interno; null si la factura ya no existe.
invoice.amountsobject|nullResumen completo del documento; null si la factura no existe.
invoice.amounts.totalnumberTotal de la factura.
invoice.amounts.paidnumberTotal pagado de la factura.
invoice.amounts.balancenumberSaldo actual de la factura.
Albarán relacionado12 rutas documentadas
Ruta JSONTipoSignificado
delivery_noteobject|nullAlbarán indicado por aquote_id; puede coexistir con invoice como origen histórico.
delivery_note.aquote_idintegerID guardado en el pago.
delivery_note.existsbooleanIndica si la fila de albarán relacionada existe actualmente.
delivery_note.numberstring|nullNúmero del albarán.
delivery_note.referencestring|nullReferencia del albarán.
delivery_note.datedate|nullFecha del albarán.
delivery_note.status_idinteger|nullEstado interno; null si el albarán ya no existe.
delivery_note.linked_invoice_idinteger|nullFactura vinculada actualmente desde la cabecera del albarán.
delivery_note.amountsobject|nullResumen completo del albarán; null si ya no existe.
delivery_note.amounts.totalnumberTotal del albarán.
delivery_note.amounts.paidnumberTotal pagado almacenado en el albarán.
delivery_note.amounts.balancenumberSaldo almacenado en el albarán.
Ejemplo completo de respuesta de un pago transferidoEl albarán se conserva como origen y la factura recibe el saldo
Valores ilustrativos
Los nombres, números e importes son ficticios. Los importes de invoice y delivery_note se leen de sus respectivas tablas de totales.
{
  "ok": true,
  "read_only": true,
  "version": "1.1.2",
  "account": "Empresa de ejemplo",
  "resource": "payments",
  "nombre": "pagos",
  "filters": {
    "id": 4567,
    "date_from": null,
    "date_to": null,
    "date_defaulted": false,
    "invoice_id": null,
    "aquote_id": null,
    "client_id": null,
    "user_id": null,
    "payment_method_id": null,
    "bank_method_id": null,
    "remittance_id": null,
    "document_type": "all",
    "paid": "all",
    "returned": "all",
    "search": null,
    "after_id": 0,
    "limit": 50
  },
  "pagination": {
    "returned": 1,
    "has_more": false,
    "next_after_id": null
  },
  "data": [
    {
      "payment_id": 4567,
      "number": "REC-4567",
      "date": "2026-07-12",
      "amount": 50.0,
      "payment_client_id": null,
      "status": {
        "paid": true,
        "returned": false,
        "counts_towards_balance": true
      },
      "payment_method": {
        "payment_method_id": 2,
        "name": "TRANSFERENCIA"
      },
      "bank_method": {
        "bank_method_id": 1,
        "name": "BANCO PRINCIPAL",
        "accounting_code": "572000001",
        "payment_bank_name": "Cuenta principal"
      },
      "maturity_days": 0,
      "remittance": null,
      "note": "Anticipo registrado originalmente en el albarán",
      "note_truncated": false,
      "inmov": false,
      "allocation": {
        "current_document_type": "invoice",
        "origin_document_type": "delivery_note",
        "transferred_from_delivery_note": true
      },
      "user": {
        "user_id": 3,
        "name": "ANA COMERCIAL"
      },
      "client": {
        "client_id": 949,
        "name": "CLIENTE DE EJEMPLO, S.L.",
        "commercial_name": "CLIENTE EJEMPLO",
        "nif": "B12345678"
      },
      "invoice": {
        "invoice_id": 12345,
        "exists": true,
        "number": "F/2026/00125",
        "reference": "PED-7781",
        "date": "2026-07-15",
        "status_id": 2,
        "amounts": {
          "total": 121.0,
          "paid": 50.0,
          "balance": 71.0
        }
      },
      "delivery_note": {
        "aquote_id": 6789,
        "exists": true,
        "number": "A/2026/00480",
        "reference": "PED-7781",
        "date": "2026-07-10",
        "status_id": 4,
        "linked_invoice_id": 12345,
        "amounts": {
          "total": 121.0,
          "paid": 0.0,
          "balance": 121.0
        }
      }
    }
  ],
  "request_id": "a1b2c3d4e5f60708"
}
06 · Líneas vendidas

Venta y salida de artículos — resource=sales

Consulta líneas de facturas y/o albaranes con documento, cliente, artículo, cantidades, precios, impuestos, coste, beneficio, margen y comisión.

Alias aceptados

salessales_linesitem_salesventasventas_articulossalida_articulos

Fuente predeterminada

source=all: combina facturas y albaranes.

Base predeterminada

basis=invoices: prevalece la factura cuando existe vínculo.

Paginación

Cursor opaco por fecha, fuente, documento y línea.

Filtros disponibles

ParámetroAliasFormatoPredeterminadoDescripción
date_fromfecha_desde fechaini desde_fechaYYYY-MM-DDPrimer día del mes actualFecha inicial del documento, inclusiva. Debe enviarse junto con date_to.
date_tofecha_hasta fechafin hasta_fechaYYYY-MM-DDFecha actualFecha final del documento, inclusiva. El intervalo máximo es de 366 días.
sourceorigenEnumallall, invoices o delivery_notes. Decide qué fuentes se consultan.
basisdesdeEnuminvoicesinvoices o delivery_notes. Decide qué documento prevalece al deduplicar; solo afecta a source=all.
movementverEnumallall, sales o returns. sales exige cantidad > 0; returns exige cantidad < 0.
document_iddocumento_idEntero mayor que 0Sin filtroID de factura o albarán. Con source=all puede coincidir en ambas tablas.
client_idclienteEntero mayor que 0Sin filtroFiltra por cliente.
user_idusuarioEntero mayor que 0Sin filtroFiltra por el usuario o comercial del documento.
owner_user_idpropietario_user_idEntero mayor que 0Sin filtroFiltra por el propietario actual del cliente.
route_idruta_idEntero mayor que 0Sin filtroFiltra por la ruta actual del cliente.
family_idfamiliaEntero mayor que 0Sin filtroFiltra por la familia actual del artículo.
item_idarticuloEntero mayor que 0Sin filtroFiltra por item_lookup_id.
item_type_idtipoEntero mayor que 0Sin filtroFiltra por el tipo actual del artículo.
tax_rate_idimpuesto_idEntero mayor que 0Sin filtroFiltra por tipo impositivo. El valor 0 equivale a no filtrar, por lo que no selecciona exclusivamente líneas exentas.
searchbuscarTexto, máximo 100 caracteresSin búsquedaBusca en documento, cliente, línea, artículo, SKU y código de barras.
cursorTexto opacoSin cursorCursor devuelto por pagination.next_cursor. No debe modificarse ni reutilizarse con otros filtros; longitud máxima admitida: 1.024 caracteres.
limitlimiteEntero de 1 a 20050Número máximo de líneas por página.

Cómo interactúan source y basis

sourcebasisResultado
allinvoicesIncluye facturas válidas y albaranes aún no vinculados a una factura existente. Es la combinación predeterminada.
alldelivery_notesIncluye albaranes y omite facturas procedentes de un albarán vinculado.
invoicesCualquier valor válidoConsulta únicamente líneas de factura. basis no realiza deduplicación.
delivery_notesCualquier valor válidoConsulta únicamente líneas de albarán. basis no realiza deduplicación.
Alias de valores admitidos
source: both, todos, invoice, factura, delivery_note y albaranes. basis: invoice, factura, delivery_note y albaranes. movement: todos, ventas, sale, return y devoluciones. Se recomiendan los valores canónicos en inglés.

Facturas incluidas

La rama de facturas excluye documentos anulados y sustituidos, además de líneas técnicas cuyo nombre contiene ALB-.

Movimiento

sales exige cantidad positiva; returns, cantidad negativa. all no aplica condición de signo.

Ejemplos de consulta

Consultas habituales de ventasPeriodo, familia, devoluciones, fuentes, búsqueda y cursor

Ventas del periodo

Aplica source=all, basis=invoices y movement=all.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-07-01&date_to=2026-07-26&limit=100"

Ventas positivas de una familia

La familia procede del catálogo actual.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-01-01&date_to=2026-12-31&family_id=4&movement=sales&limit=100"

Devoluciones de un artículo

Filtra cantidades negativas del artículo.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-01-01&date_to=2026-12-31&item_id=57248&movement=returns"

Solo facturas

Consulta únicamente líneas de factura.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-07-01&date_to=2026-07-26&source=invoices"

Vista basada en albaranes

Los albaranes prevalecen al deduplicar.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-07-01&date_to=2026-07-26&source=all&basis=delivery_notes"

Búsqueda por documento o artículo

Busca en documento, cliente, artículo, SKU y código de barras.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-01-01&date_to=2026-12-31&search=SKU-100"

Página siguiente

Sustituya CURSOR_DEVUELTO por pagination.next_cursor y conserve los filtros.

curl -sS \
  -H "X-API-Key: TU_TOKEN_API" \
  -H "Accept: application/json" \
  "https://api.facturaone.com/v1/?resource=sales&date_from=2026-07-01&date_to=2026-07-26&source=all&basis=invoices&limit=100&cursor=CURSOR_DEVUELTO"

Datos históricos y actuales en cada línea

  • Históricos: nombre y descripción de línea, lote, unidad, formato, cantidad, precio, coste, beneficio, margen, descuento e importes.
  • Actuales: SKU, código de barras, familia, tipo, nombre de la unidad de formato y porcentaje de comisión.
  • pricing.unit_cost, unit_profit y margin_percent se leen de la línea histórica; no se recalculan con el coste actual.
  • Si el artículo cambia de familia, una consulta histórica por family_id refleja la familia actual.
  • Propietario y ruta proceden del maestro actual del cliente.
page_totals no representa todo el periodo
Solo suma las líneas de la página actual. Para el total completo debe recorrer todas las páginas y acumular los resultados.

Diccionario de campos de data[]

Fuente y documento8 rutas documentadas
Ruta JSONTipoSignificado
sourcestringinvoice o delivery_note.
document.document_idintegerID de factura o albarán según source.
document.line_idintegerID de la línea.
document.linked_invoice_idinteger|nullFactura vinculada al albarán; en facturas es null.
document.status_idintegerEstado interno del documento.
document.datedate|nullFecha del documento.
document.numberstringNúmero del documento.
document.referencestring|nullReferencia del documento.
Cliente y responsables12 rutas documentadas
Ruta JSONTipoSignificado
client.client_idintegerID del cliente.
client.namestring|nullNombre del cliente.
client.nifstring|nullNIF del cliente.
sellerobject|nullComercial del documento.
seller.user_idinteger|nullID del comercial cuando seller no es null.
seller.namestring|nullNombre del comercial.
ownerobject|nullPropietario actual del cliente.
owner.user_idinteger|nullID del propietario cuando owner no es null.
owner.namestring|nullNombre del propietario actual.
routeobject|nullRuta actual del cliente.
route.route_idinteger|nullID de la ruta cuando route no es null.
route.namestring|nullNombre de la ruta actual.
Artículo y clasificación18 rutas documentadas
Ruta JSONTipoSignificado
item.item_lookup_idintegerID del artículo del catálogo; puede ser 0 si la línea es libre.
item.skustring|nullSKU actual del catálogo.
item.barcodestring|nullCódigo de barras actual.
item.namestring|nullNombre histórico guardado en la línea, limitado a 500 caracteres.
item.descriptionstring|nullDescripción histórica guardada en la línea, limitada a 2.000 caracteres.
item.lotstring|nullLote de la línea.
item.unitstring|nullUnidad guardada en la línea.
item.familyobject|nullFamilia actual del artículo.
item.family.family_idinteger|nullID de la familia cuando family no es null.
item.family.namestring|nullNombre actual de la familia.
item.typeobject|nullTipo actual del artículo.
item.type.item_type_idinteger|nullID del tipo cuando type no es null.
item.type.namestring|nullNombre actual del tipo.
item.formatobject|nullFormato asociado a la línea.
item.format.format_idinteger|nullID de formato guardado en la línea.
item.format.unitsnumberUnidades de formato guardadas en la línea.
item.format.unitstring|nullNombre actual de la unidad del catálogo de formatos.
quantitynumberCantidad de la línea, con hasta 4 decimales.
Precio, coste, margen, impuesto y comisión15 rutas documentadas
Ruta JSONTipoSignificado
pricing.unit_pricenumberPrecio unitario histórico guardado en la línea.
pricing.unit_costnumberCoste unitario histórico guardado en item_cost_price de la línea de factura o albarán.
pricing.unit_profitnumberBeneficio unitario histórico guardado en item_beneficio de la línea de factura o albarán.
pricing.margin_percentnumberMargen histórico guardado en item_margen de la línea de factura o albarán.
pricing.discount_percentnumberPorcentaje de descuento.
pricing.discount_amountnumberImporte calculado del descuento.
pricing.subtotalnumberSubtotal de la línea.
pricing.tax.tax_rate_idintegerID del impuesto de la línea.
pricing.tax.namestring|nullNombre del impuesto.
pricing.tax.percentnumberPorcentaje efectivo del impuesto.
pricing.tax.amountnumberCuota de impuesto.
pricing.tax.surcharge_amountnumberCuota de recargo de equivalencia.
pricing.totalnumberTotal de la línea.
commission.percentnumberPorcentaje actual de comisión del artículo.
commission.amountnumberComisión calculada sobre el subtotal.

Campos de page_totals

CampoTipoSignificado en la página actual
quantitynumberSuma de cantidades, incluidas negativas cuando hay devoluciones.
discount_amountnumberImporte de descuento de las líneas.
subtotalnumberSuma de bases o subtotales.
tax_amountnumberSuma de cuotas de impuesto.
surcharge_amountnumberSuma de cuotas de recargo de equivalencia.
totalnumberSuma del total de las líneas.
commission_amountnumberSuma de la comisión calculada.
Ejemplo completo de respuesta de ventasLínea de factura, cursor y totales de página
Valores ilustrativos
Cuando source sea delivery_note, document.document_id será el ID del albarán.
{
  "ok": true,
  "read_only": true,
  "version": "1.1.2",
  "account": "Empresa de ejemplo",
  "resource": "sales",
  "nombre": "salida_articulos",
  "filters": {
    "date_from": "2026-07-01",
    "date_to": "2026-07-15",
    "date_defaulted": false,
    "source": "all",
    "basis": "invoices",
    "movement": "sales",
    "document_id": null,
    "client_id": null,
    "user_id": null,
    "owner_user_id": null,
    "route_id": null,
    "family_id": 4,
    "item_id": null,
    "item_type_id": null,
    "tax_rate_id": null,
    "search": null,
    "limit": 1
  },
  "pagination": {
    "returned": 1,
    "has_more": true,
    "next_cursor": "eyJ2IjoxLCJmIjoiLi4uIn0"
  },
  "page_totals": {
    "quantity": 2.0,
    "discount_amount": 10.0,
    "subtotal": 90.0,
    "tax_amount": 18.9,
    "surcharge_amount": 0.0,
    "total": 108.9,
    "commission_amount": 1.8
  },
  "data": [
    {
      "source": "invoice",
      "document": {
        "document_id": 12345,
        "line_id": 67890,
        "linked_invoice_id": null,
        "status_id": 2,
        "date": "2026-07-10",
        "number": "F/2026/00125",
        "reference": "PED-7781"
      },
      "client": {
        "client_id": 949,
        "name": "CLIENTE DE EJEMPLO, S.L.",
        "nif": "B12345678"
      },
      "seller": {"user_id": 3, "name": "ANA COMERCIAL"},
      "owner": {"user_id": 3, "name": "ANA COMERCIAL"},
      "route": {"route_id": 2, "name": "RUTA NORTE"},
      "item": {
        "item_lookup_id": 57248,
        "sku": "SKU-100",
        "barcode": "8400000000100",
        "name": "ARTÍCULO DE EJEMPLO",
        "description": "Descripción guardada en la línea",
        "lot": "L-2026-07",
        "unit": "ud",
        "family": {"family_id": 4, "name": "CONSUMIBLES"},
        "type": {"item_type_id": 2, "name": "PRODUCTO"},
        "format": {"format_id": 1, "units": 1.0, "unit": "ud"}
      },
      "quantity": 2.0,
      "pricing": {
        "unit_price": 50.0,
        "unit_cost": 30.0,
        "unit_profit": 15.0,
        "margin_percent": 33.33,
        "discount_percent": 10.0,
        "discount_amount": 10.0,
        "subtotal": 90.0,
        "tax": {
          "tax_rate_id": 1,
          "name": "IVA 21%",
          "percent": 21.0,
          "amount": 18.9,
          "surcharge_amount": 0.0
        },
        "total": 108.9
      },
      "commission": {"percent": 2.0, "amount": 1.8}
    }
  ],
  "request_id": "a1b2c3d4e5f60708"
}
07 · Eventos salientes

Webhooks — cambios en tiempo real

FacturaOne puede enviar automáticamente un POST JSON a una URL de su servidor cuando se emite una factura, se crea o modifica un cliente, o se guarda la ficha de un artículo nuevo o existente. Los webhooks complementan la API de lectura: la API permite consultar, mientras que el webhook avisa de que acaba de producirse un cambio relevante.

Una única URL

Todos los eventos se entregan en la misma dirección configurada en Configuración → API externa. El receptor distingue el tipo mediante X-FacturaOne-Event y event.

Proceso en segundo plano

La emisión de la factura y el guardado del cliente o del artículo no esperan al servidor receptor. La entrega, los reintentos y la auditoría se ejecutan fuera de la petición principal del ERP.

Campos públicos

Los objetos enviados utilizan exclusivamente nombres ya documentados en esta API. No se incluyen XML o JSON fiscales, claves, notas privadas ni columnas internas no publicadas.

API y webhooks son mecanismos independientes
El token X-API-Key sirve únicamente para consultar la API. No se envía dentro del webhook. Para proteger el receptor use HTTPS y un secreto propio, distinto del token de la API, en la URL configurada o en la lógica de su servidor.
Versionado independiente
La API de lectura se encuentra en la versión 1.1.2. La incorporación de resource=payments no modifica la envoltura de webhooks, cuya cabecera X-FacturaOne-Webhook-Version continúa siendo 1.1.1.

Activación y selección de eventos

  1. Abra Configuración → API externa.
  2. Introduzca una URL pública HTTP o, preferentemente, HTTPS.
  3. Seleccione las familias Facturas emitidas, Clientes y/o Artículos.
  4. Guarde la configuración.

Las tres familias aparecen activadas por defecto cuando todavía no existe una preferencia guardada. Dejar la URL vacía desactiva todos los webhooks; desmarcar una familia desactiva únicamente sus eventos.

Eventos disponibles

EventoRecursoSe produce cuandoID principalObjeto enviado
invoice.confirmedinvoicesUna factura queda confirmada y emitida.invoice_iddata.invoice
client.createdclientsSe crea una nueva ficha de cliente.client_iddata.client
client.updatedclientsSe guarda o actualiza la ficha de cliente mediante los flujos integrados, incluida su activación o desactivación.client_iddata.client
item.createditemsSe guarda por primera vez una nueva ficha de artículo.item_lookup_iddata.item
item.updateditemsSe pulsa guardar en la ficha de un artículo existente.item_lookup_iddata.item
Los cambios de stock no generan webhooks
item.created y item.updated se producen únicamente al guardar la ficha del artículo. Ventas, compras, albaranes, traspasos, recálculos, refrescos y demás modificaciones automáticas de existencias no generan eventos. El campo item_stock incluido en data.item es solo una fotografía del valor existente al guardar; para obtener el stock vigente consulte expresamente resource=items&id=ID_ARTICULO&fields=item_lookup_id,item_stock.

Entrega HTTP

PropiedadValorComportamiento
MétodoPOSTFacturaOne envía el evento al endpoint configurado.
Contenidoapplication/json; charset=utf-8El cuerpo contiene un único evento JSON.
Conexión5 segundosTiempo máximo para establecer la conexión.
Respuesta15 segundosEl receptor debe responder rápidamente; para tareas pesadas conviene guardar el evento en una cola propia.
ConfirmaciónCualquier 2xxSe considera recibido y no vuelve a intentarse. Se recomienda 204 No Content.
ReintentosMáximo 3 intentosPrimer intento inmediato; segundo tras 2 segundos; tercero tras 5 segundos adicionales.
RedireccionesNo se siguenConfigure directamente la URL final del receptor.
DestinoHTTP/HTTPS públicoSe bloquean localhost y redes privadas o reservadas.

Cuándo se reintenta

  • Error de conexión, DNS, timeout o ausencia de respuesta HTTP.
  • HTTP 408, 425 o 429.
  • Cualquier respuesta HTTP 5xx.

Cuándo no se reintenta

  • Cualquier respuesta 2xx.
  • Errores 4xx distintos de 408, 425 y 429.
  • URL inválida, destino privado o respuesta que supera el límite permitido.

Cabeceras enviadas

CabeceraEjemploUso recomendado
X-FacturaOne-Eventitem.updatedSeleccionar el procesador correspondiente.
X-FacturaOne-Deliveryevt_item_321_...Clave de idempotencia. Permanece igual durante los reintentos de la misma entrega.
X-FacturaOne-Timestamp1785141300Instante Unix en el que se inicia el intento HTTP.
X-FacturaOne-Attempt1Número de intento, de 1 a 3.
X-FacturaOne-Webhook-Version1.1.1Versión de la envoltura y del esquema enviado.
El receptor debe ser idempotente
Una interrupción de red puede hacer que FacturaOne reenvíe una entrega ya procesada. Guarde X-FacturaOne-Delivery en una columna con índice UNIQUE antes de aplicar cambios. Si el identificador ya existe, responda igualmente con un código 2xx.

Envoltura común del JSON

RutaTipoSignificado
idstringIdentificador de entrega; coincide con X-FacturaOne-Delivery.
eventstringNombre canónico del evento.
versionstringVersión del payload.
resourcestringinvoices, clients o items.
occurred_atdatetimeMomento asociado a la confirmación, creación o guardado.
object_idintegerID genérico del objeto afectado.
invoice_id / client_id / item_lookup_idintegerID específico del recurso.
data.invoice / data.client / data.itemobjectDatos públicos del objeto afectado.

Contenido de data.invoice

Incluye un subconjunto estable de los campos documentados en Facturas emitidas: identificación, fechas, estado, validez, serie, tipo, cliente, emisor, forma de pago, causa de exención, importes e impuestos.

No incluye: líneas de venta, pagos individuales, datos bancarios, beneficio, XML/JSON fiscal, QR, CSV, claves ni notas privadas. Las líneas deben consultarse mediante resource=sales.

Contenido de data.client

Incluye exactamente los 24 campos autorizados por resource=clients, desde client_id hasta retencionprofesional. El diccionario completo se encuentra en Recursos y catálogos → Clientes.

Contenido de data.item

Incluye exactamente los 29 campos autorizados por resource=items: identificación, fechas, activación, descripción, referencias, precios, impuesto, clasificación e imagen. El diccionario completo se encuentra en Recursos y catálogos → Artículos.

Stock: item_stock representa el valor disponible al guardar la ficha, pero sus cambios posteriores no generan eventos.

Ejemplos abreviados de payload

invoice.confirmedCabecera, cliente, importes e impuestos
Ejemplo abreviado
El evento real contiene todos los campos del subconjunto documentado anteriormente.
{
  "id": "evt_invoice_12345_...",
  "event": "invoice.confirmed",
  "version": "1.1.1",
  "resource": "invoices",
  "occurred_at": "2026-07-27 10:30:00",
  "object_id": 12345,
  "invoice_id": 12345,
  "data": {
    "invoice": {
      "invoice_id": 12345,
      "number": "F/2026/00125",
      "dates": {
        "issued": "2026-07-27",
        "confirmed_at": "2026-07-27 10:30:00"
      },
      "client": {
        "client_id": 949,
        "name": "CLIENTE DE EJEMPLO, S.L.",
        "nif": "B12345678"
      },
      "amounts": {
        "item_subtotal": 100.0,
        "tax_total": 21.0,
        "total": 121.0,
        "balance": 121.0
      },
      "taxes": [
        {
          "tax_rate_id": 1,
          "name": "IVA 21%",
          "percent": 21.0,
          "base": 100.0,
          "tax_amount": 21.0
        }
      ]
    }
  }
}
client.updatedMisma estructura para client.created
Ejemplo abreviado
El evento real contiene los 24 campos autorizados del recurso clients.
{
  "id": "evt_client_949_...",
  "event": "client.updated",
  "version": "1.1.1",
  "resource": "clients",
  "occurred_at": "2026-07-27 10:35:00",
  "object_id": 949,
  "client_id": 949,
  "data": {
    "client": {
      "client_id": 949,
      "client_date_created": "2026-01-15 09:00:00",
      "client_date_modified": "2026-07-27 10:35:00",
      "client_name": "CLIENTE DE EJEMPLO, S.L.",
      "client_name_comercial": "CLIENTE EJEMPLO",
      "client_nif": "B12345678",
      "client_address_1": "Calle Ejemplo 1",
      "client_city": "Madrid",
      "client_zip": "28000",
      "client_country": "España",
      "client_email": "[email protected]",
      "client_active": 1
    }
  }
}
item.updatedMisma estructura para item.created
Ejemplo abreviado
El evento real contiene los 29 campos autorizados del recurso items. item_stock es una fotografía del momento del guardado y no implica suscripción a movimientos de stock.
{
  "id": "evt_item_321_...",
  "event": "item.updated",
  "version": "1.1.1",
  "resource": "items",
  "occurred_at": "2026-07-27T10:40:00+02:00",
  "object_id": 321,
  "item_lookup_id": 321,
  "data": {
    "item": {
      "item_lookup_id": 321,
      "item_create_date": "2026-01-20 11:15:00",
      "item_active": 1,
      "item_is_stock": 1,
      "item_stock": 24.0,
      "item_name": "ARTÍCULO DE EJEMPLO",
      "item_description": "Descripción actual del artículo",
      "item_sku": "SKU-321",
      "item_barcode": "8437000000321",
      "item_unidad": "Ud.",
      "item_price": 12.5,
      "item_tax_rate_id": 1,
      "item_familia": 4
    }
  }
}

Receptor mínimo en PHP

Este ejemplo valida un secreto propio, comprueba el evento y el identificador de entrega, extrae data.invoice, data.client o data.item, lo añade a un log y responde con HTTP 204.

<?php

date_default_timezone_set('Europe/Madrid');

// URL configurada en FacturaOne:
// https://tu-dominio.com/receptor_webhook.php?token=TU_SECRETO_WEBHOOK

$secret = 'CAMBIAR_POR_UN_SECRETO_LARGO_Y_ALEATORIO';
$token  = isset($_GET['token']) ? trim((string)$_GET['token']) : '';

$token_valido = function_exists('hash_equals')
    ? hash_equals($secret, $token)
    : ($secret === $token);

if (!$token_valido) {
    http_response_code(401);
    exit;
}

if (!isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit;
}

$event = isset($_SERVER['HTTP_X_FACTURAONE_EVENT'])
    ? trim((string)$_SERVER['HTTP_X_FACTURAONE_EVENT'])
    : '';
$delivery_id = isset($_SERVER['HTTP_X_FACTURAONE_DELIVERY'])
    ? trim((string)$_SERVER['HTTP_X_FACTURAONE_DELIVERY'])
    : '';

$eventos = array(
    'invoice.confirmed' => 'invoice',
    'client.created'    => 'client',
    'client.updated'    => 'client',
    'item.created'      => 'item',
    'item.updated'      => 'item'
);

$raw = file_get_contents('php://input');
$payload = json_decode($raw, true);

if (
    $delivery_id === ''
    || !isset($eventos[$event])
    || !is_array($payload)
    || !isset($payload['id'])
    || (string)$payload['id'] !== $delivery_id
    || !isset($payload['event'])
    || (string)$payload['event'] !== $event
) {
    http_response_code(400);
    exit;
}

$data_key = $eventos[$event];
$objeto = isset($payload['data'][$data_key])
    ? $payload['data'][$data_key]
    : null;

if (!is_array($objeto)) {
    http_response_code(400);
    exit;
}

// En producción, guarde $delivery_id en una columna UNIQUE antes de procesar.
$linea = date('Y-m-d H:i:s') . ' | ' . $delivery_id . ' | ' . $event . ' | '
       . json_encode($objeto, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
       . PHP_EOL;

if (file_put_contents(__DIR__ . '/webhooks_facturaone.log', $linea, FILE_APPEND | LOCK_EX) === false) {
    http_response_code(500);
    exit;
}

// Cualquier 2xx confirma la recepción. 204 evita enviar cuerpo de respuesta.
http_response_code(204);
exit;
No reutilice el token de la API como secreto del webhook
Use un secreto largo y distinto, proteja siempre el endpoint con HTTPS y no deje el archivo de log accesible desde la web. El ejemplo escribe un fichero únicamente para facilitar la primera prueba; en producción conviene registrar la entrega en una base de datos o cola.

Auditoría y consumo

Cada intento de entrega se registra en el mismo sistema de medición de la API. Las facturas aparecen como webhook_invoices, los clientes como webhook_clients y los artículos como webhook_items. Un evento que necesita tres intentos genera tres registros de auditoría y tres consumos de transporte.

08 · Recorrido

Paginación correcta

La API no utiliza offset. Emplea paginación por clave en catálogos, facturas y pagos, y cursor compuesto en ventas.

Recursos simples, invoices y payments

{
  "pagination": {
    "returned": 100,
    "has_more": true,
    "next_after_id": 12345
  }
}

Añada after_id=12345 y mantenga los demás filtros. En payments, el valor corresponde siempre al último payment_id.

sales

{
  "pagination": {
    "returned": 100,
    "has_more": true,
    "next_cursor": "eyJ2IjoxLC..."
  }
}

Envíe el valor completo como cursor. No lo modifique.

No cambie filtros entre páginas
En ventas, el cursor contiene una huella de los filtros y se rechazará con CURSOR_FILTER_MISMATCH cuando detecte otra combinación.

Patrón recomendado

  1. Realice la primera petición sin after_id ni cursor.
  2. Procese todos los elementos de data.
  3. Si has_more es true, guarde la clave de continuación.
  4. Repita la misma URL añadiendo únicamente esa clave.
  5. Finalice cuando has_more sea false.
09 · Diagnóstico

Errores y códigos HTTP

Los errores no exponen SQL, rutas internas ni credenciales. Guarde siempre el request_id cuando necesite soporte.

Respuesta de error

{
  "ok": false,
  "read_only": true,
  "error": "BAD_DATE_RANGE",
  "message": "date_from no puede ser posterior a date_to.",
  "request_id": "a1b2c3d4e5f60708"
}

Cabeceras útiles

X-Request-ID
Identificador de diagnóstico.
X-API-Version
Versión que respondió.
X-API-Read-Only
Siempre true.
Allow
En un 405 indica que solo se admite GET.
HTTPCódigoSignificado
400BAD_PARAMETERUn parámetro no tiene el tipo, rango o formato esperado.
400BAD_DATEUna fecha no tiene formato YYYY-MM-DD o no es una fecha real.
400INCOMPLETE_DATE_RANGESe ha enviado solo date_from o solo date_to.
400BAD_DATE_RANGEdate_from es posterior a date_to.
400DATE_RANGE_TOO_LARGEEl intervalo supera 366 días.
400SEARCH_TOO_LONGsearch supera 100 caracteres.
400BAD_FIELDSfields está vacío o no contiene campos válidos.
400FIELD_NOT_ALLOWEDSe ha solicitado un campo no autorizado.
400CONFLICTING_PAGINATIONSe han combinado id y after_id.
400FILTER_NOT_SUPPORTEDSe ha usado active en un recurso que no lo admite.
400BAD_ACTIVE_FILTERactive no es 0, 1 o all.
400BAD_STATUS_FILTERstatus no pertenece a los valores admitidos.
400BAD_VALIDITY_FILTERvalidity no pertenece a los valores admitidos.
400BAD_DOCUMENT_TYPE_FILTERdocument_type no es all, invoice, delivery_note, client o unassigned.
400BAD_SOURCE_FILTERsource no es all, invoices o delivery_notes.
400BAD_BASIS_FILTERbasis no es invoices o delivery_notes.
400BAD_MOVEMENT_FILTERmovement no es all, sales o returns.
400BAD_CURSOREl cursor está dañado, tiene formato incorrecto o supera el tamaño permitido.
400CURSOR_FILTER_MISMATCHEl cursor pertenece a otra combinación de filtros.
401MISSING_TOKENNo se ha enviado Authorization Bearer ni X-API-Key.
401INVALID_TOKENEl token es incorrecto, está revocado o la API está desactivada.
404RESOURCE_NOT_FOUNDEl recurso solicitado no existe.
405METHOD_NOT_ALLOWEDSe ha usado un método distinto de GET.
500AUTH_DATABASE_ERRORNo se ha podido validar el token en la base maestra.
500INVALID_DATABASE_CONFIGLa instalación asociada no tiene una configuración válida.
500DATABASE_ERRORNo se ha podido completar la consulta de lectura.
500JSON_ENCODE_ERRORLa respuesta no se ha podido codificar como JSON.
501RESOURCE_NOT_IMPLEMENTEDEl recurso existe en el enrutador pero no está implementado.

Tratamiento recomendado

  • 400: no reintentar sin corregir filtros, fechas, campos o cursor.
  • 401: revisar el token y sustituirlo si fue regenerado.
  • 404/405: corregir recurso o método.
  • 500: registrar request_id y aplicar reintentos limitados con espera progresiva.
  • 501: revisar versión o recurso; no reintentar automáticamente.
10 · Control económico

Consumo, medición y facturación

FacturaOne registra cada consulta de lectura y cada intento de entrega de webhook para que la empresa pueda conocer de dónde procede su consumo y revisar la evolución mensual antes de valorar el coste económico.

Solicitudes y entregas

Número de consultas API e intentos de webhook, recurso asociado, estado HTTP y tiempo de respuesta.

Volumen

Filas devueltas y tamaño de entrada y salida generado por cada petición.

Consumo estimado

Estimación reproducible de tokens de entrada, salida y total para comparar periodos y tipos de consulta.

Consulta mensual dentro de FacturaOne

Desde Configuración → API externa → Mostrar uso puede abrir la pantalla de consumo, consultar el mes actual por defecto y seleccionar meses y años anteriores. La gráfica desglosa el uso por recurso, incluido payments y las series webhook_invoices, webhook_clients y webhook_items, para detectar qué integración genera el mayor consumo.

El uso efectivo puede generar costes
La activación, la generación del token y la configuración de la URL de webhook no añaden coste por sí mismas. La facturación se calcula según el consumo real de consultas e intentos de entrega y las tarifas vigentes; por ese motivo conviene paginar correctamente, limitar campos y evitar consultas repetitivas innecesarias.
11 · Producción

Seguridad y comprobaciones

Recomendaciones para consultar la API y recibir webhooks sin exponer secretos, duplicar operaciones ni sobrecargar una instalación.

Buenas prácticas

  • No coloque el token de lectura de la API en la URL, archivos públicos, repositorios ni JavaScript del navegador.
  • Guárdelo como secreto del servidor o variable de entorno.
  • Envíelo únicamente por HTTPS.
  • Regénere el token si sospecha que se ha expuesto.
  • No registre cabeceras completas de autenticación.
  • Use el menor limit razonable y periodos acotados.

Probar con Postman

  1. Cree una petición GET.
  2. Use https://api.facturaone.com/v1/?resource=resources.
  3. Añada la cabecera X-API-Key.
  4. Coloque el token guardado como valor.
  5. Añada opcionalmente Accept: application/json.
  6. Compruebe que la respuesta contiene ok=true.

Lista de comprobación para un conector nuevo

  • Validar primero resource=resources y guardar la versión recibida.
  • Sincronizar catálogos auxiliares antes de filtrar por ID.
  • Implementar paginación hasta has_more=false.
  • Guardar request_id en errores y no mostrar el token.
  • Tratar campos null y objetos opcionales.
  • No asumir que page_totals representa todas las páginas.
  • Diferenciar datos históricos del documento y datos actuales del maestro.
  • Probar facturas pagadas, pendientes, anuladas y sustituidas; además de pagos en factura, pagos que siguen en albarán, pagos transferidos desde albarán, devueltos y no asignados.
  • En webhooks, validar event, id y X-FacturaOne-Delivery, y guardar este último con un índice único.
  • Responder rápidamente con 2xx y trasladar el trabajo pesado a una cola propia.
Regenerar invalida el token anterior inmediatamente
Antes de regenerar en producción, coordine el cambio con todos los conectores. No existe un periodo de convivencia entre el token antiguo y el nuevo.
12 · Ayuda

Preguntas frecuentes sobre la API y los webhooks de FacturaOne

Respuestas rápidas a las dudas más habituales antes de iniciar una integración.

¿La API puede crear o modificar datos?

No. La API pública es exclusivamente de lectura y solo admite peticiones GET. Los POST descritos en la sección de webhooks son notificaciones que FacturaOne envía hacia su servidor; no permiten escribir datos en el ERP.

¿Cómo se autentica una integración?

Las consultas API se autentican mediante un token enviado en X-API-Key o Authorization: Bearer; ese token no debe formar parte de la URL. El receptor de webhooks utiliza un secreto independiente definido por la integración.

¿Qué diferencia hay entre la API y los webhooks?

La API se consulta cuando su aplicación necesita leer datos. El webhook se recibe automáticamente cuando FacturaOne emite una factura, crea o modifica un cliente, o guarda la ficha de un artículo. Es habitual usar el webhook como aviso y la API para sincronizaciones completas, recuperaciones y consultas de stock vigente.

¿Qué eventos de webhook están disponibles?

invoice.confirmed, client.created, client.updated, item.created e item.updated. Todos se envían a una única URL y cada familia puede activarse o desactivarse desde Configuración.

¿Se envía un webhook cada vez que cambia el stock?

No. Los eventos de artículos se generan solamente al guardar una ficha nueva o existente. Los movimientos y recálculos de stock no generan webhooks. Para conocer las existencias vigentes consulte resource=items por item_lookup_id y solicite el campo item_stock.

¿Qué debe responder mi receptor?

Cualquier código HTTP 2xx confirma la recepción; se recomienda 204. Los errores de conexión, 408, 425, 429 y 5xx pueden provocar hasta tres intentos con el mismo X-FacturaOne-Delivery.

¿Qué datos puedo consultar?

Clientes, artículos, proveedores, familias, tipos, series, rutas, usuarios, impuestos, formas de pago, facturas emitidas, pagos y cobros, y líneas de venta.

¿Qué diferencia hay entre include_payments=1 y resource=payments?

include_payments=1 añade a cada factura una colección compacta de sus pagos y es útil cuando ya está consultando invoices. resource=payments devuelve una estructura más completa y permite filtrar directamente por albarán, cliente, usuario, forma de pago, banco, remesa, pagado, devuelto y tipo de asignación.

¿Cómo consulto un pago hecho en un albarán que después se facturó?

Consulte resource=payments&aquote_id=ID_ALBARAN. El pago seguirá apareciendo una sola vez. Si ya fue transferido, allocation.current_document_type será invoice, origin_document_type será delivery_note y se devolverán tanto invoice como delivery_note.

¿Cómo se recorren más de 200 registros?

Con paginación. Los recursos simples, las facturas y los pagos usan next_after_id; las ventas utilizan un next_cursor opaco.

¿Activar la API o los webhooks tiene coste?

Activar la API, generar el token y configurar la URL de webhooks no tiene coste adicional. El uso efectivo de consultas e intentos de entrega se factura según el consumo y las tarifas vigentes.

¿Dónde puedo ver el consumo?

En FacturaOne, dentro de Configuración → API externa → Mostrar uso. Puede consultar el mes actual y periodos anteriores.

¿Qué debo enviar a soporte cuando falla una llamada?

Para una consulta API, envíe el request_id, el recurso y la hora aproximada. Para un webhook, envíe X-FacturaOne-Delivery, X-FacturaOne-Event y la hora aproximada. Nunca envíe secretos en claro.

Una integración predecible, segura y medible

Empiece consultando resource=resources, implemente la paginación y conserve el request_id de cualquier error. Para tiempo real, añada un receptor idempotente que guarde X-FacturaOne-Delivery. Con estas reglas, el conector podrá sincronizar datos y pagos, reaccionar a eventos y controlar su consumo.

Documentación correspondiente a FacturaOne API v1.1.2 y Webhooks v1.1.1. Los ejemplos contienen datos ficticios y los marcadores TU_TOKEN_API y TU_SECRETO_WEBHOOK; nunca publique credenciales reales.