Errores y límites
Los formatos de error, cada código de estado y su causa, los códigos de fallo del negocio, y cómo gestionar los límites de solicitudes y los reintentos.
Una solicitud fallida siempre lleva success: 0. Hay dos formatos principales, según lo que haya salido mal, y los distingues porque el cuerpo tenga o no un arreglo errors.
La solicitud en sí era incorrecta
Los problemas de la solicitud (un parámetro que falta o no es válido, la clave de API, el límite de solicitudes, un nivel del catálogo sin nada debajo) devuelven un arreglo errors:
{
"success": 0,
"errors": [{
"message": "You are missing a required parameter for this request.",
"param": "country",
"description": "Country code from /api/v1/catalog/platforms/{platform}/countries, e.g. US"
}]
}Campo | Siempre presente | Significado |
|---|---|---|
| sí | Qué salió mal, en inglés sencillo. |
| no | El parámetro con el problema ( |
| no | Qué debe contener ese parámetro, o cómo superar el error. |
Corrige la solicitud; si la reintentas sin cambios, fallará igual (salvo 429 y 503, más abajo).
Códigos de estado
HTTP | Cuándo |
|
|---|---|---|
| Un nivel del catálogo para el que enviaste | — |
| Falta un parámetro obligatorio. |
|
| Se llamó sin clave a un endpoint que la necesita ( |
|
| Un id no es exacto: el nombre de una plataforma en lugar de su id, |
|
| Un parámetro tiene un formato incorrecto. |
|
| La clave de API no existe o fue revocada, en cualquier endpoint, también en los públicos ( |
|
| Un nivel del catálogo no tiene stock para la plataforma, el país o el proveedor de la ruta. El mensaje te remite al nivel superior. |
|
|
|
|
| Todavía se está procesando una compra con el mismo |
|
| Se reutilizó un |
|
| Demasiadas solicitudes sin clave desde tu dirección IP. |
|
| Demasiadas solicitudes con tu clave. |
|
| Demasiadas solicitudes con una clave no válida desde tu dirección IP ( |
|
| Algo salió mal por nuestra parte. |
|
| El catálogo todavía está cargando los precios, normalmente justo después de un reinicio. Vuelve a intentarlo en unos segundos. |
|
Fíjate en la diferencia entre 400 y 404 para los ids: un endpoint que recibe service y country como parámetros (/request/price, /purchase/sms) responde a un id desconocido con 400; una ruta del catálogo (/catalog/platforms/{platform}/…) responde con 404, porque el árbol solo muestra lo que tiene stock y ese nivel está vacío.
La solicitud era correcta, pero no se puede completar
Pedir números, alquilarlos y comprar cuentas de correo fallan de las mismas pocas maneras, y siempre incluyen dos campos según los cuales actuar:
type: la categoría general que la mayoría de los clientes de verificación ya gestionan.code: el motivo exacto.
{
"success": 0,
"message": "That option is no longer available. Pick another.",
"type": "OUT_OF_STOCK",
"code": "OPTION_GONE"
}
|
| HTTP | Qué hacer |
|---|---|---|---|
|
| 409 | Prueba otro país u otra opción, o inténtalo más tarde. |
|
| 409 | La |
|
| 409 | El |
|
| 402 | Recarga saldo. El mensaje indica cuánto cuesta el pedido y cuál es tu saldo. |
|
| 400 | El precio supera tu |
|
| 400 | Ese plazo de alquiler no se ofrece. Usa uno de |
|
| 409 | Esa plataforma no se vende en ese país en este momento. |
|
| 503 | El suministro no está disponible momentáneamente. Reintenta tras una breve espera. |
|
| 400 / 409 | No disponible para este producto, número o acción. |
|
| 429 | Demasiadas compras en tu cuenta (60 por minuto de forma predeterminada), o el suministro está limitando las solicitudes momentáneamente. Espera los segundos de |
|
| 404 | No existe ese pedido, alquiler o cuenta en tu cuenta. |
|
| 409 | Solo en |
|
| 400 | Cuentas de correo: elige entre 1 y 500. |
|
| 400 | Cuentas de correo: ese producto no existe. |
|
| 500 | Algo salió mal por nuestra parte. Reintenta una vez; si persiste, consulta la página de estado. |
Una cotización sin nada en stock sigue la misma idea, sin code: /request/price responde 409 con type: "OUT_OF_STOCK" y las options (agotadas).
Algunas respuestas de gestión de pedidos solo llevan un message; por ejemplo, /sms/check sobre un pedido que no es tuyo:
{ "success": 0, "message": "We could not find this order!" }Un pedido rechazado no cuesta nada
Cualquier fallo antes de que se entregue un número o una cuenta deja tu saldo intacto. Si un pedido no se puede completar después de haber reservado tu saldo, el dinero vuelve de inmediato, antes de que llegue la respuesta.
Límites de solicitudes
Quién llama | Límite (predeterminado) | Se cuenta por |
|---|---|---|
Sin clave, endpoints públicos | 10 solicitudes por segundo | Dirección IP |
Con clave | 32 solicitudes por segundo | Cuenta |
Compras de cualquier tipo | 60 por minuto | Cuenta |
Los rechazos por límite llevan una cabecera Retry-After: espera esa cantidad de segundos antes de reintentar. Un rechazo por exceso de solicitudes se ve así:
{ "success": 0, "errors": [{ "message": "Rate limit exceeded. Slow down and try again." }] }Sin clave, el error también incluye una description que te sugiere enviar tu clave, lo que te pasa al límite más alto de tu cuenta. El límite de compras responde con el formato de negocio, con code: "RATE_LIMITED". Más detalles en Autenticación.
Reintentar de forma segura
Reintenta los
429y503tras una espera breve y creciente, respetandoRetry-Aftercuando esté presente. No reintentes otros4xxsin cambios.Una solicitud de pedido que agota el tiempo de espera por tu lado puede haberse completado igualmente. Envía una cabecera
Idempotency-Keycon cada compra y reintenta con la misma clave: una repetición después de un éxito devuelve el pedido original (marcado conIdempotent-Replayed: true) y no cobra nada. Sin ella, consulta/request/activeantes de volver a pedir, o podrías comprar dos números.