La API de Calendar muestra dos niveles de información de errores:
- Códigos de error de HTTP y mensajes en el encabezado
- Un objeto JSON en el cuerpo de la respuesta con detalles adicionales que pueden ayudarte a determinar cómo manejar el error
En el resto de esta página, se proporciona una referencia de los errores de Calendario con orientación para solucionarlos en tu app.
Implementa una retirada exponencial
La documentación de las APIs de Cloud contiene una buena explicación de la retirada exponencial y cómo usarla con las APIs de Google.
Errores y acciones sugeridas
En esta sección, se proporciona la representación completa de JSON de cada error enumerado y las acciones sugeridas que puedes realizar para solucionarlo.
400: Bad Request
Error del usuario. Esto puede significar que no se proporcionó un campo o parámetro obligatorio, que el valor proporcionado no es válido o que la combinación de campos proporcionados no es válida.
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "timeRangeEmpty",
"message": "The specified time range is empty.",
"locationType": "parameter",
"location": "timeMax",
}
],
"code": 400,
"message": "The specified time range is empty."
}
}
Acción sugerida: Dado que se trata de un error permanente, no vuelvas a intentarlo. Lee el mensaje de error y cambia la solicitud según corresponda.
401: Credenciales no válidas
El encabezado de autorización no es válido. El token de acceso que estás usando está vencido o no es válido.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization",
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Acciones sugeridas:
- Obtén un token de acceso nuevo con el token de actualización de larga duración.
- Si esto falla, dirige al usuario a través del flujo de OAuth, como se describe en Autoriza solicitudes con OAuth 2.0.
- Si ves esto en una cuenta de servicio, verifica si completaste todos los pasos de forma correcta en la página de la cuenta de servicio.
403: Se superó el límite de frecuencia de usuarios
Se alcanzó uno de los límites de Play Console.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
Acciones sugeridas:
- Asegúrate de que tu app siga las prácticas recomendadas de la administración de cuotas.
- Aumenta la cuota por usuario en el proyecto de Play Console.
- Si un usuario realiza muchas solicitudes en nombre de muchos usuarios de una cuenta de Google Workspace, considera usar una cuenta de servicio con delegación de todo el dominio y configurar el parámetro
quotaUser
. - Usa la retirada exponencial.
403: Límite de tasa excedido
El usuario alcanzó la tasa máxima de solicitudes por calendario o por usuario autenticado de la API de Calendario de Google.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 403,
"message": "Rate Limit Exceeded"
}
}
Acción sugerida: Los errores rateLimitExceeded
pueden mostrar códigos de error 403 o 429. Por el momento, son similares en cuanto a sus funciones y se deben responder de la misma manera mediante una retirada exponencial.
Además, asegúrate de que tu app siga las prácticas recomendadas de la administración de cuotas.
403: Se excedieron los límites de uso del Calendario
El usuario alcanzó uno de los límites del Calendario de Google establecidos para proteger a los usuarios y la infraestructura de Google de comportamientos abusivos.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"message": "Calendar usage limits exceeded.",
"reason": "quotaExceeded"
}
],
"code": 403,
"message": "Calendar usage limits exceeded."
}
}
Acciones sugeridas:
- Obtén más información sobre los límites de uso de Calendario en la ayuda para administradores de Google Workspace.
403: Prohibido para organización sin organización
La solicitud de actualización del evento intenta establecer una de las propiedades del evento compartida
en una copia que no pertenece al organizador. Solo el organizador puede configurar las propiedades compartidas (por ejemplo,
guestsCanInviteOthers
, guestsCanModify
o guestsCanSeeOtherGuests
).
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "forbiddenForNonOrganizer",
"message": "Shared properties can only be changed by the organizer of the event."
}
],
"code": 403,
"message": "Shared properties can only be changed by the organizer of the event."
}
}
Acciones sugeridas:
- Si usas Events: insert, Events: import o Events: update y tu solicitud no incluye ninguna propiedad compartida, esto equivale a intentar establecerlas en sus valores predeterminados. En su lugar, considera usar Events: patch.
- Si tu solicitud tiene propiedades compartidas, asegúrate de intentar cambiar estas propiedades solo si estás actualizando la copia del organizador.
404: No encontrado
No se encontró el recurso especificado. Esto puede suceder en varios casos. Estos son algunos ejemplos:
- Cuando el recurso solicitado (con el ID proporcionado) nunca existió
cuando se accede a un calendario al que el usuario no puede acceder
{ "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "No encontrado" } ], "code": 404, "message": "No se encontró" } }
Acción sugerida: Usa la retirada exponencial.
409: El identificador solicitado ya existe
Ya existe una instancia con este ID en el almacenamiento.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "duplicate",
"message": "The requested identifier already exists."
}
],
"code": 409,
"message": "The requested identifier already exists."
}
}
Acción sugerida: Genera un ID nuevo si deseas crear una instancia nueva. De lo contrario, usa la llamada al método update.
410: No disponible
Los parámetros syncToken
o updatedMin
ya no son válidos. Este error también puede ocurrir si una solicitud intenta borrar un evento que ya se borró.
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "fullSyncRequired",
"message": "Sync token is no longer valid, a full sync is required.",
"locationType": "parameter",
"location": "syncToken",
}
],
"code": 410,
"message": "Sync token is no longer valid, a full sync is required."
}
}
o
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "updatedMinTooLongAgo",
"message": "The requested minimum modification time lies too far in the past.",
"locationType": "parameter",
"location": "updatedMin",
}
],
"code": 410,
"message": "The requested minimum modification time lies too far in the past."
}
}
o
{
"error": {
"errors": [
{
"domain": "global",
"reason": "deleted",
"message": "Resource has been deleted"
}
],
"code": 410,
"message": "Resource has been deleted"
}
}
Acción sugerida: Para los parámetros syncToken
o updatedMin
, limpia el almacén y vuelve a sincronizar. Para obtener más detalles, consulta Cómo sincronizar recursos de manera eficiente.
En el caso de los eventos ya eliminados, no es necesario realizar ninguna otra acción.
412: Precondition Failed (error de condición previa)
La ETag proporcionada en el encabezado If-match ya no corresponde a la ETag actual del recurso.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conditionNotMet",
"message": "Precondition Failed",
"locationType": "header",
"location": "If-Match",
}
],
"code": 412,
"message": "Precondition Failed"
}
}
Acción sugerida: Vuelve a recuperar la entidad y aplicar los cambios de nuevo. Para obtener más detalles, consulta Cómo obtener versiones específicas de los recursos.
429: Demasiadas solicitudes
Se produce un error rateLimitExceeded
cuando el usuario envía demasiadas solicitudes en un período determinado.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 429,
"message": "Rate Limit Exceeded"
}
}
Acción sugerida: Los errores rateLimitExceeded
pueden mostrar códigos de error 403 o 429. Por el momento, son similares en cuanto a sus funciones y se deben responder de la misma manera mediante una retirada exponencial.
Además, asegúrate de que tu app siga las prácticas recomendadas de la administración de cuotas.
500: Error de backend
Se produjo un error inesperado cuando se procesaba la solicitud.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error",
}
],
"code": 500,
"message": "Backend Error"
}
}
Acción sugerida: Usa la retirada exponencial.