INWX provider for octoDNS
An octoDNS provider that targets INWX DNS via the DOMRobot XML-RPC API.
Installation
Command line
pip install octodns-inwx
requirements.txt/setup.py
Pinning specific versions or SHAs is recommended to avoid unplanned upgrades.
Versions
# Start with the latest versions and don't just copy what's here
octodns==1.18.0
octodns-inwx==0.1.0
SHAs
# Start with the latest/specific versions and don't just copy what's here
-e git+https://git@github.com/octodns/octodns.git@9da19749e28f68407a1c246dfdf65663cdc1c422#egg=octodns
-e git+https://git@github.com/fjaeckel/octodns-inwx.git@<sha>#egg=octodns_inwx
Configuration
providers:
inwx:
class: octodns_inwx.INWXProvider
# INWX account username (required)
username: env/INWX_USERNAME
# INWX API password (required)
api_password: env/INWX_PASSWORD
# API endpoint base URL (optional, defaults to the production endpoint)
#endpoint: https://api.domrobot.com
# How many times to retry a transient API failure (optional, default 4)
#retries: 4
# Base seconds for the exponential retry backoff (optional, default 2.0)
#retry_backoff: 2.0
A dedicated API user with permission to manage the affected domains is recommended.
Rate limiting
Large plans (many deletes, or a zone with dozens of changes) can trip INWX'
account-level rate limiting, which surfaces as a generic
2400 Command failed on any API method. The provider retries those with an
exponential backoff — raise retries/retry_backoff if bulk applies still
fail. The backoff pauses every worker, not just the one that was throttled,
since the limit applies to the account rather than the connection.
Support Information
Records
INWXProvider supports A, AAAA, CAA, CNAME, MX, NS, PTR, SRV, TLSA, and TXT.
PTR records are managed the same way as any other record type, so reverse
DNS zones (e.g. 2.0.192.in-addr.arpa. or ...ip6.arpa.) can be managed by
octoDNS as long as the corresponding reverse zone is registered with INWX.
Multi-value PTR records (multiple hostnames pointed at the same IP) are supported, since INWX itself allows storing more than one PTR row per name.
Dynamic
INWXProvider does not support dynamic records.
Concurrency (max_workers)
octoDNS shares a single INWXProvider/session across all zones that use it,
and runs populate() for those zones concurrently on separate threads when
the manager's max_workers is greater than 1. The underlying INWX API is
session-based, so the provider serializes all API calls internally and keeps
the session logged in for the lifetime of the provider instead of logging
out after each zone -- logging out early would kill the session for any
other zone still in flight. If you need to explicitly close the session
(e.g. at the end of a script that uses INWXProvider directly), call
provider.close().
Development
Install the package in editable mode along with the development tools:
pip install -r requirements-dev.txt
Tests are run with:
python -m unittest discover -s tests -v
Linting is run with:
ruff check .
Releasing
Releases are published to PyPI automatically by .github/workflows/publish.yml
whenever a v* tag is pushed. The workflow refuses to publish if the tag
doesn't match the version in pyproject.toml, so the two must be bumped
together:
- Update
versionin pyproject.toml (e.g.0.1.2->0.1.3). - Commit the bump, e.g.
git commit -am "Bump version to 0.1.3". - Tag the commit to match, with a
vprefix:git tag v0.1.3. - Push both the commit and the tag:
git push && git push origin v0.1.3.
Pushing the tag triggers the workflow, which verifies the tag matches
pyproject.toml, builds the sdist/wheel, and publishes to PyPI via trusted
publishing (no manual credentials needed).
Metadata
Release files for octodns-inwx 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| octodns_inwx-0.1.5.tar.gz | 18.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| octodns_inwx-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.0 kB
Release files / octodns_inwx-0.1.5.tar.gz
| Download URL | octodns_inwx-0.1.5.tar.gz |
|---|---|
| Size | 18.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ef6f819675f91de4675f2632d06b6a42b3b83c96a04cdcaa051ac23c086b6fdc
|
|
BLAKE2b-256 checksum How to use checksums |
8e4772342bf3b283ad2071e7e304709520e230821471bb9e2cec377ba85a8181
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
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 Jul 20, 2026.
Transparency logRelease files / octodns_inwx-0.1.5-py3-none-any.whl
| Download URL | octodns_inwx-0.1.5-py3-none-any.whl |
|---|---|
| Size | 9.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
066bcadda93952110a8aa9b6ed2b89804d0e1104c6225a104cf1e8e8b9fb7c63
|
|
BLAKE2b-256 checksum How to use checksums |
4ae4722d1196ad2e16e9ece9830d13276a0df5f21cc9bb00e01f7578487e0a69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
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 Jul 20, 2026.
Transparency log