Convert CDR files
from your own application
Change a CDR file's version, or convert between CDR, PDF, AI, EPS, SVG and image formats — over a plain REST API. Upload a file or give us a URL, get a webhook when it is done.
No card needed for the sandbox. Keys are created in your dashboard — nothing to request by email.
curl -X POST https://asanconvert.com/api/v1/convert \
-H "Authorization: Bearer sk_live_your_secret_key" \
-F "[email protected]" \
-F "target_format=cdr" \
-F "target_version=2024" \
-F "webhook_url=https://your-app.com/hooks/asanconvert"
# 202 Accepted
{
"id": "cv_8f4a2b1c9d0e1f23",
"object": "conversion",
"status": "queue",
"type": "version",
"source_format": "cdr",
"target_format": "cdr",
"target_version": "2024",
"download_url": null
}
Conversions run asynchronously. You get a webhook when the file is ready, or poll
GET /api/v1/conversions/{id}.
Two kinds of conversion
Plans are built around these two. Check which ones your key includes with
GET /api/v1/account.
CDR to CDR
Save a CDR file down to an older version so an earlier release can open it, or bring an old file up to a current one. Layers, curves and text stay editable.
Between file types
CDR to PDF, PDF to CDR, AI to PNG, JPG to CDR and many more.
Call /formats for the exact pairs your key may use.
Plans
Every limit below is the number the API actually enforces.
API Sandbox
Free test credentials. Build and verify your integration before you pay.
API — Version Converter
Convert CDR files between versions, programmatically.
Need different limits, or a specific set of formats? Ask us — allowances are set per account.
Reference
Base URL https://asanconvert.com/api/v1
Authentication
Send your secret key as a bearer token. That is the only header required.
Create keys in your dashboard. Each key has:
pk_live_…— a public identifier. Safe to put in a log or a support ticket.sk_live_…— the secret. Shown once, at creation. We store only a hash, so we cannot recover it for you — roll the key instead.whsec_…— signs the webhooks we send you.
Sandbox keys use sk_test_ and run real
conversions against your sandbox allowance.
Never put a key in a query string — we reject it there on purpose. Query strings end up in access logs, proxy logs and referrer headers.
Endpoints
/convert
/conversions/{id}
/conversions
/conversions/{id}/retry
/formats
/account
/convert
Send the file as multipart form data, or give us a URL to fetch it from.
| Parameter | Required | Notes |
|---|---|---|
file |
either | The file itself, as multipart form data. |
file_url |
either | A public https URL we fetch the file from. Must be publicly reachable. |
target_format |
yes | The format you want out, e.g. pdf, png, cdr. |
target_version |
for CDR | Required when target_format is cdr, e.g. 2024, x8, v12. |
source_format |
no | Guessed from the filename when omitted. |
filename |
no | Overrides the name we store for display. |
external_id |
no | Your own reference. Echoed back on every webhook. |
webhook_url |
no | Overrides your key default for this one job. |
Either means send exactly one of file or
file_url. Returns 202 Accepted
with the conversion object.
Webhooks
Set a callback URL on your key and we POST to it as the job moves. Events:
conversion.processing,
conversion.completed,
conversion.failed.
{
"event": "conversion.completed",
"created": 1727500000,
"data": {
"id": "cv_8f4a2b1c9d0e1f23",
"status": "completed",
"external_id": "order-4471",
"download_url": "https://...",
"download_url_expires_at": "2026-09-29T10:00:00+00:00"
}
}
Verify the signature
Every delivery carries an
X-AsanConvert-Signature header.
Check it before you trust the body — your endpoint is a public URL, and anyone who
learns it could otherwise post to it.
X-AsanConvert-Signature: t=1727500000,v1=5f8a...c21
# The signed string is "{timestamp}.{raw request body}"
# PHP
[$t, $v1] = sscanf($header, "t=%d,v1=%s");
$expected = hash_hmac('sha256', $t . '.' . $rawBody, $webhookSecret);
// Reject anything older than 5 minutes, then compare in constant time
if (abs(time() - $t) > 300) return 401;
if (! hash_equals($expected, $v1)) return 401;
The timestamp is inside the signed string, so an old body cannot be replayed with a fresh timestamp. Use the raw request body — re-encoding the JSON changes the bytes and the signature will not match.
Retries
Answer with any 2xx and we
consider it delivered. Anything else is retried with a growing delay —
10 seconds, 1 minute, 5 minutes, 30 minutes, then 2 hours.
Every attempt is listed in your dashboard. We do not follow redirects, so point us at the
final URL.
Rate limits and quota
Every response carries your current standing:
Going over returns 429 with a
Retry-After header. Wait that many seconds.
| Plan | Req/min | Conversions/mo | Max file | Results kept |
|---|---|---|---|---|
| API Sandbox | 10 | 50 | 25 MB | 2 h |
| API — Version Converter | 60 | 3,000 | 250 MB | 24 h |
Quota counts conversions, not requests. Polling the status of a job as often as you like costs nothing. A retry does count, because it runs the file again.
Errors
Every error has the same shape. Branch on error.code, which is stable — the message may be reworded.
{
"error": {
"code": "format_conversions_not_in_plan",
"message": "Format conversion is not included in your plan.",
"doc_url": "https://asanconvert.com/api-for-developers#errors"
}
}
401
missing_api_key
401
invalid_api_key
401
key_expired
403
key_suspended
403
key_revoked
402
subscription_inactive
429
rate_limit_exceeded
429
daily_limit_exceeded
429
monthly_quota_exceeded
403
version_conversions_not_in_plan
403
format_conversions_not_in_plan
403
source_format_not_allowed
403
target_format_not_allowed
403
target_version_not_allowed
422
target_version_required
422
pair_not_supported
413
file_too_large
422
validation_failed
422
no_file_provided
422
file_url_unreachable
404
conversion_not_found
409
conversion_not_retryable
404
not_found
405
method_not_allowed
500
server_error
Try it free
The sandbox gives you 50 conversions a month
with no card. Test keys run real conversions and real webhooks — the only difference is the
allowance and the sk_test_ prefix.
- Create an account.
- Open Dashboard → API.
- Click Create sandbox key and copy the secret.
Nothing to request by email, and no waiting for us to approve you.
Ready to build?
Create a key in your dashboard and make your first call in a couple of minutes.
Not building an integration? See the plans for individual users →