Ultralytics YOLO27:

Referencia de la REST API#

Ultralytics Platform proporciona una REST API para acceder mediante programación a conjuntos de datos, imágenes, proyectos, modelos, entrenamientos, exportaciones y despliegues.

Documentación interactiva de la API de Ultralytics Platform

Inicio rápido
# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/datasets/YOUR_USERNAME

Cada endpoint que aparece a continuación incluye su llamada client.<resource>.<method>(...) del SDK ultralytics-platform, que se genera a partir del mismo contrato que esta referencia.

Referencia interactiva de la API

Esta página ofrece un recorrido guiado por la API. La referencia generada y siempre actualizada está en platform.ultralytics.com/api/docs, y el documento OpenAPI 3.2 legible por máquinas que la sustenta se publica en platform.ultralytics.com/openapi.json. Ambos se generan directamente a partir del contrato del servidor, por lo que tienen prioridad cuando esta página y el esquema no coinciden.

Descripción general de la API#

La API se organiza en torno a los recursos principales de Platform:

graph LR
    A[API Key]:::start --> B[Datasets]:::proc
    A --> C[Projects]:::proc
    B -->|images| G[Images]:::proc
    C -->|contains| D[Models]:::proc
    B -->|train on| D
    D -->|deploy| E[Deployments]:::proc
    D -->|export| F[Exports]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
RecursoDescripciónOperaciones clave
Conjuntos de datosColecciones de imágenes etiquetadasCRUD, ingesta, versiones, clases, divisiones, clonación
ImágenesImágenes individuales y etiquetasLeer, anotar, mover de división, eliminar, anotar automáticamente
ProyectosEspacios de trabajo de modelosCRUD, clonación
ModelosCheckpoints entrenadosCRUD, predecir, descargar, clonar, estado del entrenamiento
EntrenamientoTrabajos de entrenamiento en la GPU de la nubeDisponibilidad de la GPU, iniciar, progreso, cancelar
ExportacionesTrabajos de conversión de formatoCrear, listar, consultar el estado, cancelar
DesplieguesEndpoints de inferencia dedicadosCrear, iniciar/detener/sustituir, predecir, métricas, registros
PapeleraRecursos eliminados de forma lógicaListar, restaurar, eliminar permanentemente
AlmacenamientoIntegraciones de almacenamiento en la nubeConectar, descubrir, explorar, desconectar
CuentaPlan, créditos, almacenamiento, perfilResumen de la cuenta, claves de API, uso del almacenamiento, búsqueda de usuarios
FacturaciónUso del plan y libro mayorResumen de uso, transacciones
ExplorarBúsqueda de contenido públicoBuscar proyectos y conjuntos de datos

Autenticación#

La mayoría de los endpoints requieren una clave de API. Los endpoints que exponen contenido público —leer un conjunto de datos, proyecto o modelo público, listar imágenes de un conjunto de datos público, ejecutar inferencia en un modelo público o buscar en Explorar— también aceptan solicitudes anónimas y simplemente devuelven más resultados cuando se proporciona una clave.

Obtener una clave de API#

  1. Ve a Settings > API Keys
  2. Haz clic en Create Key
  3. Copia la clave generada

Consulta Claves de API para obtener instrucciones detalladas.

Cabecera de autorización#

Incluye tu clave de API como token bearer:

Authorization: Bearer YOUR_API_KEY
Formato de la clave de API

Las claves de API constan del prefijo literal ul_ seguido de 40 caracteres hexadecimales, 43 caracteres en total (por ejemplo, ul_a1b2c3d4e5f6789012345678901234567890abcd). Las solicitudes con una cabecera ausente, una clave con formato incorrecto o una clave revocada devuelven 401. Mantén tu clave en secreto: no la incluyas nunca en el control de versiones ni la compartas públicamente.

Ejemplo#

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/account/summary

URL base#

Todos los endpoints de la API utilizan:

https://platform.ultralytics.com/api

Rutas de recursos#

Los recursos se identifican mediante los mismos nombres legibles que aparecen en las URL de Platform, no mediante identificadores de base de datos:

RecursoRutaEjemplo
Conjunto de datos/api/datasets/{owner}/{dataset}/api/datasets/acme-vision/warehouse
Proyecto/api/projects/{owner}/{project}/api/projects/acme-vision/inspection
Modelo/api/models/{owner}/{project}/{model}/api/models/acme-vision/inspection/v3
Despliegue/api/deployments/{owner}/{deployment}/api/deployments/acme-vision/edge-1
Imagen/api/images/{imageId}/api/images/65f1c0a2b3d4e5f601234567
  • {owner} es un nombre de usuario personal o el identificador de un espacio de trabajo de equipo: de 4 a 32 caracteres alfanuméricos en minúsculas, con guiones simples entre segmentos.
  • {dataset}, {project}, {model} y {deployment} siguen el mismo patrón en minúsculas y separado por guiones, con un máximo de 128 caracteres.
  • {imageId} y {exportId} son identificadores hexadecimales de 24 caracteres devueltos por la API.
  • Cambiar el nombre de un recurso mediante PATCH modifica simultáneamente el name visible y el nombre de la URL, y la respuesta devuelve el nombre actual de la URL para que puedas seguir utilizándolo.
Selección del espacio de trabajo

