| 401 on every call |
Key mistyped, regenerated, or with stray whitespace |
Regenerate in the portal and update the configuration |
The route ... could not be found |
/v1 missing from the base, or a numeric payment id where a transaction UUID belongs |
Fix the URL; void/refund/receipt are keyed by the transaction UUID (13.1) |
404 Pago no encontrado |
Id from the other environment (created with sk_test_, queried with sk_live_ or vice versa) |
Use the key from the same environment |
422 about currency_code in sandbox |
Sandbox not provisioned for the merchant |
16.2 - ask ROKI to enable it |
| Payment created but without tax/tip/fee |
Field name misspelled and silently ignored |
12.1 - compare against openapi.yaml and inspect the response |
| No webhooks arriving |
Endpoint registered in the wrong environment, URL not public, or not HTTPS |
Check the sandbox/production toggle and "Entregas recientes" in the portal |
| Webhooks arrive but the signature fails |
Signing re-serialized JSON instead of the raw body |
14.4, rule 1 |
| Paid orders stuck as pending |
Relying on success_url to confirm |
9.3 - confirm via webhook or lookup |
| Duplicate payments |
Missing Idempotency-Key (external_reference is not unique) |
11 |
| Checkout link dead after one payment |
reusable defaults to false and the link is consumed |
8.4 |
| Expiry looks wrong by six hours |
Timestamps parsed as UTC instead of UTC-6 |
12.4 |