curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}'
curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{ "part_number": 1, "etag": "abc123def456" },
{ "part_number": 2, "etag": "def456ghi789" },
{ "part_number": 3, "etag": "ghi789jkl012" }
]
}'
const response = await fetch("https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete", {
method: "POST",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
build_id: "123e4567-e89b-12d3-a456-426614174000",
}),
});
const data = await response.json();
import requests
import os
response = requests.post(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete",
headers={
"X-Api-Key": os.environ["NUNU_API_TOKEN"],
"Content-Type": "application/json"
},
json={
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{"part_number": 1, "etag": "abc123def456"},
{"part_number": 2, "etag": "def456ghi789"},
{"part_number": 3, "etag": "ghi789jkl012"}
]
}
)
data = response.json()
{
"status": "success"
}
{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
Builds
Complete Upload
Complete a build upload (single-part or multipart).
POST
/
project
/
{projectId}
/
builds
/
upload
/
complete
curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}'
curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{ "part_number": 1, "etag": "abc123def456" },
{ "part_number": 2, "etag": "def456ghi789" },
{ "part_number": 3, "etag": "ghi789jkl012" }
]
}'
const response = await fetch("https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete", {
method: "POST",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
build_id: "123e4567-e89b-12d3-a456-426614174000",
}),
});
const data = await response.json();
import requests
import os
response = requests.post(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete",
headers={
"X-Api-Key": os.environ["NUNU_API_TOKEN"],
"Content-Type": "application/json"
},
json={
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{"part_number": 1, "etag": "abc123def456"},
{"part_number": 2, "etag": "def456ghi789"},
{"part_number": 3, "etag": "ghi789jkl012"}
]
}
)
data = response.json()
{
"status": "success"
}
{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
Permission Required:
project:manage-build-storageRequest Body (Single-Part)
string
required
Build ID returned from initiate upload
Request Body (Multipart)
string
required
Build ID returned from initiate upload
string
required
Upload ID returned from initiate upload
string
required
Object key returned from initiate upload
Part[]
required
For multipart uploads, parts must be in order by
part_number. Missing or incorrectly ordered parts will cause completion to fail.Response (Single-Part)
string
required
Always
successResponse (Multipart)
string
required
The completed build ID
curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}'
curl -X POST "https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete" \
-H "X-Api-Key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{ "part_number": 1, "etag": "abc123def456" },
{ "part_number": 2, "etag": "def456ghi789" },
{ "part_number": 3, "etag": "ghi789jkl012" }
]
}'
const response = await fetch("https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete", {
method: "POST",
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
build_id: "123e4567-e89b-12d3-a456-426614174000",
}),
});
const data = await response.json();
import requests
import os
response = requests.post(
"https://nunu.ai/api/v1/project/your-project-id/builds/upload/complete",
headers={
"X-Api-Key": os.environ["NUNU_API_TOKEN"],
"Content-Type": "application/json"
},
json={
"build_id": "123e4567-e89b-12d3-a456-426614174000",
"upload_id": "ExampleUploadId123",
"object_key": "abc123-def456/large-app.apk",
"parts": [
{"part_number": 1, "etag": "abc123def456"},
{"part_number": 2, "etag": "def456ghi789"},
{"part_number": 3, "etag": "ghi789jkl012"}
]
}
)
data = response.json()
{
"status": "success"
}
{
"build_id": "123e4567-e89b-12d3-a456-426614174000"
}
{
"error": "Upload not found",
"code": "UPLOAD_NOT_FOUND"
}
After Completion
Once the upload is complete, you can:Use in Test Runs
Reference the
build_id when starting runsView in Dashboard
See the build under Builds in nunu.ai
Manage Storage
Old builds can be deleted via auto-delete policy
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.
Body
application/json