Ultralytics Storage Integrations API
Connect external cloud storage for dataset ingestion.
Connect external cloud storage for dataset ingestion.
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-storage-integrations-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 Storage Integrations 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: Storage Integrations
description: Connect external cloud storage for dataset ingestion.
paths:
/api/integrations/buckets/{id}:
delete:
summary: Disconnect cloud storage
tags:
- Storage Integrations
operationId: delete_api_integrations_buckets_id
description: Removes saved credentials without deleting provider data. Connected datasets remain visible but their files are unavailable until the same storage account is reconnected.
parameters:
- name: id
in: path
required: true
schema:
type: string
minLength: 24
maxLength: 24
pattern: ^[0-9a-fA-F]{24}$
example: 507f1f77bcf86cd799439011
description: Cloud integration ID
responses:
'200':
description: Integration disconnected
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteBucketIntegrationResponse'
'400':
description: Invalid integration 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: Workspace admin access required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Integration not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
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.storage_integrations.delete(\n id=\"507f1f77bcf86cd799439011\",\n)\nprint(response)"
/api/integrations/buckets/{id}/objects:
get:
summary: Browse cloud storage objects
tags:
- Storage Integrations
operationId: get_api_integrations_buckets_id_objects
description: Lists folders and objects beneath a prefix in a connected bucket or container.
parameters:
- name: id
in: path
required: true
schema:
type: string
minLength: 24
maxLength: 24
pattern: ^[0-9a-fA-F]{24}$
example: 507f1f77bcf86cd799439011
description: Cloud integration ID
- name: target
in: query
required: true
description: Bucket or container name
schema:
type: string
minLength: 1
maxLength: 222
example: my-dataset-bucket
- name: prefix
in: query
required: false
description: Folder prefix
schema:
default: ''
type: string
maxLength: 1024
- name: cursor
in: query
required: false
description: Provider pagination cursor
schema:
type: string
maxLength: 4096
responses:
'200':
description: Folder contents
content:
application/json:
schema:
$ref: '#/components/schemas/BucketObjectsResponse'
'400':
description: Invalid integration ID, folder path, or page cursor
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Workspace access denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Integration or target not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'502':
description: Cloud provider listing 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.storage_integrations.objects(\n id=\"507f1f77bcf86cd799439011\",\n target=\"my-dataset-bucket\",\n)\nprint(response)"
/api/integrations/buckets:
get:
summary: List cloud storage integrations
tags:
- Storage Integrations
operationId: get_api_integrations_buckets
description: Returns the cloud storage integrations configured for the API key's workspace.
x-sdk-method: list
responses:
'200':
description: Connected integrations
content:
application/json:
schema:
$ref: '#/components/schemas/ListBucketIntegrationsResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Workspace access denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codeSamples:
- label: Python SDK
lang: Python
source: 'from ultralytics_platform import Platform
client = Platform() # Reads ULTRALYTICS_API_KEY
response = client.storage_integrations.list()
print(response)'
post:
summary: Connect cloud storage
tags:
- Storage Integrations
operationId: post_api_integrations_buckets
description: Validates and saves a GCS, Amazon S3, or Azure Blob Storage integration.
x-sdk-method: create
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- type: object
properties:
targets:
minItems: 1
maxItems: 50
type: array
items:
type: string
maxLength: 222
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: my-dataset-bucket
provider:
type: string
const: gcs
credentials:
type: object
properties:
client_email:
type: string
maxLength: 254
pattern: ^(?:\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*|\s*"\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*"\s*|\s*'\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*'\s*)$
example: service-account@my-gcp-project.iam.gserviceaccount.com
private_key:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: REDACTED_PRIVATE_KEY_EXAMPLE
project_id:
type: string
maxLength: 100
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: my-gcp-project
required:
- client_email
- private_key
- project_id
required:
- targets
- provider
- credentials
- type: object
properties:
targets:
minItems: 1
maxItems: 50
type: array
items:
type: string
maxLength: 222
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: my-dataset-bucket
provider:
type: string
const: s3
credentials:
type: object
properties:
access_key_id:
type: string
maxLength: 100
pattern: ^(?:\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: YOUR_AWS_ACCESS_KEY_ID
secret_access_key:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: YOUR_AWS_SECRET_ACCESS_KEY
region:
type: string
maxLength: 100
pattern: ^(?:\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*|\s*"\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*"\s*|\s*'\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*'\s*)$
example: us-east-1
required:
- access_key_id
- secret_access_key
- region
required:
- targets
- provider
- credentials
- type: object
properties:
targets:
minItems: 1
maxItems: 50
type: array
items:
type: string
maxLength: 222
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: my-dataset-bucket
provider:
type: string
const: azure
credentials:
type: object
properties:
connection_string:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=YOUR_AZURE_ACCOUNT_KEY;EndpointSuffix=core.windows.net
required:
- connection_string
required:
- targets
- provider
- credentials
responses:
'201':
description: Cloud storage connected
content:
application/json:
schema:
$ref: '#/components/schemas/BucketIntegrationResponse'
'400':
description: Credential or target validation failed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Workspace access or plan denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'409':
description: Cloud credential already exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
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.storage_integrations.create(\n body={\"targets\": [\"my-dataset-bucket\"], \"provider\": \"gcs\", \"credentials\": {\"client_email\": \"service-account@my-gcp-project.iam.gserviceaccount.com\", \"private_key\": \"REDACTED_PRIVATE_KEY_EXAMPLE\", \"project_id\": \"my-gcp-project\"}},\n)\nprint(response)"
/api/integrations/buckets/discover:
post:
summary: Discover cloud storage locations
tags:
- Storage Integrations
operationId: post_api_integrations_buckets_discover
description: Lists accessible buckets or containers using the supplied provider credentials.
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- type: object
properties:
provider:
type: string
const: gcs
credentials:
type: object
properties:
client_email:
type: string
maxLength: 254
pattern: ^(?:\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*|\s*"\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*"\s*|\s*'\s*(?:(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,})\s*'\s*)$
example: service-account@my-gcp-project.iam.gserviceaccount.com
private_key:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: REDACTED_PRIVATE_KEY_EXAMPLE
project_id:
type: string
maxLength: 100
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: my-gcp-project
required:
- client_email
- private_key
- project_id
required:
- provider
- credentials
- type: object
properties:
provider:
type: string
const: s3
credentials:
type: object
properties:
access_key_id:
type: string
maxLength: 100
pattern: ^(?:\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:(?!ASIA)[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: YOUR_AWS_ACCESS_KEY_ID
secret_access_key:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: YOUR_AWS_SECRET_ACCESS_KEY
region:
type: string
maxLength: 100
pattern: ^(?:\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*|\s*"\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*"\s*|\s*'\s*(?:[a-z]{2,4}(?:-[a-z0-9]+)+-\d+)\s*'\s*)$
example: us-east-1
required:
- access_key_id
- secret_access_key
- region
required:
- provider
- credentials
- type: object
properties:
provider:
type: string
const: azure
credentials:
type: object
properties:
connection_string:
type: string
maxLength: 4096
pattern: ^(?:\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*|\s*"\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*"\s*|\s*'\s*(?:[^\s"'](?:[\s\S]*\S)?)\s*'\s*)$
example: DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=YOUR_AZURE_ACCOUNT_KEY;EndpointSuffix=core.windows.net
required:
- connection_string
required:
- provider
- credentials
responses:
'200':
description: Readable buckets or containers
content:
application/json:
schema:
$ref: '#/components/schemas/BucketDiscoveryResponse'
'400':
description: Credential validation or discovery failed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Workspace access denied
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
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.storage_integrations.discover(\n body={\"provider\": \"gcs\", \"credentials\": {\"client_email\": \"service-account@my-gcp-project.iam.gserviceaccount.com\", \"private_key\": \"REDACTED_PRIVATE_KEY_EXAMPLE\", \"project_id\": \"my-gcp-project\"}},\n)\nprint(response)"
components:
schemas:
BucketIntegrationResponse:
type: object
properties:
id:
type: string
maxLength: 128
provider:
type: string
enum:
- gcs
- s3
- azure
credentialIdentity:
type: string
maxLength: 254
targets:
type: array
items:
type: string
maxLength: 222
createdAt:
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))$
required:
- id
- provider
- credentialIdentity
- targets
- createdAt
additionalProperties: false
ErrorResponse:
type: object
properties:
error:
type: string
description: Error message
example: Invalid request
required:
- error
additionalProperties: false
description: Standard error response
BucketDiscoveryResponse:
type: object
properties:
targets:
type: array
items:
type: string
required:
- targets
additionalProperties: false
DeleteBucketIntegrationResponse:
type: object
properties:
success:
type: boolean
const: true
required:
- success
additionalProperties: false
BucketObjectsResponse:
type: object
properties:
entries:
type: array
items:
type: object
properties:
kind:
type: string
enum:
- folder
- file
name:
type: string
key:
type: string
size:
type: number
updatedAt:
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))$
required:
- kind
- name
- key
additionalProperties: false
cursor:
type: string
required:
- entries
additionalProperties: false
ListBucketIntegrationsResponse:
type: object
properties:
integrations:
type: array
items:
$ref: '#/components/schemas/BucketIntegrationResponse'
required:
- integrations
additionalProperties: false
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