This release is a pre-release and may not be stable for production use.
Vatly Python SDK
Alpha — under active development. Every alpha release may include breaking changes. Pin exact versions during alpha.
Python SDK for Vatly, the European Merchant of Record for AI, software and digital products. Python 3.10+, Pydantic v2 models, and pooled httpx sync/async clients. All 50 production OpenAPI operations are covered.
Installation
pip install vatly-api-python==0.1.0a3
For local development: uv sync --locked.
Quick start
Get a test or live API key from the dashboard, under Settings > API.
Keep keys server-side. The client reads VATLY_API_KEY by default.
from vatly import VatlyClient
from vatly.models import CreateCheckoutRequest
with VatlyClient() as vatly:
checkout = vatly.checkouts.create(
CreateCheckoutRequest(
redirect_url_success="https://example.com/success",
redirect_url_canceled="https://example.com/canceled",
products=[{"id": "subscription_plan_abc123", "quantity": 1}],
)
)
print(checkout.links.checkout_url.href)
from vatly import AsyncVatlyClient
async def read_orders():
async with AsyncVatlyClient() as vatly:
async for order in vatly.orders.list_all({"limit": 100}):
print(order.id, order.total)
Pydantic models use snake_case attributes and accept Vatly's camelCase aliases.
Dictionary inputs use wire-format camelCase keys. Model requests serialize with
aliases and omit unset fields; explicitly supplied None is sent as JSON null.
Money values remain decimal strings, never floats.
Configuration and reliability
from vatly import VatlyClient, RequestOptions
with VatlyClient(timeout=30, max_retries=2) as vatly:
page = vatly.customers.list({"limit": 25}, options=RequestOptions(timeout=10))
Timeouts are seconds per httpx network phase per attempt, not a total request deadline;
zero disables timeouts. Default base URL: https://api.vatly.com/v1.
base_url, default_headers, and transport (an httpx transport) can be overridden.
mode exposes test or live. Test helpers reject live keys before sending.
POST/PATCH/PUT/DELETE receive a UUID idempotency key, reused across retries.
Set RequestOptions(idempotency_key="your-operation-id") to reuse a business-operation key
across separate SDK calls. Set idempotency_key_generator=None to disable auto-keys.
GETs and keyed mutations retry 429, 5xx, timeouts and connection errors with exponential
backoff (250ms to 8s plus jitter), honoring numeric or HTTP-date Retry-After.
Keyed 409 retries only details.idempotency_outcome == "in_progress".
Never blindly retry an unknown idempotency outcome: read/reconcile the resource first.
Unkeyed mutations do not retry. Redirects are not followed.
Vatly-Client-Info identifies SDK/runtime/OS/architecture. Pass
client_info={"app": "MyApp/1.0", "framework": "Django/5"} to add sanitized identifiers,
or client_info=False to suppress the SDK-generated header.
Errors
All API/transport errors extend VatlyError, with status, body, url, method,
details, errors and retry_after. Network errors retain the httpx exception as __cause__.
| Status | Error |
|---|---|
| 401 | VatlyAuthError |
| 403 | VatlyForbiddenError |
| 404 | VatlyNotFoundError |
| 409 | VatlyConflictError |
| 422 | VatlyValidationError |
| 429 | VatlyRateLimitError |
| Other / invalid response | VatlyApiError |
| Network / timeout | VatlyConnectionError / VatlyTimeoutError |
from vatly import VatlyClient, VatlyValidationError
with VatlyClient() as vatly:
try:
customer = vatly.customers.create({"email": "buyer@example.com"})
except VatlyValidationError as error:
print(error.errors)
See getting started and resource guides, the generated method inventory, webhook guide, and production API reference.
Development
Run .agents/setup in a fresh orb. It installs uv if missing, provisions Python 3.12,
syncs locked dependencies and runs an import sanity check. Warm runs reuse uv's caches.
uv run python scripts/generate.py --check
uv run ruff check .
uv run ruff format --check .
uv run mypy
uv run pytest
uv build
uv run twine check dist/*
See maintainer notes for spec regeneration, docs sync, and trusted publishing.
Metadata
Release files for vatly-api-python 0.1.0a3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| vatly_api_python-0.1.0a3.tar.gz | 112.5 kB | With provenance | Details for vatly_api_python-0.1.0a3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| vatly_api_python-0.1.0a3-py3-none-any.whl | Python 3 | none | any | Details for vatly_api_python-0.1.0a3-py3-none-any.whl |
Total release size: 151.8 kB
Release files / vatly_api_python-0.1.0a3.tar.gz
| Download URL | vatly_api_python-0.1.0a3.tar.gz |
|---|---|
| Size | 112.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aa8af3f52d6570a869aceb7a7c6ee64ddf85f124ed1bf504eabc28228b3ad07d
|
|
BLAKE2b-256 checksum How to use checksums |
24063fe5113356153b6619552c6e0c7f33c6c7771d27fda2085172276edc26d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.
Transparency logRelease files / vatly_api_python-0.1.0a3-py3-none-any.whl
| Download URL | vatly_api_python-0.1.0a3-py3-none-any.whl |
|---|---|
| Size | 39.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
436f4d2ec62a96fdb71fd8431996a69bb0358fd690d792df643a344ea961029b
|
|
BLAKE2b-256 checksum How to use checksums |
32d3510c5b139fc8a180d82d0ae0dd7b6ccc46a732493bd4cdab198c47d5a5b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.
Transparency logSecurity for vatly-api-python 0.1.0a3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for vatly_api_python-0.1.0a3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.