Ultralytics Upload API
Upload files directly to cloud storage using signed URLs for fast, reliable transfers. See Data documentation.
Upload files directly to cloud storage using signed URLs for fast, reliable transfers. See Data documentation.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/ultralytics:ultralytics-upload-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Ultralytics Platform Upload API
summary: Build, train, and deploy YOLO models with the Ultralytics Platform REST API.
version: 0.1.84
description: The Ultralytics Platform API lets you manage datasets, train models on cloud GPUs, deploy inference endpoints, and more — all from your own code. See the Quickstart to get started.
termsOfService: https://www.ultralytics.com/legal/terms-of-service
contact:
name: Ultralytics
url: https://www.ultralytics.com
license:
name: AGPL-3.0
identifier: AGPL-3.0-only
url: https://www.ultralytics.com/license
servers:
- url: https://platform.ultralytics.com
description: Production
security:
- BearerAuth: []
tags:
- name: Upload
description: Upload files directly to cloud storage using signed URLs for fast, reliable transfers. See Data documentation.
externalDocs:
description: Data documentation
url: https://docs.ultralytics.com/platform/data
paths:
/api/upload/complete:
post:
summary: Confirm file upload
tags:
- Upload
operationId: post_api_upload_complete
description: Call this after uploading a file to the signed URL. Dataset uploads are verified here, then processed by the dataset ingest endpoint.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
sessionId:
type: string
minLength: 1
maxLength: 128
description: Upload session ID from signed-url response
example: 507f1f77bcf86cd799439011
checksum:
type: string
maxLength: 128
md5:
description: Expected uploaded object MD5 digest in hexadecimal
type: string
maxLength: 32
pattern: ^[0-9a-f]{32}$
required:
- sessionId
description: Mark an upload session complete
responses:
'200':
description: Upload confirmed
content:
application/json:
schema:
$ref: '#/components/schemas/UploadCompleteResponse'
'400':
description: Invalid upload session or asset ID
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Upload session access denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Upload session, file, or asset not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'409':
description: Upload completion conflicts with another request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Upload completion failed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codeSamples:
- label: Python SDK
lang: Python
source: "from ultralytics_platform import Platform\n\nclient = Platform() # Reads ULTRALYTICS_API_KEY\nresponse = client.upload.complete(\n session_id=\"507f1f77bcf86cd799439011\",\n)\nprint(response)"
/api/upload/signed-url:
post:
summary: Get a file upload URL
tags:
- Upload
operationId: post_api_upload_signed_url
description: 'Generates a pre-signed URL for uploading a file directly to cloud storage. Upload the file with a PUT request to the returned URL and headers, then confirm it with /api/upload/complete. Dataset uploads can skip that call: the dataset ingest endpoint completes the upload when given the returned sessionId. Dataset upload URLs remain valid for 12 hours, are create-only, and filenames must end in .zip, .tar, .tar.gz, .tgz, or .ndjson — package loose images into an archive.'
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- type: object
properties:
assetId:
type: string
minLength: 1
maxLength: 128
example: 507f1f77bcf86cd799439011
contentType:
type: string
minLength: 1
maxLength: 50
description: File MIME type
example: application/zip
totalBytes:
type: number
exclusiveMinimum: 0
description: File size in bytes
example: 1048576
assetType:
type: string
const: datasets
filename:
type: string
minLength: 1
maxLength: 256
pattern: (?:\.[zZ][iI][pP]|\.[tT][aA][rR]\.[gG][zZ]|\.[tT][gG][zZ]|\.[tT][aA][rR]|\.[nN][dD][jJ][sS][oO][nN])$
example: dataset.zip
required:
- assetId
- contentType
- totalBytes
- assetType
- filename
- type: object
properties:
assetId:
type: string
minLength: 1
maxLength: 128
example: 507f1f77bcf86cd799439011
contentType:
type: string
minLength: 1
maxLength: 50
description: File MIME type
example: application/zip
totalBytes:
type: number
exclusiveMinimum: 0
description: File size in bytes
example: 1048576
assetType:
type: string
const: models
filename:
type: string
minLength: 1
maxLength: 256
required:
- assetId
- contentType
- totalBytes
- assetType
- filename
description: Request body for generating a signed upload URL
responses:
'200':
description: Upload URL ready
content:
application/json:
schema:
$ref: '#/components/schemas/UploadSignedUrlResponse'
'400':
description: Invalid upload request or file size
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Resource access or storage quota denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Target resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Storage unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codeSamples:
- label: Python SDK
lang: Python
source: "from ultralytics_platform import Platform\n\nclient = Platform() # Reads ULTRALYTICS_API_KEY\nresponse = client.upload.signed_url(\n body={\"assetId\": \"507f1f77bcf86cd799439011\", \"contentType\": \"application/zip\", \"totalBytes\": 1048576, \"assetType\": \"datasets\", \"filename\": \"dataset.zip\"},\n)\nprint(response)"
components:
schemas:
UploadCompleteResponse:
type: object
properties:
success:
type: boolean
const: true
file:
type: object
properties:
size:
type: number
contentType:
type: string
required:
- size
additionalProperties: false
required:
- success
- file
additionalProperties: false
description: Completed upload metadata
ErrorResponse:
type: object
properties:
error:
type: string
description: Error message
example: Invalid request
required:
- error
additionalProperties: false
description: Standard error response
UploadSignedUrlResponse:
type: object
properties:
sessionId:
type: string
uploadUrl:
type: string
expiresAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
headers:
description: Headers required when uploading to the signed URL
type: object
propertyNames:
type: string
additionalProperties:
type: string
required:
- sessionId
- uploadUrl
- expiresAt
additionalProperties: false
description: Signed direct-upload session
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: API key starting with `ul_`. Create one at platform.ultralytics.com under Settings > API Keys.
externalDocs:
description: Full documentation with guides and examples
url: https://docs.ultralytics.com/platform/api