pyregrws
A Python library for interacting with ARIN's Reg-RWS (Registry RESTful Web Service) API. This library provides pydantic-xml models for ARIN payloads and a comprehensive REST client for CRUD operations on ARIN resources like POCs, Customers, Organizations, and Networks.
Features
- Type-safe models: Built with Pydantic v2 and pydantic-xml v2 for robust XML serialization/deserialization
- Complete CRUD operations: Create, read, update, and delete ARIN resources
- Automatic manager integration: Each model type has an associated manager for API operations
- Error handling: Built-in error response handling with proper HTTP status code mapping
- Environment configuration: Configurable via environment variables with sensible defaults (powered by pydantic-settings)
Requirements
- Python 3.11+
- Pydantic v2.0+
- pydantic-xml v2.0+
- pydantic-settings v2.0+
Installation
Install from PyPI using pip:
pip install pyregrws
Or using uv:
uv add pyregrws
Quick Start
from regrws.api.core import Api
from regrws.models import Poc, Org, Net, Customer
# Initialize the API client
api = Api(
base_url="https://reg.arin.net/", # Optional, defaults to ARIN production
api_key="your-api-key-here" # Or set REGRWS_API_KEY env var
)
# Retrieve a POC by handle
poc = api.poc.from_handle("EXAMPLE-ARIN")
print(f"POC: {poc.first_name} {poc.last_name}")
# Create a new POC
new_poc = api.poc.create(
contact_type="PERSON",
first_name="John",
last_name="Doe",
company_name="Example Corp",
iso3166_1={"name": "United States", "code2": "US", "code3": "USA", "e164": "1"},
street_address=[{"line": "123 Main St"}],
city="Anytown",
iso3166_2="VA",
postal_code="12345",
phones=[{"type": {"code": "O"}, "number": "555-123-4567"}]
)
# Update and save changes
poc.city = "New City"
updated_poc = poc.save()
# Delete a resource
poc.delete()
Configuration
The library can be configured via environment variables or by passing parameters directly to the Api class:
Environment Variables
REGRWS_BASE_URL: Base URL for the ARIN Reg-RWS API (default:https://reg.arin.net/)REGRWS_API_KEY: Your ARIN API key (required)
Warning: For testing purposes, use ARIN's Operational Test and Evaluation (OTE) environment (
https://reg.ote.arin.net/) instead of the production URL. The OTE environment provides a safe sandbox that will not affect real registration data.
Direct Configuration
from regrws.api.core import Api
from regrws.settings import Settings
# Method 1: Pass parameters directly
api = Api(
base_url="https://reg.arin.net/",
api_key="your-api-key"
)
# Method 2: Use Settings object
settings = Settings(
base_url="https://reg.arin.net/",
api_key="your-api-key"
)
api = Api(settings=settings)
API Reference
Core Classes
Api
The main entry point for the library. Automatically creates manager instances for each supported model type.
api = Api(base_url=None, api_key=None, settings=None)
Attributes:
poc: Manager for POC operationsorg: Manager for Organization operationsnet: Manager for Network operationscustomer: Manager for Customer operations
BaseManager
All model managers inherit from BaseManager and provide these methods:
create(**kwargs): Create a new resourcefrom_handle(handle): Retrieve a resource by handlesave(instance): Update an existing resourcedelete(instance): Delete a resource
Models
All models inherit from BaseModel which provides:
save(): Save changes to the resourcedelete(): Delete the resourceabsolute_url: Get the full API URL for this resourcemanager: Access to the associated API manager
Currently Supported Payloads
Core Resources
- POC - Point of Contact
- Customer - Customer records
- ORG - Organization records
- NET - Network records
- NET Block - Network block records
- POC Link - POC associations
Ticketing
Error Handling
- Error - API error responses
Examples
Working with POCs
# Retrieve an existing POC
poc = api.poc.from_handle("EXAMPLE-ARIN")
# Create a new person POC
person_poc = api.poc.create(
contact_type="PERSON",
first_name="Jane",
last_name="Smith",
company_name="ACME Corp",
iso3166_1={"name": "United States", "code2": "US", "code3": "USA", "e164": "1"},
street_address=[{"line": "456 Oak Ave"}, {"line": "Suite 100"}],
city="Springfield",
iso3166_2="IL",
postal_code="62701",
phones=[
{"type": {"code": "O"}, "number": "217-555-0123"},
{"type": {"code": "F"}, "number": "217-555-0124"}
],
comment=[{"line": "Technical contact for ACME Corp"}]
)
# Create a role POC
role_poc = api.poc.create(
contact_type="ROLE",
last_name="Network Operations Center", # Role name goes in last_name
company_name="ACME Corp",
iso3166_1={"name": "United States", "code2": "US", "code3": "USA", "e164": "1"},
street_address=[{"line": "789 Tech Dr"}],
city="Austin",
iso3166_2="TX",
postal_code="78701",
phones=[{"type": {"code": "O"}, "number": "512-555-0100"}]
)
Working with Organizations
# Retrieve an organization
org = api.org.from_handle("EXAMPLE-ARIN")
# Update organization details
org.company_name = "Updated Company Name"
updated_org = org.save()
Working with Networks
# Retrieve a network
net = api.net.from_handle("NET-192-0-2-0-1")
# Update network information
net.net_name = "UPDATED-NET-NAME"
updated_net = net.save()
Error Handling
from regrws.models import Error
try:
poc = api.poc.from_handle("NONEXISTENT-HANDLE")
except Exception as e:
# The library automatically handles error responses
print(f"Error occurred: {e}")
Development
Setup
# Clone the repository
git clone https://github.com/jsenecal/pyregrws.git
cd pyregrws
# Install dependencies
uv sync
Running Tests
# Run all tests with coverage
uv run pytest --cov -n 2 --cov-report xml --cov-report term-missing
# Run a specific test
uv run pytest tests/test_api.py::TestAPI::test_manager_from_handle
Code Quality
# Lint code
uv run ruff check
# Format code
uv run ruff format
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Add tests for your changes
- Ensure all tests pass and code is formatted
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Links
Metadata
Release files for pyregrws 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyregrws-1.0.0.tar.gz | 17.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyregrws-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 40.3 kB
Release files / pyregrws-1.0.0.tar.gz
| Download URL | pyregrws-1.0.0.tar.gz |
|---|---|
| Size | 17.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
11ca981dbc5d8c6d4f2b8d334eb7d898ddb648148dc692eac7d8fb32d20a7a16
|
|
BLAKE2b-256 checksum How to use checksums |
5b8ee24561757a4ee7488897e011f58d8940290f49d377c1c14a18b0f3a1f01f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 22, 2026.
Transparency logRelease files / pyregrws-1.0.0-py3-none-any.whl
| Download URL | pyregrws-1.0.0-py3-none-any.whl |
|---|---|
| Size | 23.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9ad9771b61fbd51b152f0a71b108615aa7524bae2c9126e5e2cb92637ecf174e
|
|
BLAKE2b-256 checksum How to use checksums |
9ab36d71cba4db328cd96647dd582eb6e9c5d1368cc0797c587dd6f183daf82c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 22, 2026.
Transparency log