Build and execute multi-step file-processing workflows visually, then generate production-ready API requests in JSON, cURL, Node.js, and Python.
The Job Builder is a visual tool that lets developers design file-processing workflows by stacking conversion steps. Each step takes a file, applies a conversion with specific options, and produces an output that can feed the next step. The builder generates ready-to-use code in four languages — no SDK required.
When to use it: When you need to chain multiple conversions (e.g., convert a DOCX to PDF, then compress the PDF), prototype an API integration, or generate boilerplate code for your application.
Visual workflow
Stack, reorder, duplicate, and delete steps.
Generated code
JSON, cURL, Node.js, Python — live from your steps.
Real endpoints only
Every snippet references the actual API.
A workflow consists of three types of steps, executed top-to-bottom:
Specify the source file. This generates a POST /api/uploads request that returns a fileId. The file is uploaded once at the start of the workflow.
One or more conversion steps. Each generates a POST /api/conversions request with a target format and options. The first step uses the upload's fileId; subsequent steps download the previous step's output and re-upload it for a new fileId.
Downloads the final converted output via GET /api/files/:id/download. This is the end of the pipeline — the result of the last processing step.
The Job Builder supports one operation type: Processing Task (a single-file conversion). This maps to POST /api/conversions.
Convert a file to a target format with optional conversion options. The builder shows only the option keys the server accepts for the chosen target's category.
POST /api/conversions
Planned operations
Merge PDF, Watermark, Thumbnail, and Background Remove appear in the Add Step menu as disabled entries. These operations have no backend endpoint yet.
Each processing task is configured with:
| Field | Type | Required | Description |
|---|---|---|---|
| toFormat | string | Yes | Target format (e.g. "pdf", "webp"). |
| options | object | No | Conversion options validated per target category. |
Options are derived from the backend's OPTION_SPECS — the same validation the server uses. The builder cannot produce a 400 from an unknown option by design.
The workflow starts with a file upload. The builder generates a multipart POST /api/uploads request that returns a fileId. This fileId feeds the first processing step.
Supported upload types: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, ODT, RTF, HTML, HTM, JPG, JPEG, PNG, WEBP, GIF, SVG, TIFF, MP4, AVI, MOV, MKV, WEBM, MP3, WAV, FLAC, AAC, OGG, ZIP, RAR, 7Z, TAR, GZ.
After the final processing step completes, the result is downloaded via GET /api/files/:id/download. The download endpoint accepts a signed token query parameter for browser-based downloads, or a Bearer token for API-based downloads.
For multi-step workflows, each intermediate step's output is downloaded and re-uploaded as the next step's input. This chaining happens client-side — the API does not support server-side job chaining.
The builder generates code in four formats, all derived live from the current step state. Changing a format or option immediately updates every snippet.
A structured representation of the workflow. Useful for saving workflows or sending to a backend that re-creates the conversion chain.
[
{
"method": "POST",
"url": "/api/uploads",
"body": "multipart/form-data: file=@input.docx"
},
{
"method": "POST",
"url": "/api/conversions",
"headers": { "x-api-key": "ch_live_..." },
"body": { "fileId": "{{step-1.fileId}}", "toFormat": "pdf" }
},
{
"method": "GET",
"url": "/api/conversions/{{step-2.conversionId}}",
"poll": true
}
]Shell commands you can paste into a terminal. Each step is a separate cURL invocation.
# Step 1: Upload
curl -X POST https://api.orbconvert.com/api/uploads \
-H "x-api-key: ch_live_your_api_key_here" \
-F "file=@input.docx"
# Step 2: Convert
curl -X POST https://api.orbconvert.com/api/conversions \
-H "x-api-key: ch_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"fileId":"file_abc123","toFormat":"pdf"}'
# Step 3: Poll status
curl https://api.orbconvert.com/api/conversions/conv_xyz789 \
-H "x-api-key: ch_live_your_api_key_here"An async/await script using the Fetch API. Includes polling logic and error handling.
const API_BASE = "https://api.orbconvert.com";
const API_KEY = "ch_live_your_api_key_here";
// Step 1: Upload
const upload = await fetch(`${API_BASE}/api/uploads`, {
method: "POST",
headers: { "x-api-key": API_KEY },
body: formData, // file attached
});
const { file } = await upload.json();
// Step 2: Convert
const conv = await fetch(`${API_BASE}/api/conversions`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ fileId: file.fileId, toFormat: "pdf" }),
});
const { conversionId } = await conv.json();
// Step 3: Poll
while (true) {
const status = await fetch(`${API_BASE}/api/conversions/${conversionId}`, {
headers: { "x-api-key": API_KEY },
}).then(r => r.json());
if (status.conversion.status === "completed") break;
await new Promise(r => setTimeout(r, 3000));
}A requests-based script with the same upload → convert → poll chain.
import requests, time
API_BASE = "https://api.orbconvert.com"
API_KEY = "ch_live_your_api_key_here"
HEADERS = {"x-api-key": API_KEY}
# Step 1: Upload
with open("input.docx", "rb") as f:
upload = requests.post(f"{API_BASE}/api/uploads",
headers=HEADERS, files={"file": f})
file_id = upload.json()["file"]["fileId"]
# Step 2: Convert
conv = requests.post(f"{API_BASE}/api/conversions",
headers={**HEADERS, "Content-Type": "application/json"},
json={"fileId": file_id, "toFormat": "pdf"})
conversion_id = conv.json()["conversionId"]
# Step 3: Poll
while True:
status = requests.get(f"{API_BASE}/api/conversions/{conversion_id}",
headers=HEADERS)
if status.json()["conversion"]["status"] == "completed":
break
time.sleep(3)The generated code uses an API key (x-api-key header) by default. Replace ch_live_your_api_key_herewith your actual key from Settings → API Keys.
JWT Bearer tokens are also supported — swap the x-api-key header for Authorization: Bearer <jwt>.
| Code | Meaning | When |
|---|---|---|
| 400 | Bad Request | Invalid fileId, unsupported format, or invalid option value. |
| 401 | Unauthorized | Missing or invalid API key. |
| 413 | Payload Too Large | File exceeds size limit (200 MB). |
| 429 | Too Many Requests | Rate limit or daily quota exceeded. |
| 500 | Internal Server Error | Conversion engine failure. |
| Limit | Value |
|---|---|
| Max file size | 200 MB |
| Max steps per workflow | Unlimited (client-side chaining) |
| Rate limit | 100 requests / 15 min |
| Daily quota | 50 conversions / day (free tier) |
| Poll interval | Recommended 2-5 seconds |
Upload a DOCX file, convert to PDF, download the result. One processing step, no options.
toFormat: "pdf", options: {}
Convert a PNG to WebP, then re-convert the WebP with quality: 80 and targetSizeKb: 200. The builder generates two separate POST /api/conversions requests.
Step 1: toFormat: "webp" → Step 2: toFormat: "webp", options: { quality: 80, targetSizeKb: 200 }
Was this page helpful?