Skip to main content

Converter Service

The Converter service transforms files between different formats. It supports InDesign and POD (Print on Demand) package conversion, font format conversion, and image processing.

Base URL: /v1/converter/

Scopes: converter (full), converter:read, converter:write

Token type: any — converter endpoints accept either a user token or a client token. See Token Types.

Endpoints

MethodPathScopesDescription
GET/v1/converter/jobsconverter / converter:readList conversion jobs
POST/v1/converter/jobsconverter / converter:writeCreate a conversion job
GET/v1/converter/jobs/{path}converter / converter:readJob detail and output files
GET/health/converterService health (public, unauthenticated)

The single-item endpoint uses a catch-all {path} — concrete sub-paths handled by the converter service include /v1/converter/jobs/{id} (job details) and /v1/converter/jobs/{id}/files (download converted files, see File Types below).

Supported Conversions

Package Conversion

InputOutputDescription
indesign_packagetypograph_packageConvert an InDesign package (zipped Collect-for-Output bundle) to Typograph format
pod_packagetypograph_packageConvert a POD (Print on Demand) package to Typograph format

Font Conversion

Input TypesOutput Types
eot, otf, ttf, woff, woff2ttf, otf, woff, woff2

Image Conversion

Input TypesOutput Types
bmp, ai, eps, gif, psd, jpg, jpeg, png, svg, webp, tiffjpg, png, webp, svg

Package Formats

Package conversions exchange ZIP archives. The exact archive layout matters — the converter validates and rejects anything it can't parse. The structures below describe what to send in (input.source.url) and what to expect back (uploaded to output.upload.url).

indesign_package (input)

A standard Adobe InDesign Collect for Output bundle, zipped. The archive may contain a single wrapper folder or place the bundle contents at the root — both are accepted (the converter ignores __MACOSX and .DS_Store entries).

indesign_package.zip
└── <bundle-folder>/ (optional wrapper — may be omitted)
├── <document>.idml required — the InDesign document
├── Links/ required if the document references images
│ ├── photo-01.jpg
│ └── logo.ai
└── Document fonts/ required if the document references fonts
├── MyFont-Regular.otf
└── MyFont-Bold.otf

Linked images and embedded fonts are converted as part of the job — see the typograph_package output below for what comes back.

pod_package (input)

A ZIP containing the MY VIVENDA POD template JSON. The converter scans the archive, skips macOS metadata (__MACOSX/, ._*), and uses the first .json file it finds.

pod_package.zip
└── <any-name>.json POD template — single template object OR array of templates

The JSON itself follows the POD template schema. Multiple templates in one array become multiple pages in the resulting Typograph document.

typograph_package (output)

The converted bundle. Contents differ slightly between InDesign and POD sources:

typograph_package.zip                 (from indesign_package conversion)
├── templatebundle.json { "version": "1.0.0", "template": {...}, "manifest": {...} }
├── images/ browser-ready variants of all linked images
│ ├── photo-01.webp
│ └── logo.png
└── fonts/ TTF versions of all embedded fonts
├── MyFont-Regular.ttf
└── MyFont-Bold.ttf

typograph_package.zip (from pod_package conversion)
└── templatebundle.json { "version": "1.0.0", "template": {...}, "manifest": {...} }

The templatebundle.json carries both the template (pages, elements, styles, swatches, fontData) and the manifest (referenced images and fonts) as top-level fields. See the Documents concept page for the full schema.

Feeding the output into Publisher

The Publisher Service does not accept typograph_package.zip directly — it expects separate URLs for template.json and manifest.json. Unzip the package, host templatebundle.template and templatebundle.manifest as two JSON files, and point input.template.url / input.manifest.url at them. Images and fonts in images/ and fonts/ are referenced by URL inside the template, so they need to stay reachable from the Publisher worker.

Create a Conversion Job

Request Structure

PropertyTypeRequiredDescription
tagstringNoOptional tag to identify or group jobs (max 255 chars)
inputobjectYesInput file specification
input.typestringYesInput file format
input.sourceobjectYesSource file URL and optional headers
input.source.urlstringYesURL to download input file
input.source.headersobjectNoHTTP headers for downloading (max 5)
outputobjectYesOutput specification
output.typestringYesOutput file format
output.uploadobjectYesTarget for converted files
output.upload.urlstringYesURL to upload converted files
output.upload.headersobjectNoHTTP headers for uploading (max 5)
output.configobjectNoConfiguration for image conversions

Convert an InDesign Package

Convert an InDesign package to Typograph format:

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "design-project-alpha",
"input": {
"type": "indesign_package",
"source": {
"url": "https://example.com/packages/design.zip"
}
},
"output": {
"type": "typograph_package",
"upload": {
"url": "https://example.com/webhook/upload"
}
}
}'

Response

{
"id": "01234567-89ab-cdef-0123-456789abcdef",
"tag": "design-project-alpha",
"status": "queued",
"input": {
"type": "indesign_package",
"source": {
"url": "https://example.com/packages/design.zip"
}
},
"output": {
"type": "typograph_package",
"upload": {
"url": "https://example.com/webhook/upload"
}
},
"created_at": "<ISO 8601 timestamp>"
}

Convert a POD Package

