Referencia de la API · v1
Entrenamientos
Entrenar por API en XEYE: estimar el precio, relanzar una lista, sondear el estado hasta completed y elegir el modelo de embedding.
Cómo funciona un entrenamiento
Entrenar calcula los embeddings de todos los elementos de la lista (y, si la lista lo permite, genera descripciones con IA para los que no las tienen) y deja ese modelo en uso para la búsqueda. Lo lanzas tú: las ediciones solo dejan un entrenamiento pendiente por lista. Consume crédito; la estimación te dice cuánto antes de lanzar.
Estados
| Estado | Significado |
|---|---|
| pending | Hay cambios sin entrenar; esperando a que lo lances. |
| queued | Lanzado, en la cola (queue_position = 1 es el siguiente). |
| initialized | Entregado al worker; arrancando. |
| optimizing | Generando descripciones con IA (si procede). |
| training | Calculando embeddings. |
| completed | Terminado: el modelo está en uso (in_use) y la búsqueda ya lo sirve. |
| failed | Falló o se estancó; error dice por qué. El crédito se devuelve y la lista sigue pendiente. |
Endpoints
Estimar el precio
https://api.xeye.es/v1/lists/{listId}/trainings/estimateÁmbito: trainings:readPrecio de lanzar ahora: fijo más el enriquecimiento de los elementos sin descripción cacheada; sufficient indica si el saldo alcanza.
| Campo | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| listId | ruta | integer | sí | Id de la lista. |
| regenerate_descriptions | query | boolean | no | Regenerar las descripciones con IA de todos los elementos aunque estén cacheadas (más caro). Por defecto false. |
| no_descriptions | query | boolean | no | Entrenar sin descripciones con IA; gana a regenerate_descriptions y es lo más barato. Por defecto false. |
Petición
curl -X GET https://api.xeye.es/v1/lists/42/trainings/estimate \
-H "X-API-Key: $XEYE_API_KEY"Respuesta
{
"descriptions_to_generate": 250,
"fixed": 0.3,
"enrichment": 1.325,
"total": 1.625,
"balance": 5.0,
"sufficient": true
}Reentrenar la lista
https://api.xeye.es/v1/lists/{listId}/trainingsÁmbito: trainings:writeEncola el entrenamiento de la lista (reutiliza el pendiente o crea uno) y cobra su precio. La respuesta trae el run tal como queda; sondea GET /trainings/{id} hasta completed o failed.
| Campo | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| listId | ruta | integer | sí | Id de la lista. |
| embedding_model | cuerpo | string | no | Uno de GET /trainings/embedding-models; ausente = el por defecto. |
| regenerate_descriptions | cuerpo | boolean | no | Regenerar las descripciones con IA de todos los elementos aunque estén cacheadas (más caro). Por defecto false. |
| no_descriptions | cuerpo | boolean | no | Entrenar sin descripciones con IA; gana a regenerate_descriptions y es lo más barato. Por defecto false. |
Petición
curl -X POST https://api.xeye.es/v1/lists/42/trainings \
-H "X-API-Key: $XEYE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"no_descriptions": false
}'Respuesta
{
"id": 310,
"list_id": 42,
"status": "queued",
"embedding_model": "intfloat/multilingual-e5-small",
"element_count": 250,
"described_count": null,
"in_use": false,
"has_embeddings": false,
"usable": false,
"queue_position": 1,
"error": null,
"cost": { "fixed": 0.3, "enrichment": 1.325, "total": 1.625 },
"time": null,
"last_heartbeat_at": null,
"created_at": "2026-10-14T09:20:00Z",
"updated_at": "2026-10-14T09:20:00Z"
}Estado de un entrenamiento
https://api.xeye.es/v1/trainings/{id}Ámbito: trainings:readEstado de un entrenamiento. Es el endpoint de sondeo: cada pocos segundos basta.
| Campo | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| id | ruta | integer | sí | Id del entrenamiento. |
Petición
curl -X GET https://api.xeye.es/v1/trainings/310 \
-H "X-API-Key: $XEYE_API_KEY"Respuesta
{
"id": 310,
"list_id": 42,
"status": "completed",
"embedding_model": "intfloat/multilingual-e5-small",
"element_count": 250,
"described_count": 250,
"in_use": true,
"has_embeddings": true,
"usable": true,
"queue_position": null,
"error": null,
"cost": { "fixed": 0.3, "enrichment": 1.325, "total": 1.625 },
"time": { "optimizing_seconds": 12, "training_seconds": 95, "total_seconds": 107 },
"last_heartbeat_at": null,
"created_at": "2026-10-14T09:20:00Z",
"updated_at": "2026-10-14T09:20:00Z"
}Historial de entrenamientos
https://api.xeye.es/v1/lists/{listId}/trainingsÁmbito: trainings:readHistorial de la lista, los más recientes primero.
| Campo | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| listId | ruta | integer | sí | Id de la lista. |
| offset | query | integer | no | Primer elemento de la página, desde 0. |
| limit | query | integer | no | Tamaño de página, de 1 a 200 (50 por defecto). |
Petición
curl -X GET https://api.xeye.es/v1/lists/42/trainings \
-H "X-API-Key: $XEYE_API_KEY"Respuesta
{
"items": [ {
"id": 310,
"list_id": 42,
"status": "queued",
"embedding_model": "intfloat/multilingual-e5-small",
"element_count": 250,
"described_count": null,
"in_use": false,
"has_embeddings": false,
"usable": false,
"queue_position": 1,
"error": null,
"cost": { "fixed": 0.3, "enrichment": 1.325, "total": 1.625 },
"time": null,
"last_heartbeat_at": null,
"created_at": "2026-10-14T09:20:00Z",
"updated_at": "2026-10-14T09:20:00Z"
} ],
"total": 1,
"offset": 0,
"limit": 50
}Lanzar un entrenamiento pendiente
https://api.xeye.es/v1/trainings/{id}/launchÁmbito: trainings:writeLanza un entrenamiento concreto en estado pending (equivale a relanzar la lista cuando ya conoces su id).
| Campo | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
| id | ruta | integer | sí | Id del entrenamiento. |
| embedding_model | cuerpo | string | no | Uno de GET /trainings/embedding-models; ausente = el por defecto. |
| regenerate_descriptions | cuerpo | boolean | no | Regenerar las descripciones con IA de todos los elementos aunque estén cacheadas (más caro). Por defecto false. |
| no_descriptions | cuerpo | boolean | no | Entrenar sin descripciones con IA; gana a regenerate_descriptions y es lo más barato. Por defecto false. |
Petición
curl -X POST https://api.xeye.es/v1/trainings/310/launch \
-H "X-API-Key: $XEYE_API_KEY"Respuesta
{
"id": 310,
"list_id": 42,
"status": "queued",
"embedding_model": "intfloat/multilingual-e5-small",
"element_count": 250,
"described_count": null,
"in_use": false,
"has_embeddings": false,
"usable": false,
"queue_position": 1,
"error": null,
"cost": { "fixed": 0.3, "enrichment": 1.325, "total": 1.625 },
"time": null,
"last_heartbeat_at": null,
"created_at": "2026-10-14T09:20:00Z",
"updated_at": "2026-10-14T09:20:00Z"
}Modelos de embedding
https://api.xeye.es/v1/trainings/embedding-modelsÁmbito: trainings:readModelos de embedding admitidos en embedding_model. El primero es el que se usa si no indicas ninguno.
Petición
curl -X GET https://api.xeye.es/v1/trainings/embedding-models \
-H "X-API-Key: $XEYE_API_KEY"Respuesta
{
"models": ["intfloat/multilingual-e5-small", "intfloat/multilingual-e5-base"],
"default_model": "intfloat/multilingual-e5-small"
}