AI Jobs
Run AI image upscaling, voice isolation, stem separation, and speech-to-text through the same job lifecycle — with per-job credit costs on top of the monthly job quota.
https://api.filemorf.com/api/public
Bearer API key from a Developer or Enterprise workspace.
Signed uploads, queued jobs, retained artifacts, refreshable URLs.
Same lifecycle
AI jobs use the standard job endpoints
image-upscale, audio-enhance, and audio-transcribe go through POST /jobs → upload → start → poll like every other job type. The differences are the options schema, per-job AI credits, and multi-file results.
| Job type | Options | Credit cost |
|---|---|---|
| image-upscale | engine: "crisp" | "clarity" (default crisp) · scale: 2 | 4 · creativity: 0–1 (clarity) · fitToLimit: boolean (clarity) · outputFormat: "png" | "jpg" | "webp" | crisp: 1 credit per image · clarity: max(2, ceil(output megapixels / 2.5)) — priced from the planned output size |
| audio-enhance | operation: "isolate-voice" | "separate-stems" (default isolate-voice) · prompt: string ≤200 chars (stems only; defaults to "vocals") | isolate-voice: 2 credits per started minute · separate-stems: 3 credits per started minute |
| audio-transcribe | language: 2–3 letter ISO code (optional; auto-detected when omitted) | 1 credit per started minute |
Behavior
Credits, capacity, and result shapes
AI jobs run on managed inference (fal.ai) behind the same queue, with credit metering resolved from the real input.
- AI jobs consume AI credits (separate monthly meters for image and audio) in addition to counting against the server-job quota. Credits are reserved when the job starts and finalized from the actual input duration or output size.
- Jobs are rejected with 503 when the AI backend is not configured, and with 429 when the monthly AI credit balance cannot cover the job's minimum cost.
- separate-stems returns TWO result files: the target stem matching your prompt and the residual (everything else). Use result.files[] rather than assuming a single output.
- audio-transcribe returns the transcript as TXT plus SRT and VTT caption files and a word-level timestamp JSON — all listed in result.files[].
- Inputs are processed by the AI provider (fal.ai) over TLS and are automatically deleted after processing; outputs land in retained artifacts like any other job.
Examples
Create an AI job
Options are validated strictly at creation — unknown keys or out-of-range values fail with a 400 before any upload happens.
curl -X POST https://api.filemorf.com/api/public/jobs \
-H "Authorization: Bearer $FILEMORF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: podcast-ep42-transcript-v1" \
-d '{
"type": "audio-transcribe",
"filename": "episode-42.mp3",
"fileSize": 38115942,
"contentType": "audio/mpeg",
"options": {
"language": "en"
}
}'curl -X POST https://api.filemorf.com/api/public/jobs \
-H "Authorization: Bearer $FILEMORF_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "image-upscale",
"filename": "product-shot.png",
"fileSize": 2411520,
"contentType": "image/png",
"options": {
"engine": "clarity",
"scale": 2,
"fitToLimit": true,
"outputFormat": "png"
}
}'