Quick start
- 1
Create a free account
API access comes with every free account.
- 2
Create an API key
On your Account page. Keep it on your server, never in browser code.
- 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"
}'
| Field | Description |
|---|---|
file / input_url | The file itself (multipart) or a public http(s) link to it. Up to 1 GB. |
output_format | Target extension, for example pdf, mp4, webp. |
options | Optional settings. In multipart, send them as options[width]=1600. See GET /api/v1/formats?input=… for the keys each conversion accepts. |
webhook_url | Optional. 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/formats | All input formats and their outputs. Add ?input=mp4 to include each output's options. No key needed. |
| GET | /api/v1/usage | Conversions 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).