1. API Transaccional (API KEY)
Payday Payments
  • API Transaccional (API KEY)
    • Crear Clabe
      POST
    • Listar Transacciones
      GET
    • Listar Transaccion
      GET
    • Listar Transacciones X CLABE
      GET
    • Crear Payment Intent
      POST
    • Actualiza Payment Intent
      PUT
    • Listar Payment Intents
      GET
    • Obtener Payment Intent
      GET
    • Cancelar Payment Intent
      POST
    • Crear webhook
      POST
    • Borrar Webhook
      DELETE
    • Evento - Transaction Income
    • Evento - Payment Receive
    • Consultar Transferencia X TxID
      GET
    • Consultar Detalle Transferencia
      GET
    • Cancelar Transferencia
      POST
  • Connect API
    • Implementacion Connect
    • Crear regla de split
      POST
    • Listar Reglas Split
      GET
    • Obtener regla split por id
      GET
    • Actualizar regla split
      PUT
    • Eliminar regla split
      DELETE
    • Enlazar Connect
      PUT
    • Desactivar Connect
      PUT
    • Crear cuentas conectadas
      POST
    • Listar cuentas conectadas
      GET
    • Obtener cuenta conectada por id
      GET
    • Actualizar cuenta conectada
      PUT
    • Eliminar cuenta conectada
      DELETE
    • Listar Transferencias Manuales
      GET
    • Libera un transfer de hold manual
      POST
  • Partner API (OAuth)
    • Obtener Token
    • Crear Cuenta
    • Configurar Cuenta Bancaria
    • Crear API Key Transaccional
    • Rotar API Key Transaccional
    • Revocar API Key
  1. API Transaccional (API KEY)

Actualiza Payment Intent

