Assets
Asset upload and management
Generates a signed PUT URL for uploading a file directly to storage. The key is {project}/{type}/{name}. Manager is required for assets, instructions, exports and segmentationModels; any project role is enough for brushes, medicalBrushes, upload-box and conversation. Organization admins pass either way. Fails with 403 once the organization asset quota is exhausted.
API key for authentication. Format - apikey YOUR_API_KEY
File name with extension
Project ID
Storage folder for the file: assets, instructions, exports, segmentationModels, brushes, medicalBrushes, upload-box or conversation. The legacy custom Upload Box form {projectId}/upload-box works only together with a custom bucket and a storageId; there the real project is the first segment of type and the project parameter is a storage subfolder. Not enforced by the server: omitting it signs a key containing the literal undefined and requires the Manager role.
Custom storage ID
Custom bucket name
Upload URL generated successfully
successForbidden - insufficient permissions
curl -X GET "https://imeritapi.ango.ai/v2/getUploadUrl?name=image.jpg&project=YOUR_PROJECT_ID&type=assets" \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json"
{
"status": "success",
"data": {
"uploadUrl": "https://bucket.s3.amazonaws.com/project/assets/file.jpg?X-Amz-Signature=..."
}
}Generates a signed GET URL for an asset URL. When storageId is given, access to that storage integration is checked. Fails with 403 once the organization asset quota is exhausted.
API key for authentication. Format - apikey YOUR_API_KEY
Full asset URL to sign
Storage integration ID. Omit it for objects in the platform bucket.
Signed URL generated successfully
successForbidden - insufficient permissions
curl -X GET "https://imeritapi.ango.ai/v2/getSignedUrl?name=https://bucket.s3.amazonaws.com/project/assets/image.jpg" \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json"
{
"status": "success",
"data": {
"signedUrl": "text"
}
}Imports assets from cloud storage (S3, GCS, Azure) and creates their tasks. The upload status is derived by the server, so PCT assets, videos without width, height and frameTotal, and NRRD series get their task only after preprocessing; for those tasksCreated is lower than assetsCreated. A storage at request level is ignored, put it on each asset.
API key for authentication. Format - apikey YOUR_API_KEY
Project ID
JSON stringified array of batch IDs, applied to every asset in the request that does not carry its own batches.
"true" marks the created assets private. Nothing is downloaded, the files stay where they are. Read endpoints return pre-signed URLs when an asset is private, carries a storage, or is NRRD, so an asset with a storage gets signed URLs either way.
falsePossible values: Task priority for queue ordering (higher values first). Applies to every asset in the request and wins over a per-asset priority, including when it is 0.
0Assets imported successfully
successBad request - validation error
curl -X POST "https://imeritapi.ango.ai/v2/project/YOUR_PROJECT_ID/cloud" \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assets": [
{
"data": "https://my-bucket.s3.amazonaws.com/images/img001.jpg",
"externalId": "IMG-001"
},
{
"data": "https://my-bucket.s3.amazonaws.com/images/img002.jpg",
"externalId": "IMG-002"
}
]
}'
{
"status": "success",
"data": {
"assets": {
"assetsCreated": 1,
"tasksCreated": 1,
"preLabelsCount": 1,
"validPreLabelsCount": 1
}
}
}Creates conversation assets for chat annotation projects. Conversations come from the uploaded file; without a file, numberOfConversations empty conversations are created. At most 10000 conversations per request. The created assets are always private.
API key for authentication. Format - apikey YOUR_API_KEY
Project ID
JSON file holding the conversations to import
Storage integration ID. Send an empty value to use the platform bucket.
JSON stringified array of batch IDs, applied to every conversation asset created by this request.
LLM configuration JSON
How many conversations to create when no file is uploaded
Accepted for backward compatibility, has no effect
Chat assets uploaded successfully
successPOST /v2/project/{projectId}/chat HTTP/1.1
Host: imeritapi.ango.ai
apikey: YOUR_API_KEY
Content-Type: multipart/form-data
Accept: */*
Content-Length: 151
{
"file": "binary",
"storageId": "text",
"bucket": "text",
"batches": "text",
"llmConfig": "text",
"numberOfConversations": 1,
"namingStrategy": "text",
"priority": 1
}Chat assets uploaded successfully
{
"status": "success",
"data": {
"assets": {
"assetsCreated": 1,
"tasksCreated": 1,
"preLabelsCount": 1,
"validPreLabelsCount": 1
}
}
}Retrieves assets for a specific project with optional filtering. Results are always ordered newest first. Without page and limit every asset in the project is returned.
API key for authentication. Format - apikey YOUR_API_KEY
Project ID
Page number (1-indexed). Sets the page size to 10 when limit is absent.
Items per page. Not capped; without it and without page no limit is applied.
JSON stringified filter object, merged into the query
Filter by external ID
Filter by batch ID
Relation to populate, repeatable. labelTasks is always populated. Use project to get the project object instead of its ID.
Comma separated field list. Prefix a field with - to exclude it. Inclusion lists have no effect because the server always requests all fields.
Assets retrieved successfully
successcurl -X GET "https://imeritapi.ango.ai/v2/project/YOUR_PROJECT_ID/assets?page=1&limit=10&externalId=image-001" \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json"
Assets retrieved successfully
{
"status": "success",
"data": {
"assets": [
{
"_id": "text",
"id": "text",
"data": "text",
"dataset": [
"text"
],
"overlay": [
"text"
],
"head": "text",
"project": "text",
"organization": "text",
"storage": "text",
"externalId": "text",
"editorType": "ango",
"uploadStatus": "READY",
"isPrivate": true,
"isPreLabeled": true,
"batches": [
"text"
],
"metadata": {
"width": 1,
"height": 1,
"size": 1,
"frameStep": 1,
"frameTotal": 1,
"frameRate": 1,
"numOfPages": 1,
"numOfWords": 1,
"duration": 1,
"hasVariableFrameRate": true
},
"attachments": [
{
"type": "text",
"value": "text",
"label": {}
}
],
"contextData": {},
"labelTasks": [
{
"_id": "text",
"id": "text",
"stage": "text",
"assignee": "text"
}
],
"deleted": true,
"preprocessEnqueuedAt": "2026-01-01T00:00:00.000Z",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text"
}
],
"total": 1
}
}Soft deletes assets. The assets and their tasks, task history and issues are marked deleted, the project asset count is decremented by the number of IDs sent, and the tasks are removed from the work queues.
API key for authentication. Format - apikey YOUR_API_KEY
Project ID
Assets deleted successfully
successDELETE /v2/project/{projectId}/assets HTTP/1.1
Host: imeritapi.ango.ai
apikey: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 19
{
"assets": [
"text"
]
}Assets deleted successfully
{
"status": "success",
"data": {
"assets": [
"text"
]
}
}Updates asset metadata or properties
API key for authentication. Format - apikey YOUR_API_KEY
Asset ID
The fields below are the supported ones. The endpoint applies the request body to the asset without validation, so any other Asset field is writable as well. The response carries the updated asset with its URLs re-signed.
Asset updated successfully
successPOST /v2/assets/{assetId} HTTP/1.1
Host: imeritapi.ango.ai
apikey: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 228
{
"metadata": {
"width": 1,
"height": 1,
"size": 1,
"frameStep": 1,
"frameTotal": 1,
"frameRate": 1,
"numOfPages": 1,
"numOfWords": 1,
"duration": 1,
"hasVariableFrameRate": true
},
"contextData": {},
"data": "text",
"overlay": [
"text"
],
"externalId": "text"
}Asset updated successfully
{
"status": "success",
"data": {
"asset": {
"_id": "text",
"id": "text",
"data": "text",
"dataset": [
"text"
],
"overlay": [
"text"
],
"head": "text",
"project": "text",
"organization": "text",
"storage": "text",
"externalId": "text",
"editorType": "ango",
"uploadStatus": "READY",
"isPrivate": true,
"isPreLabeled": true,
"batches": [
"text"
],
"metadata": {
"width": 1,
"height": 1,
"size": 1,
"frameStep": 1,
"frameTotal": 1,
"frameRate": 1,
"numOfPages": 1,
"numOfWords": 1,
"duration": 1,
"hasVariableFrameRate": true
},
"attachments": [
{
"type": "text",
"value": "text",
"label": {}
}
],
"contextData": {},
"labelTasks": [
{
"_id": "text",
"id": "text",
"stage": "text",
"assignee": "text"
}
],
"deleted": true,
"preprocessEnqueuedAt": "2026-01-01T00:00:00.000Z",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text"
}
}
}Replaces the batches of existing assets with the given batch IDs. The new batches are also written to the tasks and task history of those assets.
API key for authentication. Format - apikey YOUR_API_KEY
Asset IDs to update
Batch IDs to set on the assets. Use the _id values from the project's batches array, not batch names; an unknown ID fails the whole request with 400.
Project the batches belong to
Batches assigned successfully
successcurl -X POST "https://imeritapi.ango.ai/v2/assignBatches" \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "YOUR_PROJECT_ID",
"assets": ["asset123", "asset456"],
"batches": ["507f1f77bcf86cd799439011", "507f1f77bcf86cd799439012"]
}'
Batches assigned successfully
{
"status": "success",
"data": {
"assets": {
"count": 1,
"message": "text"
}
}
}Last updated

