Skip to main content

Official Python SDK for the API2Convert file-conversion API. Convert, compress and transform images, documents, audio, video, ebooks, archives and CAD with one line of code.

Project description

API2Convert Python SDK

CI PyPI version Python License

The official Python client for the API2Convert file-conversion API. Convert, compress and transform images, documents, audio, video, ebooks, archives and CAD — and run operations like OCR, merge, thumbnail and website capture — in one line of code.

from api2convert import Api2Convert

client = Api2Convert("YOUR_API_KEY")

client.convert("invoice.docx", "pdf").save("invoice.pdf")

That single call creates a job, uploads your file, starts it, waits for it to finish and gives you back a result you can save. No polling loops, no manual upload handling.

Requirements

  • Python 3.10+
  • httpx (installed automatically)

Install

pip install api2convert

Get an API key from the API2Convert dashboard / documentation.

Quick start

from api2convert import Api2Convert

# Reads the API2CONVERT_API_KEY environment variable when no key is passed.
client = Api2Convert("YOUR_API_KEY")

# 1) From a local file
client.convert("photo.png", "jpg").save("photo.jpg")

# 2) From a URL
client.convert("https://example.com/photo.png", "jpg").save("photo.jpg")

# 3) With conversion options (discover them via client.options("jpg"))
client.convert("photo.png", "jpg", {"quality": 85, "width": 1280, "height": 720}).save("out/")

convert(source, to, options=None, ...)source is a local path, a public URL, or an open binary stream; to is the target format; options is the conversion options map for that target. Less-common controls are keyword-only arguments: category, timeout, output_index, filename, download_password. The returned ConversionResult lets you:

result = client.convert("report.docx", "pdf")

result.save("report.pdf")       # stream to a file
result.save("downloads/")       # ...or a directory (keeps the server filename)
data = result.contents()        # ...or get the raw bytes
url = result.url()              # ...or just the download URL

Password-protect the result

Pass download_password and the output is locked behind it. The SDK remembers the password and sends it automatically when you download — you don't pass it again:

result = client.convert("statement.docx", "pdf", download_password="hunter2")

result.save("statement.pdf")    # the password is applied for you

The download URL still needs the password from anywhere else (a browser, curl, another process), via the X-Oc-Download-Password header. When you already hold an OutputFile — e.g. from the Jobs API — hand the password to download():

client.download(output, "hunter2").save("out/")

Asynchronous conversions & webhooks

For long-running jobs, start the conversion and get notified via a webhook instead of waiting:

job = client.convert_async("movie.mov", "mp4", callback="https://your-app.example.com/webhooks/api2convert")

In your webhook handler, verify and parse the callback:

from api2convert import Api2Convert
from api2convert import SignatureVerificationError

payload = request.body                       # the RAW body (bytes or str)
signature = request.headers.get("X-Oc-Signature")

try:
    event = Api2Convert.webhooks().construct_event(payload, signature, "YOUR_WEBHOOK_SECRET")
    job = event.job
    # ... react to job.status.code ...
except SignatureVerificationError:
    ...  # respond 400

Signed webhooks are being rolled out. Until they are enabled for your account no signature is sent — call Api2Convert.webhooks().parse(payload) (or pass an empty secret) to deserialize the callback without verifying.

Error handling

Every failure is a typed exception extending api2convert.Api2ConvertError:

from api2convert import (
    Api2Convert,
    AuthenticationError,
    ConversionFailedError,
    RateLimitError,
    ValidationError,
)

try:
    Api2Convert("KEY").convert("photo.png", "jpg").save("photo.jpg")
except ValidationError as e:
    ...  # bad target / option — str(e) explains
except AuthenticationError:
    ...  # bad or missing API key
except RateLimitError as e:
    ...  # too many requests — retry after e.retry_after seconds
except ConversionFailedError as e:
    ...  # the job failed — inspect e.errors()
Exception When
AuthenticationError 401 / 403 — bad or missing key
PaymentRequiredError 402 — no remaining quota
ValidationError 400 / 422 — invalid request (e.g. unknown target)
NotFoundError 404 — resource doesn't exist
RateLimitError 429 — exposes .retry_after
ServerError 5xx
NetworkError transport failure / non-JSON success body
ConversionFailedError the job reached failed; exposes .job and .errors()
ConversionTimeoutError the job didn't finish within the poll timeout
SignatureVerificationError a webhook payload failed verification

