{"id":50853624,"url":"https://github.com/foundata/inwx-tools","last_synced_at":"2026-06-14T16:38:28.096Z","repository":{"id":358560662,"uuid":"1241877862","full_name":"foundata/inwx-tools","owner":"foundata","description":"Helper scripts and tools to administer, provision and/or manage tasks related to INWX (https://www.inwx.de), a well known professional domain provider.","archived":false,"fork":false,"pushed_at":"2026-05-18T19:20:34.000Z","size":101,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T21:28:14.526Z","etag":null,"topics":["api","domainservice","inwx"],"latest_commit_sha":null,"homepage":"https://foundata.com/en/projects/inwx-tools/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foundata.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSES/GPL-3.0-or-later.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T23:27:07.000Z","updated_at":"2026-05-18T19:20:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/foundata/inwx-tools","commit_stats":null,"previous_names":["foundata/inwx-tools"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/foundata/inwx-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundata%2Finwx-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundata%2Finwx-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundata%2Finwx-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundata%2Finwx-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foundata","download_url":"https://codeload.github.com/foundata/inwx-tools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundata%2Finwx-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34328115,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","domainservice","inwx"],"created_at":"2026-06-14T16:38:25.611Z","updated_at":"2026-06-14T16:38:28.090Z","avatar_url":"https://github.com/foundata.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# INWX Tools\n\nHelper scripts and tools to administer, provision and/or manage tasks related to [INWX](https://www.inwx.de/), a well known professional domain provider.\n\n\n\u003cdiv align=\"center\" id=\"project-readme-header\"\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n**⭐ Found this useful? Support open-source and star this project:**\n\n[![GitHub repository](https://img.shields.io/github/stars/foundata/inwx-tools.svg)](https://github.com/foundata/inwx-tools)\n\n\u003cbr\u003e\n\u003c/div\u003e\n\n\n\n## Table of contents\u003ca id=\"toc\"\u003e\u003c/a\u003e\n\n- [`inwx-create-user.py`](#inwx-create-user)\n- [Licensing, copyright](#licensing-copyright)\n  - [Trademarks](#trademarks)\n- [Author information](#author-information)\n\n\n## `inwx-create-user.py`\u003ca id=\"inwx-create-user\"\u003e\u003c/a\u003e\n\n**Helper to *quickly* create additional sub-user accounts.**\n\nCreates a sub-user account with parent account contact data as default, and optionally grants [INWX roles](https://account.inwx.de/en/help/apidoc/f/ch02.html#account.addrole):\n\n![inwx-create-user-py-001.png](./assets/images/inwx-create-user-py-001.png)\n\n```\n./inwx-create-user.py --help\nusage: inwx-create-user.py [-h] [--ote] [--api-url API_URL] [--language LANGUAGE] [--debug] [--json] [--force]\n                           [--no-output-file] [--password [PASSWORD]] [--current-password [CURRENT_PASSWORD]]\n                           [--generate-password] [--password-retries PASSWORD_RETRIES]\n                           [--password-retry-delay PASSWORD_RETRY_DELAY] [--require-2fa] [--role-id ROLE_ID]\n                           [--keep-full-access]\n                           [--email EMAIL] [--title TITLE] [--firstname FIRSTNAME] [--lastname LASTNAME] [--street STREET] [--pc PC]\n                           [--city CITY] [--cc CC] [--org ORG] [--voice VOICE]\n                           username\n\nCreate an INWX sub-account and optionally grant roles.\n\npositional arguments:\n  username              Username for the INWX sub-account to create.\n\noptions:\n  -h, --help            show this help message and exit\n  --ote                 Use the INWX OT\u0026E test API. Default is production.\n  --api-url API_URL     Override API base URL, for example https://api.ote.domrobot.com.\n  --language LANGUAGE   INWX language code. Default: EN.\n  --debug               Print redacted XML-RPC call metadata to stderr.\n  --json                Print machine-readable result JSON.\n  --force               If the username already exists, update that sub-user's roles and password instead of failing.\n  --no-output-file      Do not write the created sub-user credentials file next to this script.\n  --password [PASSWORD]\n                        Password for the new sub-account. If used without a value, prompt securely.\n  --current-password [CURRENT_PASSWORD]\n                        Current password for an existing sub-account when using --force. If used without a value, prompt securely.\n  --generate-password   Generate and set a password for the new sub-account.\n  --password-retries PASSWORD_RETRIES\n                        Retries for the initial password change after account.create. Default: 6.\n  --password-retry-delay PASSWORD_RETRY_DELAY\n                        Seconds between initial password change retries. Default: 10.\n  --require-2fa         Set required2fa=1 for the sub-account.\n  --role-id ROLE_ID     Role id to assign. Repeatable. 20000 (Full Access), 20001 (Accounting), 20002 (Domain), 20003 (Hosting), 20004\n                        (DNS), 20005 (Authcodes)\n  --keep-full-access    Keep INWX's default Full Access role. By default, Full Access is removed unless --role-id 20000 is explicitly\n                        requested.\n  --email EMAIL         Sub-account email. Defaults to parent email.\n  --title TITLE         Sub-account title. Defaults to parent title.\n  --firstname FIRSTNAME\n                        Sub-account first name. Defaults to parent first name.\n  --lastname LASTNAME   Sub-account last name. Defaults to parent last name.\n  --street STREET       Sub-account street. Defaults to parent street.\n  --pc PC               Sub-account postal code. Defaults to parent postal code.\n  --city CITY           Sub-account city. Defaults to parent city.\n  --cc CC               Sub-account country code. Defaults to parent country code.\n  --org ORG             Sub-account organization. Defaults to parent organization.\n  --voice VOICE         Sub-account phone number. Defaults to parent phone number.\n```\n\n### Usage notes\n\nAPI credentials are read from environment variables. If a variable is missing, the script prompts for it interactively:\n\n```sh\nexport INWX_API_USER='...'\nexport INWX_API_PASSWORD='...'\nexport INWX_API_OTPSECRET='...' # optional unless the account requires 2FA\n```\n\nBy default the script uses the production INWX API. Pass `--ote` for the [INWX OT\u0026E](https://ote.inwx.com/de) test API.\n\n```sh\n./inwx-create-user.py new-example-user --generate-password --role-id 20004\n./inwx-create-user.py new-example-user --ote --generate-password --role-id 20001 --role-id 20004\n./inwx-create-user.py new-example-user --password\n./inwx-create-user.py existing-example-user --force --generate-password --current-password --role-id 20004\n```\n\nWith `--force`, the script handles an existing visible sub-user by setting its role set to the requested roles. If `--password` or `--generate-password` is used for an existing sub-user, INWX usually requires the current sub-user password; pass it with `--current-password`, or use `--current-password` without a value to be prompted securely. Without `--force`, an existing username still fails with the INWX API error.\n\nINWX creates sub-users with Full Access (`20000`) by default; this helper removes that role unless you explicitly pass `--role-id 20000` or `--keep-full-access`. For [ACME DNS-01](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) clients, pass `--role-id 20004` to grant the DNS role to manage DNS resource records:\n\n```sh\n./inwx-create-user.py acme-client-example --role-id 20004\n```\n\nThe helper copies the parent account contact data from `account.info` and uses it for the required `account.create` fields. Override individual fields when needed:\n\n```sh\n./inwx-create-user.py acme-example \\\n  --email \"acme-admin@example.org\" \\\n  --firstname \"ACME\" \\\n  --lastname \"Automation\" \\\n  --generate-password\n```\n\nFor machine-readable output:\n\n```sh\n./inwx-create-user.py acme-example --generate-password --json\n```\n\nBy default the script stores the created sub-user details next to the script as `YYYYMMDDTHHMMSS_username.txt` with file mode `0600`. The file contains the created account id, role ids, and the `INWX_API_USER` / `INWX_API_PASSWORD` values for the sub-user when a password was set or generated. Disable that file with:\n\n```sh\n./inwx-create-user.py acme-example --generate-password --no-output-file\n```\n\n**Important note on deleting users:** As of 2026-Q2, user accounts cannot be fully deleted by the customer. When a user is created and later deleted via the Web UI or API, a new user with the same username cannot be created again afterwards, as the system will return `code 2302: Object exists`.\u003cbr\u003e Deleting a user therefore only makes the account invisible and deactivates it; the user object still remains in the system. If the same username is absolutely required again, INWX Support must be contacted.\n\n\n## Licensing, copyright\u003ca id=\"licensing-copyright\"\u003e\u003c/a\u003e\n\n\u003c!--REUSE-IgnoreStart--\u003e\nCopyright (c) 2026 [foundata GmbH](https://foundata.com/) (https://foundata.com)\n\nThis project is licensed under the GNU General Public License v3.0 or later (SPDX-License-Identifier: `GPL-3.0-or-later`), see [`LICENSES/GPL-3.0-or-later.txt`](./LICENSES/GPL-3.0-or-later.txt) for the full text.\n\nThe [`REUSE.toml`](./REUSE.toml) file provides detailed licensing and copyright information in a human- and machine-readable format. This includes parts that may be subject to different licensing or usage terms, such as third-party components. The repository conforms to the [REUSE specification](https://reuse.software/spec/). You can use [`reuse spdx`](https://reuse.readthedocs.io/en/latest/readme.html#cli) to create a [SPDX software bill of materials (SBOM)](https://en.wikipedia.org/wiki/Software_Package_Data_Exchange).\n\u003c!--REUSE-IgnoreEnd--\u003e\n\n[![REUSE status](https://api.reuse.software/badge/github.com/foundata/inwx-tools)](https://api.reuse.software/info/github.com/foundata/inwx-tools)\n\n\n### Trademarks\u003ca id=\"trademarks\"\u003e\u003c/a\u003e\n\n* [INWX® is a trademark](https://register.dpma.de/DPMAregister/marke/registerhabm?AKZ=018729512) of INWX GmbH, registered in Germany and probably other countries.\n\n\n## Author information\u003ca id=\"author-information\"\u003e\u003c/a\u003e\n\nThis project was created and is maintained by [foundata](https://foundata.com/). If you like it, you might [buy us a coffee](https://buy-me-a.coffee/inwx-tools/).\n\nThe INWX Tools project is *not* associated with [INWX](https://www.inwx.de/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoundata%2Finwx-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoundata%2Finwx-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoundata%2Finwx-tools/lists"}