curl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk" \
-H "X-Api-Key: YOUR_API_TOKEN"
curl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk&upload_id=ExampleUploadId123" \
-H "X-Api-Key: YOUR_API_TOKEN"
const params = new URLSearchParams({
build_id: "123e4567-e89b-12d3-a456-426614174000",
object_key: "abc123-def456/app.apk",
// For multipart, also add:
// upload_id: "ExampleUploadId123",
});
const response = await fetch(
`https://nunu.ai/api/v1/project/your-project-id/builds/upload?${params}`,
{
method: "DELETE",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
params = {
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"object_key": "abc123-def456/app.apk"
# For multipart, also add:
# "upload_id": "ExampleUploadId123"
}
response = requests.delete(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params=params
)
data = response.json()
{
"success": true
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
Builds
Cancel Upload
Cancel an in-progress upload.
DELETE
/
project
/
{projectId}
/
builds
/
upload
curl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk" \
-H "X-Api-Key: YOUR_API_TOKEN"
curl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk&upload_id=ExampleUploadId123" \
-H "X-Api-Key: YOUR_API_TOKEN"
const params = new URLSearchParams({
build_id: "123e4567-e89b-12d3-a456-426614174000",
object_key: "abc123-def456/app.apk",
// For multipart, also add:
// upload_id: "ExampleUploadId123",
});
const response = await fetch(
`https://nunu.ai/api/v1/project/your-project-id/builds/upload?${params}`,
{
method: "DELETE",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
params = {
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"object_key": "abc123-def456/app.apk"
# For multipart, also add:
# "upload_id": "ExampleUploadId123"
}
response = requests.delete(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params=params
)
data = response.json()
{
"success": true
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
Permission Required:
project:manage-build-storageQuery Parameters
string
required
Build ID to cancel
string
required
Object key from initiate upload response
string
Upload ID (required for multipart uploads)
Response
boolean
required
Always
true on successful cancellationcurl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk" \
-H "X-Api-Key: YOUR_API_TOKEN"
curl -X DELETE "https://nunu.ai/api/v1/project/your-project-id/builds/upload?build_id=123e4567-e89b-12d3-a456-426614174000&object_key=abc123-def456/app.apk&upload_id=ExampleUploadId123" \
-H "X-Api-Key: YOUR_API_TOKEN"
const params = new URLSearchParams({
build_id: "123e4567-e89b-12d3-a456-426614174000",
object_key: "abc123-def456/app.apk",
// For multipart, also add:
// upload_id: "ExampleUploadId123",
});
const response = await fetch(
`https://nunu.ai/api/v1/project/your-project-id/builds/upload?${params}`,
{
method: "DELETE",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
params = {
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"object_key": "abc123-def456/app.apk"
# For multipart, also add:
# "upload_id": "ExampleUploadId123"
}
response = requests.delete(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params=params
)
data = response.json()
{
"success": true
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
When to Use
Abort Failed Upload
Cancel a stuck or failed upload immediately
Reclaim Storage
Free up reserved storage capacity before timeout
Automatic Cleanup
Uploads have a configurable timeout (default: 10 minutes for single-part, 60 minutes for multipart). After timeout:
- Reserved storage capacity is reclaimed
- Incomplete uploads are marked for cleanup
- Partially uploaded parts are removed
upload_timeout field (1-1440 minutes).Authorizations
API key for authentication
Path Parameters
The project ID. You can copy it from the project settings page or the project URL in the dashboard.
Query Parameters
Build ID to cancel
Object key for the upload
Upload ID (required for multipart uploads)
Response
Upload cancelled successfully