Referencia
Errores
Cuando una llamada falla, la respuesta dice qué salió mal y qué hacer. Aquí está cada código de error y cómo manejarlo.
Cómo se ve un error
Una llamada que falla responde con un código de estado HTTP y un objeto error en lugar de data. Este viene de empezar una recopilación cuando ya se acabaron los créditos de hoy:
HTTP/2 429
retry-after: 3600
x-request-id: 7c1e0b54-9a2f-4d3e-8f61-2b5a9c0d4e17{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "You reached your daily limit of 250 credits. Retry after midnight UTC. Buying credits does not raise this limit.",
"messageKey": "serverErrors.quotaDay",
"params": { "limit": 250 },
"details": {
"scope": "day",
"limit": 250,
"resetAt": "2026-09-25T00:00:00.000Z",
"retryAfterSecs": 3600
}
}
}code: qué salió mal, como uno de los códigos de abajo. Los códigos no cambian, pero los mensajes sí pueden cambiar, así que en tu programa revisacode, nomessage.message: el problema y qué hacer, en inglés. Guárdalo en tus logs o muéstraselo a una persona.messageKeyyparams: una clave fija y los valores que la completan, para que una app pueda mostrar el mensaje en su propio idioma. La mayoría de los errores los traen.details: más sobre este error, cuando hay algo más que decir. En una solicitud incorrecta, lista los campos que fallaron. En un límite, dice cuál y cuándo se reinicia.
El SDK lanza los mismos campos como un GmapsError, con status, requestId y retryAfter de más. Por MCP, una llamada a una herramienta que falla vuelve con isError: true y este objeto como texto.
Todos los códigos de error
Cada código viene siempre con el mismo estado HTTP. La columna Origen dice dónde está el problema: en tu solicitud, en los límites de tu plan, de nuestro lado o en Google Maps.
| Código | Estado | Origen | Qué pasó | Qué hacer |
|---|---|---|---|---|
VALIDATION_ERROR | 400 | Tú | Falta algo en la solicitud o algo está mal. Cuando es un campo, details lista cada uno con su ruta. | Corrige la solicitud. Si la envías igual, vuelve a fallar. |
UNAUTHORIZED | 401 | Tú | La llamada llegó sin una clave de API, o no con el formato Authorization: Bearer. | Envía tu clave como Authorization: Bearer gm_…. Consulta Autenticación. |
INVALID_TOKEN | 401 | Tú | La clave es incorrecta, está revocada o venció, o es un token de inicio de sesión de la consola y no una clave de API. | Usa una clave activa o crea una nueva en Claves de API. |
PLAN_GATE | 402 | Tu plan | Tu plan no incluye esta función. details.gate dice cuál es, y details.upgradeTo dice qué plan la incluye. | Cambia de plan en Plan y vuelve a intentarlo. Esperar no ayuda. |
AUP_REQUIRED | 403 | Tú | Para usar correos electrónicos debes aceptar la versión actual de la política de uso aceptable, y tu cuenta todavía no la ha aceptado. details.version es la versión que falta aceptar. | Lee la política, acéptala en la consola, en Cuenta, y vuelve a intentarlo. |
FORBIDDEN | 403 | Tú | Tu cuenta no puede hacer esto: está suspendida o pediste eliminarla. | El mensaje dice cuál es el caso. Para detener una eliminación, inicia sesión en la consola y cancélala. En los demás casos, escribe a soporte. |
NOT_FOUND | 404 | Tú | No existe esa ruta o ese id, o pertenece a otra cuenta. | Revisa el método, la URL y el id. |
PLACE_NOT_FOUND | 404 | Tú | Todavía no guardamos este lugar, o lo eliminamos después de una solicitud de eliminación. | Busca en su zona para recopilarlo y vuelve a consultarlo. Un lugar eliminado no vuelve. Consulta Lugares. |
COLLECTION_NOT_FOUND | 404 | Tú | Tu cuenta no tiene ninguna recopilación con este id. | Revisa el id. GET /v1/collections lista las tuyas. |
EXPORT_NOT_FOUND | 404 | Tú | El enlace de la exportación tiene más de 24 horas, se borraron los lugares de su recopilación, o el enlace es incorrecto. | Crea otra exportación. Si la recopilación tiene más de 30 días, vuelve a ejecutarla antes. |
CONFLICT | 409 | Tú | La llamada choca con la situación actual, como cancelar una recopilación que ya terminó o crear una clave por encima del límite de tu plan. | El mensaje dice qué lo impide. Resuélvelo y vuelve a intentarlo. |
PAYLOAD_TOO_LARGE | 413 | Tú | El cuerpo de la solicitud es más grande de lo que aceptamos. params.limit es el máximo, en bytes. | Envía un cuerpo más pequeño. |
GEO_UNRESOLVED | 422 | Tú | No pudimos encontrar la ciudad que indicaste, o hay más de una ciudad con ese nombre. Por nombre, solo funcionan las ciudades de Brasil. | Agrega el estado, como Curitiba, PR, o elige una de details.candidates. Fuera de Brasil, envía lat, lng y radiusM, o un bbox. |
UPSTREAM_BLOCKED | 422 | Google Maps | Todavía no enviamos este código. Está reservado para cuando Google Maps rechace nuestras búsquedas. Hoy, una recopilación cuyas búsquedas fallan termina con ENGINE_UNAVAILABLE. | Nada, por ahora. Si de todos modos lo manejas, vuelve a intentarlo más tarde con una zona más pequeña. |
RATE_LIMIT_EXCEEDED | 429 | Tu plan | Tu cuenta hizo más llamadas en este minuto de las que permite tu plan. | Espera los segundos indicados en retry-after y vuelve a intentarlo. details.limit es cuántas llamadas permite el límite, y details.window es en cuánto tiempo las cuenta: minute, o hour para el formulario de eliminación. |
QUOTA_EXCEEDED | 429 | Tu plan | Te quedaste sin créditos por hoy o por este mes, o ya tienes en marcha todas las recopilaciones que permite tu plan. details.scope dice cuál es el caso. | Depende de details.scope. Mira la sección siguiente. |
INTERNAL_ERROR | 500 | Nosotros | Algo falló de nuestro lado. | Vuelve a intentarlo. Si sigue fallando, escribe a soporte con el x-request-id. |
ENGINE_UNAVAILABLE | 503 | Nosotros | No pudimos ejecutar las búsquedas de una recopilación, así que no encontró nada y no cobró nada. Lo ves en el error de la recopilación, no como una llamada fallida. | Empieza la recopilación de nuevo en unos minutos. Las búsquedas siguen respondiendo con los lugares que ya guardamos. |
SERVICE_UNAVAILABLE | 503 | Nosotros | Un servicio del que dependemos, como nuestra base de datos, no respondió. | Vuelve a intentarlo en unos segundos. Si sigue fallando, escribe a soporte. |
BILLING_UNAVAILABLE | 503 | Nosotros | No pudimos comunicarnos con nuestro proveedor de pagos, o los pagos todavía no están configurados. Solo la página Plan de la consola se topa con esto, nunca la API. | Inténtalo de nuevo más tarde. No se cobró nada. |
Funciones del plan y límites
Solo PLAN_GATE responde 402. Significa que tu plan no incluye la función, así que esperar no cambia la respuesta. details.upgradeTo dice cuál es el plan más barato que la incluye. Cambia en Plan y vuelve a intentarlo.
Agotar un límite responde 429, y esperar lo resuelve. RATE_LIMIT_EXCEEDED significa demasiadas llamadas en este minuto. QUOTA_EXCEEDED trata de créditos o recopilaciones, y details.scope dice cuál:
month: los créditos de este mes se acabaron, incluidos los de paquetes.details.resetAtes el día 1 del mes siguiente a medianoche UTC. Con un paquete de créditos puedes seguir de inmediato.day: llegaste al límite de hoy.details.resetAtes la próxima medianoche UTC. Un paquete no lo aumenta.concurrency: ya tienes en marcha todas las recopilaciones que permite tu plan. Vuelve a intentarlo cuando termine una. Aquí no hayresetAt.
En Límites están todos los números de cada plan.
Cuándo volver a intentarlo
- Cuando la respuesta trae un encabezado
retry-after, espera esa cantidad de segundos y envía la misma llamada otra vez.RATE_LIMIT_EXCEEDEDsiempre lo trae, yQUOTA_EXCEEDEDtambién cuando esdayomonth. El mismo número está endetails.retryAfterSecs. - Cualquier otro 4xx: corrige primero lo que señala el mensaje. Si la llamada se envía igual, casi siempre recibe la misma respuesta.
- Un 5xx es de nuestro lado. Vuelve a intentarlo después de unos segundos y espera un poco más tras cada falla. El SDK no reintenta por ti.
Cómo pedirnos ayuda
Cada respuesta, con error o sin él, trae un encabezado x-request-id. Señala esa llamada en nuestros logs. Cuando escribas a soporte, envíalo junto con lo que enviaste y cuándo.
También puedes enviar tu propio x-request-id, como el id que ya usan tus logs, para que un solo id siga la llamada desde tus logs hasta los nuestros. Usa hasta 64 letras, dígitos, puntos, guiones y guiones bajos, y nada más. Si no, generamos uno nuevo.
Nunca nos envíes tu clave de API. No la necesitamos para encontrar la llamada.