Browse Docs
On This Page

Endpoint Group: Jobs

Base group: /compress/job

Examples

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

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

# download
curl -sS "https://api.tools.fast/compress/job/${JOB_ID}/download" \
  -H "X-Fast-Api-Key: ${API_KEY}" \
  -o "./compressed-output.jpg"

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

# delete
curl -sS -X DELETE "https://api.tools.fast/compress/job/${JOB_ID}" \
  -H "X-Fast-Api-Key: ${API_KEY}"
C#
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-Fast-Api-Key", "fast_prod_your_key_here");

var jobId = "019c56457340753ba9441d7b4e6516a0";

// status
var status = await http.GetFromJsonAsync<JsonElement>(
    $"https://api.tools.fast/compress/job/{jobId}");

// download
var output = await http.GetByteArrayAsync(
    $"https://api.tools.fast/compress/job/{jobId}/download");
File.WriteAllBytes("compressed-output.jpg", output);

// cancel
await http.PostAsync($"https://api.tools.fast/compress/job/{jobId}/cancel", null);

// delete
await http.DeleteAsync($"https://api.tools.fast/compress/job/{jobId}");
PowerShell
$headers = @{ "X-Fast-Api-Key" = "fast_prod_your_key_here" }
$jobId = "019c56457340753ba9441d7b4e6516a0"

# status
Invoke-RestMethod "https://api.tools.fast/compress/job/$jobId" -Headers $headers

# download
Invoke-RestMethod "https://api.tools.fast/compress/job/$jobId/download" `
  -Headers $headers -OutFile "compressed-output.jpg"

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

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

Endpoints

  • GET /compress/job/{id}: get job status
  • GET /compress/job/{id}/download: download output file
  • POST /compress/job/{id}/cancel: cancel queued/running job
  • DELETE /compress/job/{id}: delete completed/failed/canceled job
  • GET /compress/job/{id}/compare: generate before/after comparison previews

Status response example

{
  "id": "019c56457340753ba9441d7b4e6516a0",
  "status": "Succeeded",
  "format": "jpg",
  "progress": {
    "percent": 100,
    "phase": null
  },
  "metrics": {
    "inputBytes": 10333959,
    "outputBytes": 3421187,
    "creditCost": 1,
    "compressionRatio": 0.33,
    "savingsPercent": 66.9
  },
  "error": null,
  "output": {
    "fileName": "photo-compressed.jpg",
    "contentType": "image/jpeg",
    "fileCount": 1
  }
}

Job statuses

StatusDescription
QueuedJob is waiting to be processed
RunningJob is actively being compressed
SucceededCompression complete, output ready for download
FailedCompression failed (check error field)
CanceledJob was canceled before completion

Compare endpoint

GET /compress/job/{id}/compare generates before/after preview images for visual comparison. Returns base64-encoded preview images with size metrics.

{
  "beforeImage": "<base64>",
  "afterImage": "<base64>",
  "originalBytes": 10333959,
  "compressedBytes": 3421187,
  "beforeMimeType": "image/webp",
  "afterMimeType": "image/webp",
  "previewWidth": 800,
  "previewHeight": 600,
  "afterPreviewWidth": 800,
  "afterPreviewHeight": 600,
  "inputWidth": 4032,
  "inputHeight": 3024,
  "outputWidth": 4032,
  "outputHeight": 3024,
  "wasResized": false
}

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_deletabledeleteCannot delete queued/running jobs — cancel first
409compare.not_readycompareJob not yet succeeded
410jobs.expireddownloadOutput artifacts cleaned up
410compare.expiredcompareOutput artifacts cleaned up
504compare.timeoutcomparePreview generation timed out

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.