FileForge

FileForge API

The same thing, from code

Every conversion on the site is available over HTTP. Send a file or a link, check the job or wait for a webhook, then download the result. Free accounts get API access; Pro raises the limits; credits work here too.

Convert a Word file to PDF
curl -X POST https://imageconvert.art/api/v1/jobs \
  -H "Authorization: Bearer $FILEFORGE_KEY" \
  -F "file=@report.docx" \
  -F "output_format=pdf" \
  -F "webhook_url=https://your-app.example/hooks/fileforge"

Quick start

  1. 1

    Create a free account

    API access comes with every free account.

  2. 2

    Create an API key

    On your Account page. Keep it on your server, never in browser code.

  3. 3

    Send a file

    Pick the output format and options, then get a webhook when it's done.

Authentication

Create a free account, then open Account and press Create key. Send it on every request:

Authorization: Bearer ff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

API conversions count towards your account's daily limit.

Create a job

POST /api/v1/jobs

Upload a file (multipart/form-data)

curl -X POST https://imageconvert.art/api/v1/jobs \
  -H "Authorization: Bearer $FILEFORGE_KEY" \
  -F "file=@report.docx" \
  -F "output_format=pdf"

Convert a file from a link (JSON)

curl -X POST https://imageconvert.art/api/v1/jobs \
  -H "Authorization: Bearer $FILEFORGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_url": "https://example.com/photo.heic",
    "output_format": "jpg",
    "options": { "width": 1600, "quality": 80 },
    "webhook_url": "https://your-app.example/hooks/fileforge"
  }'
FieldDescription
file / input_urlThe file itself (multipart) or a public http(s) link to it. Up to 1 GB.
output_formatTarget extension, for example pdf, mp4, webp.
optionsOptional settings. In multipart, send them as options[width]=1600. See GET /api/v1/formats?input=… for the keys each conversion accepts.
webhook_urlOptional. Called with a POST when the job finishes or fails.

The response is 201 Created with the job:

{
  "id": "6f1c0e7a-…",
  "status": "queued",
  "progress": 0,
  "input_format": "docx",
  "output_format": "pdf",
  "engine": null,
  "error": null,
  "input": { "filename": "report.docx", "size": 48213, "url": null },
  "output": null,
  "created_at": "2026-11-04T10:12:00Z",
  "started_at": null,
  "ended_at": null,
  "expires_at": "2026-11-05T10:12:00Z"
}

Check the job

GET /api/v1/jobs/{id}

status moves through queued → processing → finished or failed. When finished, output.url is a signed download link that works without the API key until the job expires (24 hours).

Webhooks

If you set webhook_url, we POST this when the job ends:

{ "event": "job.finished", "job": { …same shape as above… } }

The X-FileForge-Signature header is sha256= plus the HMAC-SHA256 of the raw body, keyed with the webhook secret shown on your Account page. Check it before trusting the request. Failed deliveries are retried 3 times (after 10 s, 1 min and 5 min).

// Node.js
const expected = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers["x-fileforge-signature"]));

Other endpoints

GET/api/v1/formatsAll input formats and their outputs. Add ?input=mp4 to include each output's options. No key needed.
GET/api/v1/usageConversions used today and your daily limit.
DELETE/api/v1/jobs/{id}Delete a job and its files now instead of waiting 24 hours.

Errors and limits

Errors return JSON like { "error": "Can't convert .mp3 to .pdf." } with status 400 (bad request), 401 (missing or wrong key), 404, 413 (file too large) or 429 (daily limit, or more than 120 requests a minute).