No existe ningún parámetro de consulta owner. Las rutas asociadas a un espacio de trabajo incluyen al propietario en la ruta, y los endpoints asociados a la cuenta (/api/account/summary, /api/api-keys, /api/storage, /api/billing/*, /api/trash, /api/integrations/buckets) operan en el espacio de trabajo que emitió la clave de API. Para actuar en un espacio de trabajo de equipo, utiliza una clave de API creada en ese espacio de trabajo.

Límites de uso#

La API aplica límites de ventana deslizante por clave de API. Cada ruta pertenece a una categoría, y cada categoría tiene un contador independiente, por lo que 20 solicitudes de predicción no consumen tu límite predeterminado.

CategoríaLímiteSe aplica a
Predeterminado100 solicitudes/minTodas las rutas no indicadas a continuación
Entrenamiento10 solicitudes/minPOST /api/training/start
Cargar10 solicitudes/minURL de carga firmadas, finalización de cargas e ingesta de conjuntos de datos
Predict20 solicitudes/minInferencia de modelos y despliegues mediante las rutas de la API de Platform
Exportar20 solicitudes/minRutas de exportación de modelos y rutas de exportación/versión de conjuntos de datos, excepto la lectura de una exportación de conjuntos de datos (GET), que utiliza el límite predeterminado
Download30 solicitudes/minDescargas de archivos de modelos
Mutación10 solicitudes/minListado de claves de API, conexión o descubrimiento de almacenamiento en la nube y acciones PATCH de despliegues
Hidratación20 solicitudes/minPOST /api/datasets/{owner}/{dataset}/images (recuperación de un conjunto seleccionado de imágenes) y GET /api/images/{imageId}/similar
Clustering10 solicitudes/minGET /api/datasets/{owner}/{dataset}/images/clustering y GET /api/models/{owner}/{project}/{model}/similar-images

Las rutas de Platform exclusivas del navegador, como el proceso de pago de facturación y la gestión de equipos, tienen sus propios límites, que no se aplican al tráfico con claves de API.

Cuando se aplica una limitación, la API devuelve 429 junto con cabeceras y un cuerpo JSON:

Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z
{
    "error": "Rate limit exceeded",
    "retryAfter": 12,
    "resetAt": "2026-02-21T12:34:56.000Z"
}

Endpoints dedicados (ilimitados)#

Los endpoints dedicados no están sujetos a los límites de frecuencia de las claves de API de Platform cuando llamas directamente al serviceUrl propio del despliegue (por ejemplo, https://predict-abc123.run.app/predict). En ese caso, el rendimiento depende de la configuración del servicio desplegado.

Gestión de los límites de frecuencia

Cuando recibas un 429, espera Retry-After segundos (o hasta X-RateLimit-Reset) antes de volver a intentarlo. Consulta las preguntas frecuentes sobre los límites de frecuencia para obtener una implementación de retroceso exponencial.

Formato de respuesta#

Respuestas correctas#

Las respuestas son objetos JSON con campos específicos de cada recurso. No existe ningún contenedor genérico: los endpoints de listado devuelven una colección con nombre junto con recuentos, y las mutaciones devuelven los identificadores modificados.

{
    "datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
    "total": 1,
    "region": "us"
}

Las respuestas que contienen datos también incluyen region (us, eu o ap), la región de almacenamiento de ese espacio de trabajo.

Respuestas de error#

Cada respuesta de error es un objeto JSON con un mensaje error:

{
    "error": "Dataset not found"
}
Estado HTTPSignificado
200Correcto
201Creado
202Aceptado; el trabajo continúa de forma asíncrona
400Ruta, consulta o cuerpo de solicitud no válidos
401Falta autenticación o esta no es válida
402Créditos insuficientes (entrenamiento)
403Permisos, plan o cuota insuficientes
404Recurso no encontrado
409Conflicto con el estado actual (nombre duplicado, trabajo en curso)
413La entrada de predicción es demasiado grande
422Las clases del modelo no coinciden con el conjunto de datos (anotación automática)
429Se ha superado el límite de solicitudes
500Error del servidor
502El proveedor ascendente o la llamada al servicio han fallado
503El servicio dependiente no está disponible temporalmente

Paginación#

El estilo de paginación depende de la colección:

EstiloEndpointsParámetros
Solo límiteListas de conjuntos de datos, proyectos, modelos, exportaciones y despliegueslimit
Desplazamiento y límiteImágenes de conjuntos de datos, agrupación de imágenes y búsqueda de Exploreoffset, limit, además de hasMore en la respuesta
CursorImágenes de conjuntos de datos (conjuntos de datos grandes)cursor, includeTotal, además de nextCursor
Número de páginaPapelerapage, limit, además de totalPages
Token de página opacoRegistros del desplieguepageToken, además de nextPageToken

API de conjuntos de datos#

Crea, consulta y gestiona conjuntos de datos de imágenes etiquetadas para entrenar modelos YOLO. Consulta la documentación de conjuntos de datos.

Enumerar conjuntos de datos#

GET /api/datasets/{owner}

SDK de Python: client.datasets.list(owner)

Devuelve los conjuntos de datos públicos del propietario, además de los conjuntos de datos privados cuando tu clave puede ver ese espacio de trabajo.

Parámetros de consulta:

ParámetroTipoDescripción
limitintNúmero máximo de conjuntos de datos que se devolverán (predeterminado: 1000, máximo: 1000)
includeSamplesbooleanoIncluir vistas previas de imágenes de muestra (predeterminado: true)
includeImageUrlsbooleanoIncluir URL alternativas de imágenes de muestra a tamaño completo (predeterminado: false)
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"

Respuesta:

{
    "datasets": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "owner": "acme-vision",
            "dataset": "warehouse",
            "name": "Warehouse",
            "task": "detect",
            "visibility": "private",
            "imageCount": 1000,
            "classCount": 2,
            "classNames": ["person", "forklift"],
            "splits": { "train": 800, "val": 200, "test": 0, "labeled": 1000 },
            "annotationCount": 5400,
            "starCount": 3,
            "isStarred": false,
            "status": "ready",
            "createdAt": "2026-01-15T10:00:00Z",
            "updatedAt": "2026-01-16T08:30:00Z"
        }
    ],
    "total": 1,
    "region": "us"
}

Obtener conjunto de datos#

GET /api/datasets/{owner}/{dataset}

SDK de Python: client.datasets.retrieve(owner, dataset)

Devuelve el objeto completo del conjunto de datos bajo una clave dataset, incluidos classNames, splits, versions, source y el objeto metadata definido por el usuario.

Crear conjunto de datos#

POST /api/datasets

SDK de Python: client.datasets.create(dataset=..., name=...)

Cuerpo:

{
    "dataset": "warehouse",
    "name": "Warehouse",
    "task": "detect",
    "description": "Forklift and pedestrian safety dataset",
    "classNames": ["person", "forklift"],
    "visibility": "private",
    "metadata": { "location": "factory-1", "reviewed": true },
    "owner": "acme-vision"
}
CampoTipoObligatorioDescripción
datasetstringNombre del conjunto de datos utilizado en las URL de Platform (en minúsculas, con guiones y con un máximo de 128 caracteres)
namestringNombre para mostrar (máximo 100 caracteres)
descriptionstringNoDescripción (máximo 1000 caracteres)
taskstringNoTipo de tarea (predeterminado: detect)
classNamesmatrizNoNombres de las clases en orden de índice (máximo 25.000)
formatstringNoFormato de anotación: yolo (predeterminado), coco, raw, ndjson
visibilitystringNopublic o private
tagsmatrizNoHasta 50 etiquetas de 50 caracteres cada una
licensestringNoIdentificador de licencia del conjunto de datos
metadataobjetoNoMetadatos JSON personalizados
ownerstringNoIdentificador del espacio de trabajo del equipo; de forma predeterminada, se usa tu espacio de trabajo personal
requireExactSlugbooleanoNoDevuelve 409 cuando dataset ya está ocupado en lugar de crear un nombre con sufijo como warehouse-2 (por defecto false)

La respuesta devuelve el slug de dataset que se creó realmente, así que léeselo antes de subirlo a menos que configures requireExactSlug.

Tareas compatibles

Valores válidos de task al crear o actualizar un conjunto de datos: detect, segment, semantic, depth, classify, pose y obb. Los conjuntos de datos de profundidad no tienen clases.

Respuesta (201):

{
    "id": "65f1c0a2b3d4e5f601234567",
    "owner": "acme-vision",
    "dataset": "warehouse",
    "region": "us"
}

Actualizar conjunto de datos#

PATCH /api/datasets/{owner}/{dataset}

SDK de Python: client.datasets.update(owner, dataset)

Cuerpo (actualización parcial):

{
    "name": "Warehouse Safety",
    "description": "New description",
    "visibility": "public",
    "metadata": { "location": "factory-2", "reviewed": true }
}

Campos aceptados: name, description, visibility, metadata, tags, classNames, classColors, format, task, license, iconColor, iconLetter y starred. Envía un objeto metadata vacío ({}) para borrar los metadatos personalizados. Las claves de metadatos están limitadas a 128 caracteres y el objeto serializado, a 500.000 caracteres.

Respuesta:

{
    "success": true,
    "dataset": "warehouse-safety"
}

Cambiar el nombre modifica el nombre de la URL, así que usa el valor dataset devuelto para las solicitudes posteriores.

Eliminar conjunto de datos#

DELETE /api/datasets/{owner}/{dataset}

SDK de Python: client.datasets.delete(owner, dataset)

Mueve el conjunto de datos a la papelera, donde se puede recuperar durante 30 días.

Clonar conjunto de datos#

POST /api/datasets/{owner}/{dataset}/clone

SDK de Python: client.datasets.clone(owner, dataset)

Copia un conjunto de datos accesible, con sus imágenes y etiquetas, en tu espacio de trabajo personal o en el de un equipo.

Cuerpo opcional (todos los campos son opcionales):

{
    "dataset": "warehouse-copy",
    "name": "Warehouse Copy",
    "description": "Cloned for experimentation",
    "visibility": "private",
    "license": "CC-BY-4.0",
    "owner": "acme-vision"
}

Respuesta (201): id, owner, dataset, name, imageCount, classCount y region. Los conjuntos de datos respaldados por un origen de almacenamiento conectado devuelven 409 porque sus archivos no se copian.

Descargar una exportación de conjunto de datos#

GET /api/datasets/{owner}/{dataset}/export

SDK de Python: client.datasets.export(owner, dataset)

Devuelve una URL de descarga NDJSON firmada. Omite v para exportar el estado actual del conjunto de datos y reutilizar la exportación almacenada en caché cuando no haya cambiado nada desde que se generó.

Parámetros de consulta:

ParámetroTipoDescripción
venteroNúmero de versión guardada (indexado desde 1). Omítelo para usar el conjunto de datos actual.

Respuesta:

{
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "cached": true
}

Solicitar una versión específica devuelve downloadUrl y version en lugar de cached.

Crear versión del conjunto de datos#

POST /api/datasets/{owner}/{dataset}/export

SDK de Python: client.datasets.create_export(owner, dataset)

Crea una instantánea numerada e inmutable del conjunto de datos y almacena su exportación NDJSON. Requiere acceso de editor.

Cuerpo (opcional):

{
    "description": "Added 500 training images"
}

Respuesta:

{
    "version": 3,
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "reused": false
}

reused es true cuando el conjunto de datos no ha cambiado desde la versión anterior y se devuelve esa instantánea en su lugar.

Actualizar la descripción de la versión#

PATCH /api/datasets/{owner}/{dataset}/export

SDK de Python: client.datasets.update_export(owner, dataset, version=..., description=...)

Cuerpo:

{
    "version": 2,
    "description": "Fixed mislabeled classes"
}

Respuesta: {"ok": true}

Restaurar versión del conjunto de datos#

POST /api/datasets/{owner}/{dataset}/restore

SDK de Python: client.datasets.restore(owner, dataset, version=...)

Reconstruye las imágenes, las anotaciones y las clases a partir de una versión guardada sin copiar los datos binarios de las imágenes.

Cuerpo:

{
    "version": 2
}

Respuesta: {"version": 2, "imageCount": 1000}

Obtener estadísticas del conjunto de datos#

GET /api/datasets/{owner}/{dataset}/class-stats

SDK de Python: client.datasets.class_stats(owner, dataset)

Devuelve recuentos de anotaciones por clase, histogramas de imágenes y anotaciones, y mapas de calor. Los conjuntos de datos grandes se muestrean; en ese caso, sampleSize indica cuántas imágenes han contribuido.

Respuesta (abreviada):

{
    "classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
    "imageStats": {
        "widthHistogram": [{ "bin": 640, "count": 120, "size": 1 }],
        "heightHistogram": [{ "bin": 480, "count": 95, "size": 1 }],
        "pointsHistogram": [{ "bin": 4, "count": 200, "size": 1 }],
        "formatDistribution": { "jpg": 900, "png": 100 },
        "fileSizeHistogram": [{ "bin": 250000, "count": 300, "size": 50000 }],
        "objectsPerImageHistogram": [{ "bin": 5, "count": 210, "size": 1 }],
        "bboxWidthHistogram": [{ "bin": 120, "count": 340, "size": 20 }],
        "bboxHeightHistogram": [{ "bin": 90, "count": 300, "size": 20 }]
    },
    "locationHeatmap": {
        "bins": [
            [5, 10],
            [8, 3]
        ],
        "maxCount": 50
    },
    "dimensionHeatmap": {
        "bins": [
            [2, 5],
            [3, 1]
        ],
        "maxCount": 12,
        "minWidth": 10,
        "maxWidth": 1920,
        "minHeight": 10,
        "maxHeight": 1080
    },
    "classNames": ["person", "forklift"],
    "cached": true,
    "sampleSize": null
}

Gestionar clases#

Combinar clases (reasigna las anotaciones a una clase de destino y, después, elimina las clases de origen):

POST /api/datasets/{owner}/{dataset}/classes/merge

SDK de Python: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)

{
    "sourceClassIds": [2, 4],
    "targetClassId": 1
}

Eliminar clases (se eliminan sus anotaciones y los ID de las clases restantes disminuyen):

POST /api/datasets/{owner}/{dataset}/classes/delete

SDK de Python: client.datasets.delete_classes(owner, dataset, class_ids=...)

{
    "classIds": [2, 4]
}

Ambas operaciones devuelven success, los valores actualizados de classNames y classColors, y un resumen de los cambios realizados (mergedClassIds y targetClassId, o deletedClassIds y deletedAnnotations).

Los ID de clase son posicionales

Como los ID restantes cambian después de combinar o eliminar clases, estas operaciones no son idempotentes. Vuelve a obtener el conjunto de datos para conocer los índices de clase actuales antes de realizar otra operación de clase.

Redistribuir particiones#

POST /api/datasets/{owner}/{dataset}/splits/redistribute

SDK de Python: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)

Reasigna aleatoriamente las imágenes entre las particiones. Los tres porcentajes deben sumar 100.

{
    "train": 80,
    "val": 20,
    "test": 0
}

Respuesta: success, los recuentos resultantes de splits y modified (número de imágenes movidas).

Embeddings del conjunto de datos#

GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddings

SDK de Python: client.datasets.embeddings(owner, dataset), client.datasets.create_embeddings(owner, dataset), client.datasets.delete_embeddings(owner, dataset)

GET devuelve el resumen del análisis (analyzedAt, embeddingsCount, latestImageAt, activeJob). POST pone en cola un análisis de embeddings y devuelve 202 con un jobId. DELETE cancela el trabajo activo y devuelve el ID del trabajo cancelado o null.

Agrupación de imágenes#

GET /api/datasets/{owner}/{dataset}/images/clustering

SDK de Python: client.datasets.clustering(owner, dataset)

Devuelve la distribución 2D de UMAP de un análisis completado, paginada con offset y limit (predeterminado y máximo: 50.000). Cada entrada contiene id, umapX, umapY, split, classIds, width, height, bytes, labelCount y missing.

Enumerar modelos entrenados con un conjunto de datos#

GET /api/datasets/{owner}/{dataset}/models

SDK de Python: client.datasets.models(owner, dataset)

Respuesta:

{
    "models": [
        {
            "id": "65f1c0a2b3d4e5f601234599",
            "owner": "acme-vision",
            "project": "inspection",
            "model": "v3",
            "name": "v3",
            "status": "completed",
            "task": "detect",
            "epochs": 100,
            "bestEpoch": 87,
            "metrics": { "mAP50": 0.85, "mAP50-95": 0.72, "precision": 0.88, "recall": 0.81 },
            "startedAt": "2026-01-14T22:00:00Z",
            "completedAt": "2026-01-15T10:00:00Z",
            "createdAt": "2026-01-14T21:55:00Z"
        }
    ],
    "count": 1
}

Enumerar imágenes del conjunto de datos#

GET /api/datasets/{owner}/{dataset}/images

SDK de Python: client.datasets.images(owner, dataset)

Parámetros de consulta:

ParámetroTipoDescripción
limitintNúmero máximo de imágenes que se devolverán (predeterminado: 50, máximo: 5000)
offsetintImágenes que se omitirán (predeterminado: 0)
cursorstringÚltimo ID de imagen de la página anterior, para la paginación mediante cursor
includeTotalbooleanoIncluir el recuento total de coincidencias (predeterminado: true)
splitstringFiltrar por partición: train, val, test
hasLabelbooleanoFiltrar por estado de anotación
hasErrorbooleanoFiltrar por estado de error de procesamiento
classIdsstringID de clase separados por comas; devuelve las imágenes que contienen cualquiera de ellos
searchstringCoincidencia de subcadena en el nombre de archivo y los metadatos personalizados (máximo 200 caracteres)
sortstringnewest (predeterminado), oldest, name-asc, name-desc, height-asc, height-desc, width-asc, width-desc, size-asc, size-desc, labels-asc, labels-desc
includeThumbnailsbooleanoIncluir URL firmadas de miniaturas (predeterminado: true)
includeImageUrlsbooleanoIncluir URL firmadas de imágenes a tamaño completo (predeterminado: false)
includeLabelsbooleanoIncluir anotaciones de vista previa con tamaño limitado (predeterminado: false)

Respuesta:

{
    "images": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "hash": "9f2c1d4b6a8e0f3c5d7b9a1e2f4c6d8b",
            "ext": "jpg",
            "name": "aisle-04.jpg",
            "thumbnailUrl": "https://storage.googleapis.com/...&signature=...",
            "width": 1920,
            "height": 1080,
            "split": "train",
            "labelCount": 6,
            "bytes": 284213,
            "error": null
        }
    ],
    "total": 1000,
    "hasMore": true,
    "classes": ["person", "forklift"],
    "errorCount": 0,
    "nextCursor": "65f1c0a2b3d4e5f601234567"
}

Obtener imágenes seleccionadas#

POST /api/datasets/{owner}/{dataset}/images

SDK de Python: client.datasets.selected_images(owner, dataset, image_ids=...)

Devuelve la misma estructura de imagen para un máximo de 1.000 ID de imagen proporcionados y acepta los mismos parámetros de filtro y consulta de URL que la operación de listado.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

Ingerir datos del conjunto de datos#

POST /api/datasets/{owner}/{dataset}/ingest

SDK de Python: client.datasets.ingest(owner, dataset, body=...)

Procesa una carga completada, un archivo remoto o una fuente de almacenamiento conectada en un conjunto de datos existente. Proporciona exactamente una fuente:

CampoTipoDescripción
sessionIdstringSesión de carga de POST /api/upload/signed-url, ya completada
sourceUrlstringURL HTTP o HTTPS pública de un archivo ZIP, TAR, TAR.GZ, TGZ o NDJSON (máximo 4096 caracteres)
referenceobjetoUna fuente conectada: almacenamiento en la nube (provider: "cloud", integrationId, target, prefix) o local (provider: "local", keyId, root, prefix)
targetSplitstringtrain, val o test; sustituye la estructura de particiones del archivo
conflictPolicystringskip, keep_both o replace para conflictos de nombre de archivo o contenido
classMappingobjetoAsigna nombres de clase entrantes a un índice de clase, a un nombre de clase existente o nuevo, o a null para omitirlos
imageMetadataobjetoMetadatos personalizados identificados por la ruta relativa al archivo de cada imagen o por el valor file de NDJSON

Las sesiones de carga están vinculadas a un conjunto de datos mediante el assetId pasado a POST /api/upload/signed-url, y la ingestión rechaza una sesión que pertenezca a un conjunto de datos diferente.

Cuerpo (archivo cargado):

{
    "sessionId": "session_abc123",
    "targetSplit": "train"
}

Cuerpo (archivo remoto o NDJSON):

{
    "sourceUrl": "https://example.com/my-dataset.zip"
}

Cuerpo (importación de etiquetas en una ingestión posterior):

{
    "sessionId": "session_abc123",
    "classMapping": { "person": 0, "automobile": "forklift", "background": null }
}

Cuerpo (adjuntar metadatos por imagen):

{
    "sessionId": "session_abc123",
    "imageMetadata": {
        "airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
        "images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
    }
}

Las claves de metadatos deben coincidir con la ruta normalizada dentro del archivo, incluidas las carpetas. En las importaciones de NDJSON, cada registro puede incluir su propio objeto metadata, que tiene prioridad sobre una entrada coincidente de imageMetadata. Las rutas de archivo están limitadas a 1.024 caracteres, las claves de metadatos de nivel superior a 128 caracteres y cada objeto de metadatos —así como el mapa completo de imageMetadata— a 500.000 caracteres serializados.

Asignación de clases

La primera ingestión crea automáticamente las clases a partir del archivo. En las ingestiones posteriores, las clases del archivo que no aparezcan en classMapping recurren a una coincidencia sin distinguir mayúsculas y minúsculas con las clases existentes del conjunto de datos. Las etiquetas solo se omiten para las clases asignadas explícitamente a null o que no tengan una clase existente coincidente.

Respuesta (201):

{
    "jobId": "65f1c0a2b3d4e5f6012345aa",
    "status": "queued"
}
graph LR
    A[POST /api/datasets]:::start --> B[POST /api/upload/signed-url]:::proc
    B --> C[PUT archive to signed URL]:::proc
    C --> D[POST /api/upload/complete]:::proc
    D --> E["POST /api/datasets/{owner}/{dataset}/ingest"]:::proc
    E --> F[Process archive]:::proc
    F --> G[Dataset ready]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
Cargar una imagen con metadatos usando Python

El mismo código gestiona un grupo de imágenes: añade más archivos al ZIP y las entradas correspondientes a imageMetadata.

import io
import zipfile
from pathlib import Path

import requests

api = "https://platform.ultralytics.com/api"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
owner, dataset = "acme-vision", "warehouse"
dataset_id = "65f1c0a2b3d4e5f601234567"  # id returned by POST /api/datasets
image_path = Path("airbus-wing.jpg")

archive = io.BytesIO()
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as zf:
    zf.write(image_path, image_path.name)
data = archive.getvalue()

signed = requests.post(
    f"{api}/upload/signed-url",
    headers=headers,
    json={
        "assetType": "datasets",
        "assetId": dataset_id,
        "filename": "images.zip",
        "contentType": "application/zip",
        "totalBytes": len(data),
    },
)
signed.raise_for_status()
upload = signed.json()

requests.put(upload["uploadUrl"], headers={"Content-Type": "application/zip"}, data=data).raise_for_status()
requests.post(
    f"{api}/upload/complete",
    headers=headers,
    json={"sessionId": upload["sessionId"]},
).raise_for_status()

ingest = requests.post(
    f"{api}/datasets/{owner}/{dataset}/ingest",
    headers=headers,
    json={
        "sessionId": upload["sessionId"],
        "imageMetadata": {
            "airbus-wing.jpg": {
                "aircraft": {"family": "A350", "section": "wing"},
                "inspectionStatus": "reviewed",
            }
        },
    },
)
ingest.raise_for_status()
print(ingest.json())

API de imágenes#

Inspecciona, anota, mueve y elimina imágenes del conjunto de datos mediante su ID de imagen de 24 caracteres. Consulta la documentación sobre anotaciones.

Obtener imagen#

GET /api/images/{imageId}

SDK de Python: client.images.retrieve(image_id)

Devuelve el objeto metadata (personalizado y definido por el usuario), properties (nombre de archivo, hash, dimensiones, partición, recuentos y marcas de tiempo), labels y el classNames del conjunto de datos.

Actualizar imagen#

PATCH /api/images/{imageId}

SDK de Python: client.images.update(image_id, body=...)

Sustituye o bien las anotaciones o bien los metadatos personalizados; envía una de las dos estructuras, no ambas.

Cuerpo (anotaciones):

{
    "labels": [
        { "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] },
        { "classId": 1, "segments": [0.1, 0.2, 0.3, 0.2, 0.2, 0.4] }
    ]
}

Cuerpo (metadatos):

{
    "metadata": { "location": "strasbourg", "reviewed": true }
}
Formato de coordenadas

Las coordenadas de las etiquetas utilizan valores normalizados de YOLO entre 0 y 1. Las cajas delimitadoras utilizan [x_center, y_center, width, height]. Las etiquetas de segmentación utilizan segments, una lista aplanada de vértices de polígono [x1, y1, x2, y2, ...]. Las etiquetas de pose utilizan keypoints en una única estructura plana coherente: pares [x1, y1, x2, y2, ...] o tríos [x1, y1, v1, x2, y2, v2, ...], donde la visibilidad normalmente usa 0, 1 o 2. Las cajas orientadas utilizan las esquinas obb. Las coordenadas guardadas se redondean a 5 decimales y una imagen admite como máximo 10.000 anotaciones.

Eliminar imagen#

DELETE /api/images/{imageId}

SDK de Python: client.images.delete(image_id)

Elimina permanentemente una imagen y sus anotaciones.

Anotar imagen automáticamente#

POST /api/images/{imageId}/predict

SDK de Python: client.images.predict(image_id, model_id=...)

Ejecuta inferencia de YOLO en la imagen y devuelve las anotaciones predichas. No las guarda; escribe los resultados de nuevo con PATCH /api/images/{imageId} cuando estés satisfecho con ellos.

CampoTipoObligatorioDescripción
modelIdstringURI de modelo totalmente cualificada, ul://{owner}/{project}/{model}
confidencefloatNoUmbral de confianza, 0,01 – 1,0 (predeterminado: 0,25)
ioufloatNoUmbral de IoU para la supresión no máxima, 0,0 – 0,95 (predeterminado: 0,7)

Respuesta: success, predictions (objetos de anotación), modelUsed y inferenceTime. Un modelo cuyas clases no coincidan con las del conjunto de datos devuelve 422.

Anota automáticamente un conjunto de datos#

POST /api/datasets/{owner}/{dataset}/predict/batch

SDK de Python: client.datasets.create_batch(owner, dataset, model_id=...)

Guarda una versión de un conjunto de datos, luego pone en cola una ejecución que etiqueta las imágenes sin etiquetar del conjunto de datos con el modelo y devuelve 202. El cuerpo acepta los mismos campos modelId, confidence y iou que el endpoint de imagen única, además de includeAnnotated (por defecto, false) para anotar también las imágenes que ya tienen etiquetas y una matriz opcional classMapping que proporciona el índice de clase del conjunto de datos para cada clase de modelo, o null para omitirlo. Las etiquetas existentes nunca se modifican y la ejecución se factura por las imágenes que procesa realmente. 402 significa que el saldo no cubre la estimación, 409 que el conjunto de datos no está listo, no le quedan imágenes por anotar o ya tiene una ejecución en curso, y 422 que el conjunto de datos no tiene clases: créalas con el classes endpoint antes de llamar a este endpoint, que es lo que hace el paso de asignación de clases de la aplicación antes de iniciar una ejecución.

GET en la misma ruta (client.datasets.batch(owner, dataset)) devuelve la ejecución en curso y su progreso, o la última ejecución terminada hasta que se descarte; DELETE (client.datasets.delete_batch(owner, dataset)) cancela una ejecución en curso o liquida la facturación y descarta el resumen finalizado.

Mover imágenes en bloque#

PATCH /api/images/bulk

SDK de Python: client.images.update_bulk(image_ids=..., split=...)

Mueve hasta 1.000 imágenes de un conjunto de datos a una partición diferente.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"],
    "split": "val",
    "conflictPolicy": "skip"
}

Los conflictos de nombre de archivo o contenido devuelven 409 hasta que elijas una conflictPolicy para todo el lote de skip, keep_both o replace. La respuesta informa de modifiedCount, skippedCount y targetSplit.

Eliminar imágenes en bloque#

DELETE /api/images/bulk

SDK de Python: client.images.delete_bulk(image_ids=...)

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

Elimina hasta 1.000 imágenes de un único conjunto de datos y devuelve deletedCount y deletedImageIds.

Obtener URL firmadas de imágenes#

POST /api/images/urls

SDK de Python: client.images.urls(image_ids=...)

Devuelve URL firmadas temporales para un máximo de 100 ID de imagen de un conjunto de datos.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"]
}

Respuesta: urls y thumbnails, ambas identificadas por el ID de imagen.


API de proyectos#

Organiza tus modelos en proyectos. Cada modelo pertenece a un proyecto. Consulta la documentación sobre proyectos.

Enumerar proyectos#

GET /api/projects/{owner}

SDK de Python: client.projects.list(owner)

Parámetros de consulta:

ParámetroTipoDescripción
limitintNúmero máximo de proyectos que devolver (predeterminado: 20, máximo: 500)

Obtener proyecto#

GET /api/projects/{owner}/{project}

SDK de Python: client.projects.retrieve(owner, project)

Devuelve el objeto project, una matriz models de resúmenes por modelo (estado, métricas, épocas, pesos y argumentos de entrenamiento), y isOwner.

Crear proyecto#

POST /api/projects

SDK de Python: client.projects.create(project=..., name=...)

CampoTipoObligatorioDescripción
projectstringNombre del proyecto utilizado en las URL de Platform
namestringNombre para mostrar (máximo 100 caracteres)
descriptionstringNoDescripción (máximo 1000 caracteres)
visibilitystringNopublic o private
tagsmatrizNoHasta 50 etiquetas
licensestringNoIdentificador de licencia del proyecto
metadataobjetoNoMetadatos JSON personalizados
ownerstringNoIdentificador del espacio de trabajo del equipo; de forma predeterminada, se usa tu espacio de trabajo personal
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project": "inspection",
    "name": "Inspection",
    "description": "Detection experiments",
    "metadata": {"department": "manufacturing", "cost_center": "cv-01"}
  }' \
  https://platform.ultralytics.com/api/projects

Respuesta (201): id, owner, project, region.

Actualizar proyecto#

PATCH /api/projects/{owner}/{project}

SDK de Python: client.projects.update(owner, project)

Campos aceptados: name, description, visibility, metadata, tags, license, archived, iconColor, iconLetter, viewPreferences y starred.

{
    "metadata": { "department": "research", "program": "inspection" }
}

Envía un objeto metadata vacío ({}) para borrarlo. Los metadatos del proyecto utilizan los mismos límites de 128 caracteres por clave y de 500.000 caracteres por objeto serializado que los metadatos del conjunto de datos.

Eliminar proyecto#

DELETE /api/projects/{owner}/{project}

SDK de Python: client.projects.delete(owner, project)

Mueve el proyecto y sus modelos a la papelera y devuelve cascadedModels.

Clonar un proyecto#

POST /api/projects/{owner}/{project}/clone

SDK de Python: client.projects.clone(owner, project)

Clona un proyecto accesible y sus modelos completados. El cuerpo opcional acepta project, name, description, visibility, license y un owner de destino.


API de modelos#

Gestiona modelos YOLO entrenados: consulta métricas, descarga pesos, ejecuta inferencias y supervisa el entrenamiento. Consulta la documentación sobre modelos.

Enumerar modelos de un proyecto#

GET /api/models/{owner}/{project}

SDK de Python: client.models.list(owner, project)

Parámetros de consulta:

ParámetroTipoDescripción
limitintNúmero máximo de modelos que devolver (predeterminado: 20, máximo: 100)

Obtener modelo#

GET /api/models/{owner}/{project}/{model}

SDK de Python: client.models.retrieve(owner, project, model)

Parámetros de consulta:

ParámetroTipoDescripción
analysisintEstablécelo en 1 para devolver el análisis de validación por imagen en lugar del modelo

La respuesta predeterminada contiene el objeto model —estado, tarea, métricas, trainArgs, trainResults, classNames, computeCost, metadata, entre otros—, además de isOwner.

Crear modelo#

POST /api/models

SDK de Python: client.models.create(body=...)

Crea un registro de modelo sin entrenar al que puedes adjuntar pesos o que puedes entrenar.

CampoTipoObligatorioDescripción
projectstringNombre del proyecto de destino
ownerstringNoIdentificador del espacio de trabajo; el predeterminado es tu espacio de trabajo personal
modelstringNoNombre del modelo utilizado en las URL de Platform; se genera si se omite
namestringNoNombre para mostrar (solo se acepta junto con model)
descriptionstringNoDescripción (máximo 1000 caracteres)
taskstringNodetect, segment, semantic, depth, classify, pose o obb
metadataobjetoNoMetadatos JSON personalizados
trainArgsobjetoNoArgumentos de entrenamiento que se registrarán
metricsobjetoNoMétricas como mAP50, mAP50-95, precision, recall
epochsnúmeroNoNúmero de épocas de un modelo ya entrenado
versionstringNoEtiqueta de versión (máximo 50 caracteres)

Respuesta (201): id, owner, project, model, region.

Carga de archivos de modelo

Para adjuntar pesos de .pt, solicita una URL de carga firmada con assetType: "models" y el id de este modelo como assetId, PUT el archivo en la URL devuelta y, después, llama a POST /api/upload/complete con el sessionId devuelto.

Actualizar modelo#

PATCH /api/models/{owner}/{project}/{model}

SDK de Python: client.models.update(owner, project, model)

Los campos aceptados incluyen name, description, color, metadata, status, license, datasetSlug, trainArgs, trainResults, epochs, bestEpoch, bestFitness, version, trainingError y starred. Pasar projectId por sí solo mueve el modelo a otro proyecto del mismo propietario; la respuesta devuelve el slug del modelo en el destino, renamed: true cuando ese slug ya estaba ocupado allí y 409 mientras el modelo sigue entrenando.

{
    "metadata": { "release": "candidate-3", "reviewed": true }
}

El metadata personalizado es independiente de los campos propios del entrenamiento, como trainArgs, environment y trainResults, y utiliza los mismos límites de tamaño que los metadatos del conjunto de datos.

Eliminar modelo#

DELETE /api/models/{owner}/{project}/{model}

SDK de Python: client.models.delete(owner, project, model)

Mueve el modelo a la papelera durante 30 días.

Descargar archivos del modelo#

GET /api/models/{owner}/{project}/{model}/files

SDK de Python: client.models.files(owner, project, model)

Devuelve URL firmadas de corta duración para los pesos del modelo.

{
    "files": [
        {
            "name": "best.pt",
            "size": 6534127,
            "downloadUrl": "https://storage.googleapis.com/...&signature=..."
        }
    ]
}

Clonar modelo#

POST /api/models/{owner}/{project}/{model}/clone

SDK de Python: client.models.clone(owner, project, model, project_body=...)

Copia un modelo accesible en un proyecto existente.

{
    "owner": "acme-vision",
    "project": "inspection",
    "model": "v3-copy",
    "name": "V3 Copy",
    "description": "Cloned from a public model"
}
CampoTipoObligatorioDescripción
projectstringNombre del proyecto de destino
ownerstringNoEspacio de trabajo de destino; el predeterminado es el personal
modelstringNoNombre del modelo de destino
namestringNoNombre para mostrar de destino
descriptionstringNoDescripción del clon

Ejecuta la inferencia#

POST /api/models/{owner}/{project}/{model}/predict

SDK de Python: client.models.predict(owner, project, model, body=...)

Los modelos públicos se pueden utilizar para realizar predicciones sin autenticación. Los modelos privados y compartidos requieren una clave de API con acceso al proyecto principal.

Formulario multipart:

ParámetroTipoPredeterminadoRangoDescripción
filefile--Archivo de imagen o vídeo (obligatorio a menos que se establezca source)
conffloat0.250.01 – 1.0Umbral mínimo de confianza
ioufloat0.70.0 – 0.95Umbral de IoU de NMS
imgszint64032 – 1280Tamaño de la imagen de entrada en píxeles
normalizeboolfalse-Devuelve las coordenadas del cuadro delimitador como valores de 0 a 1
decimalsint50 – 10Precisión decimal de los valores de coordenadas
bitsint88, 12, 16Cuantización del mapa de profundidad, solo para modelos de profundidad
sourcestring--URL de imagen o cadena en base64 (alternativa a file)

Proporciona file o source. Los modelos de profundidad también aceptan bits (8, 12 o 16) para seleccionar la cuantización PNG del mapa de profundidad. Las solicitudes que superen los límites de entrada del servicio devuelven 413.

curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@image.jpg" \
  -F "conf=0.5" \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/predict

Respuesta:

Cada entrada de images contiene shape, speed, results y, para tareas de predicción densa, un payload PNG semantic_mask o depth (los valores de profundidad son pixel × max / divisor, con divisor 255 para el mapa de 8 bits predeterminado y 65535 cuando bits es 12 o 16). El objeto metadata informa del número de imágenes, los tiempos de ejecución de las funciones, la tarea y las versiones del servicio. Las rutas internas de los modelos nunca se devuelven.

{
    "images": [
        {
            "shape": [1080, 1920],
            "speed": { "preprocess": 2.1, "inference": 12.4, "postprocess": 1.3 },
            "results": [
                {
                    "class": 0,
                    "name": "person",
                    "confidence": 0.92,
                    "box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
                }
            ]
        }
    ],
    "metadata": {
        "imageCount": 1,
        "functionTimeAlive": 184.2,
        "functionTimeCall": 0.31,
        "task": "detect",
        "version": { "ultralytics": "8.4.120" }
    }
}

Comprobar el progreso del entrenamiento#

GET /api/models/{owner}/{project}/{model}/training

SDK de Python: client.models.training(owner, project, model)

Devuelve job, que contiene el estado, el progreso de las épocas, los tiempos, los detalles de cómputo, los argumentos de entrenamiento, las métricas de las épocas y detalles de errores seguros, o null cuando el modelo nunca se ha entrenado. Los modelos de proyectos públicos se pueden leer sin autenticación.

Cancela el entrenamiento#

DELETE /api/models/{owner}/{project}/{model}/training

SDK de Python: client.models.delete_training(owner, project, model)

Termina la instancia de cómputo en ejecución y marca el trabajo como cancelado. Devuelve 409 cuando el entrenamiento ya no está activo.


API de entrenamiento#

Inicia el entrenamiento de YOLO en GPU en la nube y supervisa el progreso en tiempo real. Consulta la documentación sobre entrenamiento en la nube.

graph LR
    A[POST /api/training/start]:::start --> B[Job Created]:::proc
    B --> C{Training}:::decide
    C -->|progress| D[GET .../training]:::proc
    C -->|cancel| E[DELETE .../training]:::error
    C -->|complete| F[Model Ready]:::out
    F --> G[Deploy or Export]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff

Consultar la disponibilidad de GPU#

GET /api/training/gpu-availability

SDK de Python: client.training.gpu_availability()

Devuelve el estado actual del inventario, identificado por el ID de la GPU. Es público y no requiere autenticación; pasa managed=true para incluir la capacidad de entrenamiento gestionada, que sí requiere una clave de API.

Iniciar entrenamiento#

POST /api/training/start

SDK de Python: client.training.start(model_id=..., train_args=...)

CampoTipoObligatorioDescripción
modelIdstringID del modelo que se va a entrenar
trainArgsobjetoArgumentos de entrenamiento de YOLO; model, data y epochs son obligatorios
gpuTypestringNoGPU en la nube que se va a usar (valor predeterminado: rtx-4090)
captureDatasetVersionbooleanoNoGuarda una versión inmutable del dataset para esta ejecución (valor predeterminado: false)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "gpuType": "rtx-4090",
    "trainArgs": {
      "model": "yolo26n.pt",
      "data": "ul://acme-vision/datasets/warehouse",
      "epochs": 100,
      "imgsz": 640,
      "batch": 16
    }
  }' \
  https://platform.ultralytics.com/api/training/start

Respuesta:

{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "status": "starting",
    "gpuType": "rtx-4090",
    "estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
    "billing": {
        "estimatedCostCents": 138,
        "estimatedCostDisplay": "$1.38",
        "balanceCents": 2500
    }
}

El entrenamiento devuelve 402 cuando tu saldo de créditos es demasiado bajo y 503 cuando no hay capacidad disponible para la GPU solicitada.

Tipos de GPU

Hay 26 tipos de GPU disponibles, desde rtx-2000-ada hasta b300, incluidos rtx-4090, l40s, a100-80gb-pcie, a100-80gb-sxm, rtx-pro-6000, h100-sxm, h200-sxm y b200. Consulta Entrenamiento en la nube para ver la lista completa con precios.


API de exportaciones#

Convierte modelos a formatos optimizados como ONNX, TensorRT, CoreML y LiteRT para su implementación en el edge. Consulta la documentación sobre implementación.

Enumerar exportaciones#

GET /api/models/{owner}/{project}/{model}/exports

SDK de Python: client.exports.list(owner, project, model)

Parámetros de consulta:

ParámetroTipoDescripción
statusstringFiltra por queued, starting, running, completed, failed o cancelled
limitintNúmero máximo de exportaciones que se devolverán (valor predeterminado: 20, máximo: 100)

Crear exportación#

POST /api/models/{owner}/{project}/{model}/exports

SDK de Python: client.exports.create(owner, project, model, format=...)

CampoTipoObligatorioDescripción
formatstringFormato de exportación de destino (consulta la tabla siguiente)
gpuTypestringCondicionalObligatorio cuando format es engine; usa un destino de GPU o Jetson compatible
argsobjetoNoOpciones de exportación: imgsz, quantize, dynamic, simplify, opset, conf, iou, batch, workspace, nms, optimize, keras y name (destino de dispositivo para los formatos RKNN, QNN, Hailo y Ascend)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"format": "onnx", "args": {"imgsz": 640, "quantize": 16}}' \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/exports

Respuesta (201): id, format, status (queued o running), gpuType, region. Una exportación equivalente que ya esté en curso devuelve 409.

Formatos compatibles:

Usa el argumento format de la tabla de exportaciones compartida que aparece a continuación. PyTorch es el formato de origen y no es un destino de exportación de la API.

FormatoArgumento formatModeloMetadatosArgumentos
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnximgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engineimgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackageimgsz, dynamic, quantize, nms, batch, device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz, keras, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pbimgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz, quantize, opset, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz, batch, device
MNNmnnyolo26n.mnnimgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n_ncnn_model/imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz, batch, device
Axeleraaxelerayolo26n_axelera_model/imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnximgsz, batch, name, quantize, simplify, opset, data, fraction, device
LiteRTlitertyolo26n.tfliteimgsz, quantize, batch, data, fraction, device
Hailohailoyolo26n_hailo_model/imgsz, name, quantize, data, fraction, simplify, conf, iou
Huawei Ascendascendyolo26n_ascend_model/imgsz, batch, name, quantize, opset, simplify, nms
Apple Core AIcoreaiyolo26n.aimodelimgsz, batch, quantize

nms=None se establece por defecto en salidas sin procesar para la NMS externa. Configura nms=False para seleccionar una cabeza libre de NMS disponible; los formatos no compatibles recurren a su ruta de salida nativa. Las entradas nms anteriores identifican los formatos que pueden incrustar la NMS con nms=True.

Consultar el estado de la exportación#

GET /api/models/{owner}/{project}/{model}/exports/{exportId}

SDK de Python: client.exports.retrieve(owner, project, model, export_id)

Devuelve el objeto export con status, format, args, gpuType, las marcas de tiempo y, una vez completada, un objeto file que contiene size, downloadUrl y downloadFilename.

Cancelar o eliminar una exportación#

DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}

SDK de Python: client.exports.delete(owner, project, model, export_id)

Cancela una exportación activa o elimina una finalizada y su archivo. La respuesta indica cuál de las dos acciones se ha realizado:

{
    "success": true,
    "action": "cancelled"
}

API de implementaciones#

Implementa modelos en endpoints de inferencia dedicados con comprobaciones de estado y supervisión. Consulta la documentación sobre endpoints.

graph LR
    A[Create]:::start --> B[Deploying]:::proc
    B --> C[Ready]:::out
    C -->|action stop| D[Stopped]:::extern
    C -->|action replace| B
    D -->|action start| C
    C -->|delete| E[Deleted]:::error
    D -->|delete| E
    C -->|predict| F[Inference Results]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff
    classDef extern fill:#607D8B,color:#fff

Enumerar implementaciones#

GET /api/deployments/{owner}

SDK de Python: client.deployments.list(owner)

Parámetros de consulta:

ParámetroTipoDescripción
statusstringcreating, deploying, ready, stopping, stopped o failed
modelstringFiltra por {project}/{model}, por ejemplo inspection/v3
limitintNúmero máximo de implementaciones que se devolverán (valor predeterminado: 20, máximo: 100)

Los usuarios anónimos deben filtrar por un modelo público; para enumerar todo un espacio de trabajo se requiere autenticación.

Crear implementación#

POST /api/deployments/{owner}

SDK de Python: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)

Cuerpo:

{
    "project": "inspection",
    "model": "v3",
    "deployment": "edge-1",
    "name": "Edge 1",
    "region": "us-central1"
}
CampoTipoObligatorioDescripción
projectstringProyecto que contiene el modelo
modelstringModelo que se va a implementar
deploymentstringNombre de la implementación utilizado en las URL de Platform
namestringNombre visible
regionstringUna de las 42 regiones de implementación compatibles

Respuesta (201): id, deployment, status (creating), message y region.

Dimensionamiento de recursos

Platform gestiona la CPU, la memoria y el escalado de las instancias según los límites de tu plan, y la solicitud de creación no acepta una configuración de recursos. Los valores actuales se devuelven en el objeto resources cada vez que se consulta una implementación.

Selección de región

Elige una región cercana a tus usuarios para obtener la menor latencia posible. La interfaz de Platform muestra estimaciones de latencia para las 42 regiones disponibles.

Consultar implementación#

GET /api/deployments/{owner}/{deployment}

SDK de Python: client.deployments.retrieve(owner, deployment)

Devuelve el objeto deployment con status, statusMessage, region, serviceUrl y resources.

Iniciar, detener o sustituir una implementación#

PATCH /api/deployments/{owner}/{deployment}

SDK de Python: client.deployments.update(owner, deployment, body=...)

Un único campo action selecciona la operación:

{ "action": "start" }

La sustitución implementa una nueva revisión mientras conserva el ID de la implementación, la región y la URL del endpoint; la revisión existente sigue activa si falla la implementación. El modelo de sustitución debe ser un modelo completado con pesos a los que tu clave tenga acceso. Las operaciones completadas devuelven 200 con status, ready o stopped; las operaciones que todavía se están implementando devuelven 202 con deploying o stopping.

Eliminar implementación#

DELETE /api/deployments/{owner}/{deployment}

SDK de Python: client.deployments.delete(owner, deployment)

Elimina permanentemente el endpoint de inferencia.

Comprobación del estado#

GET /api/deployments/{owner}/{deployment}/health

SDK de Python: client.deployments.health(owner, deployment)

Hace ping al endpoint y lo prepara, y devuelve healthy, latencyMs y el código ascendente status.

Ejecutar inferencia en una implementación#

POST /api/deployments/{owner}/{deployment}/predict

SDK de Python: client.deployments.predict(owner, deployment, body=...)

Enruta una imagen o un vídeo a través del endpoint dedicado. Los contratos de solicitud y respuesta coinciden con los de la inferencia de modelos.

Formulario multipart:

ParámetroTipoPredeterminadoRangoDescripción
filefile--Archivo de imagen o vídeo (obligatorio a menos que se establezca source)
conffloat0.250.01 – 1.0Umbral mínimo de confianza
ioufloat0.70.0 – 0.95Umbral de IoU de NMS
imgszint64032 – 1280Tamaño de la imagen de entrada en píxeles
normalizeboolfalse-Devuelve las coordenadas del cuadro delimitador como valores de 0 a 1
decimalsint50 – 10Precisión decimal de los valores de coordenadas
bitsint88, 12, 16Cuantización del mapa de profundidad, solo para modelos de profundidad
sourcestring--URL de imagen o cadena en base64 (alternativa a file)

Consultar métricas#

GET /api/deployments/{owner}/{deployment}/metrics

SDK de Python: client.deployments.metrics(owner, deployment)

Parámetros de consulta:

ParámetroTipoDescripción
rangestring1h, 6h, 24h (valor predeterminado), 7d o 30d
sparklinebooleanoDevuelve el resumen compacto del panel en lugar de las series completas (valor predeterminado: false)

La respuesta completa contiene summary (totales de solicitudes, tasa de errores y latencia media y p50/p95/p99) y timeSeries (solicitudes, errores, latencia, CPU, memoria y número de instancias). La respuesta de sparkline devuelve requests24h, totalRequests, errorRate y avgLatencyMs.

Consultar registros#

GET /api/deployments/{owner}/{deployment}/logs

SDK de Python: client.deployments.logs(owner, deployment)

Parámetros de consulta:

ParámetroTipoDescripción
severitystringSeparados por comas: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY
limitintEntradas que se devolverán (valor predeterminado: 50, máximo: 200)
pageTokenstringToken de paginación de una respuesta anterior

API de papelera#

Consulta, restaura y elimina permanentemente proyectos, datasets y modelos eliminados de forma temporal. Los elementos se purgan automáticamente después de 30 días. Consulta la documentación de la papelera.

Enumerar la Papelera#

GET /api/trash

SDK de Python: client.lifecycle.trash()

Parámetros de consulta:

ParámetroTipoDescripción
typestringall (valor predeterminado), project, dataset o model
pageintNúmero de página (valor predeterminado: 1)
limitintElementos por página (valor predeterminado: 50, máximo: 200)

La respuesta incluye items (cada uno con daysRemaining), total, page, limit, totalPages y un summary con los totales por tipo.

Restaurar elemento#

POST /api/trash

SDK de Python: client.lifecycle.restore(id=..., type=...)

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

Al restaurar un proyecto también se restauran los modelos que se enviaron a la papelera con él, indicados como restoredModels.

Eliminar permanentemente#

DELETE /api/trash

SDK de Python: client.lifecycle.delete_trash(body=...)

Elimina un elemento:

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

O vacía toda la papelera:

{
    "all": true
}

La respuesta informa de deletedCount, además de cascadedModels y survivingDeployments cuando corresponde.

Irreversible

La eliminación permanente no se puede deshacer. El recurso y todos los datos asociados se eliminan.


API de cargas#

Carga archivos directamente en el almacenamiento en la nube mediante URL firmadas. Al completar la carga de un modelo se asocian sus pesos; al completar la carga de un archivo de dataset se registra la sesión, que después pasas a la ingesta del dataset. Consulta la documentación sobre datos.

Obtener URL de carga firmada#

POST /api/upload/signed-url

SDK de Python: client.upload.signed_url(body=...)

Cuerpo:

{
    "assetType": "datasets",
    "assetId": "65f1c0a2b3d4e5f601234567",
    "filename": "warehouse.zip",
    "contentType": "application/zip",
    "totalBytes": 52428800
}
CampoTipoObligatorioDescripción
assetTypestringdatasets, models, images o videos
assetIdstringID del dataset o modelo de destino
filenamestringNombre de archivo original (máximo 256 caracteres)
contentTypestringTipo MIME
totalBytesnúmeroTamaño del archivo en bytes
Nombres de archivo del archivo de dataset

Cuando assetType es datasets, filename debe terminar en .zip, .tar, .tar.gz, .tgz o .ndjson. Agrupa las imágenes sueltas en un archivo antes de cargarlas.

Respuesta:

{
    "sessionId": "session_abc123",
    "uploadUrl": "https://storage.googleapis.com/...&signature=...",
    "expiresAt": "2026-02-22T12:00:00Z",
    "headers": { "x-goog-if-generation-match": "0" }
}

Sube el archivo con una petición de PUT a uploadUrl, utilizando el mismo Content-Type que declaraste y cada cabecera devuelta en headers. Las URL de subida de conjuntos de datos son válidas durante 12 horas y son de solo creación: una segunda PUT a la misma URL devuelve 412, y una PUT sin las cabeceras devueltas devuelve 400.

Completar carga#

POST /api/upload/complete

SDK de Python: client.upload.complete(session_id=...)

{
    "sessionId": "session_abc123",
    "md5": "<optional md5 hex>"
}

Respuesta: success y un objeto file con size y contentType. En el caso de los modelos, esto asocia los pesos; para los archivos de dataset, llama después a ingest para iniciar el procesamiento.

Cuando se proporciona md5, se comprueba con el objeto almacenado. Una discrepancia devuelve 400; en una sesión que aún no está completa, también borra el archivo subido y deja la sesión incompleta, así que solicita una nueva URL firmada y vuelve a subirlo . Una sesión de conjunto de datos completada se puede volver a completar mientras exista su archivo, pero las finalizaciones concurrentes con diferentes resúmenes devuelven 409; las sesiones de modelos se eliminan al completarse. checksum se almacena como metadatos del archivo del modelo y no se verifica.


API de integraciones de almacenamiento#

Conecta cuentas de Google Cloud Storage, Amazon S3 o Azure Blob Storage con acceso de solo lectura y explóralas como fuentes de datasets. Consulta la documentación sobre integraciones.

Enumerar integraciones#

GET /api/integrations/buckets

SDK de Python: client.storage_integrations.list()

Devuelve integrations, cada uno con id, provider, credentialIdentity, targets y createdAt. Las credenciales nunca se devuelven.

Descubrir ubicaciones#

POST /api/integrations/buckets/discover

SDK de Python: client.storage_integrations.discover(body=...)

Enumera los buckets o contenedores legibles con las credenciales proporcionadas, sin guardarlos.

{
    "provider": "gcs",
    "credentials": {
        "client_email": "svc@project.iam.gserviceaccount.com",
        "private_key": "-----BEGIN PRIVATE KEY-----\n...",
        "project_id": "my-project"
    }
}

Respuesta: {"targets": ["my-bucket", "another-bucket"]}

Conectar almacenamiento#

POST /api/integrations/buckets

SDK de Python: client.storage_integrations.create(body=...)

Las mismas estructuras de credenciales que en el descubrimiento, además de una matriz targets obligatoria con entre 1 y 50 nombres de buckets o contenedores. Devuelve 201 con la integración almacenada. Las credenciales temporales de S3 (claves de acceso ASIA) se rechazan.

Examinar objetos#

GET /api/integrations/buckets/{id}/objects

SDK de Python: client.storage_integrations.objects(id, target=...)

Parámetros de consulta:

ParámetroTipoObligatorioDescripción
targetstringNombre del bucket o contenedor
prefixstringNoPrefijo de carpeta (máximo 1024 caracteres)
cursorstringNoCursor de paginación del proveedor de una página anterior

Devuelve entries (cada kind es folder o file) y un cursor opcional para la página siguiente.

Desconectar almacenamiento#

DELETE /api/integrations/buckets/{id}

SDK de Python: client.storage_integrations.delete(id)

Elimina las credenciales guardadas sin borrar los datos del proveedor. Los conjuntos de datos conectados siguen visibles, pero sus archivos permanecen no disponibles hasta que se vuelva a conectar la misma cuenta de almacenamiento. Requiere acceso de administrador del espacio de trabajo.


API de importación de conjuntos de datos#

Importa conjuntos de datos desde servicios de terceros. Consulta la integración de Roboflow.

Previsualizar una importación de Roboflow#

POST /api/integrations/roboflow/preview

SDK de Python: client.datasets.preview_roboflow(api_key=...)

Resuelve una clave de API de Roboflow en un plan de importación: detalles del espacio de trabajo, newDatasets que se importarían, recuentos de proyectos omitidos, no compatibles y no resueltos, bytesTotal y el margen disponible de storage. La clave de API de Roboflow se lee del cuerpo y no se guarda.

{
    "apiKey": "ROBOFLOW_API_KEY"
}

Importar desde Roboflow#

POST /api/integrations/roboflow/import

SDK de Python: client.datasets.import_roboflow(api_key=..., items=...)

Pone en cola trabajos de ingesta para un máximo de 500 versiones de proyectos de Roboflow seleccionadas, usando los elementos devueltos por la previsualización.

{
    "apiKey": "ROBOFLOW_API_KEY",
    "items": [
        {
            "workspace": "my-workspace",
            "projectId": "warehouse-safety",
            "projectName": "Warehouse Safety",
            "projectType": "object-detection",
            "latestVersion": 4
        }
    ]
}

Respuesta (201): matrices imported, failed y skipped. Las importaciones requieren margen de almacenamiento y cada conjunto de datos debe ajustarse al límite de tamaño por importación de tu plan.


API de la cuenta#

Consulta tu cuenta de Platform, las claves, el almacenamiento y los perfiles públicos. Consulta la documentación de configuración.

Resumen de la cuenta#

GET /api/account/summary

SDK de Python: client.account.summary()

Devuelve el plan, el saldo de créditos y los recuentos de recursos del espacio de trabajo que emitió la clave.

{
    "username": "acme-vision",
    "name": "Acme Vision",
    "accountType": "team",
    "plan": "pro",
    "creditsCents": 2500,
    "counts": { "projects": 4, "datasets": 7, "models": 21 },
    "teams": []
}
Lista del equipo

teams se rellena para las sesiones del navegador. Las respuestas autenticadas con clave de API devuelven una lista vacía, porque una clave ya está limitada a un único espacio de trabajo.

Enumerar claves de API#

GET /api/api-keys

SDK de Python: client.account.api_keys()

Devuelve keys con keyId, name, keyPrefix y createdAt para el espacio de trabajo de la clave. Las solicitudes autenticadas con clave de API reciben solo metadatos; los valores completos de las claves se muestran al propietario del espacio de trabajo en Configuración > Claves de API en la interfaz de Platform, donde también se crean y revocan las claves.

Comprobar el uso del almacenamiento#

GET /api/storage

SDK de Python: client.account.storage()

Parámetros de consulta:

ParámetroTipoDescripción
detailsbooleanoIncluir los diez mayores consumidores de almacenamiento (predeterminado: false)

Respuesta:

{
    "tier": "pro",
    "usage": {
        "storage": { "current": 1073741824, "limit": 107374182400, "percent": 1.0 },
        "datasets": { "current": 536870912, "limit": 107374182400, "percent": 0.5 }
    },
    "breakdown": {
        "byCategory": {
            "datasets": { "bytes": 536870912, "count": 2 },
            "models": { "bytes": 268435456, "count": 4 },
            "exports": { "bytes": 268435456, "count": 3 }
        },
        "topItems": [
            {
                "_id": "65f1c0a2b3d4e5f601234567",
                "name": "Warehouse",
                "slug": "warehouse",
                "sizeBytes": 536870912,
                "type": "dataset"
            }
        ]
    },
    "region": "us",
    "username": "acme-vision",
    "updatedAt": "2026-01-15T10:00:00Z"
}

Obtener un perfil de usuario público#

GET /api/users

SDK de Python: client.account.profile(username=...)

Parámetros de consulta:

ParámetroTipoObligatorioDescripción
usernamestringNombre de usuario que se quiere buscar

Devuelve el perfil público user con followerCount y, para los solicitantes autenticados, isFollowed.

Seguir o dejar de seguir a un usuario#

PATCH /api/users

SDK de Python: client.account.follow(username=..., followed=...)

{
    "username": "target-user",
    "followed": true
}

Respuesta: followed y followerCount actualizado.


API de facturación#

Consulta el uso del plan y tu registro de créditos. Consulta la documentación de facturación.

Unidades monetarias

Los importes de facturación son números enteros en centavos de dólar estadounidense, donde 100 = $1.00.

Ver el plan y el uso#

GET /api/billing/usage-summary

SDK de Python: client.billing.usage_summary()

Devuelve plan (ID, estado, ciclo de facturación, final del periodo), metrics (límite y uso del almacenamiento), trainingCredit, features, creditsCents y el número de puestos.

Ver transacciones#

GET /api/billing/transactions

SDK de Python: client.billing.transactions()

Parámetros de consulta:

ParámetroTipoDescripción
fromstringMarca de tiempo de la transacción más antigua (ISO 8601)
tostringMarca de tiempo de la transacción más reciente (ISO 8601)

Cada transacción incluye id, type (como purchase, training, monthly_grant o refund), amountCents, balanceAfter, createdAt, un receiptUrl opcional y el contexto del modelo para los cargos de entrenamiento. Los detalles internos de facturación nunca se devuelven.


Explorar API#

Busca proyectos y conjuntos de datos públicos compartidos por la comunidad. Consulta la documentación de exploración.

Buscar contenido público#

GET /api/explore/search

SDK de Python: client.explore.search()

Parámetros de consulta:

ParámetroTipoDescripción
qstringTérmino de búsqueda (máximo 200 caracteres)
typestringall (predeterminado), projects o datasets
sortstringnewest (predeterminado), oldest, stars, name-asc, name-desc, count-desc, count-asc
offsetintResultados que omitir (predeterminado: 0)
limitintMáximo de resultados por tipo de recurso (predeterminado: 20, máximo: 100)
taskstringFiltros de tareas separados por comas: detect, segment, semantic, depth, classify, pose, obb
authorstringFiltro por nombre de usuario del propietario
starredbooleanoDevuelve únicamente el contenido marcado con estrella por el solicitante autenticado; requiere una clave de API

Respuesta: projects, datasets y hasMore.

curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"

SDK de Python#

ultralytics-platform es un cliente Python con tipos generado a partir del contrato OpenAPI, con un método por endpoint (client.datasets.list, client.models.predict, client.exports.create, ...). Cada método acepta los parámetros de ruta posicionalmente, el resto de entradas como argumentos con nombre y timeout y extra_headers opcionales por solicitud.

pip install "ultralytics-platform>=0.1.45" # Python 3.11+
from ultralytics_platform import Platform

with Platform() as client:  # reads ULTRALYTICS_API_KEY or the key saved by yolo login
    dataset = client.datasets.retrieve("acme-vision", "warehouse")
    images = client.datasets.images("acme-vision", "warehouse", limit=10)
    export = client.exports.create("acme-vision", "inspection", "v3", format="onnx")

AsyncPlatform expone el mismo árbol de recursos para el código de async/await; las respuestas no satisfactorias generan APIError con status_code, body y json analizado, y los fallos de conexión generan APIConnectionError. Consulta el repositorio del SDK para ver el README completo.

Integración con Python#

Para flujos de trabajo de entrenamiento e inferencia, usa el paquete de Python de Ultralytics, que gestiona la autenticación, las subidas y la transmisión de métricas en tiempo real de forma automática. En Python 3.11+, pip install ultralytics también instala el SDK ultralytics-platform. Cuando model.train(project=...) apunta a Platform, las devoluciones de llamada de entrenamiento transmiten eventos a través de client.training.metrics() del SDK y solicitan URLs de subida de puntos de control a través de client.models.upload_checkpoint(), las operaciones POST /api/webhooks/training/metrics y POST /api/webhooks/models/upload en el documento OpenAPI, por lo que no hay nada que tengas que llamar por tu cuenta.

Instalación y configuración#

La integración en la plataforma requiere Python>=3.11 y ultralytics>=8.4.120:

pip install "ultralytics>=8.4.120"

Verifica la instalación:

yolo check

Autenticación#

yolo login YOUR_API_KEY

Usar conjuntos de datos de Platform#

Haz referencia a conjuntos de datos con URI ul://:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Train on your Platform dataset
model.train(
    data="ul://your-username/datasets/your-dataset",
    epochs=100,
    imgsz=640,
)

Formato de URI:

PatrónDescripción
ul://username/datasets/slugConjunto de datos
ul://username/project-nameProyecto
ul://username/project/model-nameModelo específico
ul://ultralytics/yolo26/yolo26nModelo oficial

Envío a Platform#

Envía los resultados a un proyecto de Platform:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Results automatically sync to Platform
model.train(
    data="coco8.yaml",
    epochs=100,
    project="your-username/my-project",
    name="experiment-1",
)

Qué se sincroniza:

  • Métricas de entrenamiento (en tiempo real)
  • Pesos finales del modelo
  • Gráficos de validación
  • Salida de la consola
  • Métricas del sistema
  • Argumentos de entrenamiento y entorno del host (nombre de host, SO, Python, hardware, confirmación de git, línea de comandos)

Ejemplos de API#

Cargar un modelo desde Platform:

# Your own model
model = YOLO("ul://username/project/model-name")

# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")

Ejecutar inferencia:

results = model("image.jpg")

# Access results
for r in results:
    boxes = r.boxes  # Detection boxes
    masks = r.masks  # Segmentation masks
    keypoints = r.keypoints  # Pose keypoints
    probs = r.probs  # Classification probabilities

Exportar el modelo:

# Export to ONNX
model.export(format="onnx", imgsz=640, quantize=16)

# Export to TensorRT
model.export(format="engine", imgsz=640, quantize=16)

# Export to CoreML
model.export(format="coreml", imgsz=640)  # use imgsz=224 for classification

Validación:

metrics = model.val(data="ul://username/datasets/my-dataset")

print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")

Preguntas frecuentes#

  • Usa los mismos segmentos de propietario y nombre que aparecen en la URL de Platform. Un modelo en https://platform.ultralytics.com/acme-vision/inspection/v3 es GET /api/models/acme-vision/inspection/v3. Los ID de base de datos se siguen devolviendo en las respuestas (como id) y algunas rutas los aceptan directamente: las rutas de imágenes aceptan un imageId, las cargas aceptan un assetId y POST /api/training/start acepta un modelId.

  • Depende de la colección. La mayoría de los endpoints de listado aceptan limit:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"

    Las imágenes de conjuntos de datos, la agrupación y la búsqueda de Explore usan offset con limit y devuelven hasMore:

    curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"

    Los conjuntos de imágenes muy grandes se recorren mejor con el cursor devuelto como nextCursor:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision/warehouse/images?limit=1000&includeTotal=false&cursor=LAST_IMAGE_ID"

    La papelera usa page, y los registros de implementación usan el pageToken opaco devuelto como nextPageToken.

  • Sí. Todas las operaciones de esta página son solicitudes HTTPS simples y el contrato completo se publica como OpenAPI 3.2 en platform.ultralytics.com/openapi.json, que puedes proporcionar a un generador de clientes en cualquier lenguaje. El paquete ultralytics-platform es exactamente eso: un cliente con tipos generado a partir del contrato, mientras que el paquete ultralytics añade transmisión de métricas en tiempo real y cargas automáticas de modelos para entrenamiento e inferencia. Los flujos de cuenta exclusivos de las sesiones del navegador, como el proceso de pago y la gestión del equipo, permanecen en la interfaz de Platform.

  • Usa la cabecera Retry-After de la respuesta 429 para esperar el tiempo adecuado:

    import time
    
    import requests
    
    def api_request_with_retry(url, headers, max_retries=3):
        for attempt in range(max_retries):
            response = requests.get(url, headers=headers)
            if response.status_code != 429:
                return response
            wait = int(response.headers.get("Retry-After", 2**attempt))
            time.sleep(wait)
        raise RuntimeError("Rate limit exceeded")
  • 404 significa que el recurso no existe o no es visible para tu clave en absoluto. 403 significa que se encontró el recurso, pero la action requiere más acceso del que tiene tu clave: acceso de editor para modificar un conjunto de datos, acceso del propietario para eliminar una implementación, acceso de administrador para desconectar el almacenamiento o un plan o cuota superiores para las exportaciones y las implementaciones.

  • Leer conjuntos de datos, proyectos y modelos públicos, incluidas sus imágenes, URL de imágenes firmadas, estadísticas de clases, estado de incrustaciones, diseño de agrupación y lista de exportaciones; comprobar el progreso del entrenamiento de un modelo público; descargar los archivos de un modelo público; ejecutar inferencia en un modelo público; consultar el perfil de un usuario público; enumerar implementaciones filtradas por un modelo público; y buscar en Explore. GET /api/training/gpu-availability es totalmente público a menos que solicites capacidad gestionada. Todo lo demás requiere una clave, y proporcionar una en un endpoint público también revela tus recursos privados.

Comentarios