JetEncode HTTP API
JetEncode exposes version 1 and version 2 HTTP endpoints. The dashboard uses both versions.
Use /v1 to create jobs, read job status, cancel jobs, and read server system information. Use /v2 to inspect jobs, workers, queues, and transcoding capabilities. Version 2 also provides queue controls.
Endpoint summary
| Method | Path | Purpose |
|---|---|---|
GET | /v1/sysinfo | Read system information from the API process. |
GET | /v1/jobs | List version 1 job IDs. |
POST | /v1/jobs | Create a transcoding job. |
GET | /v1/jobs/:id | Read version 1 job status. |
POST | /v1/jobs/:id/cancel | Cancel a job. |
GET | /v2/jobs | List jobs with dashboard status data. |
GET | /v2/jobs/:id | Read detailed job status. |
GET | /v2/jobs/:id/request | Read the stored job request. |
GET | /v2/jobs/:id/tasks | Read internal task history for a job. |
GET | /v2/queues | Read worker and queue information. |
GET | /v2/workers/:uid | Read one worker. |
GET | /v2/queue | Read the managed job queue. |
POST | /v2/queue/:id/run-next | Run a queued job before other eligible jobs. |
PATCH | /v2/queue/:id/priority | Change a queued job priority. |
POST | /v2/queue/:id/move | Move a queued job. |
POST | /v2/queue/:id/pause | Pause a queued job. |
POST | /v2/queue/:id/resume | Resume a queued job. |
POST | /v2/queue/:id/cancel | Cancel a queued job. |
POST | /v2/queue/:id/retry | Retry terminal failed tasks for a job. |
GET | /v2/transcoding/capabilities | Read supported transcoding capabilities. |
GET | /v2/config | Read dashboard-safe node configuration. |
PUT | /v2/config | Save node configuration. A restart applies the change. |
GET | /v2/config/worker-dsn | Generate a worker bootstrap DSN. |
Create a Job
POST /v1/jobs
Body
{
"source": {
"service": "http",
"url": "https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_720p_h264.mov"
},
"outputs": {
"httpstream": {
"hls": { "path": "/hls" },
"dash": { "path": "/dash" },
"variants": [
"mp4:x:64k",
"mp4:240p::quality=2",
"mp4:480p::quality=3,maxrate=1500k",
"mp4:720p::quality=4,maxrate=3000k"
],
"playlist_name": "master"
},
"mp4:480p::quality=3": {
"key": "480p",
"path": "/mp4/480p.mp4"
},
"jpg:180x": {
"key": "jpg:thumbs",
"path": "/jpg/thumbs.jpg",
"interval": 0,
"sprite": {
"columns": 16,
"limit": 360
},
"vtt": {
"filename": "thumbs.vtt"
}
}
}
}Retrieve All Jobs
GET /v1/jobs
Response
{
"jobs": [
"ff77ef17-81d1-43d9-a977-df0facafbf94",
"ffc537a2-a8e2-4406-9088-517211b108c6",
"4208d040-7b57-4742-9331-24ff72684eb6",
"c515a9ee-26a4-46c8-8757-fbedf9bf67ac",
"61d31caf-0126-4667-8c0f-09de58f5ec76",
"310dad74-5ed6-4f92-8917-2de65f723639",
"c270151a-a74c-4166-a133-dd98de1cb362",
"26ea6fbc-376a-4001-926e-1cf4bd40c590",
"a3dfeca3-2acd-4556-84ce-19bf9d6aa78b",
"c97ae9f0-016d-41bd-92a9-8d756e14eca2",
"0197f941-8b57-4329-8d98-7dfaaeee86c8",
"cc7f2121-f082-4ef4-9165-15857fef1103",
"f06220cc-30ee-427a-a1e1-3f7602867f94",
"45c16c8c-c2ab-45b2-a7e9-5eca71aae43d",
"51c33a6f-a947-45d0-afbe-94626efd8248",
"b6c7196c-a471-459c-b2b0-0c861dafc152"
]
}Retrieve A Job
GET /v1/jobs/:id
Response
{
"download": {
"status": "downloaded",
"progress": 100,
"output": {
"url": "https://vhx9nfhlsy.gpcdn.net/uploads/videos/01KKRZQQFFTEYGPDVRHYCDKXR8.mp4",
"size": 380236470,
"filename": "f7aa3d0e_01KKRZQQFFTEYGPDVRHYCDKXR8.mp4",
"original_filename": "01KKRZQQFFTEYGPDVRHYCDKXR8.mp4"
}
},
"prepare": {
"status": "analyzed",
"metadata": {
"streams": [
{
"index": 0,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "LC",
"codec_type": "audio",
"codec_tag_string": "mp4a",
"codec_tag": "0x6134706d",
"id": "0x2",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/48000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 9020160,
"duration": "187.920000",
"bit_rate": "317346",
"nb_frames": "8810",
"extradata_size": 2,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"creation_time": "2026-03-15T12:21:30Z",
"language": "eng",
"handler_name": "#Mainconcept MP4 Sound Media Handler",
"vendor_id": ""
},
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 2,
"channel_layout": "stereo"
},
{
"index": 1,
"codec_name": "h264",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"profile": "High",
"codec_type": "video",
"codec_tag_string": "avc1",
"codec_tag": "0x31637661",
"width": 1080,
"height": 1920,
"coded_width": 1080,
"coded_height": 1920,
"has_b_frames": 1,
"pix_fmt": "yuv420p",
"level": 41,
"color_range": "tv",
"color_space": "bt709",
"color_transfer": "bt709",
"color_primaries": "bt709",
"chroma_location": "left",
"is_avc": "true",
"nal_length_size": "4",
"id": "0x1",
"r_frame_rate": "25/1",
"avg_frame_rate": "25/1",
"time_base": "1/25000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 4698000,
"duration": "187.920000",
"bit_rate": "15851475",
"bits_per_raw_sample": "8",
"nb_frames": "4698",
"extradata_size": 48,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"creation_time": "2026-03-15T12:21:30Z",
"language": "eng",
"handler_name": "\u001fMainconcept Video Media Handler",
"vendor_id": ""
}
}
],
"format": {
"filename": "localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/f7aa3d0e_01KKRZQQFFTEYGPDVRHYCDKXR8.mp4",
"nb_streams": 2,
"nb_programs": 0,
"nb_stream_groups": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "187.920000",
"size": "380236470",
"bit_rate": "16187163",
"probe_score": 100,
"tags": {
"major_brand": "mp42",
"minor_version": "0",
"compatible_brands": "mp42mp41",
"creation_time": "2026-03-15T12:21:29Z"
}
}
}
},
"encode": {
"httpstream": {
"status": "encoded",
"outputs": [
{
"path": "localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/httpstream/audio_eng.mp4",
"metadata": {
"format": {
"size": "3046958",
"tags": {
"major_brand": "isom",
"creation_time": "0001-01-01T00:00:00Z",
"minor_version": "512",
"compatible_brands": "isomiso2mp41"
},
"bit_rate": "129709",
"duration": "187.925000",
"filename": "localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/httpstream/audio_eng.mp4",
"nb_streams": 1,
"start_time": "0.000000",
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"nb_programs": 0,
"probe_score": 100,
"format_long_name": "QuickTime / MOV",
"nb_stream_groups": 0
},
"streams": [
{
"id": "0x1",
"tags": {
"language": "eng",
"vendor_id": "",
"handler_name": "#Mainconcept MP4 Sound Media Handler",
"creation_time": "0001-01-01T00:00:00Z"
},
"index": 0,
"profile": "LC",
"bit_rate": "128157",
"channels": 2,
"duration": "187.925000",
"codec_tag": "0x6134706d",
"nb_frames": "8810",
"start_pts": 0,
"time_base": "1/48000",
"codec_name": "aac",
"codec_type": "audio",
"sample_fmt": "fltp",
"start_time": "0.000000",
"disposition": {
"dub": 0,
"forced": 0,
"lyrics": 0,
"comment": 0,
"default": 1,
"karaoke": 0,
"captions": 0,
"metadata": 0,
"original": 0,
"dependent": 0,
"still_image": 0,
"attached_pic": 0,
"descriptions": 0,
"non_diegetic": 0,
"clean_effects": 0,
"visual_impaired": 0,
"hearing_impaired": 0,
"timed_thumbnails": 0
},
"duration_ts": 9020400,
"sample_rate": "48000",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"channel_layout": "stereo",
"extradata_size": 5,
"codec_long_name": "AAC (Advanced Audio Coding)",
"codec_tag_string": "mp4a"
}
]
}
}
]
},
"jpg:120x": {
"status": "encoded"
},
"mp3": {
"status": "encoded",
"metadata": {
"format": {
"size": "3007818",
"tags": {
"major_brand": "mp42",
"creation_time": "0001-01-01T00:00:00Z",
"minor_version": "0",
"compatible_brands": "mp42mp41"
},
"bit_rate": "128043",
"duration": "187.925333",
"filename": "localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/mp3/audio_eng.mp3",
"nb_streams": 1,
"start_time": "0.023021",
"format_name": "mp3",
"nb_programs": 0,
"probe_score": 51,
"format_long_name": "MP2/3 (MPEG audio layer 2/3)",
"nb_stream_groups": 0
},
"streams": [
{
"id": "",
"tags": {
"language": "",
"vendor_id": "",
"handler_name": "",
"creation_time": "0001-01-01T00:00:00Z"
},
"index": 0,
"profile": "",
"bit_rate": "128000",
"channels": 2,
"duration": "187.925333",
"codec_tag": "0x0000",
"nb_frames": "",
"start_pts": 324870,
"time_base": "1/14112000",
"codec_name": "mp3",
"codec_type": "audio",
"sample_fmt": "fltp",
"start_time": "0.023021",
"disposition": {
"dub": 0,
"forced": 0,
"lyrics": 0,
"comment": 0,
"default": 0,
"karaoke": 0,
"captions": 0,
"metadata": 0,
"original": 0,
"dependent": 0,
"still_image": 0,
"attached_pic": 0,
"descriptions": 0,
"non_diegetic": 0,
"clean_effects": 0,
"visual_impaired": 0,
"hearing_impaired": 0,
"timed_thumbnails": 0
},
"duration_ts": 2652002304,
"sample_rate": "48000",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"channel_layout": "stereo",
"extradata_size": 0,
"codec_long_name": "MP3 (MPEG audio layer 3)",
"codec_tag_string": "[0][0][0][0]"
}
]
}
},
"mp4:480p::quality=1": {
"status": "encoded",
"metadata": {
"format": {
"size": "19522604",
"tags": {
"major_brand": "isom",
"creation_time": "0001-01-01T00:00:00Z",
"minor_version": "512",
"compatible_brands": "isomiso2avc1mp41"
},
"bit_rate": "831080",
"duration": "187.925000",
"filename": "localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/mp4:480p::quality=1/480p.mp4",
"nb_streams": 2,
"start_time": "0.000000",
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"nb_programs": 0,
"probe_score": 100,
"format_long_name": "QuickTime / MOV",
"nb_stream_groups": 0
},
"streams": [
{
"id": "0x1",
"tags": {
"language": "und",
"vendor_id": "",
"handler_name": "VideoHandler",
"creation_time": "0001-01-01T00:00:00Z"
},
"index": 0,
"level": 30,
"width": 480,
"height": 854,
"is_avc": "true",
"pix_fmt": "yuv420p",
"profile": "High",
"bit_rate": "696885",
"duration": "187.920000",
"codec_tag": "0x31637661",
"nb_frames": "4698",
"start_pts": 0,
"time_base": "1/12800",
"codec_name": "h264",
"codec_type": "video",
"start_time": "0.000000",
"coded_width": 480,
"color_range": "tv",
"color_space": "bt709",
"disposition": {
"dub": 0,
"forced": 0,
"lyrics": 0,
"comment": 0,
"default": 1,
"karaoke": 0,
"captions": 0,
"metadata": 0,
"original": 0,
"dependent": 0,
"still_image": 0,
"attached_pic": 0,
"descriptions": 0,
"non_diegetic": 0,
"clean_effects": 0,
"visual_impaired": 0,
"hearing_impaired": 0,
"timed_thumbnails": 0
},
"duration_ts": 2405376,
"field_order": "progressive",
"coded_height": 854,
"has_b_frames": 2,
"r_frame_rate": "25/1",
"avg_frame_rate": "25/1",
"color_transfer": "bt709",
"extradata_size": 50,
"chroma_location": "left",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"color_primaries": "bt709",
"nal_length_size": "4",
"codec_tag_string": "avc1",
"bits_per_raw_sample": "8"
},
{
"id": "0x2",
"tags": {
"language": "eng",
"vendor_id": "",
"handler_name": "#Mainconcept MP4 Sound Media Handler",
"creation_time": "0001-01-01T00:00:00Z"
},
"index": 1,
"profile": "LC",
"bit_rate": "128157",
"channels": 2,
"duration": "187.925000",
"codec_tag": "0x6134706d",
"nb_frames": "8810",
"start_pts": 0,
"time_base": "1/48000",
"codec_name": "aac",
"codec_type": "audio",
"sample_fmt": "fltp",
"start_time": "0.000000",
"disposition": {
"dub": 0,
"forced": 0,
"lyrics": 0,
"comment": 0,
"default": 1,
"karaoke": 0,
"captions": 0,
"metadata": 0,
"original": 0,
"dependent": 0,
"still_image": 0,
"attached_pic": 0,
"descriptions": 0,
"non_diegetic": 0,
"clean_effects": 0,
"visual_impaired": 0,
"hearing_impaired": 0,
"timed_thumbnails": 0
},
"duration_ts": 9020400,
"sample_rate": "48000",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"channel_layout": "stereo",
"extradata_size": 5,
"codec_long_name": "AAC (Advanced Audio Coding)",
"codec_tag_string": "mp4a"
}
]
}
}
},
"package": {
"httpstream": {
"status": "packaged",
"outputs": [
"localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/httpstream/packaged/hls/master.m3u8"
]
},
"jpg:120x": {
"status": "packaged",
"outputs": [
"localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/jpg:120x/image_%05d.jpg",
"localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/jpg:120x/sprite.jpg"
]
},
"mp3": {
"status": "packaged",
"outputs": [
"localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/mp3/audio_eng.mp3"
]
},
"mp4:480p::quality=1": {
"status": "packaged",
"outputs": [
"localstorage/b6c7196c-a471-459c-b2b0-0c861dafc152/mp4:480p::quality=1/480p.mp4"
]
}
},
"upload": {
"httpstream": {
"status": "uploaded",
"progress": 100,
"destination": ["jetencode-test/hls"]
},
"jpg:120x": {
"status": "uploaded",
"progress": 100,
"destination": ["jetencode-test/jpg/thumbs"]
},
"mp3": {
"status": "uploaded",
"progress": 100,
"destination": ["jetencode-test"]
},
"mp4:480p::quality=1": {
"status": "uploaded",
"progress": 100,
"destination": ["jetencode-test/mp4"]
}
},
"created_at": "2026-03-29T13:03:19.720971+06:00",
"updated_at": "2026-03-29T13:04:56.018419+06:00"
}Cancel A Job
POST /v1/jobs/:id/cancel
Resopnse
- Successful -> 202 Accepted
- Error -> 404 Not Found
Webhook
Include a webhook url in the request body to receive callback on every job step
{
//...
"webhook": "<optional webhook url>"
//...
}Webhooks are emitted after every successful job step and after a terminal job failure. Retryable failures are not emitted until retries are exhausted, so consumers do not receive a failure event for a step that later succeeds.
Each webhook includes an event object identifying the step outcome.
Sample Webhook Body
{
"id": "ff77ef17-81d1-43d9-a977-df0facafbf94",
"event": {
"signature": "job:download",
"outcome": "succeeded"
},
"created_at": "Mon, 11 May 2026 10:33:03 +0600",
"updated_at": "Mon, 11 May 2026 10:33:03 +0600",
"download": {
"status": "downloaded",
"progress": 100,
"output": {
"url": "https://vhx9nfhlsy.gpcdn.net/uploads/videos/01KKRZQQFFTEYGPDVRHYCDKXR8.mp4",
"size": 380236470,
"filename": "f7aa3d0e_01KKRZQQFFTEYGPDVRHYCDKXR8.mp4",
"original_filename": "01KKRZQQFFTEYGPDVRHYCDKXR8.mp4"
}
}
}Failure Webhook
Terminal failures use the same job-step payload and include the error in event:
{
"id": "ff77ef17-81d1-43d9-a977-df0facafbf94",
"event": {
"signature": "job:upload",
"outcome": "failed",
"error": "upload failed: connection reset"
},
"upload": {
"mp4:720p": {
"status": "error",
"error": "upload failed: connection reset"
}
}
}