Primeros pasos
La API de xYago conecta tu ERP, tu sistema de nómina o cualquier otro sistema con xYago: sincroniza áreas, empleados, vacaciones y registro de horas, y recibe un webhook firmado cada vez que algo cambia.
URL base (producción y sandbox):
https://api.xyago.com/v1
Todo es JSON en UTF-8, las fechas van en ISO 8601 UTC (2026-03-02T14:05:00Z)
y los teléfonos en formato E.164 (+573005550123). La referencia completa de cada
endpoint está en la referencia de la API; también puedes
descargar el OpenAPI o la
colección de Postman.
Tu primera petición en 5 minutos
- Habilita la API en el sandbox. Un administrador de tu empresa entra en el panel de xYago → API Developer, elige el entorno Test y activa los productos que vas a usar (por ejemplo Áreas y Empleados).
- Crea una API key de sandbox. En Credenciales → Nueva
credencial: ponle un nombre (p. ej. «Siesa pruebas») y marca los scopes que necesitas
(
areas:read,employees:read...). La clave completa (xy_test_...) se muestra una sola vez: guárdala en tu gestor de secretos. - Haz la primera llamada. El sandbox devuelve datos de ejemplo fijos, así que puedes probar sin miedo.
curl
export XYAGO_API_KEY="xy_test_EXAMPLE_replace-with-your-sandbox-key"
curl "https://api.xyago.com/v1/areas?limit=1" \
-H "Authorization: Bearer $XYAGO_API_KEY"
Python
import os
import requests # pip install requests
response = requests.get(
"https://api.xyago.com/v1/areas",
params={"limit": 1},
headers={"Authorization": f"Bearer {os.environ['XYAGO_API_KEY']}"},
timeout=30,
)
response.raise_for_status()
print(response.json())
JavaScript
// Node.js 18+ (fetch nativo). Guardar como first-call.mjs
const response = await fetch("https://api.xyago.com/v1/areas?limit=1", {
headers: { Authorization: `Bearer ${process.env.XYAGO_API_KEY}` },
});
const data = await response.json();
if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);
C#
using System.Net.Http.Headers;
using var http = new HttpClient { BaseAddress = new Uri("https://api.xyago.com/v1/") };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("XYAGO_API_KEY"));
var response = await http.GetAsync("areas?limit=1");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
Respuesta (200 OK):
{
"results": [
{
"id": "51f510d8-6482-5355-b5c3-5f511c06d851",
"public_id": "AR-0002",
"name": "Administracion",
"parent_id": null,
"status": "active",
"minimum_employees": 1,
"maximum_employees": 4,
"skills": [],
"created_at": "2026-01-17T09:00:00Z",
"updated_at": "2026-01-17T09:00:00Z"
}
],
"next_cursor": "eyJ0IjogIjIwMjYtMDEtMTdUMDk6MDA6MDAiLCAiaWQiOiAiNTFmNTEwZDgtNjQ4Mi01MzU1LWI1YzMtNWY1MTFjMDZkODUxIn0"
}
Si recibes 401 invalid_api_key, revisa la cabecera; si es
403 api_disabled, el producto no está activo en el entorno Test del panel.
Consulta la tabla de errores.
Qué puedes hacer
| Producto | Endpoints | Scopes |
|---|---|---|
| Áreas | GET /areas, GET /areas/{id}, POST /areas | areas:read, areas:write |
| Empleados | GET /employees, GET /employees/{id}, POST /employees, PATCH /employees/{id}, POST /employees/{id}/deactivate, POST /employees/import, GET /employees/import/{job_id} | employees:read, employees:write |
| Vacaciones | GET /vacations, POST /vacations, PATCH /vacations/{id}/approve, PATCH /vacations/{id}/reject, GET /employees/{id}/vacation-balance | vacations:read, vacations:write |
| Registro de horas | GET /time-entries, POST /time-entries | time:read, time:write |
Y webhooks para enterarte de los cambios sin consultar continuamente.
Integración típica con un ERP (p. ej. Siesa)
- Carga inicial: importa la plantilla de empleados con
POST /employees/importusando el código de empleado del ERP comoexternal_id. - Altas y cambios: cuando el ERP crea o modifica un empleado, llama a
POST /employeesoPATCH /employees/{id}(busca antes el id de xYago conGET /employees?external_id=...). Ver idempotencia. - Retiros:
POST /employees/{id}/deactivate. - Nómina: lee horas con
GET /time-entriesy vacaciones conGET /vacations, o suscríbete atime_entry.createdyvacation.approved.
Pasar a producción
- En el panel, entorno Live: activa los mismos productos, configura el límite de peticiones y, recomendado, las IPs permitidas de tu servidor.
- Crea una credencial
xy_live_...con los scopes mínimos necesarios. - Registra tus webhooks en el entorno Live y guarda su secreto de firma.
- Cambia solo la API key: la URL base es la misma.
Nunca incluyas una API key en el código fuente, en una app móvil o en el navegador: la API está pensada para llamadas servidor a servidor.