FITALAPI

Conceptos

Una empresa, una cuenta FITAL, y lo que se mueve dentro de ella.

Tu empresa tiene una cuenta FITAL. Sobre ella hay saldos, beneficiarios, cotizaciones, pagos, cobros, depósitos y movimientos. Cada recurso tiene un identificador con prefijo.

ConceptoPrefijoQué es
Beneficiarioben_Destino de un pago. Se aprueba en el panel antes de poder pagarle
Cotizaciónquo_Monto de débito indicativo, con vencimiento
Pagopay_Salida de dinero a un beneficiario
Cobrocol_Instrucción para que un cliente te pague
Dirección de depósitodep_Dirección para recibir un token por una red
Depósitodpt_Dinero recibido, con los datos del pagador si el riel los informa
Movimientomov_Cualquier entrada o salida de tu cuenta

Saldos y cuentas para recibir

GET /v1/balances da lo disponible por moneda. GET /v1/wallets da lo mismo por wallet, con su red: la suma por moneda coincide, salvo redondeo al centavo, y las wallets sólo se consultan. GET /v1/receiving-accounts da las cuentas donde puedes recibir fondos, y POST /v1/receiving-accounts abre una nueva, como en Cuentas para recibir. GET /v1/limits da los rieles habilitados y el máximo aplicable, si existe.

Beneficiarios

El alta por API crea el beneficiario pendiente. La aprobación ocurre en el panel y nunca por API: una llave robada no puede pagar a un destino nuevo. No hay espera ni tope de monto; sí hay aprobación.

EstadoSignificado
processingEl alta sigue en curso
pending_approvalFalta aprobarlo en el panel
approvedYa se le puede pagar
rejectedNo se aprobó
deletedSe dio de baja

Pagos

El riel sale del beneficiario, no lo eliges en la petición. Queda fijo al crear el pago: dar de baja al beneficiario después no lo cambia. Estos son los estados públicos:

EstadoSignificado¿Terminal?
processingAceptado y en curso, o aún sin confirmarNo
in_reviewEn revisión. No repitas el pagoNo
completedSe pagó. Aún puede pasar a returnedSí
failedNo se hizo y no queda dinero en tránsitoSí
returnedSe devolvió y el saldo ya volvióSí
canceledSe canceló antes de ejecutarseSí

Trata estas listas como extensibles: un valor nuevo no rompe la versión. Tu código debe tolerar un estado que no conoce.

Con failed, GET /v1/payments/{id} y payment.failed traen failure_code, un código del catálogo de errores. Nunca llega en null en un pago failed: sin un motivo más específico, o si el detalle ya no se puede leer, es payment_rejected. La lista GET /v1/payments no lo trae: ahí siempre es null. Los valores están en Consultar un pago.

processing tampoco garantiza que el pago siga avanzando. Si un pago se reenvía y ese reenvío cae, sigue en processing hasta que FITAL lo cierre, y entonces llega su estado final. No lo repitas. Si lleva demasiado tiempo así, escribe a soporte con el pay_.

Un estado terminal se puede corregir

Terminal significa que no esperas otro cambio, no que sea imposible. Una lectura parcial no mueve el estado de un pago, salvo un rechazo ya cerrado. Una lectura concluyente sí, también hacia atrás: un completed que se devuelve o un canceled que se reabre cambian de estado y publican su evento. Ver Orden. Esto aplica a pagos, no a cobros.

Qué confirma un completed

completed exige confirmación del riel. En latam la da el banco de destino: mientras no llegue, el pago sigue en processing. Si no se sabe el riel de un pago, ninguna lectura nueva lo da por completed: el detalle responde lo último que se sabe, con freshness.status en delayed, y su movimiento sale en processing con read_status: "partial".

Frescura del detalle

GET /v1/payments/{id} lee el estado en vivo y dice de dónde salió en freshness. Ese campo sólo existe en el detalle.

freshness.statusQué significafreshness.as_of
currentstatus sale de una lectura de ahoraLa hora de esa lectura
delayedLa lectura no concluyó: status es lo último que se sabeLa hora de la última lectura aplicada o de la cancelación confirmada. null si aún no hay ninguna

Con delayed, no tomes status como un resultado nuevo: consulta otra vez más tarde. Una cancelación confirmada responde canceled con delayed hasta que una lectura la confirme. Si ese pago responde después processing con current, se reabrió de verdad.

Lista y detalle

GET /v1/payments es una vista guardada: no lee en vivo y no lleva freshness. Puede ir una vuelta de sincronización por detrás del detalle, también justo después de cancelar, y se pone al día sola. Esa vuelta es la misma que publica los eventos: normalmente tarda de 20 a 120 segundos. Para decidir sobre un pago, usa el detalle.

Vigilancia de un pago completado

Un pago completed en latam se vigila leyendo el riel durante 120 días desde la primera lectura que lo vio completado. Después, una devolución tardía puede no generar evento ni aparecer en GET /v1/payments. Ese plazo no garantiza que una devolución no llegue más tarde.

En los demás rieles nada lee el riel por su cuenta: la devolución se conoce por el aviso del riel. Es el caso normal, y entonces llega payment.returned. Si ese aviso no llegara y nadie consultara el pago, la devolución no se vería, ni dentro de esos 120 días ni después.

En cualquier riel, GET /v1/payments/{id} lee en vivo y da el estado real. Si tu cierre depende de un pago, consúltalo ahí. Si esa consulta ve otro estado, el pago vuelve a vigilarse y el cambio se publica.

Cotizaciones

POST /v1/quotes devuelve cuánto se debitaría, en source_amount y source_currency. Es indicativa y vence en expires_at, a los 60 segundos en producción. Si envías su quote_id al crear el pago, el débito no puede superar lo cotizado.

Errores comunes

  • Dar por fallido un pago en processing. Consulta el pay_ hasta un estado terminal.
  • Tomar delayed como un resultado nuevo. Es lo último que se sabe.
  • Decidir sobre un pago con GET /v1/payments. Es una vista: usa el detalle.
  • Pagar a un beneficiario sin aprobar: responde 422 beneficiary_not_approved.

Qué sigue

Ambientes y Autenticación.

Ver esta página en Markdown

En esta página