xYago APIv1

Errores

Los errores usan códigos HTTP estándar y siempre el mismo cuerpo JSON. Tu código debe decidir por error.code, que es estable; message es orientativo (en inglés) y puede cambiar.

HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_7f3a9c2e5b1d4f60

{
  "error": {
    "code": "external_id_already_exists",
    "message": "external_id is already assigned to another employee of the company."
  }
}

Todos los códigos

Cada endpoint documenta en la referencia qué códigos puede devolver. Podemos añadir códigos nuevos en v1 (siempre con un status HTTP coherente): trata un código desconocido según su status.

HTTPCódigoSignificado y qué hacer
400invalid_cursorEl cursor no es válido (manipulado o de otro listado). Repite la consulta sin cursor.
401invalid_api_keyFalta la API key o no es válida, está revocada o ha caducado.
403api_disabledEl producto (areas, employees...) no está habilitado en el panel para el entorno de la API key (live o test).
403endpoint_disabledEl administrador desactivó este endpoint concreto en el panel.
403insufficient_scopeLa API key no tiene el scope que exige el endpoint (p. ej. employees:write).
403ip_not_allowedLa IP de origen no está en la lista de IPs permitidas del producto.
403new_recipients_pausedxYago pausó los envíos del remitente a destinatarios nuevos (demasiados teléfonos sin xYago). Los destinatarios que ya recibieron mensajes siguen funcionando. Contacta con xYago.
403verify_pausedxYago pausó Verify para el remitente (demasiados teléfonos sin xYago). Las verificaciones ya iniciadas se pueden seguir comprobando. Contacta con xYago.
404not_foundEl recurso no existe o pertenece a otra empresa (nunca se distingue).
404sender_not_foundEl sender_id no es un remitente de tu cuenta.
404template_not_foundEl remitente no tiene una plantilla con ese nombre.
404recipient_not_on_xyagoPOST /verify/start: el teléfono no usa xYago. No se envió nada ni se reintentará: envía el código por tu otro canal (p. ej. SMS).
409area_already_existsYa existe un área con ese nombre bajo el mismo padre.
409external_id_already_existsEl external_id ya está asignado a otro empleado de la empresa.
409external_id_in_progressOtra petición está creando ahora mismo un empleado con ese external_id. Reintenta en unos segundos (y consulta antes por external_id).
409employee_already_existsYa hay un empleado con ese phone_number en la empresa.
409email_already_registeredEl email ya lo usa otro empleado.
409document_number_already_existsEl document_number ya lo usa otro empleado de la empresa.
409vacation_already_decidedLa solicitud ya estaba aprobada o rechazada.
409vacation_overlapEl empleado ya tiene vacaciones aprobadas en ese rango.
409time_entry_overlapEl tramo se solapa con otro tramo del empleado en la empresa.
409sender_not_approvedEl remitente aún no está aprobado por xYago (en live solo envían remitentes aprobados).
409sender_suspendedxYago suspendió el remitente (o la cuenta). Contacta con xYago.
409template_not_approvedLa plantilla no está aprobada (en sandbox también vale una en draft).
409template_pausedxYago pausó la plantilla (p. ej. por quejas de los usuarios). No se puede usar hasta que xYago la reactive; contacta con xYago.
409idempotency_key_reusedYa usaste esa Idempotency-Key con otro cuerpo. Usa una clave nueva por envío distinto.
409undeliverableEl mensaje no se puede entregar a este destinatario. No reintentes.
409verification_expiredEl código caducó (10 minutos). Inicia una verificación nueva.
409max_attempts_reachedSe agotaron los 5 intentos de la verificación. Inicia una nueva.
409verification_not_pendingLa verificación ya no admite códigos: ya se verificó (un solo uso), se sustituyó por otra más reciente (canceled) o no se pudo enviar (failed).
409sandbox_number_existsEl número ya es un número de prueba confirmado.
422validation_errorEl cuerpo o los parámetros no cumplen el esquema (campo obligatorio, formato, campo desconocido...). message indica el campo.
422invalid_parent_idparent_id no corresponde a un área activa de la empresa.
422invalid_employee_dataxYago rechazó los datos del empleado. Revisa los campos.
422employee_has_no_jobSe intentó cambiar el puesto de un empleado sin puesto en la empresa.
422invalid_employee_idemployee_id no corresponde a un empleado de la empresa.
422invalid_vacationxYago rechazó la solicitud de vacaciones.
422vacation_type_not_configuredLa empresa no tiene configurado el tipo de ausencia de vacaciones en xYago.
422vacation_requires_documentLa empresa exige un documento de soporte para las vacaciones; no se pueden solicitar por la API.
422invalid_date_rangeRango from..to no válido: from posterior a to o más de 31 días.
422invalid_time_rangeEl tramo termina en el futuro.
422invalid_time_entryxYago rechazó el tramo.
422invalid_phoneto no es un teléfono E.164 válido (al menos 10 dígitos).
422template_variables_mismatchEl número de variables no coincide con el de la plantilla (variables_count).
422invalid_variablesUna variable supera 256 caracteres o contiene un enlace.
422invalid_button_variablesFalta el valor de button_variables de un botón de enlace con variable, sobra uno (el botón no tiene variable) o no es válido (texto, máx. 200 caracteres).
422sandbox_recipient_not_allowedCon una clave xy_test_ solo se envía a los números de prueba confirmados en el panel.
422invalid_messagexYago rechazó el contenido del mensaje.
429rate_limitedSe superó el límite de peticiones por minuto de la API key o, en POST /messages, un tope de envío del remitente (mensajes por minuto, por destinatario y día, destinatarios nuevos por día) o, en Verify, un tope de códigos (espera entre códigos, por teléfono, por remitente) o de códigos erróneos por hora. Espera los segundos de Retry-After.
500internal_errorError inesperado de xYago. Reintenta con backoff; si persiste, contacta a soporte con el X-Request-Id.
502upstream_errorUn servicio interno de xYago falló o no respondió a tiempo. Reintenta con backoff (en las escrituras, comprueba antes si ya se aplicaron).
503limits_unavailableLos límites de envío no se pueden comprobar ahora mismo; por seguridad no se envía. Reintenta con backoff y la misma Idempotency-Key.
503messaging_not_configuredLa mensajería no está disponible temporalmente. Contacta con soporte.
503import_queue_unavailableNo se pudo encolar la importación. Reintenta más tarde.

Qué reintentar

Status¿Reintentar?
400, 401, 403, 404, 409, 422No: corrige la petición o la configuración. Excepción: 409 external_id_in_progress (reintenta en unos segundos).
429Sí, después de los segundos de Retry-After.
500, 502, 503, errores de red / timeoutSí, con backoff exponencial (p. ej. 1 s, 2 s, 4 s... máximo 5 intentos). En escrituras, comprueba antes si ya se aplicaron (ver idempotencia).

Errores de validación

422 validation_error indica qué campo falla en message, con el formato campo: motivo (varios separados por ; ). Los campos desconocidos también se rechazan: por ejemplo enviar company_id en un alta devuelve 422, porque la empresa sale de la API key.

{
  "error": {
    "code": "validation_error",
    "message": "phone_number: String should match pattern '^\\+[1-9][0-9]{6,14}$'; company_id: Extra inputs are not permitted"
  }
}

Cuando contactes con soporte

Incluye el X-Request-Id de la respuesta, el método y la ruta, la hora (UTC) y el entorno (live/test). Nunca envíes la API key.