No replicues el flujo en tu código. Pregunta a Payana qué paso está pendiente y qué opciones admite, y devuelve una de esas opciones. Así, cuando tu compañía reconfigure su flujo — agregue un paso, cambie los responsables, sume valores a un campo — tu integración sigue funcionando sin cambios.
Esta guía es para integrarte con el flujo: respetar sus pasos, sus responsables y sus efectos. Si lo único que necesitas es dejar un documento aprobado sin pasar por él, usa Aprobar documento.
Requisitos previos
1
Una API key de tu compañía
Se envía en el header
api-key. Consulta las URLs base en la introducción a la API.2
La API de flujos habilitada
Si no lo está, ambos endpoints responden
403 con feature_not_enabled. Pídela a tu contacto en Payana.3
Los usuarios que deciden, dados de alta en Payana
Con el mismo email que usan en tu sistema. Toda decisión queda registrada a nombre de una persona, y ese email es el vínculo entre ambos lados.
4
Un endpoint para el webhook `document.created`
Es como te enteras de que hay un documento nuevo que espejar. Opcional si prefieres consultar por tu cuenta.
Cómo se ven los dos lados
Los pasos de tu sistema no tienen que corresponder uno a uno con los de Payana, ni llamarse igual. Lo único que necesitas saber en cada momento es cuál está pendiente del lado de Payana.El ciclo, en tres llamadas
No existe un webhook por cada paso: Payana no te avisa cuando aparece uno nuevo. Consulta el paso actual cuando tu sistema lo necesite — al abrir el caso, al refrescar una bandeja, o con un sondeo periódico.
Guarda la referencia del documento
El webhookdocument.created trae en data.reference la referencia interna del documento en Payana. Guárdala junto a tu propio identificador: es la única llave que necesitas para todo lo que sigue.
Webhook: Document Created
El payload completo y cómo verificar la firma.
1. Consulta el paso pendiente
Un documento tiene, a lo sumo, un paso pendiente a la vez.2. Traduce la decisión a tu interfaz
Hay tres clases de decisión, ydecision.kind te dice cuál tienes enfrente:
Dos reglas al construir el control:
El value es opaco — no lo interpretes
El value es opaco — no lo interpretes
"approve", "451", "88": son tokens que Payana traduce a la rama del flujo, al valor del campo o a la etiqueta. Muestra el label a tu usuario, guarda el value y devuélvelo tal cual. No construyas lógica sobre su contenido ni lo mapees a tus propios códigos.Si options_complete es false, la lista no es el límite
Si options_complete es false, la lista no es el límite
Ocurre en etiquetado sin restricción:
options es una muestra del catálogo y cualquier etiqueta de tu compañía es válida, aunque no aparezca. Si tu interfaz solo ofrece lo que llegó, estarás recortando opciones legítimas — deja que tu usuario escriba una etiqueta libre.3. Envía la decisión
Ejemplos de cuerpo para las otras dos clases:
Si el paso exige que decidan todos sus responsables, la respuesta vuelve con
status: pending. No es un error: tu decisión quedó registrada y el paso espera a los demás. Vuelve a consultar el paso actual para ver quiénes faltan — son los assignees con acted: false.Cuando no hay nada que responder
Dos situaciones que conviene no confundir:Errores y reintentos
403 · not_assigned
403 · not_assigned
El miembro que indicaste no está habilitado para ese paso. Consulta
assignees antes de decidir; la lista cambia si reconfiguran el flujo.409 · step_not_pending
409 · step_not_pending
Alguien ya lo resolvió, desde Payana o desde otra llamada tuya. No lo reintentes: vuelve a consultar el paso actual del documento y sigue desde ahí.
422 · invalid_decision
422 · invalid_decision
El valor no está entre los que el paso ofrece. En etiquetado sin restricción también se rechaza una etiqueta que no exista en tu compañía.
422 · unsupported_step
422 · unsupported_step
El paso no se decide por esta API.
GET /workflow-steps/current lo anticipa con actionable: false.400 · acting_user_not_found_in_company
400 · acting_user_not_found_in_company
Ese email no es miembro de tu compañía en Payana. Suele ser un usuario que existe en tu sistema y nunca se dio de alta, o que fue eliminado.
code son tokens estables en snake_case; el message es texto para humanos y puede cambiar. Decide sobre el code.
Cómo confirmas que funcionó
Tres señales, de la más inmediata a la más definitiva:- La respuesta del
completetraestatus: completedyacted_by. - El paso ya no está pendiente: volver a consultar devuelve el paso siguiente, o
204si el flujo terminó. - El efecto del flujo se ve en el documento. Si al paso le sigue la generación de la cuenta por pagar, aparece en
payablesal consultar el documento — ese array vacío antes de la decisión y con la CxP después es la confirmación de punta a punta.
Obtener un documento
Pide
fields=payables,payments para ver el efecto de la decisión.Puesta en marcha
- Recibe el webhook
document.createdy guardadata.referencecontra tu identificador - Verifica que los emails de quienes deciden existan como miembros en Payana
- Consulta el paso actual y construye el control desde
decision.kindyoptions - Respeta
options_complete: falseen etiquetado - Envía la decisión con
acting_user_email - Trata el
409como “vuelve a consultar”, no como fallo - Prueba el ciclo completo contra
api.develop.payana.cloudantes de producción
Próximos pasos
Paso actual de un documento
La referencia completa del primer endpoint.
Resolver un paso
La referencia completa del segundo.
Flujos personalizados
Cómo se configuran los pasos por los que pasa un documento.
Registro de facturas en el ERP
La otra mitad de la integración: catálogo y causación.