Catálogo de errores
Cada respuesta de error trae un código estable en error.code. Tu cliente debe ramificar sobre ese: busca por código, filtra por dominio, o abre cualquier fila para ver la explicación completa y cómo resolverlo.
40 códigos documentados
401AUTH_REQUIREDNo se envió un token Bearer y cada llamada lo requiere.
No vimos un token Bearer en tu petición. Cada llamada a la API v6 necesita una API key en el header Authorization: sin ella no podemos saber qué organización está consultando.
Cómo resolverlo
Envía Authorization: Bearer hk_TU_API_KEY en cada petición. El esquema Bearer es la única forma aceptada de autenticarse: los estilos antiguos que mandaban la key en la URL o en el cuerpo ya no se aceptan.
40002#auth-required401AUTH_INVALID_KEYLa API key no se reconoce: formato equivocado, revocada o vencida.
La API key que enviaste no se reconoce. Tres situaciones producen este código: una key con el formato equivocado, una key que fue rotada o revocada, o una key que ya pasó su fecha de vencimiento.
Cómo resolverlo
Verifica que tu cliente esté usando exactamente el valor que se mostró cuando la key se creó: las keys se muestran una sola vez. Si rotaste keys hace poco, asegúrate de estar usando la nueva. Si la key venció, emite una nueva desde el portal de clientes.
40003#auth-invalid-key401AUTH_COST_CENTER_DISABLEDEl centro de costo asociado a la key está deshabilitado.
Cada API key está asociada a un centro de costo para que el uso se facture y se reporte correctamente. El centro de costo de esta key está deshabilitado.
Cómo resolverlo
Reactiva el centro de costo desde el portal de clientes, o emite una nueva key asociada a uno activo.
401AUTH_SERVICE_NOT_ALLOWEDLa key no tiene permitido el servicio detrás de este endpoint.
Esta key no tiene permitido llamar al servicio detrás de este endpoint. Las keys se pueden restringir a servicios específicos para que una key filtrada o mal usada solo pueda hacer aquello que se le permitió.
Cómo resolverlo
Emite una nueva key con el servicio correcto habilitado, o cambia a una que ya lo tenga. Los endpoints de diagnóstico bajo /api/v6/utilities/ siempre están disponibles, sin importar el alcance de la key.
400AUTH_SOURCE_IP_UNKNOWNReservado: solo como puente desde v5.
Código reservado, se mantiene como puente para quienes vienen migrando desde v5. La API v6 no usa el mecanismo de sustitución de IP de origen que producía este error, así que no deberías verlo en tráfico v6.
40015#auth-source-ip-unknown403ACCOUNT_NOT_ACTIVETu organización está suspendida o cerrada.
Tu organización no está en estado activo, normalmente porque fue suspendida o cerrada. Mientras siga así, todos los endpoints rechazan las llamadas, incluso los de diagnóstico.
Cómo resolverlo
Contacta a soporte para revisar la situación y restaurar la organización. El estado no se puede levantar desde la API.
403ACCOUNT_BLOCKEDHay un bloqueo total activo: cada llamada se rechaza.
Tu organización tiene un bloqueo total. Cada llamada se rechaza, incluidas las de solo lectura, hasta que se retire el bloqueo.
Cómo resolverlo
Abre un ticket de soporte para revisar el caso. Los bloqueos se retiran una vez resuelto el motivo de fondo.
403ACCOUNT_READ_ONLYModo solo lectura: solo pasan GET, HEAD y OPTIONS.
Tu organización está en modo solo lectura. Las peticiones que solo consultan información (GET, HEAD, OPTIONS) siguen funcionando, pero cualquier llamada que cree o modifique datos se rechaza.
Cómo resolverlo
Hasta que se levante el bloqueo, pausa el código que modifica datos. Contacta a soporte para saber por qué está activo y qué se necesita para retirarlo.
403ACCOUNT_CONFIG_NOT_FOUNDNo pudimos cargar la organización de tu key.
Tu API key se autenticó bien, pero no pudimos cargar la organización a la que apunta. Es un problema de datos de nuestro lado, no de tu petición.
Cómo resolverlo
Contacta a soporte e incluye el meta.requestId de la respuesta: con ese id rastreamos la consulta exacta que falló.
4002#account-config-not-found429RATE_DDOS_EXCEEDEDVolumen inusualmente alto desde tu IP de origen.
Tu IP de origen produjo un volumen inusualmente alto de peticiones en el último minuto. Esta protección está pensada para absorber tráfico de ataque y de escáneres; las integraciones legítimas rara vez se acercan al límite.
Cómo resolverlo
Espera los segundos que indique Retry-After antes de reintentar. Si eres un llamante legítimo detrás de una IP compartida y chocas con esto de forma consistente, contacta a soporte para revisar tu patrón de tráfico.
40001#rate-ddos-exceeded429RATE_TPS_EXCEEDEDExcediste el cupo de tu organización para este endpoint.
Enviaste más peticiones a este endpoint de las que permite el cupo de tu organización en la ventana actual. Cada endpoint tiene su propio cupo: chocar con la pared en uno no afecta a los demás.
Cómo resolverlo
Pausa tu cliente los segundos que indique Retry-After y vuelve a empezar. Para no llegar siquiera a tocarla, revisa los headers RateLimit-Remaining y RateLimit-Reset que vienen en cada respuesta y ajusta el ritmo. La guía de límites de uso lo explica en detalle.
40001#rate-tps-exceeded400IDEMPOTENCY_KEY_INVALIDLa llave de idempotencia no cumple el formato.
La Idempotency-Key está vacía, es demasiado larga o trae caracteres fuera del conjunto permitido. Se aceptan de 1 a 255 caracteres de A-Z a-z 0-9 _ -.
Cómo resolverlo
Genera la llave con un UUID v4 o cualquier valor aleatorio dentro del conjunto permitido. Ver la guía de idempotencia.
409IDEMPOTENCY_IN_PROGRESSLa primera petición con esa llave sigue en proceso.
Enviaste la misma llave de idempotencia mientras la petición original todavía se está procesando. No se ejecuta dos veces: la segunda espera.
Cómo resolverlo
Espera lo que indique Retry-After y reintenta con la misma llave.
422IDEMPOTENCY_KEY_REUSEDLa llave ya existe, pero con un cuerpo distinto.
Usaste una llave de idempotencia que ya existe, con un cuerpo diferente. Casi siempre es un error del cliente: una llave identifica una operación, no varias.
Cómo resolverlo
Usa una llave nueva para la operación nueva. No reintentes en bucle: el resultado no va a cambiar.
400URL_INVALIDLa URL de destino está mal formada.
La url que enviaste no es una URL absoluta válida: no pudimos extraer un esquema y un host.
Cómo resolverlo
Envía una URL absoluta http o https incluyendo el host, por ejemplo https://example.com/path.
400URL_SCHEME_NOT_ALLOWEDSolo se admiten destinos http y https.
El destino usa un esquema que no acortamos (por ejemplo javascript:, data:, ftp: o file:).
Cómo resolverlo
Solo se aceptan destinos http y https.
400URL_TOO_LONGLa URL de destino supera el largo máximo.
La URL de destino es más larga que el máximo de 2048 caracteres.
Cómo resolverlo
Acorta el destino (quita parámetros de consulta innecesarios) para que entre en 2048 caracteres.
400URL_BLOCKED_HOSTEl host de destino es privado o reservado.
El destino apunta a una dirección privada o reservada, o a un nombre de host interno (por ejemplo 127.0.0.1, 10.0.0.0/8 o localhost). Los bloqueamos para que los enlaces cortos no sirvan para alcanzar destinos internos.
Cómo resolverlo
Apunta el enlace a un host alcanzable públicamente.
400ALIAS_INVALIDEl alias no cumple el formato permitido.
El alias no tiene entre 3 y 32 caracteres de minúsculas, dígitos, guion o guion bajo.
Cómo resolverlo
Usa un valor que cumpla ^[a-z0-9_-]{3,32}$, u omite alias para que la API genere el código.
409ALIAS_TAKENEl alias ya está en uso en este dominio.
Otro enlace del mismo dominio ya usa ese alias. Los códigos son únicos por dominio.
Cómo resolverlo
Elige otro alias, usa un dominio distinto, u omite alias para recibir un código generado.
409ALIAS_RESERVEDEl alias es una palabra reservada.
El alias choca con una palabra reservada (por ejemplo api, stats, admin o docs).
Cómo resolverlo
Elige un alias que no esté reservado.
400EXPIRES_AT_INVALID`expiresAt` debe ser una fecha ISO futura.
expiresAt no se pudo interpretar como fecha y hora ISO-8601, o está en el pasado.
Cómo resolverlo
Envía un valor ISO-8601 futuro, por ejemplo 2026-12-31T23:59:59Z, u omítelo para un enlace que no expira.
404LINK_NOT_FOUNDNo hay un enlace con ese dominio y código.
Ningún enlace con ese dominio y código pertenece a tu cuenta. Por privacidad también devolvemos 404 para enlaces de otras cuentas, así no se revela su existencia.
Cómo resolverlo
Revisa el dominio y el código. Los enlaces eliminados también responden 404.
400NOTHING_TO_UPDATENo se envió ningún campo actualizable.
El cuerpo del PATCH no traía ninguno de los campos actualizables (active, expiresAt, longUrl).
Cómo resolverlo
Envía al menos un campo actualizable.
500CODE_GENERATION_FAILEDNo se pudo asignar un código único.
No pudimos asignar un código aleatorio único después de varios intentos. Es poco frecuente.
Cómo resolverlo
Reintenta la petición. Si persiste, cita el meta.requestId en un ticket de soporte.
400STATS_RANGE_INVALIDEl rango o la granularidad de estadísticas son inválidos.
La ventana de estadísticas es inconsistente: from posterior a to, un rango mayor al tope (1 año para day, 31 días para hour), o granularidad hour pedida fuera de los últimos 90 días.
Cómo resolverlo
Usa un range predefinido o un from/to válido, y mantén las consultas por hora dentro de 31 días y de la ventana de retención.
400DOMAIN_NOT_ALLOWEDEl dominio elegido no está disponible para tu cuenta.
El domain que pediste no es un dominio global de la plataforma ni uno de tu cuenta, o tu cuenta no tiene un dominio predeterminado configurado.
Cómo resolverlo
Llama a GET /api/v6/urlshortener/domains para ver los dominios que puedes usar, u omite domain para usar el predeterminado.
404COUNTRY_NOT_FOUNDNo existe un país con ese código.
El código enviado a GET /api/v6/tools/countries/{code} no corresponde a ningún país del catálogo. El parámetro espera un ISO 3166-1 alpha-2 de dos letras.
Cómo resolverlo
Verifica el código contra GET /api/v6/tools/countries, que devuelve el catálogo completo.
503INFRA_DB_CONNECTION_ERRORUn servicio interno estuvo momentáneamente inalcanzable.
Uno de los servicios de los que dependemos estaba temporalmente inalcanzable cuando llegó tu petición. Es un problema de nuestro lado, no de lo que enviaste.
Cómo resolverlo
Reintenta tras los segundos que indique Retry-After, idealmente con un pequeño margen aleatorio. Si persiste más de un par de minutos, revisa la página de estado o abre un ticket de soporte.
40011#infra-db-connection-error504INFRA_DB_QUERY_TIMEOUTUna consulta interna tardó demasiado y se cortó.
Una consulta interna tomó más tiempo del que permitimos antes de devolver una respuesta, así que la cortamos en vez de dejar a tu cliente esperando de forma indefinida.
Cómo resolverlo
Reintenta de inmediato: los casos aislados suelen ser transitorios. Si ves varios seguidos, abre un ticket de soporte citando el meta.requestId.
400BAD_REQUESTNo pudimos interpretar tu petición.
No pudimos interpretar tu petición. Las causas más comunes son JSON mal formado en el cuerpo, un header Content-Type que no coincide con el contenido, o una ruta con caracteres inválidos.
Cómo resolverlo
Revisa el contenido crudo que está enviando tu cliente. Validar el JSON localmente antes de la llamada suele revelar el problema de inmediato.
403FORBIDDEN403 genérico: alternativa cuando no aplica un `ACCOUNT_*`.
La petición se autenticó bien, pero no tiene permitido acceder a este recurso. Cuando la causa es un estado conocido de la organización recibes un código ACCOUNT_*; este genérico es la alternativa.
404NOT_FOUNDLa ruta que pediste no existe en esta API.
La ruta que pediste no existe en esta API. También devolvemos este código, de forma deliberadamente indistinguible de un 404 normal, para peticiones cuyo header Host no está en nuestra lista permitida, así la superficie de la API no se puede sondear adivinando nombres de host.
Cómo resolverlo
Compara la ruta contra la referencia. Atención con la barra final y con las mayúsculas: las rutas distinguen mayúsculas de minúsculas.
405METHOD_NOT_ALLOWEDLa ruta existe pero no acepta este método HTTP.
La ruta existe pero no acepta el método HTTP que usaste, por ejemplo un POST a un endpoint de solo lectura. La respuesta incluye un header Allow con los métodos válidos.
429TOO_MANY_REQUESTS429 genérico: prefiere los códigos `RATE_*` cuando estén.
429 genérico. Cuando el límite que tocaste es uno nuestro devolvemos RATE_DDOS_EXCEEDED o RATE_TPS_EXCEEDED, que traen más contexto. Ramifica sobre los específicos cuando estén presentes.
500INTERNAL_SERVER_ERRORAlgo salió mal de nuestro lado.
Algo salió mal de forma inesperada mientras procesábamos tu petición. La traza completa queda guardada contra el mismo meta.requestId que te devolvimos, así podemos investigar sin que tengas que reproducir la falla.
Cómo resolverlo
Reintenta una vez con un pequeño retroceso. Si lo sigues viendo, abre un ticket de soporte e incluye el requestId.
504GATEWAY_TIMEOUT504 genérico: un servicio del que dependemos tardó demasiado.
Un servicio del que dependemos tardó demasiado en responder. Cuando el componente lento fue la base de datos verás INFRA_DB_QUERY_TIMEOUT, que significa lo mismo con más contexto.
Cómo resolverlo
Reintenta con retroceso exponencial. Varios seguidos suelen indicar una degradación más amplia: abre un ticket de soporte con el requestId.
Cómo se estructura el código numérico
Cada error.legacyCode es un número de seis dígitos: los dos primeros identifican el dominio del error y los cuatro restantes la condición concreta. Solo aparece cuando hay puente desde la v5; los códigos nuevos de v6 lo omiten.
| Prefijo | Dominio | Cubre |
|---|---|---|
01xxxx | AUTH | API key, tokens, IP de origen, identidad. |
02xxxx | RATE | Protección por IP y cupos por endpoint. |
03xxxx | VALIDATION | Forma de la petición, JSON, parámetros, tipos. |
04xxxx | ACCOUNT | Información de la organización, estado, bloqueos. |
05xxxx | BILLING | Saldo, pagos, moneda, tasa de cambio. |
06xxxx | SMS | Errores específicos del servicio de SMS. |
07xxxx | Servicio de WhatsApp. | |
08xxxx | Servicio de correo. | |
09xxxx | CALLBLASTING | Servicio de llamadas. |
10xxxx | URL_SHORTENER | Acortador de URLs. |
11xxxx | UTILITIES | Ping y otros endpoints de diagnóstico. |
12xxxx | TOOLS | Catálogos y utilidades. |
90xxxx | INFRA | Dependencias internas y disponibilidad. |
99xxxx | INTERNAL | Excepciones no controladas. |
Los prefijos 13xxxx a 89xxxx quedan reservados para servicios futuros, para no renumerar.