Jobs and takes
Jobs and takes are the core concepts that power the Move API workflow. Understanding these concepts is essential for building effective motion capture applications.
What is a job?
A job is a processing task that converts video input into motion capture data. Think of it as a "work order" that tells the Move API what to process and how to process it.
Job lifecycle
Every job follows this lifecycle:
- Not started - Job is submitted with video files and parameters
- Running - AI models are analyzing the video
- Completed - Processing finished, take is ready
- Failed - Processing encountered an error
Job properties
Each job contains:
{
"data": {
"getJob": {
"id": "job-813c4746-ac97-4342-abf0-83fce3ba4c40",
"name": "",
"progress": {
"state": "FINISHED",
"percentageComplete": 100
},
"inputs": {
"options": {
"mocapModel": "S1",
"trackBall": false,
"trackFingers": true
},
"numberOfActors": 1
},
"outputs": [
{
"key": "mp4",
"file": {
"id": "file-bac9b556-15b7-45db-96cf-32cdb39e8714",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/bac9b556-15b7-45db-96cf-32cdb39e8714.mp4?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.325122Z"
}
},
{
"key": "usdz",
"file": {
"id": "file-6bf1e4f5-caaa-4a8f-874c-95fbce92cac8",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/6bf1e4f5-caaa-4a8f-874c-95fbce92cac8.usdz?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
}
},
{
"key": "render_overlay_mp4",
"file": {
"id": "file-f6bfa6a2-77c2-4c08-949b-47f13acdfb0f",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/f6bfa6a2-77c2-4c08-949b-47f13acdfb0f.mp4?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.337707Z"
}
},
{
"key": "blend",
"file": {
"id": "file-90e0b7e0-a83f-4464-9af1-7a3536b64434",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/90e0b7e0-a83f-4464-9af1-7a3536b64434.blend?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.371268Z"
}
},
{
"key": "usdc",
"file": {
"id": "file-fe3d0f91-c104-45be-b8f9-e5d788ae2569",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/fe3d0f91-c104-45be-b8f9-e5d788ae2569.usdc?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.337955Z"
}
},
{
"key": "motion_data",
"file": {
"id": "file-660a28b2-ffd8-4ccf-9370-c23620ae100d",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/660a28b2-ffd8-4ccf-9370-c23620ae100d.zip?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.438225Z"
}
},
{
"key": "fbx",
"file": {
"id": "file-86700915-528f-4b78-80b6-890e1216d69b",
"presignedUrl": "https://moveai-file-storage-production.s3-accelerate.amazonaws.com/outputs/86700915-528f-4b78-80b6-890e1216d69b.fbx?AWSAccessKeyId=xxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxx&x-amz-security-token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExpires=1755860861",
"created": "2025-08-22T10:07:41.358880Z"
}
}
]
}
}
}
What is a take?
Takes are a way to define a recording session. A single take can be associated with one or more video file. A take can be used as an input to multiple jobs
A take includes:
- Sources: A grouping of a video file and file type associated with the take.
Take properties
{
"data": {
"take": {
"id": "take-97065110-6a0e-4c37-8904-f4f4c4adb242",
"sources": [
{
"deviceLabel": "cam01",
"file": {
"id": "file-e07e5bad-6ae2-42e7-84c1-20dedf9b923c"
},
"format": "MP4"
}
]
}
}
}
Working with jobs
Creating a job
- Python SDK
- GraphQL
- Curl
ugc.jobs.create_create_singlecamjob(take_id="<TAKE ID FROM TAKE CREATION">)
mutation CreateSingleCamJob {
job: createSingleCamJob(takeId: "<TAKE ID FROM TAKE CREATION>") {
id
created
progress {
state
percentageComplete
}
}
}
curl -X POST https://api.move.ai/ugc/graphql \
-H "Content-Type: application/json" \
-H "Authorization: YOUR_API_KEY" \
-d '{
"query": "mutation CreateSingleCamJob { job: createSingleCamJob(takeId: "<TAKE ID FROM TAKE CREAtION>") { id status } }"
}'
Monitoring job status
# Check job status
job = client.jobs.retrieve(id="<JOB ID>")
if job.state == "COMPLETED":
print("Job completed! Take ready for download.")
elif job.state == "FAILED":
print("Job still processing...")
elif job.state == "failed":
print(f"Job failed: {job.error_message}")
Polling for completion
import time
while True:
job = client.jobs.retrieve(id="<JOB ID>")
if job.state == "FINISHED":
print("Job completed!")
break
elif job.state == "FAILED":
print(f"Job failed: {job.error_message}")
break
print("Still processing...")
time.sleep(10) # Wait 10 seconds before checking again
tip
We recommend using events from webhooks than polling for the status of the job
Working with takes
Creating a take
- Python SDK
- GraphQL
- Curl
file_id="<FILE ID FROM FILE CREATION>"
#Create a take with the file id
ugc.takes.create(file_id=file_id)
mutation CreateSingleCamTake {
take: createSingleCamTake(
sources: [{
deviceLabel:"cam01",
fileId: "<FILE ID FROM FILE CREATION>", // (1)
format:MP4
}]
) {
id
}
}
curl -X POST https://api.move.ai/ugc/graphql \
-H "Content-Type: application/json" \
-H "Authorization: YOUR_API_KEY" \
-d '{"query":"mutation CreateSingleCamTake { take: createSingleCamTake(sources: [{ deviceLabel:\"human-readable-device-label\", fileId:\"<FILE ID FROM FILE CREATION>\", format:MP4 }]) { id } }"}'
Listing takes
- GraphQL
query ListTakes {
listTakes {
after
first
items {
created
id
metadata
name
takeType
sources {
deviceLabel
format
cameraSettings {
lens
}
}
}
}
}
Take and job relationships
- One-to-Many: Each take can be used in multiple jobs
- Take ID: Every completed take has a
take_id
- Job ID: Every job has a
job_id
that references its sourcetake_id
Best practices
Job management
- Monitor Status: Always check job status before proceeding
- Handle Errors: Implement error handling for failed jobs
- Polling: Use reasonable intervals when polling for completion, use webhooks wherever possible
- Specify Outputs: Specify the outputs formats required
Next steps
- Multicam fundamentals - Multi-camera setup and calibration
- Motion data format - Understanding the output data structure
- API reference - Detailed API documentation