NetraFlow
API Reference

Uploads

Analyze your own video files instead of a platform URL.

Upload works in three steps: ask for a presigned URL, PUT the file straight to storage, then create a job referencing the returned key. The file never transits the API.

Uploads are available on every plan — credits are the only cost control.

1. Request a presigned URL

POST /v1/uploads/presign

PropTypeDescription
content_typestringOne of video/mp4, video/quicktime, or video/webm.
size_bytesintegerExact file size in bytes. Maximum 500 MB.
curl -X POST https://api.netraflow.com/v1/uploads/presign \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_your_key_here" \
  -d '{
    "content_type": "video/mp4",
    "size_bytes": 18234112
  }'
{
  "data": {
    "put_url": "https://<upload-host>/uploads/...?X-Amz-Signature=...",
    "key": "uploads/ten_abc123/01J.../video.mp4"
  },
  "meta": { "request_id": "req_xyz789" }
}

2. Upload the file

PUT the raw bytes to put_url. Send the same Content-Type you presigned with — a mismatch invalidates the signature.

curl -X PUT "$PUT_URL" \
  -H "Content-Type: video/mp4" \
  --data-binary @my-video.mp4

The presigned URL is short-lived. Request a fresh one if the upload is delayed.

3. Create the job

Pass upload_key instead of url, plus upload_filename for the video title.

curl -X POST https://api.netraflow.com/v1/jobs \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_your_key_here" \
  -d '{
    "upload_key": "uploads/ten_abc123/01J.../video.mp4",
    "upload_filename": "my-video.mp4",
    "capabilities": ["transcription"]
  }'
{
  "data": {
    "job_id": "job_abc123",
    "status": "pending",
    "url": null,
    "platform": "upload",
    "capabilities": ["transcription"],
    "video_title": "my-video.mp4",
    "credits_estimated": 1,
    "credits_charged": null,
    "created_at": "2026-04-03T12:00:00.000Z"
  },
  "meta": { "request_id": "req_xyz789" }
}

Uploaded jobs report platform: "upload" and behave like any other job from there. Supplying both url and upload_key — or neither — returns VALIDATION_FAILED (422).

Duration limits still apply to uploaded files, based on the capabilities you request. See Jobs.

Limits

PropTypeDescription
Maximum size500 MBPer file.
Accepted formatsmp4, mov, webmvideo/mp4, video/quicktime, video/webm.

Batches accept uploaded files too — pass them in the uploads array. See Batch.

On this page