Errores típicos al integrar
Los problemas más frecuentes al integrar y cómo resolverlos.
1. Usar la cuenta de admin en vez de la cuenta de comercio para el OAuth
Causa: La cuenta de admin del portal y la cuenta de comercio (merchant) son cuentas distintas. Usar la incorrecta devuelve 401 aunque las credenciales sean válidas.
Fix: Verificá en tu dashboard de Chytapay el Client ID de la cuenta de comercio de integración. Es distinto al Client ID de admin.
2. redirect_uri no coincide con el valor registrado
Causa: El parámetro redirect_uri se valida de forma exacta (protocolo, dominio, path, trailing slash). Cualquier diferencia devuelve "redirect_uri_mismatch".
Fix: Configurá el redirect_uri exacto (paso 3 de Primeros pasos) y usá el mismo valor —sin variaciones— en cada llamada a /oauth2/authorize.
3. idToken expirado o código de autorización reutilizado
Causa: El authorization code expira en 10 minutos y solo se puede usar una vez. El idToken expira en 1 hora. Reutilizarlos devuelve "invalid_grant" o 401.
Fix: Redirigí al usuario a /authorize para obtener un código nuevo. Para el idToken, usá el refreshToken (POST /oauth2/refresh) sin requerir intervención del usuario.
4. Token de Integration API usado en endpoints de Integration Admin (o viceversa)
Causa: Los tokens OAuth B2C (idToken del merchant) solo sirven para la Integration API. Los tokens de admin (de /admin/login) solo sirven para la Integration Admin API.
Fix: Integration API → usar idToken del merchant (flow OAuth). Integration Admin API → usar idToken del admin (flow login directo).
Referencia de errores de la Integration API
Errores reales que puede devolver la Integration API (endpoints de payment-request y tenant), tal como están definidos en el backend. Los mensajes están en inglés porque son developer-facing.
| HTTP | Code | Message | Causa | Solución |
|---|---|---|---|---|
| 400 | ValidationError | (mensaje Joi específico del campo inválido) | El body no cumple el contrato: falta un campo requerido, tiene un tipo incorrecto o un valor fuera de rango. | Revisá el mensaje devuelto —nombra el campo puntual— y comparalo contra el spec OpenAPI de la Integration API. |
| 404 | PaymentRequestNotFoundError | Payment request was not found | El referenceId del path no existe para tu integración. | Verificá que el referenceId esté bien escrito. Listá tus cobros con GET /payment-request para confirmar que existe. |
| 404 | IntegrationCollectGroupNotFoundError | No collection group was found for this integration | Tu integración todavía no tiene un collect group configurado en Chytapay (onboarding incompleto). | Contactá a soporte de Chytapay para completar el alta de tu integración. |
| 404 | TenantNotFoundError | The specified tenant does not exist or was deleted | El tenantKey no corresponde a ninguna sede activa de tu integración. | Confirmá que la sede exista y no haya sido borrada desde el Portal. Ver la guía Multi-sede. |
| 404 | ClientUserNotFoundForBindingError | No integration account was found for the authenticated user | El merchant detrás del idToken todavía no completó el flujo OAuth de vinculación con tu integración. | Redirigí al usuario al flujo de vinculación inicial (ver Vinculación vs uso recurrente en Conceptos) antes de operar en su nombre. |
| 409 | ReferenceIdAlreadyExistsError | The provided reference ID already exists for this client | Ya creaste un cobro con ese mismo referenceId para esta integración. | Elegí un referenceId nuevo y único, o consultá el cobro existente con GET /payment-request/{referenceId}. |
| 409 | PaymentRequestCannotBeModifiedError | Payment request cannot be modified in its current state | Solo se puede hacer PATCH sobre un cobro en estado draft y sin pagos registrados. | Verificá el estado del cobro con GET antes de modificarlo. Si ya tiene amount o pagos, no se puede editar. |
| 409 | PaymentRequestCannotBeCanceledError | The payment request cannot be canceled in its current state | Solo se pueden cancelar cobros en estado draft o pending. | Verificá el estado del cobro antes de cancelarlo. Un cobro ya pagado o vencido no se puede cancelar. |
| 422 | BulkPaymentRequestValidationError | One or more bulk payment requests are invalid | Uno o más items del batch bulk fallaron una validación de negocio (referenceId duplicado, taxDocument inválido, etc). No se crea ningún cobro del batch (all-or-nothing). | Inspeccioná el array errors: [{ index, referenceId, reason }] de la respuesta, corregí cada item señalado y reenviá el batch completo. |
| 429 | IntegrationDailyRequestLimitExceededError | Daily payment request limit exceeded. You can create more after {fecha} | Superaste el tope diario de creación de payment requests (ver Rate limits en Conceptos). | Esperá hasta el availableAt indicado en la respuesta, o agrupá cobros con POST /payment-request/bulk (una llamada bulk cuenta como 1 sola request). |