Справочник REST API#
Ultralytics Platform предоставляет REST API для программного доступа к датасетам, изображениям, проектам, моделям, обучению, экспортам и деплоям.

# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/datasets/YOUR_USERNAMEКаждая конечная точка ниже содержит вызов client.<resource>.<method>(...) из SDK ultralytics-platform, который генерируется на основе того же контракта, что и этот справочник.
Эта страница представляет собой путеводитель по API. Сгенерированная и всегда актуальная документация находится по адресу platform.ultralytics.com/api/docs, а машиночитаемый документ OpenAPI 3.2, на котором она основана, опубликован по адресу platform.ultralytics.com/openapi.json. Оба источника генерируются напрямую из серверного контракта, поэтому они являются авторитетными в случае расхождений между этой страницей и схемой.
Обзор API#
API организован вокруг основных ресурсов 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| Ресурс | Описание | Основные операции |
|---|---|---|
| Датасеты | Коллекции размеченных изображений | CRUD, загрузка, версии, классы, разделения, клонирование |
| Images | Отдельные изображения и разметка | Чтение, аннотирование, перемещение разделения, удаление, автоаннотирование |
| Проекты | Рабочие пространства моделей | CRUD, клонирование |
| Модели | Обученные чекпоинты | CRUD, предсказание, скачивание, клонирование, статус обучения |
| Обучение | Облачные задачи обучения на GPU | Доступность GPU, запуск, прогресс, отмена |
| Экспорты | Задачи преобразования форматов | Создание, список, статус, отмена |
| Развертывания | Выделенные эндпоинты для вывода | Создание, запуск/остановка/замена, предсказание, метрики, логи |
| Trash | Ресурсы, перемещенные в корзину | Список, восстановление, безвозвратное удаление |
| Storage | Интеграции с облачным хранилищем | Подключение, обнаружение, просмотр, отключение |
| Account | Тариф, кредиты, хранилище, профиль | Сводка по аккаунту, ключи API, использование хранилища, поиск пользователя |
| Биллинг | Использование тарифа и журнал | Сводка использования, транзакции |
| Explore | Поиск по публичному контенту | Поиск проектов и датасетов |
Аутентификация#
Большинству эндпоинтов требуется ключ API. Эндпоинты, открывающие публичный контент — чтение публичного датасета, проекта или модели, получение списка изображений публичного датасета, запуск инференса на публичной модели или поиск в Explore — также принимают анонимные запросы и просто возвращают больше данных, если указан ключ.
Получить ключ API#
- Перейди в
Settings>API Keys - Нажми
Create Key - Скопируй созданный ключ
Подробные инструкции см. в разделе Ключи API.
Заголовок авторизации#
Передавай свой ключ API в качестве bearer-токена:
Authorization: Bearer YOUR_API_KEYКлючи API представляют собой буквальный префикс ul_, за которым следуют 40 шестнадцатеричных символов, всего 43 символа (например, ul_a1b2c3d4e5f6789012345678901234567890abcd). Запросы с отсутствующим заголовком, некорректным или отозванным ключом возвращают 401. Храни свой ключ в секрете — никогда не коммить его в систему контроля версий и не публикуй открыто.
Пример#
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/account/summaryБазовый URL#
Все API-эндпоинты используют:
https://platform.ultralytics.com/apiПути к ресурсам#
Ресурсы адресуются по тем же понятным людям именам, которые отображаются в URL Platform, а не по идентификаторам базы данных:
| Ресурс | Путь | Пример |
|---|---|---|
| Датасет | /api/datasets/{owner}/{dataset} | /api/datasets/acme-vision/warehouse |
| Проект | /api/projects/{owner}/{project} | /api/projects/acme-vision/inspection |
| Модель | /api/models/{owner}/{project}/{model} | /api/models/acme-vision/inspection/v3 |
| Развертывание | /api/deployments/{owner}/{deployment} | /api/deployments/acme-vision/edge-1 |
| Изображение | /api/images/{imageId} | /api/images/65f1c0a2b3d4e5f601234567 |
{owner}— это личное имя пользователя или идентификатор командного рабочего пространства: от 4 до 32 символов, строчные буквенно-цифровые символы с одиночными дефисами между сегментами.{dataset},{project},{model}и{deployment}следуют тому же шаблону со строчными буквами и дефисами, длиной до 128 символов.{imageId}и{exportId}— это 24-символьные шестнадцатеричные идентификаторы, возвращаемые API.- Переименование ресурса через
PATCHодновременно изменяет отображаемое имяnameи имя в URL, а ответ возвращает текущее имя в URL, чтобы ты мог продолжать переходить по нему.
Параметра запроса owner не существует. Пути, привязанные к рабочему пространству, содержат владельца в пути, а эндпоинты, привязанные к аккаунту (/api/account/summary, /api/api-keys, /api/storage, /api/billing/*, /api/trash, /api/integrations/buckets), работают с тем рабочим пространством, которое выпустило ключ API. Чтобы работать с командным рабочим пространством, используй ключ API, созданный в этом пространстве.
Ограничения частоты запросов#
API применяет ограничения скользящего окна для каждого ключа API. Каждый маршрут относится к определенной категории, и у каждой категории есть независимый счетчик, поэтому 20 запросов предсказания не исчерпают твой лимит по умолчанию.
| Категория | Лимит | К чему относится |
|---|---|---|
| По умолчанию | 100 запросов/мин | Любой маршрут, не указанный ниже |
| Обучение | 10 запросов/мин | POST /api/training/start |
| Загрузка | 10 запросов/мин | Подписанные URL-адреса для загрузки, завершение загрузки и прием датасета |
| Предсказание | 20 запросов/мин | Инференс моделей и развертываний через маршруты Platform API |
| Экспорт | 20 запросов/мин | Маршруты экспорта моделей и маршруты экспорта/версионирования датасетов |
| Скачивание | 30 запросов/мин | Загрузка файлов моделей |
| Mutation | 10 запросов/мин | Получение списка ключей API, подключение или обнаружение облачного хранилища, а также действия с деплоем PATCH |
| Hydrate | 20 запросов/мин | POST /api/datasets/{owner}/{dataset}/images (получение выбранного набора изображений) |
| Clustering | 10 запросов/мин | GET /api/datasets/{owner}/{dataset}/images/clustering |
Маршруты Platform, доступные только из браузера (такие как оплата счетов и управление командой), имеют собственные лимиты, которые не распространяются на трафик по ключу API.
При ограничении частоты запросов API возвращает 429 с заголовками и 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"
}Выделенные эндпоинты (безлимитные)#
Выделенные эндпоинты не подпадают под ограничения лимита запросов API-ключа Platform, когда ты обращаешься напрямую к собственному serviceUrl деплоя (например, https://predict-abc123.run.app/predict). В таком случае пропускная способность зависит от конфигурации развернутого сервиса.
Когда ты получаешь 429, подожди Retry-After секунд (или пока не наступит X-RateLimit-Reset), прежде чем повторять попытку. О реализации экспоненциальной задержки читай в FAQ по лимитам запросов.
Формат ответа#
Успешные ответы#
Ответы представляют собой JSON-объекты с полями, специфичными для ресурсов. Универсального конверта нет: эндпоинты со списками возвращают именованную коллекцию вместе со счетчиками, а мутации возвращают измененные идентификаторы.
{
"datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
"total": 1,
"region": "us"
}Ответы, содержащие данные, также включают region (us, eu или ap) — регион хранения для этого рабочего пространства.
Ответы об ошибках#
Каждый ответ с ошибкой представляет собой JSON-объект с сообщением в error:
{
"error": "Dataset not found"
}| HTTP-статус | Значение |
|---|---|
200 | Успешно |
201 | Создано |
202 | Принято, работа продолжается асинхронно |
400 | Неверный путь, параметр запроса или тело запроса |
401 | Отсутствующая или недействительная аутентификация |
402 | Недостаточно кредитов (обучение) |
403 | Недостаточно прав, несоответствие тарифа или исчерпана квота |
404 | Ресурс не найден |
409 | Конфликт с текущим состоянием (дублирующееся имя, выполняющаяся задача) |
413 | Входные данные для предсказания слишком велики |
422 | Классы модели не соответствуют датасету (автоаннотирование) |
429 | Превышен лимит запросов |
500 | Ошибка сервера |
502 | Сбой внешнего провайдера или вызова сервиса |
503 | Зависимый сервис временно недоступен |
Пагинация#
Стиль пагинации зависит от коллекции:
| Стиль | Эндпоинты | Параметры |
|---|---|---|
| Только лимит | Списки датасетов, проектов, моделей, экспортов, деплоев | limit |
| Смещение и лимит | Изображения датасета, кластеризация изображений, поиск в Explore | offset, limit, а также hasMore в ответе |
| Курсор | Изображения датасета (большие датасеты) | cursor, includeTotal, а также nextCursor |
| Номер страницы | Корзина | page, limit, а также totalPages |
| Непрозрачный токен страницы | Логи деплоя | pageToken, а также nextPageToken |
API наборов данных#
Создавай, просматривай и управляй датасетами размеченных изображений для обучения моделей YOLO. См. документацию по датасетам.
Список наборов данных#
GET /api/datasets/{owner}Python SDK: client.datasets.list(owner)
Возвращает публичные датасеты владельца, а также приватные датасеты, если твой ключ имеет доступ к просмотру этого рабочего пространства.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное количество возвращаемых датасетов (по умолчанию: 1000, макс.: 1000) |
includeSamples | boolean | Включать превью примеров изображений (по умолчанию: true) |
includeImageUrls | boolean | Включать резервные URL примеров изображений в полном размере (по умолчанию: false) |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"Ответ:
{
"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"
}Получить набор данных#
GET /api/datasets/{owner}/{dataset}Python SDK: client.datasets.retrieve(owner, dataset)
Возвращает полный объект датасета под ключом dataset, включая classNames, splits, versions, source и определяемый пользователем объект metadata.
Создать набор данных#
POST /api/datasetsPython SDK: client.datasets.create(dataset=..., name=...)
Тело запроса:
{
"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"
}| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
dataset | string | Да | Имя датасета, используемое в URL Platform (строчные буквы, с дефисами, макс. 128 символов) |
name | string | Да | Отображаемое имя (макс. 100 символов) |
description | string | Нет | Описание (макс. 1000 символов) |
task | string | Нет | Тип задачи (по умолчанию: detect) |
classNames | массив | Нет | Имена классов в порядке индексов (макс. 25 000) |
format | string | Нет | Формат аннотаций: yolo (по умолчанию), coco, raw, ndjson |
visibility | string | Нет | public или private |
tags | массив | Нет | До 50 тегов по 50 символов каждый |
license | string | Нет | Идентификатор лицензии датасета |
metadata | объект | Нет | Пользовательские метаданные JSON |
owner | string | Нет | Идентификатор командного рабочего пространства; по умолчанию используется твое личное рабочее пространство |
Допустимые значения task при создании или обновлении набора данных: detect, segment, semantic, depth, classify,
pose и obb. Наборы данных глубины не имеют классов.
Ответ (201):
{
"id": "65f1c0a2b3d4e5f601234567",
"owner": "acme-vision",
"dataset": "warehouse",
"region": "us"
}Обновить набор данных#
PATCH /api/datasets/{owner}/{dataset}Python SDK: client.datasets.update(owner, dataset)
Тело запроса (частичное обновление):
{
"name": "Warehouse Safety",
"description": "New description",
"visibility": "public",
"metadata": { "location": "factory-2", "reviewed": true }
}Допустимые поля: name, description, visibility, metadata, tags, classNames, classColors, format, task, license, iconColor, iconLetter и starred. Отправь пустой объект metadata ({}), чтобы очистить пользовательские метаданные. Ключи метаданных ограничены 128 символами, а сериализованный объект — 500 000 символами.
Ответ:
{
"success": true,
"dataset": "warehouse-safety"
}Переименование изменяет имя в URL, поэтому для последующих запросов используй возвращаемое значение dataset.
Удалить набор данных#
DELETE /api/datasets/{owner}/{dataset}Python SDK: client.datasets.delete(owner, dataset)
Перемещает датасет в корзину, где его можно восстановить в течение 30 дней.
Клонирование набора данных#
POST /api/datasets/{owner}/{dataset}/clonePython SDK: client.datasets.clone(owner, dataset)
Копирует доступный датасет вместе с его изображениями и разметкой в твое личное рабочее пространство или командное рабочее пространство.
Необязательное тело запроса (все поля необязательны):
{
"dataset": "warehouse-copy",
"name": "Warehouse Copy",
"description": "Cloned for experimentation",
"visibility": "private",
"license": "CC-BY-4.0",
"owner": "acme-vision"
}Ответ (201): id, owner, dataset, name, imageCount, classCount и region. Датасеты, подкрепленные подключенным источником хранения, возвращают 409, так как их файлы не копируются.
Скачать экспорт датасета#
GET /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.export(owner, dataset)
Возвращает подписанный URL для скачивания NDJSON. Опусти v, чтобы экспортировать текущее состояние датасета, повторно используя кэшированный экспорт, если с момента его генерации ничего не изменилось.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
v | integer | Сохраненный номер версии (начиная с 1). Пропусти для текущего датасета. |
Ответ:
{
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"cached": true
}Запрос конкретной версии возвращает downloadUrl и version вместо cached.
Создать версию набора данных#
POST /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.create_export(owner, dataset)
Создает неизменяемый нумерованный снимок датасета и сохраняет его NDJSON-экспорт. Требует прав редактора.
Тело (необязательно):
{
"description": "Added 500 training images"
}Ответ:
{
"version": 3,
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"reused": false
}reused равен true, если датасет не изменился с предыдущей версии и вместо него был возвращен этот снимок.
Обновить описание версии#
PATCH /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.update_export(owner, dataset, version=..., description=...)
Тело запроса:
{
"version": 2,
"description": "Fixed mislabeled classes"
}Ответ: {"ok": true}
Восстановить версию набора данных#
POST /api/datasets/{owner}/{dataset}/restorePython SDK: client.datasets.restore(owner, dataset, version=...)
Воссоздает изображения, аннотации и классы из сохраненной версии без копирования байтов изображений.
Тело запроса:
{
"version": 2
}Ответ: {"version": 2, "imageCount": 1000}
Получить статистику датасета#
GET /api/datasets/{owner}/{dataset}/class-statsPython SDK: client.datasets.class_stats(owner, dataset)
Возвращает количество аннотаций по классам, гистограммы изображений и аннотаций, а также тепловые карты. Большие датасеты выбираются методом случайной выборки, в этом случае sampleSize сообщает, сколько изображений в ней участвовало.
Ответ (сокращенный):
{
"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
}Управление классами#
Объединить классы (переназначить аннотации целевому классу, а затем удалить исходные):
POST /api/datasets/{owner}/{dataset}/classes/mergePython SDK: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)
{
"sourceClassIds": [2, 4],
"targetClassId": 1
}Удалить классы (их аннотации удаляются, а оставшиеся ID классов смещаются вниз):
POST /api/datasets/{owner}/{dataset}/classes/deletePython SDK: client.datasets.delete_classes(owner, dataset, class_ids=...)
{
"classIds": [2, 4]
}Обе операции возвращают success, обновленные classNames и classColors, а также сводку изменений (mergedClassIds и targetClassId либо deletedClassIds и deletedAnnotations).
Поскольку оставшиеся ID смещаются после объединения или удаления, эти операции не являются идемпотентными. Повторно запроси датасет, чтобы получить актуальные индексы классов перед выполнением другой операции с классами.
Перераспределение выборок#
POST /api/datasets/{owner}/{dataset}/splits/redistributePython SDK: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)
Случайным образом перераспределяет изображения по выборкам. Сумма трех процентных значений должна составлять 100.
{
"train": 80,
"val": 20,
"test": 0
}Ответ: success, полученные значения splits и modified (количество перемещенных изображений).
Эмбеддинги набора данных#
GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddingsPython SDK: client.datasets.embeddings(owner, dataset), client.datasets.create_embeddings(owner, dataset), client.datasets.delete_embeddings(owner, dataset)
GET возвращает сводку анализа (analyzedAt, embeddingsCount, latestImageAt, activeJob). POST ставит в очередь анализ эмбеддингов и возвращает 202 с jobId. DELETE отменяет активную задачу и возвращает ID отмененной задачи или null.
Кластеризация изображений#
GET /api/datasets/{owner}/{dataset}/images/clusteringPython SDK: client.datasets.clustering(owner, dataset)
Возвращает 2D-раскладку UMAP по результатам завершенного анализа, с пагинацией по offset и limit (по умолчанию и макс. 50 000). Каждый элемент содержит id, umapX, umapY, split, classIds, width, height, bytes, labelCount и missing.
Список моделей, обученных на датасете#
GET /api/datasets/{owner}/{dataset}/modelsPython SDK: client.datasets.models(owner, dataset)
Ответ:
{
"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
}Список изображений датасета#
GET /api/datasets/{owner}/{dataset}/imagesPython SDK: client.datasets.images(owner, dataset)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное число возвращаемых изображений (по умолчанию: 50, макс.: 5000) |
offset | int | Количество пропускаемых изображений (по умолчанию: 0) |
cursor | string | ID последнего изображения с предыдущей страницы для курсорной пагинации |
includeTotal | boolean | Включить общее количество совпадений (по умолчанию: true) |
split | string | Фильтрация по выборке: train, val, test |
hasLabel | boolean | Фильтрация по состоянию аннотации |
hasError | boolean | Фильтрация по состоянию ошибки обработки |
classIds | string | ID классов через запятую; возвращает изображения, содержащие любые из них |
search | string | Поиск по подстроке в имени файла и пользовательских метаданных (макс. 200 символов) |
sort | string | newest (по умолчанию), oldest, name-asc, name-desc, height-asc, height-desc, width-asc, width-desc, size-asc, size-desc, labels-asc, labels-desc |
includeThumbnails | boolean | Включать подписанные URL миниатюр (по умолчанию: true) |
includeImageUrls | boolean | Включить подписанные URL изображений в полном размере (по умолчанию: false) |
includeLabels | boolean | Включить ограниченные аннотации предварительного просмотра (по умолчанию: false) |
Ответ:
{
"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"
}Получить выбранные изображения#
POST /api/datasets/{owner}/{dataset}/imagesPython SDK: client.datasets.selected_images(owner, dataset, image_ids=...)
Возвращает одинаковую форму изображения для заданного числа идентификаторов изображений (до 1000) и принимает те же параметры фильтрации и запроса URL, что и операция списка.
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Загрузка данных в датасет#
POST /api/datasets/{owner}/{dataset}/ingestPython SDK: client.datasets.ingest(owner, dataset, body=...)
Обрабатывает завершенную выгрузку, удаленный архив или подключенный источник хранения в существующий датасет. Укажи ровно один источник:
| Поле | Тип | Описание |
|---|---|---|
sessionId | string | Сеанс выгрузки из POST /api/upload/signed-url, уже завершенный |
sourceUrl | string | Публичный URL (HTTP или HTTPS) файла ZIP, TAR, TAR.GZ, TGZ или NDJSON (макс. 4096 символов) |
reference | объект | Подключенный источник: облачное хранилище (provider: "cloud", integrationId, target, prefix) или локальное решение (provider: "local", keyId, root, prefix) |
targetSplit | string | train, val или test; переопределяет структуру выборок архива |
conflictPolicy | string | skip, keep_both или replace при конфликтах имен файлов или содержимого |
classMapping | объект | Сопоставляет входящие имена классов с индексом класса, существующим или новым именем класса либо null для пропуска |
imageMetadata | объект | Пользовательские метаданные с ключами по относительному пути файла в архиве или значению NDJSON file |
Сеансы выгрузки привязываются к датасету по assetId, переданному в POST /api/upload/signed-url, и операция загрузки отклоняет сеанс, принадлежащий другому датасету.
Тело запроса (загруженный архив):
{
"sessionId": "session_abc123",
"targetSplit": "train"
}Тело запроса (удаленный архив или NDJSON):
{
"sourceUrl": "https://example.com/my-dataset.zip"
}Тело (импорт меток при последующей загрузке):
{
"sessionId": "session_abc123",
"classMapping": { "person": 0, "automobile": "forklift", "background": null }
}Тело (прикрепление метаданных к изображениям):
{
"sessionId": "session_abc123",
"imageMetadata": {
"airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
"images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
}
}Ключи метаданных должны соответствовать нормализованному пути внутри архива, включая папки. Для импорта в формате NDJSON каждая запись может содержать собственный объект metadata, который имеет приоритет над соответствующим элементом imageMetadata. Пути в архиве ограничены 1024 символами, ключи метаданных верхнего уровня — 128 символами, а каждый объект метаданных, как и вся карта imageMetadata, — 500 000 сериализованных символов.
Первая загрузка создает классы из архива автоматически. При последующих загрузках классы архива, отсутствующие в classMapping, сопоставляются с существующими классами датасета без учета регистра. Метки пропускаются только для классов, явно сопоставленных с null или не имеющих совпадающего существующего класса.
Ответ (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Загрузка одного изображения с метаданными с использованием Python
Тот же код обрабатывает группу изображений: добавь больше файлов в ZIP и соответствующие записи в 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 изображений#
Просмотр, аннотирование, перемещение и удаление изображений датасета по их 24-значному ID. См. документацию по аннотациям.
Получить изображение#
GET /api/images/{imageId}Python SDK: client.images.retrieve(image_id)
Возвращает metadata (пользовательские, определяемые пользователем), properties (имя файла, хэш, размеры, выборка, количество, метки времени), labels и classNames датасета.
Обновить изображение#
PATCH /api/images/{imageId}Python SDK: client.images.update(image_id, body=...)
Заменяет либо аннотации, либо пользовательские метаданные — отправь одну из двух структур, но не обе сразу.
Тело (аннотации):
{
"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] }
]
}Тело (метаданные):
{
"metadata": { "location": "strasbourg", "reviewed": true }
}Координаты меток используют нормализованные значения YOLO от 0 до 1. Ограничивающие рамки используют [x_center, y_center, width, height]. Метки сегментации используют segments — сглаженный список вершин полигона [x1, y1, x2, y2, ...]. Метки поз используют keypoints в едином плоском формате: пары [x1, y1, x2, y2, ...] или тройки [x1, y1, v1, x2, y2, v2, ...], где видимость условно обозначается как 0, 1 или 2. Ориентированные рамки используют углы obb. Сохраненные координаты округляются до 5 знаков после запятой, и одно изображение может содержать не более 10 000 аннотаций.
Удалить изображение#
DELETE /api/images/{imageId}Python SDK: client.images.delete(image_id)
Безвозвратно удаляет одно изображение и его аннотации.
Автоматически аннотировать изображение#
POST /api/images/{imageId}/predictPython SDK: client.images.predict(image_id, model_id=...)
Запускает вывод YOLO на изображении и возвращает предсказанные аннотации. Они не сохраняются — запиши результаты обратно с помощью PATCH /api/images/{imageId}, когда тебя все устроит.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
modelId | string | Да | Полный URI модели, ul://{owner}/{project}/{model} |
confidence | float | Нет | Порог уверенности, 0.01 – 1.0 (по умолчанию: 0.25) |
iou | float | Нет | Порог IoU для подавления не максимальных значений (NMS), 0.0 – 0.95 (по умолчанию: 0.7) |
Ответ: success, predictions (объекты аннотаций), modelUsed и inferenceTime. Модель, чьи классы не соответствуют датасету, возвращает 422.
Массовое перемещение изображений#
PATCH /api/images/bulkPython SDK: client.images.update_bulk(image_ids=..., split=...)
Перемещает до 1000 изображений из одного датасета в другую выборку.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"],
"split": "val",
"conflictPolicy": "skip"
}Конфликты имен файлов или содержимого возвращают 409, пока ты не выберешь общее для всей корзины значение conflictPolicy (skip, keep_both или replace). В ответе содержатся modifiedCount, skippedCount и targetSplit.
Массовое удаление изображений#
DELETE /api/images/bulkPython SDK: client.images.delete_bulk(image_ids=...)
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Удаляет до 1000 изображений из одного датасета и возвращает deletedCount и deletedImageIds.
Получить подписанные URL изображений#
POST /api/images/urlsPython SDK: client.images.urls(image_ids=...)
Возвращает временные подписанные URL для до 100 ID изображений из одного датасета.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"]
}Ответ: urls и thumbnails, оба с ключами по ID изображения.
API проектов#
Организуй свои модели по проектам. Каждая модель принадлежит одному проекту. См. документацию по проектам.
Список проектов#
GET /api/projects/{owner}Python SDK: client.projects.list(owner)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное число возвращаемых проектов (по умолчанию: 20, макс.: 500) |
Получить проект#
GET /api/projects/{owner}/{project}Python SDK: client.projects.retrieve(owner, project)
Возвращает объект project, массив models со сводками по каждой модели (статус, метрики, эпохи, веса, аргументы обучения) и isOwner.
Создать проект#
POST /api/projectsPython SDK: client.projects.create(project=..., name=...)
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
project | string | Да | Имя проекта, используемое в URL Платформы |
name | string | Да | Отображаемое имя (макс. 100 символов) |
description | string | Нет | Описание (макс. 1000 символов) |
visibility | string | Нет | public или private |
tags | массив | Нет | До 50 тегов |
license | string | Нет | Идентификатор лицензии проекта |
metadata | объект | Нет | Пользовательские метаданные JSON |
owner | string | Нет | Идентификатор командного рабочего пространства; по умолчанию используется твое личное рабочее пространство |
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Ответ (201): id, owner, project, region.
Обновить проект#
PATCH /api/projects/{owner}/{project}Python SDK: client.projects.update(owner, project)
Допустимые поля: name, description, visibility, metadata, tags, license, archived, iconColor, iconLetter, viewPreferences и starred.
{
"metadata": { "department": "research", "program": "inspection" }
}Отправь пустой объект metadata ({}), чтобы очистить его. Метаданные проекта используют те же ограничения в 128 символов для ключа и 500 000 символов для сериализованного объекта, что и метаданные датасета.
Удалить проект#
DELETE /api/projects/{owner}/{project}Python SDK: client.projects.delete(owner, project)
Перемещает проект и его модели в корзину, возвращая cascadedModels.
Клонировать проект#
POST /api/projects/{owner}/{project}/clonePython SDK: client.projects.clone(owner, project)
Клонирует доступный проект и его завершенные модели. Необязательное тело принимает project, name, description, visibility, license и целевой owner.
API моделей#
Управляй обученными моделями YOLO: просматривай метрики, скачивай веса, запускай вывод и мониторь обучение. См. документацию по моделям.
Список моделей в проекте#
GET /api/models/{owner}/{project}Python SDK: client.models.list(owner, project)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное число возвращаемых моделей (по умолчанию: 20, макс.: 100) |
Получить модель#
GET /api/models/{owner}/{project}/{model}Python SDK: client.models.retrieve(owner, project, model)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
analysis | int | Установи значение 1, чтобы возвращать анализ валидации по изображениям вместо модели |
Ответ по умолчанию содержит объект model — статус, задачу, метрики, trainArgs, trainResults, classNames, computeCost, metadata и многое другое, а также isOwner.
Создать модель#
POST /api/modelsPython SDK: client.models.create(body=...)
Создает запись необученной модели, к которой можно привязать веса или которую можно обучить.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
project | string | Да | Имя целевого проекта |
owner | string | Нет | Имя рабочего пространства (хэндл); по умолчанию используется твое личное рабочее пространство |
model | string | Нет | Имя модели, используемое в URL Платформы; генерируется автоматически, если не указано |
name | string | Нет | Отображаемое имя (принимается только вместе с model) |
description | string | Нет | Описание (макс. 1000 символов) |
task | string | Нет | detect, segment, semantic, depth, classify, pose или obb |
metadata | объект | Нет | Пользовательские метаданные JSON |
trainArgs | объект | Нет | Аргументы обучения для записи |
metrics | объект | Нет | Метрики, такие как mAP50, mAP50-95, precision, recall |
epochs | number | Нет | Количество эпох для уже обученной модели |
version | string | Нет | Метка версии (макс. 50 символов) |
Ответ (201): id, owner, project, model, region.
Чтобы привязать веса .pt, запроси подписанный URL для выгрузки с помощью assetType: "models" и id этой модели в качестве assetId, загрузи файл (PUT) по полученному URL, а затем вызови POST /api/upload/complete с возвращенным sessionId.
Обновить модель#
PATCH /api/models/{owner}/{project}/{model}Python SDK: client.models.update(owner, project, model)
Допустимые поля включают name, description, color, metadata, status, license, datasetSlug, trainArgs, trainResults, epochs, bestEpoch, bestFitness, version, trainingError и starred.
{
"metadata": { "release": "candidate-3", "reviewed": true }
}Пользовательский параметр metadata отделен от полей, управляемых процессом обучения, таких как trainArgs, environment и trainResults, и использует те же ограничения по размеру, что и метаданные датасета.
Удалить модель#
DELETE /api/models/{owner}/{project}/{model}Python SDK: client.models.delete(owner, project, model)
Перемещает модель в корзину на 30 дней.
Скачать файлы модели#
GET /api/models/{owner}/{project}/{model}/filesPython SDK: client.models.files(owner, project, model)
Возвращает недолговечные подписанные URL для весов модели.
{
"files": [
{
"name": "best.pt",
"size": 6534127,
"downloadUrl": "https://storage.googleapis.com/...&signature=..."
}
]
}Клонирование модели#
POST /api/models/{owner}/{project}/{model}/clonePython SDK: client.models.clone(owner, project, model, project_body=...)
Копирует доступную модель в существующий проект.
{
"owner": "acme-vision",
"project": "inspection",
"model": "v3-copy",
"name": "V3 Copy",
"description": "Cloned from a public model"
}| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
project | string | Да | Имя целевого проекта |
owner | string | Нет | Целевое рабочее пространство; по умолчанию используется твое личное |
model | string | Нет | Имя целевой модели |
name | string | Нет | Отображаемое имя целевого объекта |
description | string | Нет | Описание для клона |
Запусти вывод#
POST /api/models/{owner}/{project}/{model}/predictPython SDK: client.models.predict(owner, project, model, body=...)
Публичные модели можно запускать на предсказание без аутентификации. Для приватных и общих моделей требуется API-ключ с доступом к родительскому проекту.
Multipart Form:
| Параметр | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
file | файл | - | - | Файл изображения или видео (обязательно, если не задано source) |
conf | float | 0.25 | 0.01 – 1.0 | Минимальный порог достоверности |
iou | float | 0.7 | 0.0 – 0.95 | Порог NMS IoU |
imgsz | int | 640 | 32 – 1280 | Размер входного изображения в пикселях |
normalize | bool | false | - | Возвращать координаты рамки в диапазоне 0–1 |
decimals | int | 5 | 0 – 10 | Десятичная точность для значений координат |
bits | int | 8 | 8, 12, 16 | Квантование карты глубин, только для моделей глубины |
source | string | - | - | URL изображения или строка base64 (альтернатива file) |
Укажи либо file, либо source. Модели глубины также принимают bits (8, 12 или 16) для выбора квантования PNG карты глубины. Запросы, превышающие входные ограничения сервиса, возвращают 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Ответ:
Каждая запись в images содержит shape, speed, results, а для задач плотного предсказания — полезные данные PNG в виде semantic_mask или depth (значения глубины равны pixel × max / divisor, с делителем 255 для карты по умолчанию на 8 бит и 65535, когда bits равно 12 или 16). Объект metadata сообщает количество изображений, тайминги функций, задачу и версии сервиса. Внутренние пути моделей никогда не возвращаются.
{
"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" }
}
}Проверить прогресс обучения#
GET /api/models/{owner}/{project}/{model}/trainingPython SDK: client.models.training(owner, project, model)
Возвращает job, содержащий статус, прогресс эпох, тайминги, детали вычислений, аргументы обучения, метрики эпох и подробную информацию об ошибке в безопасном формате, либо null, если модель никогда не обучалась. Модели в публичных проектах доступны для чтения без аутентификации.
Отменить обучение#
DELETE /api/models/{owner}/{project}/{model}/trainingPython SDK: client.models.delete_training(owner, project, model)
Завершает работу выполняющегося вычислительного экземпляра и помечает задание отмененным. Возвращает 409, когда обучение больше неактивно.
API обучения#
Запусти обучение YOLO на облачных GPU и отслеживай прогресс в реальном времени. См. документацию по облачному обучению.
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Получить доступность GPU#
GET /api/training/gpu-availabilityPython SDK: client.training.gpu_availability()
Возвращает текущий статус наличия ресурсов с ключом по ID GPU. Публично и без аутентификации; передай managed=true, чтобы включить управляемую емкость для обучения, для которой требуется API-ключ.
Начать обучение#
POST /api/training/startPython SDK: client.training.start(model_id=..., train_args=...)
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
modelId | string | Да | ID модели для обучения |
trainArgs | объект | Да | Аргументы обучения YOLO; model, data и epochs являются обязательными |
gpuType | string | Нет | Облачный GPU для использования (по умолчанию: rtx-4090) |
captureDatasetVersion | boolean | Нет | Сохранить неизменяемую версию датасета для этого запуска (по умолчанию: 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Ответ:
{
"modelId": "65f1c0a2b3d4e5f601234599",
"status": "starting",
"gpuType": "rtx-4090",
"estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
"billing": {
"estimatedCostCents": 138,
"estimatedCostDisplay": "$1.38",
"balanceCents": 2500
}
}Обучение возвращает 402, если твой баланс кредитов слишком мал, и 503, если для запрошенного GPU нет свободных мощностей.
Доступно 26 типов GPU, от rtx-2000-ada до b300, включая rtx-4090, l40s, a100-80gb-pcie, a100-80gb-sxm, rtx-pro-6000, h100-sxm, h200-sxm и b200. Полный список с ценами см. в разделе Облачное обучение.
API экспорта#
Конвертируй модели в оптимизированные форматы, такие как ONNX, TensorRT, CoreML и LiteRT, для развертывания на периферийных устройствах. См. документацию по развертыванию.
Список экспортов#
GET /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.list(owner, project, model)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
status | string | Фильтрация по queued, starting, running, completed, failed или cancelled |
limit | int | Максимальное количество возвращаемых экспортов (по умолчанию: 20, макс.: 100) |
Создать экспорт#
POST /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.create(owner, project, model, format=...)
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
format | string | Да | Целевой формат экспорта (см. таблицу ниже) |
gpuType | string | Условный параметр | Обязательно, когда format равен engine; используй поддерживаемую цель GPU или Jetson |
args | объект | Нет | Параметры экспорта: imgsz, quantize, dynamic, simplify, opset, conf, iou, batch, workspace, nms, end2end, optimize, keras и name (целевое устройство для форматов RKNN, QNN, Hailo и 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Ответ (201): id, format, status (queued или running), gpuType, region. Аналогичный экспорт, который уже выполняется, возвращает 409.
Поддерживаемые форматы:
Используй аргумент format из общей таблицы экспорта ниже. PyTorch является исходным форматом и не является целью экспорта API.
| Формат | Аргумент format | Модель | Метаданные | Аргументы |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
Получить статус экспорта#
GET /api/models/{owner}/{project}/{model}/exports/{exportId}Python SDK: client.exports.retrieve(owner, project, model, export_id)
Возвращает объект export с status, format, args, gpuType, метками времени и — после завершения — объектом file, содержащим size, downloadUrl и downloadFilename.
Отмена или удаление экспорта#
DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}Python SDK: client.exports.delete(owner, project, model, export_id)
Отменяет активный экспорт или удаляет завершенный вместе с его файлом. В ответе сообщается, что именно произошло:
{
"success": true,
"action": "cancelled"
}API развертываний#
Развертывай модели на выделенных эндпоинтах инференса с проверками работоспособности и мониторингом. См. документацию по эндпоинтам.
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Список развертываний#
GET /api/deployments/{owner}Python SDK: client.deployments.list(owner)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
status | string | creating, deploying, ready, stopping, stopped или failed |
model | string | Фильтрация по {project}/{model}, например inspection/v3 |
limit | int | Максимальное количество возвращаемых развертываний (по умолчанию: 20, макс.: 100) |
Анонимные вызовы должны фильтроваться по одной публичной модели; для получения списка всего рабочего пространства требуется аутентификация.
Создать развертывание#
POST /api/deployments/{owner}Python SDK: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)
Тело запроса:
{
"project": "inspection",
"model": "v3",
"deployment": "edge-1",
"name": "Edge 1",
"region": "us-central1"
}| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
project | string | Да | Проект, содержащий модель |
model | string | Да | Модель для развертывания |
deployment | string | Да | Имя развертывания, используемое в URL Platform |
name | string | Да | Отображаемое имя |
region | string | Да | Один из 42 поддерживаемых регионов развертывания |
Ответ (201): id, deployment, status (creating), message и region.
Процессор, память и масштабирование экземпляров управляются Platform в рамках лимитов твоего плана, и запрос на создание не принимает конфигурацию ресурсов. Текущие значения возвращаются в объекте resources при каждом чтении развертывания.
Выбирай регион ближе к пользователям для минимальной задержки. В интерфейсе Platform отображаются оценки задержки для всех 42 доступных регионов.
Получить развертывание#
GET /api/deployments/{owner}/{deployment}Python SDK: client.deployments.retrieve(owner, deployment)
Возвращает объект deployment с status, statusMessage, region, serviceUrl и resources.
Запуск, остановка или замена развертывания#
PATCH /api/deployments/{owner}/{deployment}Python SDK: client.deployments.update(owner, deployment, body=...)
Единственное поле action задает операцию:
{ "action": "start" }Замена развертывает новую ревизию, сохраняя ID развертывания, регион и URL эндпоинта; существующая ревизия остается активной в случае сбоя развертывания. Заменяющая модель должна быть завершенной моделью с весами, к которым у твоего ключа есть доступ. Завершенные операции возвращают 200 с status ready или stopped; операции, которые все еще развертываются, возвращают 202 с deploying или stopping.
Удалить развертывание#
DELETE /api/deployments/{owner}/{deployment}Python SDK: client.deployments.delete(owner, deployment)
Безвозвратно удаляет эндпоинт инференса.
Проверка работоспособности#
GET /api/deployments/{owner}/{deployment}/healthPython SDK: client.deployments.health(owner, deployment)
Пингует и прогревает эндпоинт, возвращая healthy, latencyMs и код вышестоящего сервера status.
Запуск инференса на развертывании#
POST /api/deployments/{owner}/{deployment}/predictPython SDK: client.deployments.predict(owner, deployment, body=...)
Направляет изображение или видео через выделенный эндпоинт. Контракты запроса и ответа соответствуют инференсу модели.
Multipart Form:
| Параметр | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
file | файл | - | - | Файл изображения или видео (обязательно, если не задано source) |
conf | float | 0.25 | 0.01 – 1.0 | Минимальный порог достоверности |
iou | float | 0.7 | 0.0 – 0.95 | Порог NMS IoU |
imgsz | int | 640 | 32 – 1280 | Размер входного изображения в пикселях |
normalize | bool | false | - | Возвращать координаты рамки в диапазоне 0–1 |
decimals | int | 5 | 0 – 10 | Десятичная точность для значений координат |
bits | int | 8 | 8, 12, 16 | Квантование карты глубин, только для моделей глубины |
source | string | - | - | URL изображения или строка base64 (альтернатива file) |
Получить метрики#
GET /api/deployments/{owner}/{deployment}/metricsPython SDK: client.deployments.metrics(owner, deployment)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
range | string | 1h, 6h, 24h (по умолчанию), 7d или 30d |
sparkline | boolean | Вернуть компактную сводку панели управления вместо полных рядов (по умолчанию: false) |
Полный ответ содержит summary (всего запросов, частота ошибок, средняя задержка и p50/p95/p99) и timeSeries (запросы, ошибки, задержка, CPU, память, количество экземпляров). Ответ со спарклайнами возвращает requests24h, totalRequests, errorRate и avgLatencyMs.
Получить логи#
GET /api/deployments/{owner}/{deployment}/logsPython SDK: client.deployments.logs(owner, deployment)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
severity | string | Через запятую: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY |
limit | int | Количество записей для возврата (по умолчанию: 50, макс.: 200) |
pageToken | string | Токен пагинации из предыдущего ответа |
API корзины#
Просмотр, восстановление и безвозвратное удаление проектов, датасетов и моделей, перемещенных в корзину. Элементы удаляются автоматически через 30 дней. См. документацию по корзине.
Список корзины#
GET /api/trashPython SDK: client.lifecycle.trash()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
type | string | all (по умолчанию), project, dataset или model |
page | int | Номер страницы (по умолчанию: 1) |
limit | int | Элементов на странице (по умолчанию: 50, макс: 200) |
Ответ включает items (каждый с daysRemaining), total, page, limit, totalPages и summary с итогами по типам.
Восстановить элемент#
POST /api/trashPython SDK: client.lifecycle.restore(id=..., type=...)
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Восстановление проекта также восстанавливает модели, которые были отправлены в корзину вместе с ним, они возвращаются как restoredModels.
Безвозвратное удаление#
DELETE /api/trashPython SDK: client.lifecycle.delete_trash(body=...)
Удалить один элемент:
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Или очистить всю корзину целиком:
{
"all": true
}В ответе сообщается deletedCount, а также cascadedModels и survivingDeployments, где применимо.
Безвозвратное удаление нельзя отменить. Ресурс и все связанные данные удаляются.
Upload API#
Загружай файлы напрямую в облачное хранилище с помощью подписанных URL. Завершение загрузки модели прикрепляет ее веса; завершение загрузки архива датасета регистрирует сеанс, который затем передается в модуль импорта датасетов. См. документацию по данным.
Получить подписанный URL для загрузки#
POST /api/upload/signed-urlPython SDK: client.upload.signed_url(body=...)
Тело запроса:
{
"assetType": "datasets",
"assetId": "65f1c0a2b3d4e5f601234567",
"filename": "warehouse.zip",
"contentType": "application/zip",
"totalBytes": 52428800
}| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
assetType | string | Да | datasets, models, images или videos |
assetId | string | Да | ID целевого датасета или модели |
filename | string | Да | Имя файла оригинала (макс. 256 символов) |
contentType | string | Да | MIME-тип |
totalBytes | number | Да | Размер файла в байтах |
Когда assetType равен datasets, filename должен заканчиваться на .zip, .tar, .tar.gz, .tgz или .ndjson. Упакуй отдельные изображения в архив перед загрузкой.
Ответ:
{
"sessionId": "session_abc123",
"uploadUrl": "https://storage.googleapis.com/...&signature=...",
"expiresAt": "2026-02-22T12:00:00Z"
}Загрузи файл запросом PUT на адрес uploadUrl, используя объявленный тобой Content-Type.
Завершить загрузку#
POST /api/upload/completePython SDK: client.upload.complete(session_id=...)
{
"sessionId": "session_abc123",
"checksum": "<optional sha-256 hex>"
}Ответ: success и объект file с size и contentType. Для моделей это прикрепляет веса; для архивов датасетов вызови ingest следующим шагом для запуска обработки.
API интеграций с хранилищами#
Подключай аккаунты Google Cloud Storage, Amazon S3 или Azure Blob Storage только для чтения и просматривай их как источники датасетов. См. документацию по интеграциям.
Список интеграций#
GET /api/integrations/bucketsPython SDK: client.storage_integrations.list()
Возвращает integrations, каждая из которых содержит id, provider, credentialIdentity, targets и createdAt. Учетные данные никогда не возвращаются.
Обнаружение хранилищ#
POST /api/integrations/buckets/discoverPython SDK: client.storage_integrations.discover(body=...)
Перечисляет бакеты или контейнеры, доступные для чтения с предоставленными учетными данными, без их сохранения.
{
"provider": "gcs",
"credentials": {
"client_email": "svc@project.iam.gserviceaccount.com",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"project_id": "my-project"
}
}Ответ: {"targets": ["my-bucket", "another-bucket"]}
Подключить хранилище#
POST /api/integrations/bucketsPython SDK: client.storage_integrations.create(body=...)
Те же форматы учетных данных, что и при обнаружении, плюс обязательный массив targets, содержащий от 1 до 50 имен бакетов или контейнеров. Возвращает 201 с сохраненной интеграцией. Временные учетные данные S3 (ключи доступа ASIA) отклоняются.
Обзор объектов#
GET /api/integrations/buckets/{id}/objectsPython SDK: client.storage_integrations.objects(id, target=...)
Параметры запроса:
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
target | string | Да | Имя бакета или контейнера |
prefix | string | Нет | Префикс папки (макс. 1024 символа) |
cursor | string | Нет | Курсор пагинации провайдера с предыдущей страницы |
Возвращает entries (каждый элемент kind является folder или file) и необязательный cursor для следующей страницы.
Отключить хранилище#
DELETE /api/integrations/buckets/{id}Python SDK: client.storage_integrations.delete(id)
Удаляет сохраненные учетные данные без удаления данных провайдера. Подключенные датасеты остаются видимыми, но их файлы будут недоступны до тех пор, пока то же хранилище не будет подключено снова. Требуется доступ администратора рабочего пространства.
API импорта датасетов#
Импортируй датасеты из сторонних сервисов. См. интеграцию с Roboflow.
Предпросмотр импорта из Roboflow#
POST /api/integrations/roboflow/previewPython SDK: client.datasets.preview_roboflow(api_key=...)
Преобразует API-ключ Roboflow в план импорта: данные о рабочем пространстве, newDatasets, которые будут импортированы, количество пропущенных, неподдерживаемых и неразрешенных проектов, bytesTotal, а также свободное пространство storage. API-ключ Roboflow считывается из тела запроса и не сохраняется.
{
"apiKey": "ROBOFLOW_API_KEY"
}Импорт из Roboflow#
POST /api/integrations/roboflow/importPython SDK: client.datasets.import_roboflow(api_key=..., items=...)
Ставит в очередь задания на загрузку для не более чем 500 выбранных версий проектов Roboflow, используя элементы, возвращенные предварительным просмотром.
{
"apiKey": "ROBOFLOW_API_KEY",
"items": [
{
"workspace": "my-workspace",
"projectId": "warehouse-safety",
"projectName": "Warehouse Safety",
"projectType": "object-detection",
"latestVersion": 4
}
]
}Ответ (201): массивы imported, failed и skipped. Для импорта требуется свободное место в хранилище, и каждый набор данных должен соответствовать ограничению размера на один импорт в твоем плане.
API аккаунта#
Просмотр аккаунта Platform, ключей, хранилища и публичных профилей. См. документацию по настройкам.
Сводка учетной записи#
GET /api/account/summaryPython SDK: client.account.summary()
Возвращает план, баланс кредитов и количество ресурсов для рабочего пространства, выдавшего ключ.
{
"username": "acme-vision",
"name": "Acme Vision",
"accountType": "team",
"plan": "pro",
"creditsCents": 2500,
"counts": { "projects": 4, "datasets": 7, "models": 21 },
"teams": []
}teams заполняется для сеансов браузера. Ответы с API-ключом возвращают пустой список, поскольку ключ уже привязан к одному рабочему пространству.
Список API keys#
GET /api/api-keysPython SDK: client.account.api_keys()
Возвращает keys с keyId, name, keyPrefix и createdAt для рабочего пространства ключа. Запросы, аутентифицированные по API-ключу, получают только метаданные; полные значения ключей отображаются владельцу рабочего пространства в разделе Настройки > API-ключи в пользовательском интерфейсе Platform, где ключи также создаются и отзываются.
Проверка использования хранилища#
GET /api/storagePython SDK: client.account.storage()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
details | boolean | Включить десять крупнейших потребителей хранилища (по умолчанию: false) |
Ответ:
{
"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"
}Получить публичный профиль пользователя#
GET /api/usersPython SDK: client.account.profile(username=...)
Параметры запроса:
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
username | string | Да | Имя пользователя для поиска |
Возвращает публичный профиль user с followerCount и, для аутентифицированных пользователей, isFollowed.
Подписаться на пользователя или отписаться от него#
PATCH /api/usersPython SDK: client.account.follow(username=..., followed=...)
{
"username": "target-user",
"followed": true
}Ответ: followed и обновленный followerCount.
API биллинга#
Проверка использования плана и журнала кредитов. См. документацию по биллингу.
Суммы в биллинге выражаются в центах США в виде целых чисел, где 100 = $1.00.
Просмотр плана и использования#
GET /api/billing/usage-summaryPython SDK: client.billing.usage_summary()
Возвращает plan (ID, статус, расчетный цикл, окончание периода), metrics (лимит хранилища и использование), trainingCredit, features, creditsCents и количество мест.
Просмотр транзакций#
GET /api/billing/transactionsPython SDK: client.billing.transactions()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
from | string | Метка времени самой ранней транзакции (ISO 8601) |
to | string | Метка времени самой последней транзакции (ISO 8601) |
Каждая транзакция включает id, type (например, purchase, training, monthly_grant или refund), amountCents, balanceAfter, createdAt, необязательный receiptUrl и контекст модели для начислений за обучение. Внутренние данные биллинга никогда не возвращаются.
Explore API#
Поиск публичных проектов и наборов данных, которыми поделилось сообщество. См. документацию по обзору.
Поиск общедоступного контента#
GET /api/explore/searchPython SDK: client.explore.search()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
q | string | Поисковый запрос (макс. 200 символов) |
type | string | all (по умолчанию), projects или datasets |
sort | string | newest (по умолчанию), oldest, stars, name-asc, name-desc, count-desc, count-asc |
offset | int | Результаты для пропуска (по умолчанию: 0) |
limit | int | Максимальное количество результатов на тип ресурса (по умолчанию: 20, макс.: 100) |
task | string | Фильтры задач, разделенные запятыми: detect, segment, semantic, depth, classify, pose, obb |
author | string | Фильтр по имени пользователя владельца |
starred | boolean | Возвращать только контент, отмеченный звездкой аутентифицированным пользователем; требуется API-ключ |
Ответ: projects, datasets и hasMore.
curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"Python SDK#
ultralytics-platform — это типизированный клиент Python, сгенерированный из контракта OpenAPI, с одним методом для каждой конечной точки (client.datasets.list, client.models.predict, client.exports.create и т. д.). Каждый метод принимает параметры пути позиционно, остальные входные данные — в качестве аргументов ключевых слов, а также необязательные параметры timeout и extra_headers для каждого запроса.
pip install "ultralytics-platform>=0.1.5" # Python 3.11+from ultralytics_platform import Platform
with Platform() as client: # reads ULTRALYTICS_API_KEY
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 предоставляет то же дерево ресурсов для кода async/await, неуспешные ответы вызывают APIError с status_code, body и разобранным json, а сбои соединения вызывают APIConnectionError. Полный файл README см. в репозитории SDK.
Интеграция с Python#
Для рабочих процессов обучения и инференса используй пакет Python Ultralytics, который автоматически обрабатывает аутентификацию, выгрузку и потоковую передачу метрик в реальном времени.
Установка и настройка#
pip install "ultralytics>=8.4.120"Проверь установку:
yolo checkАутентификация#
yolo login YOUR_API_KEYИспользование датасетов платформы#
Ссылка на датасеты с помощью 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,
)Формат URI:
| Шаблон | Описание |
|---|---|
ul://username/datasets/slug | Датасет |
ul://username/project-name | Проект |
ul://username/project/model-name | Конкретная модель |
ul://ultralytics/yolo26/yolo26n | Официальная модель |
Отправка на платформу#
Отправляй результаты в проект на платформе:
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",
)Что синхронизируется:
- Метрики обучения (в реальном времени)
- Финальные веса модели
- Графики валидации
- Вывод консоли
- Системные метрики
Примеры API#
Загрузи модель с платформы:
# Your own model
model = YOLO("ul://username/project/model-name")
# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")Запусти инференс:
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Экспорт модели:
# 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Валидация:
metrics = model.val(data="ul://username/datasets/my-dataset")
print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")FAQ#
Используй те же сегменты владельца и имени, которые отображаются в URL Platform. Модель по адресу
https://platform.ultralytics.com/acme-vision/inspection/v3имеет видGET /api/models/acme-vision/inspection/v3. Идентификаторы базы данных по-прежнему возвращаются в ответах (какid), и некоторые маршруты принимают их напрямую — маршруты изображений принимаютimageId, выгрузки принимаютassetId, аPOST /api/training/startпринимаетmodelId.Это зависит от коллекции. Большинство эндпоинтов списка принимают
limit:curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"Изображения наборов данных, кластеризация и поиск Explore используют
offsetсlimitи возвращаютhasMore:curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"По очень большим наборам изображений лучше перемещаться с помощью курсора, возвращаемого как
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"Корзина использует
page, а логи развертывания используют непрозрачныйpageToken, возвращаемый какnextPageToken.Да. Каждая операция на этой странице представляет собой обычный запрос HTTPS, а полный контракт опубликован как OpenAPI 3.2 по адресу platform.ultralytics.com/openapi.json, который ты можешь передать генератору клиентов на любом языке. Пакет
ultralytics-platform— это именно он: типизированный клиент, сгенерированный из контракта, в то время как пакетultralyticsдобавляет потоковую передачу метрик в реальном времени и автоматическую выгрузку моделей поверх обучения и инференса. Потоки учетных записей, доступные только во время сеанса браузера, такие как оформление счета и управление командами, остаются в пользовательском интерфейсе Platform UI.Используй заголовок
Retry-Afterиз ответа429, чтобы выждать нужное время: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означает, что ресурс не существует или вообще не виден твоему ключу.403означает, что ресурс был найден, но для действия требуется больше прав, чем есть у твоего ключа: права редактора для изменения набора данных, права владельца для удаления развертывания, права администратора для отключения хранилища либо более высокий план или квота для экспорта и развертывания.Чтение публичных наборов данных, проектов и моделей, включая их изображения, подписанные URL изображений, статистику классов, статус вложения, макет кластеризации и список экспорта; проверка хода обучения публичной модели; загрузка файлов публичной модели; запуск инференса на публичной модели; поиск публичного профиля пользователя; просмотр списка развертываний, отфильтрованных по одной публичной модели; и поиск в Explore.
GET /api/training/gpu-availabilityявляется полностью публичным, если ты не запрашиваешь управляемую емкость. Все остальное требует ключа, а предоставление его для публичного эндпоинта также раскрывает твои частные ресурсы.