Endpoints de negocio
Catálogo común de endpoints compartidos por PagaFactu y ZertiPay para gestionar flujos, operaciones, pagos PSD2, cuentas beneficiarias y configuraciones.
Esta página agrupa los 18 endpoints comunes que usan tanto PagaFactu como ZertiPay. El único endpoint específico de producto es la creación de un flujo PagaFactu (POST/flow/v1/flows/pagafactu), que se documenta en la página de implementación de PagaFactu.
Convenciones comunes
- Base URL Sandbox:
https://api-sandbox.zertiban.com - Headers requeridos en todas las llamadas:
Authorization: Bearer {access_token}x-tenant-id: {businessUuid}
Flujos
1. Crear flujo
Content-Type: multipart/form-data. El part payload debe llevar Content-Type: application/json; si no, el servidor responde 400. Para crear cobros PagaFactu existe el endpoint específico POST/flow/v1/flows/pagafactu, documentado en su página de implementación.
curl -X POST https://api-sandbox.zertiban.com/flow/v1/flows \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}" \
-F 'payload={ "externalId": "...", "countryCode": "ES", "operations": [...] };type=application/json'Raíz del payload:
| Campo | Tipo | Oblig. | Descripción |
|---|---|---|---|
externalId | String | No | Tu ID del flujo |
countryCode | String | Sí | ISO 3166 (ej. "ES") |
additionalLanguage | String | No | ISO 639-1 |
operations | Array | Sí | 1 operación |
documents | Array | No | PDFs adjuntos (hasta 10) |
labels | Array | No | Etiquetas clave-valor |
Respuesta (201):
| Campo | Descripción |
|---|---|
uuid | UUID del flujo |
externalId | Tu externalId |
operations[i].uuid | UUID de la operación |
operations[i].externalId | Tu externalId de la operación |
operations[i].id | El id local que enviaste |
operations[i].url | Enlace de pago para el pagador |
2. Listar flujos
# Flujos completados en los últimos 7 días
curl "https://api-sandbox.zertiban.com/flow/v1/flows?q_status=COMPLETED&q_fromCreatedAt=2026-04-15T00:00:00Z&sort_by=STATUS_UPDATED_AT&sort_dir=DESC" \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Query parameters:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
q_uuid | UUID | — | Filtrar por UUID de flujo |
q_externalId | String | — | Filtrar por externalId |
q_status | CSV | — | Estados del flujo |
q_productLabelValue | CSV | — | Filtrar por valor de etiqueta de producto |
q_fromCreatedAt / q_toCreatedAt | ISO-8601 Instant | — | Rango de creación |
q_fromStatusUpdatedAt / q_toStatusUpdatedAt | ISO-8601 Instant | — | Rango de cambio de estado |
q_origin | Enum | — | Filtra por origen del flujo: DIRECT (directos, sin Partner/Agente) o COLLABORATOR (originados por un Partner/Agente). Case-insensitive. |
q_collaboratorUuid | UUID | — | Solo flujos originados por ese Partner/Agente concreto (match exacto). |
q_collaboratorLegalName | String | — | Solo flujos cuya razón social del Partner/Agente contenga el valor (contiene, case-insensitive). |
offset | int | 0 | Posición inicial |
limit | int | 10 | Resultados por página (max 100) |
sort_by | String | CREATED_AT | EXTERNAL_ID, STATUS, CREATED_AT, STATUS_UPDATED_AT |
sort_dir | String | DESC | ASC o DESC |
Combinaciones incompatibles
q_origin=DIRECT no puede combinarse con q_collaboratorUuid ni con q_collaboratorLegalName. La combinación devuelve 400 INVALID_PARAMETER.
Respuesta (200):
{
"total": 150,
"results": [
{
"uuid": "28ffd216-...",
"externalId": "COBRO-2026-001",
"status": "COMPLETED",
"createdAt": "2026-04-22T09:00:00Z",
"statusUpdatedAt": "2026-04-22T09:15:00Z",
"operationsCount": 1,
"labels": [{ "name": "pedido", "value": "12345" }],
"collaborator": {
"uuid": "f7c1a2b3-4d5e-6f70-8192-a3b4c5d6e7f8",
"legalName": "Gestoria Perez SL"
}
},
{
"uuid": "3fa85f64-...",
"externalId": "COBRO-2026-002",
"status": "IN_PROGRESS",
"createdAt": "2026-04-23T10:00:00Z",
"statusUpdatedAt": "2026-04-23T10:05:00Z",
"operationsCount": 1,
"labels": [],
"collaborator": null
}
]
}El bloque collaborator identifica al Partner/Agente que originó el flujo. Está null o ausente cuando el flujo lo creó la propia organización en directo, sin Partner/Agente. Es una marca inmutable del momento de creación.
3. Detalle de flujo
Devuelve el flujo con el resumen de sus operaciones de pago.
curl https://api-sandbox.zertiban.com/flow/v1/flows/{flowUuid} \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"Respuesta (200):
{
"uuid": "28ffd216-5ee8-4e99-b1a9-511961e9c655",
"externalId": "COBRO-2026-001",
"status": "COMPLETED",
"countryCode": "ES",
"languageCode": "ES",
"createdAt": "2026-04-22T09:00:00Z",
"labels": [{ "name": "pedido", "value": "12345" }],
"paymentOperations": [
{
"uuid": "d1faff9e-...",
"externalId": "OP-2026-001",
"status": "COMPLETED",
"statusUpdatedAt": "2026-04-22T09:15:00Z",
"expiresAt": "2026-05-22T09:00:00Z",
"amount": 15075,
"currency": "EUR"
}
],
"collaborator": {
"uuid": "f7c1a2b3-4d5e-6f70-8192-a3b4c5d6e7f8",
"legalName": "Gestoria Perez SL"
}
}| Campo | Descripción |
|---|---|
status | Estado del flujo (CREATED, IN_PROGRESS, COMPLETED, REJECTED, EXPIRED, CANCELLED) |
paymentOperations[i].amount | Importe en céntimos |
labels | Etiquetas clave-valor enviadas al crear el flujo |
collaborator | Partner/Agente que originó el flujo, con uuid y legalName (razón social capturada en el alta). null o ausente ⇒ flujo directo, sin Partner/Agente. |
4. Historial de estados de flujo
GET/flow/v1/flows/{flowUuid}/status-histories
curl https://api-sandbox.zertiban.com/flow/v1/flows/{flowUuid}/status-histories \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Respuesta (200): Array ordenado cronológicamente.
[
{ "previousStatus": null, "newStatus": "IN_PROGRESS", "changedAt": "2026-04-22T09:10:00Z" },
{ "previousStatus": "IN_PROGRESS", "newStatus": "COMPLETED", "changedAt": "2026-04-22T09:15:00Z" }
]5. Estadísticas de flujos
curl "https://api-sandbox.zertiban.com/flow/v1/flows/statistics?q_fromCreatedAt=2026-04-01T00:00:00Z" \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Acepta los mismos filtros que GET/flow/v1/flows (sin paginación).
Respuesta (200):
{
"summary": { "totalFlows": 42 },
"groups": [
{ "key": "COMPLETED", "metrics": { "count": 38 } },
{ "key": "EXPIRED", "metrics": { "count": 3 } },
{ "key": "CANCELLED", "metrics": { "count": 1 } }
]
}Operaciones
6. Listar operaciones
# Operaciones completadas de un flujo concreto
curl "https://api-sandbox.zertiban.com/flow/v1/operations?q_flowUuid={flowUuid}&q_status=COMPLETED" \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Query parameters:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
q_operationUuid | UUID | — | Filtrar por UUID de operación |
q_flowUuid | UUID | — | Filtrar por UUID del flujo padre |
q_externalId | String | — | Filtrar por externalId de la operación |
q_status | CSV | — | Estados: CREATED, OPENED, COMPLETED, REJECTED, EXPIRED, CANCELLED |
q_type | CSV | — | Tipo de operación (PAYMENT, SIGNATURE) |
q_invoiceExternalId | String | — | Filtrar por externalId de la factura |
q_fromCreatedAt | ISO-8601 Instant | — | Creada desde |
q_toCreatedAt | ISO-8601 Instant | — | Creada hasta |
q_fromStatusUpdatedAt | ISO-8601 Instant | — | Último cambio de estado desde |
q_toStatusUpdatedAt | ISO-8601 Instant | — | Último cambio de estado hasta |
q_amountFrom | Long | — | Importe mínimo (céntimos) |
q_amountTo | Long | — | Importe máximo (céntimos) |
q_origin | Enum | — | Filtra por origen del flujo dueño: DIRECT (sin Partner/Agente) o COLLABORATOR (originadas por un Partner/Agente). Case-insensitive. |
q_collaboratorUuid | UUID | — | Solo operaciones cuyo flujo dueño fue originado por ese Partner/Agente concreto (match exacto). |
q_collaboratorLegalName | String | — | Solo operaciones cuya razón social del Partner/Agente del flujo dueño contenga el valor (contiene, case-insensitive). |
offset | int | 0 | Posición inicial |
limit | int | 10 | Resultados por página (max 100) |
sort_by | String | CREATED_AT | EXTERNAL_ID, STATUS, CREATED_AT, STATUS_UPDATED_AT |
sort_dir | String | DESC | ASC o DESC |
Combinaciones incompatibles
q_origin=DIRECT no puede combinarse con q_collaboratorUuid ni con q_collaboratorLegalName. La combinación devuelve 400 INVALID_PARAMETER.
Respuesta (200):
{
"total": 42,
"results": [
{
"uuid": "d1faff9e-...",
"externalId": "OP-2026-001",
"status": "COMPLETED",
"type": "PAYMENT",
"createdAt": "2026-04-22T09:00:00Z",
"statusUpdatedAt": "2026-04-22T09:15:00Z",
"flow": {
"uuid": "28ffd216-...",
"collaborator": {
"uuid": "f7c1a2b3-4d5e-6f70-8192-a3b4c5d6e7f8",
"legalName": "Gestoria Perez SL"
}
}
},
{
"uuid": "a2b3c4d5-...",
"externalId": null,
"status": "CREATED",
"type": "SIGNATURE",
"createdAt": "2026-04-23T08:22:00Z",
"statusUpdatedAt": null,
"flow": {
"uuid": "3fa85f64-...",
"collaborator": null
}
}
]
}La atribución del Partner/Agente se hereda del flujo dueño y se expone bajo flow.collaborator en cada item. null o ausente ⇒ operación de flujo directo.
7. Detalle de operación
Devuelve todos los datos de la operación, incluyendo los detalles del pago PSD2 y el paymentUuid necesario para consultar el detalle del pago una vez completado.
curl https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid} \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"Respuesta (200):
{
"uuid": "d1faff9e-bb8b-47bd-8b47-4f20f1a7912b",
"externalId": "OP-2026-001",
"flowUuid": "28ffd216-5ee8-4e99-b1a9-511961e9c655",
"configurationUuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"type": "PAYMENT",
"expirationOffset": "P30D",
"expiresAt": "2026-05-22T09:00:00Z",
"createdAt": "2026-04-22T09:00:00Z",
"synchronous": true,
"payment": {
"paymentUuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"amount": 15075,
"currency": "EUR",
"concept": "Cobro 2026-001",
"types": ["PSD2_PAYMENT"],
"psd2Payment": {
"type": "SINGLE_PAYMENT",
"product": "SEPA_CREDIT_TRANSFER",
"creditorAccount": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
},
"subject": { "name": "Ana", "lastName": "Martinez", "email": "[email protected]" }
},
"flow": {
"uuid": "28ffd216-5ee8-4e99-b1a9-511961e9c655",
"collaborator": {
"uuid": "f7c1a2b3-4d5e-6f70-8192-a3b4c5d6e7f8",
"legalName": "Gestoria Perez SL"
}
}
}| Campo | Descripción |
|---|---|
payment.paymentUuid | UUID del pago PSD2. Disponible una vez el estado es COMPLETED. Úsalo para llamar a GET/payment/v1/payments/{uuid} |
payment.amount | Importe en céntimos |
payment.subject | Datos del deudor tal como se enviaron al crear el flujo |
expiresAt | Fecha de caducidad de la operación |
flow.collaborator | Partner/Agente del flujo dueño, con uuid y legalName (razón social capturada en el alta). Ausente o null cuando la operación proviene de un flujo directo. |
8. Estado rápido de operación
GET/flow/v1/operations/{operationUuid}/status
Devuelve el estado actual de la operación con un payload mínimo. Ideal para polling frecuente cuando no necesitas el objeto completo.
curl https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid}/status \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"Respuesta (200):
{
"status": "COMPLETED",
"actionCode": "INITIATED",
"final": true
}| Campo | Tipo | Descripción |
|---|---|---|
status | String | Estado actual: CREATED, OPENED, COMPLETED, REJECTED, EXPIRED, CANCELLED |
actionCode | String | Código de acción interno de la plataforma |
final | boolean | true cuando el estado es terminal (no hay más transiciones posibles) |
9. Historial de estados de operación
GET/flow/v1/operations/{uuid}/status-histories
Devuelve la secuencia completa de transiciones de estado, útil para auditar el ciclo de vida de un cobro.
curl https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid}/status-histories \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Respuesta (200): Array ordenado cronológicamente.
[
{ "previousStatus": null, "newStatus": "CREATED", "changedAt": "2026-04-22T09:00:00Z" },
{ "previousStatus": "CREATED", "newStatus": "OPENED", "changedAt": "2026-04-22T09:10:00Z" },
{ "previousStatus": "OPENED", "newStatus": "COMPLETED", "changedAt": "2026-04-22T09:15:00Z" }
]| Campo | Tipo | Descripción |
|---|---|---|
previousStatus | String | Estado anterior (null para el estado inicial) |
newStatus | String | Nuevo estado |
changedAt | Instant | Momento de la transición |
10. Estadísticas de operaciones
GET/flow/v1/operations/statistics
Permite obtener métricas agregadas: número total de operaciones y suma de importes, con los mismos filtros que el listado.
# Total cobrado y desglose por estado del último mes
curl "https://api-sandbox.zertiban.com/flow/v1/operations/statistics?q_fromCreatedAt=2026-03-22T00:00:00Z" \
-H "Authorization: Bearer {access_token}" -H "x-tenant-id: {businessUuid}"Acepta los mismos query parameters de filtrado que GET/flow/v1/operations (sin offset, limit, sort_by, sort_dir).
Respuesta (200):
{
"summary": { "total": 42 },
"groups": [
{ "key": "COMPLETED", "metrics": { "count": 38, "amount": 578450 } },
{ "key": "EXPIRED", "metrics": { "count": 3, "amount": 45000 } },
{ "key": "CANCELLED", "metrics": { "count": 1, "amount": 15075 } }
]
}| Campo | Descripción |
|---|---|
summary.total | Total de operaciones que cumplen los filtros |
groups[i].key | Valor del agrupador (estado de la operación) |
groups[i].metrics.count | Número de operaciones en este grupo |
groups[i].metrics.amount | Suma de importes en céntimos en este grupo |
11. Cancelar operación
PUT/flow/v1/operations/{operationUuid}/cancel
Cancela una operación que todavía no ha alcanzado un estado final.
curl -X PUT https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid}/cancel \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"No hay body en la petición.
Respuesta exitosa: 204 No Content
| Código | Causa |
|---|---|
409 | La operación ya está en un estado final (COMPLETED, REJECTED, EXPIRED, CANCELLED) |
409 | La operación está en estado OPENED y el pagador tiene un pago en curso (transacción pendiente) |
Si el flujo tenía esta operación como la única activa, el flujo pasará también a CANCELLED.
12. Ampliar caducidad de operación
PATCH/flow/v1/operations/{operationUuid}/expiration
Recalcula la fecha de caducidad de la operación sumando la duración indicada al momento de la llamada (expiresAt = now + duration).
curl -X PATCH https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid}/expiration \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}" \
-H "Content-Type: application/json" \
-d '{ "duration": "P7D" }'Request body:
| Campo | Tipo | Descripción |
|---|---|---|
duration | String | Duración ISO 8601 en días únicamente (ej. "P7D" = 7 días, "P30D" = 30 días). Solo se admite el designador D. |
Respuesta exitosa: 204 No Content
Restricciones:
- La operación debe estar en un estado no final (CREATED u OPENED).
- La duración mínima es 1 día (
P1D). - El campo
durationsolo admite el designador de días (D). No se admiten horas (H) ni minutos.
13. Descargar documento de pago adjunto
GET/flow/v1/operations/{operationUuid}/payment-documents/{paymentDocumentUuid}/content
Descarga el contenido binario de un documento PDF que fue adjuntado al crear el flujo. El documentUuid se obtiene del array payment.documents en el detalle de la operación.
curl https://api-sandbox.zertiban.com/flow/v1/operations/{operationUuid}/payment-documents/{documentUuid}/content \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}" \
-o documento.pdfRespuesta: binario application/pdf con header Content-Disposition: attachment; filename="<nombre-del-fichero>". Si no hay nombre disponible, el servidor usa payment-document.pdf.
Pago PSD2
14. Detalle del pago PSD2
GET/payment/v1/payments/{uuid}
El paymentUuid está disponible en GET/flow/v1/operations/{uuid} → campo payment.paymentUuid, una vez la operación alcanza el estado COMPLETED.
curl https://api-sandbox.zertiban.com/payment/v1/payments/{paymentUuid} \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"Respuesta (200):
{
"psd2Payment": {
"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"status": { "code": "ACSC", "status": "AcceptedSettlementCompleted" },
"instructedAmount": { "amount": 15075, "currency": "EUR" },
"remittanceInformationUnstructured": "Cobro 2026-001",
"executionDate": "2026-04-22T09:14:00Z",
"requestedExecutionDate": null,
"bankPaymentId": "BANKA12345678",
"creditorAccount": {
"ownerName": "Mi Empresa S.L.",
"accountNumber": "ES91210004183401234567",
"bic": "CAIXESBBXXX",
"country": "ES",
"type": "IBAN"
},
"debtorAccount": {
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"accountNumber": "ES8020484097908424975543",
"type": "IBAN",
"currency": "EUR",
"psuName": "Ana Martinez",
"ownerName": "Ana Martinez",
"bic": "BBVAESMMXXX"
}
},
"collaborator": {
"uuid": "f7c1a2b3-4d5e-6f70-8192-a3b4c5d6e7f8"
}
}| Campo | Descripción |
|---|---|
psd2Payment.status.code | Código ISO 20022 del estado del pago (ej. ACSC = liquidado) |
psd2Payment.instructedAmount | Importe exacto que se movió |
psd2Payment.remittanceInformationUnstructured | Concepto / referencia del pago |
psd2Payment.executionDate | Momento en que el banco procesó el pago |
psd2Payment.requestedExecutionDate | Solo presente en pagos programados (FUTURE_PAYMENT) |
psd2Payment.bankPaymentId | Identificador del pago asignado por el banco |
psd2Payment.creditorAccount | Cuenta beneficiaria donde se recibió el dinero |
psd2Payment.debtorAccount | Cuenta del pagador que realizó la transferencia |
collaborator.uuid | UUID del Partner/Agente que originó el flujo al que pertenece este pago. Atribución heredada de forma inmutable en la creación del pago. A diferencia de flow-service, aquí no se expone la razón social; si la necesitas, obténla en el detalle del flujo o de la operación. El bloque collaborator es null o ausente en pagos originados en directo. |
Cuentas beneficiarias
Documentación detallada de campos y filtros en Cuentas beneficiarias.
15. Listar cuentas beneficiarias
GET/business-creditor-account/v1/business-creditor-accounts
curl "https://api-sandbox.zertiban.com/business-creditor-account/v1/business-creditor-accounts?offset=0&limit=10" \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
offset | int | 0 | Posición inicial |
limit | int | — | Resultados por página |
q_status | enum (ACTIVE / DISABLED) | — | Filtra por estado. Sin valor devuelve todas. |
q_isDefault | boolean | — | Filtra por si es la cuenta por defecto. |
16. Detalle de cuenta beneficiaria
GET/business-creditor-account/v1/business-creditor-accounts/{uuid}
curl "https://api-sandbox.zertiban.com/business-creditor-account/v1/business-creditor-accounts/{uuid}" \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"| Campo | Tipo | Descripción |
|---|---|---|
uuid | UUID | creditorAccountUuid a usar al crear flujos |
accountNumber | String | Número de cuenta (enmascarado) |
type | String | Tipo de cuenta. Valor posible: IBAN |
alias | String | Nombre identificativo |
status | String | ACTIVE o DISABLED. Solo las ACTIVE aceptan pagos |
isDefault | Boolean | Si es la cuenta beneficiaria por defecto de la organización |
aspsp.commercialName | String | Nombre comercial del banco |
Configuraciones de flujo
Documentación detallada de campos y filtros en Configuración de flujo.
17. Listar configuraciones
GET/flow-customization/v1/configurations
curl "https://api-sandbox.zertiban.com/flow-customization/v1/configurations?offset=0&limit=10" \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"18. Detalle de configuración
GET/flow-customization/v1/configurations/{configurationUuid}
curl https://api-sandbox.zertiban.com/flow-customization/v1/configurations/{configurationUuid} \
-H "Authorization: Bearer {access_token}" \
-H "x-tenant-id: {businessUuid}"Tabla resumen
Base URL Sandbox: https://api-sandbox.zertiban.com
Errores frecuentes
| Código | Causa típica | Solución |
|---|---|---|
400 | Payload inválido: campo faltante, formato incorrecto, parámetro mal tipado | Revisa la validación en la sección de referencia |
401 | Token expirado o credenciales inválidas | Solicita un nuevo token con Basic Auth |
403 | x-tenant-id incorrecto o permisos de credencial insuficientes | Verifica businessUuid y los permisos de las credenciales |
404 | UUID de configuración, cuenta, operación, flujo o pago no encontrado | Verifica con los endpoints GET |
409 | Conflicto de estado (cancelar operación finalizada, configuración inactiva) | Consulta el estado actual antes de la acción |