Saltar al contenido principal
Una orden de pago cobra una deuda en el momento con la cuenta bancaria que el usuario registró en TapiPay. En un solo request, POST /v2/debts/orders registra la deuda y pide el cargo a su cuenta.

Cuándo usar una orden de pago

Orden de pago

Un cobro único que quieres disparar ahora, con la cuenta que el usuario ya registró. Por ejemplo, un cargo extra o un pago que el usuario aprobó en tu app.

Débito automático

Si las deudas de un producto se tienen que cobrar solas cada vez que vencen.

Deuda

Si el usuario paga cuando quiere, por su paymentUrl, con el medio que elija.
Una orden de pago no necesita que el usuario esté adherido a un producto (POST /adhesions). Solo necesita que tenga su cuenta bancaria registrada.

Requisitos previos

  • Tu compañía debe tener habilitadas las órdenes de pago y el débito automático (se configura con tu ejecutivo de Tapi).
  • El usuario debe existir como contacto. Este endpoint no crea contactos en línea.
  • El usuario debe haber registrado su cuenta bancaria en la página de enrolamiento (no por API). Puedes comprobarlo con GET /payment-methods.

Crear una orden de pago

Campos

string
requerido
Tu identificador único de la orden, hasta 250 caracteres. Es la llave de idempotencia: si reintentas, usa el mismo valor. El debtId de la deuda resultante es debt_<externalRequestId>. Ver Reintentos.
string
requerido
El identificador del usuario, el mismo que usó al registrar su cuenta. Tiene que corresponder a un contacto existente.
number
requerido
Monto a cobrar en pesos, con hasta 2 decimales (mínimo 0.01), igual que en deudas.
string
requerido
Con qué medio se cobra. Por ahora el único valor es BANK_ACCOUNT (la cuenta bancaria registrada).
string
La cuenta con la que se cobra, tal como la devuelve GET /payment-methods. Tiene que ser una cuenta vigente del usuario y del tipo indicado en paymentMethodType. Si no lo envías, se cobra con la cuenta predeterminada del usuario.
string
Vencimiento de la deuda, en formato YYYY-MM-DD. Si no lo envías, se toma la fecha de hoy en Ciudad de México más 7 días.
string
Texto libre de hasta 255 caracteres. No puede ser vacío.
object
Objeto plano con tus datos propios. Sigue las mismas reglas que en las deudas. Ver Convenciones de la API.
string
Solo si tu cliente tiene varias companies. Ver Convenciones de la API.
El endpoint solo acepta estos campos. Cualquier otro devuelve 400 INVALID_REQUEST, con el campo rechazado en details[].field.

La respuesta

Respuesta 201
La respuesta trae dos objetos:
  • debt: la deuda que se registró. Es una deuda como cualquier otra: la puedes leer con GET /debts/{debtId}. No admite pagos parciales.
  • order: el cargo a la cuenta del usuario. estimatedProcessingDate es la fecha estimada del cargo (YYYY-MM-DD). Por ahora siempre viene en null.

Estados de la orden

El cargo se procesa de forma asíncrona: la orden nace en PROCESSING y cambia de estado cuando el banco responde. El resultado del cargo te llega por webhook: ver Pago de una orden. También puedes consultar la orden con GET /v2/debts/orders.

Consultar una orden

Respuesta 200
externalRequestId es obligatorio y es el mismo que enviaste al crear la orden. data tiene la misma forma que order en la respuesta de creación. Si no existe una orden con ese externalRequestId, la respuesta es 404 RESOURCE_NOT_FOUND.

Reintentos e idempotencia

externalRequestId es la llave de idempotencia de la orden. Así se comporta un reintento con el mismo valor:
Ante un 500 INTERNAL_ERROR en POST /v2/debts/orders, no sabes si el cargo se pidió. Reintenta siempre con el mismo externalRequestId, nunca con uno nuevo: así evitas cobrarle dos veces al usuario. Si el reintento responde 409, consulta la orden.

Errores

En estos dos endpoints, un companyCode ajeno responde 403 con el envelope de error (error.code: RESOLUTION_ERROR y requestId), y no 422 como en el resto de la API. Ver Manejo de errores.