A master is the clean file you upload once. A copy is the marked copy made from it for one
fan. Copies are normal MP4 files you send the way you always do.
POST /uploads trace:write
A short-lived URL to upload a file to. purpose is master (a file to
make copies from) or leak (a file to check). PUT the file body to
upload_url with the headers given, then use object_key.
curl https://api.creatorsenseai.com/api/v1/trace/v1/uploads \
-H "Authorization: Bearer $TRACE_KEY" \
-H "Content-Type: application/json" \
-d '{"purpose": "master", "filename": "march-drop.mp4", "content_type": "video/mp4"}'
{
"object_key": "trace/staging/encode/…/march-drop.mp4",
"upload_url": "https://…r2.cloudflarestorage.com/…",
"method": "PUT",
"headers": { "Content-Type": "video/mp4" },
"expires_at": "2026-10-26T04:00:00+00:00",
"max_size": 2000000000
}
curl -X PUT "$UPLOAD_URL" -H "Content-Type: video/mp4" --data-binary @march-drop.mp4
POST /masters trace:write
Start preparing an uploaded master. Returns 202 and a job to poll.
curl https://api.creatorsenseai.com/api/v1/trace/v1/masters \
-H "Authorization: Bearer $TRACE_KEY" \
-H "Content-Type: application/json" \
-d '{"object_key": "trace/staging/encode/…/march-drop.mp4", "title": "March drop"}'
{
"master_id": "0b7e6a52-1c3d-4f8e-9a10-2d4c6e8f0a13",
"job_id": "c4e1b7a0-9d2f-4e6b-8c31-7a5f0e2d9b44",
"status": "pending"
}
GET /masters/{master_id} trace:read
A master and its status (pending, then ready, or failed).
curl https://api.creatorsenseai.com/api/v1/trace/v1/masters/$MASTER_ID \
-H "Authorization: Bearer $TRACE_KEY"
{
"id": "0b7e6a52-1c3d-4f8e-9a10-2d4c6e8f0a13",
"title": "March drop",
"status": "ready",
"media_kind": "video",
"created_at": "2026-10-26T03:05:00+00:00"
}
POST /masters/{master_id}/copies trace:write
One marked copy per fan, from a ready master. Send up to 1,000 fan IDs; a repeated ID is made
once. Each copy counts as one marked copy (see above). If the master
isn't ready yet you get 409 MASTER_NOT_READY and nothing is counted. Files are
built when first downloaded, so this returns quickly.
curl https://api.creatorsenseai.com/api/v1/trace/v1/masters/$MASTER_ID/copies \
-H "Authorization: Bearer $TRACE_KEY" \
-H "Content-Type: application/json" \
-d '{"fan_ids": ["6f1c2a90-2b5e-4c7e-9a43-0d6f2c1e8b11", "a3d9e0c4-7f61-4b0b-8a2e-5c9b7d3f1e20"]}'
{
"copies": [
{
"id": "5d2f8b1e-3a7c-4e90-b6d4-1f0a9c8e7b62",
"master_id": "0b7e6a52-1c3d-4f8e-9a10-2d4c6e8f0a13",
"fan_id": "6f1c2a90-2b5e-4c7e-9a43-0d6f2c1e8b11",
"label": "@bella_fan",
"ready": false,
"download_url": "/api/v1/trace/v1/copies/5d2f8b1e-3a7c-4e90-b6d4-1f0a9c8e7b62/download"
}
],
"count": 1
}
GET /masters/{master_id}/copies trace:read
Every copy made from a master, in the same shape.
curl https://api.creatorsenseai.com/api/v1/trace/v1/masters/$MASTER_ID/copies \
-H "Authorization: Bearer $TRACE_KEY"
GET /copies/{copy_id}/download trace:read
A signed URL for the copy's file, valid for expires_in seconds. The first call
for a copy builds the file and can take a little longer. Downloading again costs nothing.
curl https://api.creatorsenseai.com/api/v1/trace/v1/copies/$COPY_ID/download \
-H "Authorization: Bearer $TRACE_KEY"
{ "url": "https://…/march-drop_5d2f8b.mp4?X-Amz-Signature=…", "expires_in": 900 }