Transient failures (429, 5xx, network errors) are retried automatically with exponential backoff.

Power user: the full job API

convert() is sugar over the Jobs API. Drop down to it for compound jobs, merges, presets, custom polling or job chaining:

job = client.jobs.create({
    "process": False,
    "conversion": [{"target": "pdf", "options": {"pdf_a": True}}],
})

client.jobs.upload(job, "contract.docx")                          # local file
client.jobs.add_input(job.id, {"type": "remote", "source": "https://example.com/appendix.docx"})

client.jobs.start(job.id)
done = client.jobs.wait(job.id, timeout_seconds=120)

for output in done.output:
    client.download(output).save("out/")

Available resources: client.jobs, client.conversions (the catalog + option discovery), client.presets, client.stats, client.contracts.

Discover the valid options for any target:

options = client.options("jpg")            # -> {"quality": {...}, "width": {...}, ...}

Configuration

client = Api2Convert(
    "YOUR_API_KEY",
    timeout=30,             # per-request network timeout (seconds)
    max_retries=2,          # automatic retries for transient failures
    poll_interval=1.0,      # first poll interval when waiting (seconds)
    poll_max_interval=5.0,  # backoff cap (seconds)
    poll_timeout=300,       # give up waiting after this many seconds
)

Bring your own configured httpx.Client by passing http_client=....

Security — never publish your API key

  • Never hard-code or commit your API key. Load it from the environment (API2CONVERT_API_KEY) or a secrets manager.
  • In CI, store it as a masked & protected variable and never print it to logs.
  • Treat the per-job upload token and your webhook signing secret with the same care.
  • The SDK never logs your key/token and never puts them in exception messages.
  • If a key is ever exposed, revoke and rotate it in the API2Convert dashboard immediately.

Development

python -m venv .venv && . .venv/bin/activate
pip install -e '.[dev]'

ruff check src tests && ruff format --check src tests   # lint + format
mypy                                                     # static typing (strict)
pytest -m "not live"                                     # offline unit tests

Live conformance tests run against the real API when API2CONVERT_API_KEY is set:

API2CONVERT_API_KEY=... pytest -m live

This SDK is hand-written and kept in sync with the API by an AI agent — see AGENTS.md and docs/SDK_CONTRACT.md. Notable changes are recorded in docs/CHANGELOG.md.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

api2convert-10.2.0.tar.gz (46.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

api2convert-10.2.0-py3-none-any.whl (27.7 kB view details)

Uploaded Python 3

File details

Details for the file api2convert-10.2.0.tar.gz.

File metadata

  • Download URL: api2convert-10.2.0.tar.gz
  • Upload date:
  • Size: 46.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for api2convert-10.2.0.tar.gz
Algorithm Hash digest
SHA256 2afc3aae6de1a449c94396b71fca637054ab77b3e0362cdb296963e86f76214a
MD5 78747f915fc7b37e5c552cf4ae956342
BLAKE2b-256 4f7e1479c659c9db8087b428bd6893e0ee7469c9828a2e69a1598ba70dec6153

See more details on using hashes here.

Provenance

The following attestation bundles were made for api2convert-10.2.0.tar.gz:

Publisher: release.yml on QaamGo/api2convert-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file api2convert-10.2.0-py3-none-any.whl.

File metadata

  • Download URL: api2convert-10.2.0-py3-none-any.whl
  • Upload date:
  • Size: 27.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for api2convert-10.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 76f743f61eb82e7d342b14ef287a7681bb795750833156bfe609dda0f5e8520e
MD5 302dde930bfb2fade888260dc669bf33
BLAKE2b-256 eecfd733e7e4aad8eb76bc0b5a5c3204bc36cd385b4bf78f7ffed0df1d133a75

See more details on using hashes here.

Provenance

The following attestation bundles were made for api2convert-10.2.0-py3-none-any.whl:

Publisher: release.yml on QaamGo/api2convert-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page