Browse Docs
Archives (14)
Audio (38)
Documents (26)
Ebooks (7)
Fonts (13)
Images (62)
Video (10)
On This Page

Endpoint Group: Jobs

Base group: /convert/job

Endpoints

  • GET /convert/job/{id}: get job status (JobStatusResponse)
  • GET /convert/job/{id}/download: download output file
  • POST /convert/job/{id}/cancel: cancel queued/running job
  • DELETE /convert/job/{id}: delete completed/failed/canceled job (returns 409 if still queued or running — cancel first)

Output files expire 1 hour after job completion. After expiry, download returns 410 Gone. To clean up immediately after downloading, call DELETE /convert/job/{id}.

Success responses

EndpointSuccess statusResponse body
GET /convert/job/{id}200 OKJobStatusResponse
GET /convert/job/{id}/download200 OKFile stream
POST /convert/job/{id}/cancel202 AcceptedEmpty body, Location header → /convert/job/{id}
DELETE /convert/job/{id}204 No ContentEmpty body

Status response example

{
  "id": "019c56457340753ba9441d7b4e6516a0",
  "status": "Succeeded",
  "progress": {
    "percent": 100,
    "phase": null
  },
  "metrics": {
    "inputBytes": 10333959,
    "outputBytes": 10335712,
    "creditCost": 1
  },
  "error": null,
  "output": {
    "fileName": "document.jpg",
    "contentType": "image/jpeg",
    "fileCount": 1
  }
}

The output object is null for jobs that are still queued, running, failed, canceled, or whose artifacts have expired.

Download response headers

The download endpoint sets standard HTTP headers for the output file:

  • Content-Type — MIME type of the output (e.g. image/jpeg, application/zip)
  • Content-Dispositionattachment; filename="..." with the output filename

For multi-output jobs (e.g. PDF-to-JPG with multiple pages), the download returns a ZIP archive containing all output files.

OutputsContent-TypeFilename pattern
SingleActual MIME typeOriginal stem + target extension
Multipleapplication/zipconvert.fast-{conversion}-{stem}-{count}-outputs.zip

Tip: Always use output.fileName from the status response to set your download filename — don't assume the extension matches targetFormat. Multi-output converters produce ZIP archives, and future converters may produce different output formats than expected.

Examples

cURL
API_KEY="fast_prod_your_key_here"
JOB_ID="019c56457340753ba9441d7b4e6516a0"

# status (use output.fileName for the download -o argument)
RESPONSE=$(curl -sS "https://api.tools.fast/convert/job/${JOB_ID}" \
  -H "X-Fast-Api-Key: $API_KEY")
FILENAME=$(echo "$RESPONSE" | jq -r '.output.fileName')

# download using the filename from status
curl -sS "https://api.tools.fast/convert/job/${JOB_ID}/download" \
  -H "X-Fast-Api-Key: $API_KEY" \
  -o "./${FILENAME}"

# cancel
curl -sS -X POST "https://api.tools.fast/convert/job/${JOB_ID}/cancel" \
  -H "X-Fast-Api-Key: $API_KEY"

# delete
curl -sS -X DELETE "https://api.tools.fast/convert/job/${JOB_ID}" \
  -H "X-Fast-Api-Key: $API_KEY"
PowerShell
$ApiKey = "fast_prod_your_key_here"
$JobId = "019c56457340753ba9441d7b4e6516a0"
$headers = @{ "X-Fast-Api-Key" = $ApiKey }

# status (use output.fileName for the download OutFile argument)
$job = Invoke-RestMethod "https://api.tools.fast/convert/job/$JobId" `
  -Headers $headers

# download using the filename from status
Invoke-RestMethod "https://api.tools.fast/convert/job/$JobId/download" `
  -Headers $headers -OutFile "./$($job.output.fileName)"

# cancel
Invoke-RestMethod -Method Post "https://api.tools.fast/convert/job/$JobId/cancel" `
  -Headers $headers

# delete
Invoke-RestMethod -Method Delete "https://api.tools.fast/convert/job/$JobId" `
  -Headers $headers

Errors

See Errors for the full error reference.

StatusCodeEndpointCause
401api_key.invalid_or_ip_not_allowedallInvalid API key
403jobs.forbiddenallJob owned by another user
404jobs.not_foundallJob ID does not exist
409jobs.not_readydownloadJob still processing
409jobs.not_cancellablecancelJob already completed/failed
409jobs.not_deletabledeleteJob still queued or running — cancel first
410jobs.expireddownloadOutput artifacts cleaned up

Example — job not found:

{
  "error": "jobs.not_found",
  "detail": null
}

Example — download before job finishes:

{
  "error": "jobs.not_ready",
  "detail": "Job is still processing or waiting to start."
}
Copied.