Convert a POD (Print on Demand) package — a zipped archive of POD-schema documents — to Typograph format:

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "pod-import-batch-001",
"input": {
"type": "pod_package",
"source": {
"url": "https://example.com/pod/template.zip"
}
},
"output": {
"type": "typograph_package",
"upload": {
"url": "https://example.com/webhook/upload"
}
}
}'

The response shape is the same as for InDesign packages — only input.type differs. POD packages always convert to typograph_package; pairing pod_package with any other output type is rejected with a validation error.

Convert Fonts

Convert a TTF font to WOFF2 for web use:

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "font-conversion-001",
"input": {
"type": "ttf",
"source": {
"url": "https://example.com/fonts/myfont.ttf"
}
},
"output": {
"type": "woff2",
"upload": {
"url": "https://example.com/webhook/upload"
}
}
}'

Convert and Resize Images

Convert images with optional resizing and optimization:

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "image-optimization",
"input": {
"type": "png",
"source": {
"url": "https://example.com/images/photo.png"
}
},
"output": {
"type": "webp",
"upload": {
"url": "https://example.com/webhook/upload"
},
"config": {
"width": 1200,
"height": 800,
"quality": 85,
"fit": "max",
"strip": true
}
}
}'

Image Configuration

PropertyTypeDescription
widthintegerTarget width in pixels (1-10000)
heightintegerTarget height in pixels (1-10000)
qualityintegerOutput quality (1-100, default: 90)
fitstringSizing method (see below)
stripbooleanRemove metadata from output

Fit Options

ValueDescription
maxScale to fit within dimensions, maintaining aspect ratio
minScale to fill dimensions, maintaining aspect ratio
exactStretch to exact dimensions
cropCrop to exact dimensions from center

Download Converted Files

Download the output once conversion is complete:

curl "https://api.typograph.nl/v1/converter/jobs/{id}/files?file_type=output" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-o converted-file.zip

File Types

TypeDescription
outputConverted file (default)
inputOriginal source file

Upload Request Format

When a job completes successfully, Typograph sends the converted file as a single HTTP PUT request to output.upload.url. Your upload target must accept this request shape:

PropertyValue
MethodPUT
URLExactly the URL you provided in output.upload.url (redirects are not followed)
Content-TypeDetected from the file — e.g. font/woff2, image/webp, image/png, application/zip for package conversions
User-AgentTypograph/Util-Upload
Custom headersMerged from output.upload.headers (can't override Content-Type or User-Agent)
BodyRaw file bytes, streamed (no multipart / form-data wrapper)
Connection timeout10 seconds
Transfer timeout300 seconds

Your endpoint must respond with an HTTP status in the 200–299 range — anything else fails the job.

Uploading Directly to Cloud Storage

You can point output.upload.url straight at a presigned URL from S3, GCS, Azure Blob, Cloudflare R2, etc. Each provider accepts signed PUT requests with a raw body; set output.upload.headers to whatever the signer expects. Make sure the presigned URL is signed against the content type Typograph will send (see the list above) — protected headers (Content-Type, User-Agent) cannot be overridden.

Custom Headers

Include authentication headers for protected resources:

{
"tag": "protected-conversion",
"input": {
"type": "png",
"source": {
"url": "https://storage.example.com/private/image.png",
"headers": {
"Authorization": "Bearer storage-token"
}
}
},
"output": {
"type": "webp",
"upload": {
"url": "https://webhook.example.com/uploads",
"headers": {
"X-API-Key": "webhook-api-key"
}
}
}
}

Examples

PSD to PNG Thumbnail

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "psd-thumbnail",
"input": {
"type": "psd",
"source": {
"url": "https://example.com/designs/layout.psd"
}
},
"output": {
"type": "png",
"upload": {
"url": "https://example.com/webhook/upload"
},
"config": {
"width": 400,
"fit": "max"
}
}
}'

AI to SVG Conversion

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "logo-conversion",
"input": {
"type": "ai",
"source": {
"url": "https://example.com/logos/company-logo.ai"
}
},
"output": {
"type": "svg",
"upload": {
"url": "https://example.com/webhook/upload"
}
}
}'

Batch Font Conversion

Convert multiple fonts by creating separate jobs:

for font in regular bold italic; do
curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"tag\": \"font-${font}\",
\"input\": {
\"type\": \"otf\",
\"source\": {
\"url\": \"https://example.com/fonts/myfont-${font}.otf\"
}
},
\"output\": {
\"type\": \"woff2\",
\"upload\": {
\"url\": \"https://example.com/webhook/upload\"
}
}
}"
done

Complete Example with Headers

Convert an image from protected storage with custom headers:

curl -X POST https://api.typograph.nl/v1/converter/jobs \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag": "premium-image-conversion",
"input": {
"type": "tiff",
"source": {
"url": "https://storage.example.com/originals/photo.tiff",
"headers": {
"Authorization": "Bearer storage-token"
}
}
},
"output": {
"type": "webp",
"upload": {
"url": "https://cdn.example.com/upload",
"headers": {
"X-Upload-Token": "upload-secret-key"
}
},
"config": {
"width": 1920,
"height": 1080,
"quality": 90,
"fit": "max",
"strip": true
}
}
}'