AsanConvert API v1

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.

Convert a CDR file to version 2024
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.

Version conversion

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.

target_format=cdr  target_version=2024
Format conversion

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.

target_format=pdf

Plans

Every limit below is the number the API actually enforces.

API Sandbox

Free

Free test credentials. Build and verify your integration before you pay.

50 conversions per month
Test both versions and formats
Full API and webhooks
Up to 25 MB per file
10 requests per minute
Results kept for 2 hours
Priority processing
Start free

API — Version Converter

$50 /month

Convert CDR files between versions, programmatically.

CDR version conversion, any direction
3,000 conversions per month
60 requests per minute
Up to 250 MB per file
Webhook callbacks
Priority processing
Format conversion (CDR to PDF, etc.)
Subscribe

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.

Authorization: Bearer sk_live_...

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

POST /convert
GET /conversions/{id}
GET /conversions
POST /conversions/{id}/retry
GET /formats
GET /account
POST

/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:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1727500060

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.

  1. Create an account.
  2. Open Dashboard → API.
  3. 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 →