Models Reference
This page lists the main public response models used by the API.
ErrorResponse
All error responses share this envelope. Some errors include additional context fields.
| Field | Type | Required | Description |
|---|---|---|---|
error | string | yes | Machine-readable error code (e.g. "request.empty_file") |
detail | string|null | yes | Human-readable explanation |
Additional fields may appear depending on the error code (e.g. sourceFormat, supportedTargets on convert.unsupported_format_pair). See Errors for full examples.
Example:
{
"error": "convert.unsupported_format_pair",
"detail": "Conversion from 'jpg' to 'mp3' is not supported.",
"sourceFormat": "jpg",
"targetFormat": "mp3",
"supportedTargets": ["avif", "ico", "pdf", "png", "webp"]
}
JobAcceptedResponse (POST /convert)
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Unique job identifier (GUIDv7) |
status | string | yes | Initial status ("Queued") |
creditCost | number | yes | Credits charged for this conversion |
Example — HEIC-to-JPG conversion accepted:
{
"id": "0195e2a0-1234-7000-8000-000000000001",
"status": "Queued",
"creditCost": 1
}
JobStatusResponse (GET /convert/job/{id})
| Field | Type | Required | Condition | Description |
|---|---|---|---|---|
id | string | yes | Job identifier | |
status | string | yes | "Queued", "Running", "Succeeded", "Failed", or "Canceled" | |
progress.percent | number | yes | Completion percentage (0–100) | |
progress.phase | string|null | no | Current processing phase | |
metrics.inputBytes | number | yes | Input file size in bytes | |
metrics.outputBytes | number | yes | Output file size in bytes | |
metrics.creditCost | number | yes | Credits charged for this job. This is the actual cost (not an estimate), determined at submission time. Same value as creditCost in the 202 response | |
error.code | string | no | Failed jobs only | Machine-readable failure code |
error.detail | string | no | Failed jobs only | Human-readable failure detail |
output | JobOutputSummary|null | no | Succeeded, non-expired only | Output file summary |
For jobs that are still Queued or Running, progress.percent is 0 and metrics.inputBytes / metrics.outputBytes are 0. The metrics.creditCost is always populated (cost is determined at submission time). The error object is only populated for Failed jobs. The output object is only populated for Succeeded jobs whose artifacts haven't expired.
Example — Succeeded HEIC-to-JPG job (single output):
{
"id": "0195e2a0-1234-7000-8000-000000000001",
"status": "Succeeded",
"progress": {
"percent": 100,
"phase": null
},
"metrics": {
"inputBytes": 2458624,
"outputBytes": 1024000,
"creditCost": 1
},
"error": null,
"output": {
"fileName": "vacation-photo.jpg",
"contentType": "image/jpeg",
"fileCount": 1
}
}
Example — Running job (processing in progress):
{
"id": "0195e2a0-1234-7000-8000-000000000001",
"status": "Running",
"progress": {
"percent": 0,
"phase": null
},
"metrics": {
"inputBytes": 0,
"outputBytes": 0,
"creditCost": 1
},
"error": null,
"output": null
}
Example — Succeeded PDF-to-JPG job (multi-output, downloaded as ZIP):
{
"id": "0195e2a0-1234-7000-8000-000000000002",
"status": "Succeeded",
"progress": {
"percent": 100,
"phase": null
},
"metrics": {
"inputBytes": 5242880,
"outputBytes": 12582912,
"creditCost": 5
},
"error": null,
"output": {
"fileName": "convert.fast-pdf-to-jpg-annual-report-50-outputs.zip",
"contentType": "application/zip",
"fileCount": 50
}
}
JobOutputSummary
Describes the output file(s) of a succeeded job. For single-output jobs, shows the actual file's name and content type. For multi-output jobs (e.g. PDF-to-JPG pages), shows the computed ZIP filename and application/zip.
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | yes | Output filename — matches what the download endpoint returns in Content-Disposition |
contentType | string | yes | MIME type of the download (application/zip for multi-output jobs) |
fileCount | number | yes | Number of output files (1 for single-output, >1 for multi-output) |
Use fileName to set the -o argument in cURL or the OutFile parameter in PowerShell when downloading.
CostingInfo
Describes the credit cost strategy for a converter. Appears inside ConversionItem and ConversionEdge.
| Field | Type | Required | Description |
|---|---|---|---|
strategy | string | yes | "Fixed", "PerMegabyte", "PerPage", or "PerMinute" |
baseCost | number | yes | Base credit cost per unit |
increment | number|null | no | Size/page/minute increment for variable strategies (e.g. 5 means per 5 MB, 5 means per 5 pages) |
incrementUnit | string|null | no | Unit label for the increment (e.g. "pages", "mb", "minutes", "slides", "frames") |
displaySuffix | string | yes | Human-readable label (e.g. "each", "per 5 MB", "per 5 pages", "per 5 minutes") |
costVariants | object|null | no | Cost variant tiers for converters with multiple pricing modes (e.g. transcription). null for most converters |
Calculating credits
All variable strategies use the same formula:
credits = ceil(quantity / increment) × baseCost
| Strategy | Quantity | Example | Result |
|---|---|---|---|
Fixed | — | baseCost: 1 | 1 credit |
PerPage | page count | 50 pages, increment: 5, baseCost: 1 | ceil(50/5) × 1 = 10 credits |
PerMegabyte | file size in MB | 25 MB, increment: 5, baseCost: 1 | ceil(25/5) × 1 = 5 credits |
PerMinute | duration in minutes | 12 min, increment: 5, baseCost: 1 | ceil(12/5) × 1 = 3 credits |
Fractional increments always round up — a 1-page PDF with increment: 5 still costs 1× baseCost. Use GET /convert/estimate/{from}/{to} for server-side calculation.
Examples:
{
"strategy": "Fixed",
"baseCost": 1,
"increment": null,
"incrementUnit": null,
"displaySuffix": "each",
"costVariants": null
}{
"strategy": "PerMegabyte",
"baseCost": 1,
"increment": 5,
"incrementUnit": "mb",
"displaySuffix": "per 5 MB",
"costVariants": null
}{
"strategy": "PerPage",
"baseCost": 1,
"increment": 5,
"incrementUnit": "pages",
"displaySuffix": "per 5 pages",
"costVariants": null
}{
"strategy": "PerMinute",
"baseCost": 1,
"increment": 5,
"incrementUnit": "minutes",
"displaySuffix": "per 5 minutes",
"costVariants": null
}GetConversionsResponse (GET /convert/conversions)
Top-level fields:
| Field | Type | Required | Description |
|---|---|---|---|
conversions | ConversionItem[] | yes | List of all available conversions |
sourceFormatTo | object | yes | Map of source format to target edges |
maxFileSizeBytes | number | yes | Global file size limit in bytes |
maxConcurrentJobs | number | yes | Global max concurrent jobs |
maxBatchFiles | number | yes | Maximum files per batch upload |
ConversionItem
Appears in the top-level conversions array. Groups a converter's full capabilities including all accepted input/output formats.
| Field | Type | Required | Description |
|---|---|---|---|
job | string | yes | Job type identifier (e.g. "image.heic-to-jpg") |
category | string | yes | Category ("images", "documents", "audio") |
costing | CostingInfo | yes | Cost strategy and credit amounts |
endpoint | string|null | no | Converter endpoint path |
inputFormats | string[] | yes | Accepted input format aliases |
outputFormats | string[] | yes | Output format aliases |
maxFileSizeBytes | number | yes | Per-converter file size limit in bytes |
maxConcurrentJobs | number | yes | Max concurrent jobs for this converter |
maxPages | number|null | no | Max page count (document converters with PerPage costing) |
maxDurationMinutes | number|null | no | Max duration in minutes (audio/video converters with PerMinute costing) |
maxBatchSizeBytes | number | yes | Maximum total batch input size in bytes |
ConversionEdge
A single source→target pair for direct lookup. Appears inside sourceFormatTo values — use this when you already know the source format and want to find available targets.
| Field | Type | Required | Description |
|---|---|---|---|
sourceFormat | string | yes | Source format key |
targetFormat | string | yes | Target format key |
job | string | yes | Job type identifier |
endpoint | string|null | no | API endpoint path |
category | string | yes | Category |
costing | CostingInfo | yes | Cost strategy and credit amounts |
maxFileSizeBytes | number | yes | Per-converter file size limit in bytes |
maxConcurrentJobs | number | yes | Max concurrent jobs for this converter |
maxPages | number|null | no | Max page count (document converters with PerPage costing) |
maxDurationMinutes | number|null | no | Max duration in minutes (audio/video converters with PerMinute costing) |
Example — Truncated response showing one converter and one sourceFormatTo edge:
{
"conversions": [
{
"job": "image.heic-to-jpg",
"category": "images",
"costing": {
"strategy": "PerMegabyte",
"baseCost": 1,
"increment": 5,
"incrementUnit": "mb",
"displaySuffix": "per 5 MB",
"costVariants": null
},
"endpoint": "/api/convert",
"inputFormats": ["heic", "heif"],
"outputFormats": ["jpg"],
"maxFileSizeBytes": 1073741824,
"maxConcurrentJobs": 6,
"maxPages": null,
"maxDurationMinutes": null,
"maxBatchSizeBytes": 10737418240
}
],
"sourceFormatTo": {
"heic": [
{
"sourceFormat": "heic",
"targetFormat": "jpg",
"job": "image.heic-to-jpg",
"endpoint": "/api/convert",
"category": "images",
"costing": {
"strategy": "PerMegabyte",
"baseCost": 1,
"increment": 5,
"incrementUnit": "mb",
"displaySuffix": "per 5 MB",
"costVariants": null
},
"maxFileSizeBytes": 1073741824,
"maxConcurrentJobs": 6,
"maxPages": null,
"maxDurationMinutes": null
}
]
},
"maxFileSizeBytes": 2147483648,
"maxConcurrentJobs": 6,
"maxBatchFiles": 200
}
For a multi-converter example showing all four costing strategies, see List Conversions.
ConvertFastEntitlementsResponse (GET /convert/entitlements/me)
| Field | Type | Required | Description |
|---|---|---|---|
userId | string|null | no | User ID |
organizationId | string|null | no | Organization GUID |
planId | string | yes | Plan identifier ("pro" for API users) |
planName | string | yes | Display name of the plan |
accessDisplayName | string|null | no | Short display label (e.g. "Pro") |
totalCredits | number | yes | Total available credits |
tier | string | yes | "pro" for API users |
dailyLimit | number|null | no | Daily credit limit (null for pro) |
dailyUsed | number|null | no | Credits used today (null for pro) |
resetDate | string|null | no | Daily reset date (null for pro) |
Example:
{
"userId": "0195e2a0-1234-7000-8000-000000000099",
"organizationId": "0195e2a0-1234-7000-8000-000000000050",
"planId": "pro",
"planName": "Pro",
"accessDisplayName": "Pro",
"totalCredits": 4850,
"tier": "pro",
"dailyLimit": null,
"dailyUsed": null,
"resetDate": null
}