PUT
/api/developer/payment-intents/{id}
Descripción
Actualiza un Payment Intent existente del tenant al que pertenece la API key. Permite modificar el monto (solo bajo las reglas de la sección 6), la descripción y los metadatos. La referencia es inmutable. Los intents en estado paid o canceled no son modificables.
La operación es atómica y segura ante concurrencia: si un abono SPEI esta entre la lectura y la escritura, el update no se aplica y responde 409 en vez de sobreescribir el pago.
1. Autenticación
PrioridadFormaNotas
1Authorization: Bearer ak_xxxxxxxxSolo se acepta si el token empieza con el prefijo ak_
Si la key no llega por Authorization, se rechaza la peticion.
2. Request
Headers
HeaderReqValor
AuthorizationsíVer sección 1
Path parameters
ParamTipoValidación
idstringDebe ser un ObjectId de MongoDB válido; si no, 404
Body (JSON)
Todos los campos son opcionales; se envían solo los que se quieren cambiar.
CampoTipoRequeridoReglas
amountnumber | string numériconoDebe ser > 0. Se acepta number (120.5) o string numérico ("120.50"). Se redondea a 2 decimales. Cualquier otro tipo (bool, null, array, object) → 400. Ver reglas de montos en sección 6.
descriptionstring | nullnoString libre. null limpia el campo (queda "").
metadataobjectnoObjeto de campos libres. Se reemplaza completo (no hace merge con el anterior).
referencestringnoSolo lectura. Si viene y es distinta a la actual → 400. Si viene idéntica, se ignora sin error. Nunca modifica la referencia.
Campos no reconocidos en el body se ignoran silenciosamente. Si el body no implica ningún cambio real (p. ej. solo repite la reference actual o el amount vigente), responde 200 con el documento sin modificar (PUT idempotente).
3. Reglas de negocio del monto (máquina de estados)
El monto actual se compara contra amountReceived (lo ya acreditado por abonos SPEI):
Estado del intentAumentarMantenerBajar
pending✅ 200✅ 200 (no-op)✅ 200 — cualquier valor > 0
partial✅ 200✅ 200 (no-op)⚠️ Hasta amountReceived; por debajo → 409
paid / canceled❌ 409❌ 409❌ 409
Promoción automática a pagado: si en un intent partial el nuevo monto queda <= amountReceived (el abono ya recibido cubre el nuevo total), el intent se promueve a paid con completedAt en la misma operación atómica. Si el nuevo monto queda entre amountReceived y el monto actual, permanece partial.
Garantía de atomicidad: toda la validación de estado y monto viaja en el filtro. Si un abono concurrente del webhook STP paga o modifica el intent entre la lectura y la escritura, el filtro deja de hacer match, el update no se aplica, y se responde 409 con el motivo re-classificado. Nunca queda un intent pagado con el monto alterado por esta vía.
4. Responses — enunciados de éxito
200 OK — Actualización aplicada (o no-op idempotente)
{
  "paymentIntent": {
    "_id": "665f1a2b3c4d5e6f7a8b9c0d",
    "tenantId": "demo",
    "centro_costo": null,
    "reference": "pi3fa2c1",
    "amount": 120.50,
    "amountReceived": 0,
    "amountUpdatedAt": "2026-08-28T14:40:10.773Z",
    "amountUpdatedBy": "apiKey:665f0a11b2c3d4e5f6a7b8c9",
    "status": "pending",
    "description": "Pago actualizado",
    "metadata": { "orderId": "123" },
    "payments": [],
    "createdBy": "apiKey:665f0a11b2c3d4e5f6a7b8c9",
    "lastPaidAt": null,
    "completedAt": null,
    "createdAt": "2026-08-28T13:00:00.000Z",
    "updatedAt": "2026-08-28T14:40:10.773Z"
  }
}
Esquema del objeto paymentIntent
CampoTipoDescripción
_idstringObjectId del intent (el mismo del path)
tenantIdstringTenant dueño (implícito por la API key)
centro_costostring | nullCentro de costo; heredado del creador al crear el intent
referencestringReferencia inmutable que el pagador pone en el concepto de pago SPEI. Formato pi + 6 hex
amountnumberMonto esperado, 2 decimales. Este es el campo que modifica el endpoint
amountReceivednumberSuma acreditada de abonos aplicados.
amountUpdatedAtstring ISO | nullFecha del último cambio de amount hecho por este endpoint
amountUpdatedBystringActor del último cambio de monto: apiKey:<id> o el sub del usuario JWT
statusstringpending | partial | paid | canceled
descriptionstringDescripción libre
metadataobjectCampos libres del integrador
paymentsarrayHistorial de abonos aplicados: { transaccionId, claveRastreo, montoNeto, montoOriginal, fechaOperacion, createdAt }. Solo lectura desde la API
createdBystringActor que creó el intent
lastPaidAtstring ISO | nullFecha del último abono aplicado
completedAtstring ISO | nullFecha en que quedó paid.
createdAt / updatedAtstring ISOTimestamps del documento
5. Responses — errores
Todos los errores de negocio devuelven solo { "message": "<motivo>" } con el status correspondiente. (Los errores de infraestructura no controlados usan el envelope global { "success": false, "message": "..." }.)
400 Bad Request
message exactoCausa
Invalid amountamount presente con valor <= 0, no numérico ("abc"), o de tipo no permitido (true, null, array, object)
reference is immutableBody trae reference distinta a la actual del intent
401 Unauthorized
message exactoCausa
API key requiredNo llegó ninguna API key (header ausente/vacío)
Invalid API keyLa key no coincide con ninguna activa en el índice maestro
404 Not Found
message exactoCausa
Not foundEl id no es un ObjectId válido, el intent no existe, pertenece a otro tenant, o (solo en la variante JWT) está fuera del centro de costo del operador. Deliberadamente indistinguible entre estos casos
Tenant not found or inactive (con success: false)La API key es válida pero el tenant está inactivo
409 Conflict
message exactoCausa
Cannot update a paid/canceled intentEl intent está paid o canceled (verificación previa o detección de carrera)
Amount can only be lowered down to the received amount on a partially paid intentDecremento ilegal: en pending cualquier baja; en partial, bajar por debajo de amountReceived. También se devuelve si un abono concurrente convirtió la baja en ilegal (carrera)
6. Matriz completa de escenarios
Dado un intent con amount: 100:
#Estado inicialamountReceivedBodyStatusResultado
1pending0{"amount": 150}200amount=150, amountUpdatedAt/By seteados
2pending0 {"amount": 50}200amount=50
o
3partial50{"amount": 50}200amount=50, promovido a paid + completedAt
4partial50{"amount": 80}200amount=80, sigue partial
5partial50{"amount": 40}409Monto intacto
6paid100{"amount": 150}409Nada cambia
7canceled0{"description": "x"}409Nada cambia
8pending0{"reference": "piotra", "amount": 120}400reference is immutable
9pending0{"reference": "pi3fa2c1"} (la misma)200No-op idempotente
10pending0{"amount": 0} / -10 / "abc" / true400Invalid amount
11pending0{"amount": "120.50"}200String numérico aceptado → 120.5
12pending0{} o {} con campos sin efecto200No-op idempotente
13partial50abono STP entra durante el PUT409Guard atómico; el pago manda
14——id inexistente / de otro tenant / malformado404Not found
7. Ejemplos
Notas de implementación
1.
Idempotencia: repetir el mismo PUT exitoso devuelve 200 con el documento (no error), incluyendo el caso de bajar el monto a un valor que ya es el vigente.
2.
Redondeo: todo monto se normaliza a 2 decimales antes de comparar/escribir; 120.504 → 120.5.

Solicitud

Autorización
Proporciona tu token bearer en el encabezado
Authorization
al realizar solicitudes a recursos protegidos.
Ejemplo:
Authorization: Bearer ********************
Parámetros de ruta

Parámetros del Body application/jsonRequerido

Ejemplos

Respuestas

🟢200Éxito
application/json
Bodyapplication/json

Solicitud Ejemplo de Solicitud
Shell
JavaScript
Java
Swift
cURL
curl --location --request PUT 'https://stp.paydaymx.com/api/developer/payment-intents/6a91af05659dd8c8fe1843b0' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
    "amount": 150.00
}'
Respuesta Ejemplo de Respuesta
{
  "paymentIntent": {
    "_id": "665f1a2b3c4d5e6f7a8b9c0d",
    "tenantId": "demo",
    "centro_costo": null,
    "reference": "pi3fa2c1",
    "amount": 120.50,
    "amountReceived": 0,
    "amountUpdatedAt": "2026-08-28T14:40:10.773Z",
    "amountUpdatedBy": "apiKey:665f0a11b2c3d4e5f6a7b8c9",
    "status": "pending",
    "description": "Pago actualizado",
    "metadata": { "orderId": "123" },
    "payments": [],
    "createdBy": "apiKey:665f0a11b2c3d4e5f6a7b8c9",
    "lastPaidAt": null,
    "completedAt": null,
    "createdAt": "2026-08-28T13:00:00.000Z",
    "updatedAt": "2026-08-28T14:40:10.773Z"
  }
}
Modificado en 2026-08-28 16:11:16
Anterior
Crear Payment Intent
Siguiente
Listar Payment Intents
Built with