/convert
Converts input file into structured design data.
See Overview for what each input and output format means and which combinations are supported, and Pricing for what they cost.
Asynchronous conversions.
Conversions run as background jobs, so POST /convert returns 202 Accepted
with a Location header pointing at a poll endpoint
(GET /convert/jobs/{jobId}). Poll that endpoint until its JSON status is
done (with a short-lived resultUrl to download the result) or error. The
resultUrl is a JSON body for every format except image, which delivers a
ZIP. Because the conversion has not started when the 202 is returned, an
input the server can't read (a corrupt .fig, unreadable HTML) surfaces as a
job error on the poll rather than a 400 on the submit.
Billing is reserve-then-settle: an estimate is held up front and reconciled to
the real cost when the job finishes; a run that produces no output is refunded.
Note:
- When
inputproperty is used,input.data(base64 bytes) orinput.urlmust be set. - In multipart mode the uploaded
filefield replaces both, soinputitself is omitted. - Requests are capped at 30 MB total (and base64 inflates
databy ~33%). For larger files usePOST /convert/uploadto upload out of band, then convert byinput.url = "upload://{id}".
Headers
AuthorizationAPI key as Bearer {APIKEY}. Create one in
API Keys. Alternatively send the key in the
x-drc-api-key header instead — see the security schemes below.
/convert › Responses
Conversion result. Every input format documented here is asynchronous, so
this is not the response to POST /convert itself — it is the body you
GET from the resultUrl a done poll hands you. The shape depends on
output.format. Credits are settled out of band when the job finishes
(reserve-then-settle, see above), so no X-Credits-* headers accompany
the result.
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object | |
| type = object | |
| type = object |
modelFile representation, structurally compatible with the response of
the official Figma REST API
(GET /v1/files/:fileKey).
Includes name, document, components, componentSets,
styles, schemaVersion, version, lastModified, linkAccess,
role, editorType.
Bitmap fills referenced in the file. Empty when the source has no
bitmaps. If a url ever returns 403, re-convert to refresh the
signed URL.
Optional. Mirrors meta.variables from Figma's
GET /v1/files/:fileKey/variables/local response, flattened to
the response root. Omitted when the file has no variables.
Optional. Mirrors meta.variableCollections from Figma's
variables endpoint. Omitted when the file has no collections.
/convert/upload
Upload a large source file out of band, for files over the 30 MB
POST /convert request cap (up to 2 GB). Free — billing happens on
the /convert call that consumes the upload.
Flow:
POST /convert/uploadwith the exact bytesize→{ uploadUrl, ref }.PUTthe raw bytes touploadUrlwithContent-Type: application/octet-streamand aContent-Lengthmatchingsizeexactly (the signed URL is pinned to both, and expires after 10 minutes).POST /convertwithinput.urlset to the returnedref(upload://{id}), plusformat/name/range… as usual.
Uploads are private to the API key that created them — a ref used by
anyone else 404s on /convert.
Headers
AuthorizationAPI key as Bearer {APIKEY}. Create one in
API Keys. Alternatively send the key in the
x-drc-api-key header instead — see the security schemes below.
/convert/upload › Request Body
sizeExact size of the file in bytes (max 2147483648).
/convert/upload › Responses
Signed upload target.
uploadUrlSigned URL to PUT the bytes to. Valid for 10 minutes.
refOpaque upload://{id} reference to pass as input.url
on POST /convert.
/convert/jobs/{jobId}
Poll an asynchronous /convert job — the URL from the
Location header of the 202 on POST /convert. Always 200 with a status
envelope; poll until status is done or error (job failure is not an
HTTP error). Authenticate with the same API key (or Authorization: Bearer)
that started the job. The job is pollable for 7 days.
path Parameters
jobIdThe opaque job id from the 202 Location header.
Headers
AuthorizationAPI key as Bearer {APIKEY}. Create one in
API Keys. Alternatively send the key in the
x-drc-api-key header instead — see the security schemes below.
/convert/jobs/{jobId} › Responses
Current job status.
statusqueued/running: still processing — poll again.done: finished —resultUrlis present.error: failed (already refunded) —errordescribes why.
resultUrlPresent only when status = done. Short-lived signed URL
(~15 min) to GET the result — a JSON body for every format except
image, which serves a ZIP; re-poll for a fresh one if it
expires (jobs
are pollable for 7 days).
errorPresent only when status = error.
progressWorker-reported progress. Present only while status is
queued or running, and may be absent even then.
stepShort human-readable step label, e.g. Converting page 12/40. Present only while status is queued or
running, and may be absent even then.