# Ophelos Python SDK
Python SDK for the Ophelos API - a comprehensive debt management and customer communication platform.
## Installation
### From PyPI (when published)
```bash
pip install ophelos-sdk
```
### From Local Distribution
```bash
# Install from wheel (recommended)
pip install dist/ophelos_sdk-1.4.1-py3-none-any.whl
# Or install from source distribution
pip install dist/ophelos-sdk-1.4.1.tar.gz
# Or install in development mode
pip install -e .
```
### Requirements Files
The project includes separate requirements files:
- **`requirements.txt`** - Runtime dependencies only (for end users)
- **`requirements-dev.txt`** - Development dependencies only
- **`pyproject.toml`** - Complete dependency specification (recommended)
```bash
# For end users (runtime only)
pip install -r requirements.txt
# For developers (includes testing, linting, formatting tools)
pip install -r requirements-dev.txt
# Or install everything via pyproject.toml (recommended)
pip install -e ".[dev]"
```
## Quick Start
```python
from ophelos_sdk import OphelosClient
from ophelos_sdk.models import Customer, Debt
# Initialize client with your credentials
client = OphelosClient(
client_id="your_client_id",
client_secret="your_client_secret",
audience="your_audience",
environment="staging", # or "production"
version="2025-04-01" # API version (default: "2025-04-01")
)
# Option 1: Create using dictionaries (traditional approach)
customer = client.customers.create({
"first_name": "John",
"last_name": "Doe",
"contact_details": [
{"type": "email", "value": "john.doe@example.com", "primary": True}
]
})
# Option 2: Create using model instances (new approach)
from ophelos_sdk.models import Customer, ContactDetail
customer_model = Customer(
id="temp_cust_123", # Temporary ID
first_name="Jane",
last_name="Smith",
contact_details=[
ContactDetail(
id="temp_cd_123",
type="email",
value="jane.smith@example.com",
primary=True
)
]
)
# Pass model directly to API - automatic conversion to API body
customer = client.customers.create(customer_model)
# Create a debt using model instance
debt_model = Debt(
id="temp_debt_123",
customer=customer.id, # Use real customer ID
organisation="org_123",
currency="GBP",
account_number="ACC-001",
kind="purchased"
)
debt = client.debts.create(debt_model)
# Prepare the debt for processing
client.debts.ready(debt.id)
```
📋 **For comprehensive usage examples and advanced features, see [USAGE.md](USAGE.md)**
## Key Features
- **Complete API Coverage**: All Ophelos API endpoints with comprehensive test coverage
- **Type Safety**: Full type hints and Pydantic models with automatic API body generation
- **Model-First Approach**: Create and pass Pydantic model instances directly to API calls
- **Request/Response Transparency**: Access complete HTTP request and response details from any model instance
- **Smart Field Management**: Automatic exclusion of server-generated fields and intelligent relationship handling
- **Comprehensive Error Handling**: Full debugging context for all error types (API, timeout, parsing, unexpected)
- **Authentication**: Automatic OAuth2 token management with thread-safe token caching
- **Multi-Tenant Support**: Automatic tenant header injection
- **Pagination**: Built-in pagination support with generators for memory-efficient iteration
- **Webhooks**: Webhook event handling and validation with signature verification
- **Concurrent Safe**: Thread-safe for use with concurrent request patterns
## Request/Response Transparency
Every model instance returned by the SDK includes complete HTTP request and response details:
```python
# Get a customer
customer = client.customers.get('cust_123')
# Access request details
print(customer.request_info)
# Output: {
# 'method': 'GET',
# 'url': 'https://api.ophelos.com/customers/cust_123',
# 'headers': {'Authorization': 'Bearer ...', 'Ophelos-Version': '2025-04-01'},
# 'body': None
# }
# Access response details
print(customer.response_info)
# Output: {
# 'status_code': 200,
# 'headers': {'Content-Type': 'application/json', ...},
# 'url': 'https://api.ophelos.com/customers/cust_123'
# }
# Access raw response object for advanced use cases
response = customer.response_raw
print(f"Response took: {response.elapsed.total_seconds()} seconds")
print(f"Server: {response.headers.get('Server')}")
# Works with all operations - create, update, list, search
debts = client.debts.list(limit=10)
for debt in debts.data:
print(f"Debt {debt.id} response time: {debt.response_raw.elapsed}")
# Also works with paginated responses
print(f"List request: {debts.request_info}")
print(f"List response status: {debts.response_info['status_code']}")
```
This transparency enables:
- **Request debugging**: See exactly what was sent to the API (works for errors too)
- **Response monitoring**: Track response times, status codes, headers
- **Error diagnosis**: Full request context available even for timeouts and failures
- **Audit trails**: Log complete request/response details for compliance
- **Performance analysis**: Monitor API response times and patterns
## Model-First API Usage
The SDK supports both traditional dictionary-based API calls and a modern model-first approach:
```python
from ophelos_sdk.models import Customer, Debt, ContactDetail
# Create models with type safety and validation
customer = Customer(
id="temp_123", # Temporary ID for creation
first_name="John",
last_name="Doe",
contact_details=[
ContactDetail(
id="temp_cd_1",
type="email",
value="john@example.com",
primary=True
)
]
)
# Pass model directly to API - automatic conversion
created_customer = client.customers.create(customer)
# Smart API body generation - automatically excludes server-generated fields
api_body = customer.to_api_body()
print(api_body)
# Output: {
# "first_name": "John",
# "last_name": "Doe",
# "contact_details": [
# {"type": "email", "value": "john@example.com", "primary": True}
# ]
# }
# Note: id, object, created_at, updated_at are automatically excluded
```
## Authentication
### Option 1: OAuth2 Client Credentials (Recommended)
```python
# OAuth2 authentication (automatic token management)
client = OphelosClient(
client_id="your_client_id",
client_secret="your_client_secret",
audience="your_audience",
environment="production", # "development", "staging", or "production"
version="2025-04-01" # API version (default: "2025-04-01")
)
```
### Option 2: Direct Access Token
```python
# Direct access token authentication
client = OphelosClient(
access_token="your_access_token",
version="2025-04-01"
)
```
### Multi-Tenant Support
```python
# Initialize client with tenant ID
client = OphelosClient(
client_id="your_client_id",
client_secret="your_client_secret",
audience="your_audience",
environment="production",
tenant_id="tenant_123" # Automatically adds OPHELOS_TENANT_ID header
)
```
Contact Ophelos support to obtain credentials.
## Examples
### Working with Debts
```python
from ophelos_sdk.models import Debt
# List debts with pagination
debts = client.debts.list(limit=10, expand=["customer"])
# Access request/response details
print(f"Request URL: {debts.request_info['url']}")
print(f"Response time: {debts.response_raw.elapsed.total_seconds()}s")
# Search debts
results = client.debts.search("status:paying AND updated_at>=2024-01-01")
# Get debt details
debt = client.debts.get("debt_123", expand=["customer", "payments"])
# Create using model instance
debt_model = Debt(
id="temp_debt",
customer="cust_123",
organisation="org_123",
currency="GBP",
account_number="ACC-001",
kind="purchased"
)
created_debt = client.debts.create(debt_model)
# Access creation request details
print(f"Created debt with request: {created_debt.request_info}")
```
### Working with Contact Details
```python
from ophelos_sdk.models import ContactDetail
# Create contact detail for a customer
contact = client.contact_details.create("cust_123", {
"type": "email",
"value": "john.doe@example.com",
"primary": True,
"usage": "billing"
})
# Get specific contact detail
contact_detail = client.contact_details.get("cust_123", contact.id)
# Update contact detail
updated_contact = client.contact_details.update("cust_123", contact.id, {
"usage": "notifications"
})
# List all contact details for customer
contacts = client.contact_details.list("cust_123")
# Access request/response details
print(f"Contact creation time: {contact.response_raw.elapsed.total_seconds()}s")
print(f"List request: {contacts.request_info['url']}")
```
### Error Handling with Request/Response Debugging
```python
from ophelos_sdk.exceptions import (
OphelosAPIError, AuthenticationError, TimeoutError,
ParseError, UnexpectedError
)
try:
debt = client.debts.get("invalid_debt_id")
except OphelosAPIError as e:
print(f"API Error: {e.message} (Status: {e.status_code})")
print(f"Request: {e.request_info}") # Full request details
print(f"Response time: {e.response_raw.elapsed.total_seconds()}s")
except TimeoutError as e:
print(f"Request timed out: {e.message}")
print(f"Request details: {e.request_info}") # Available even for timeouts
except UnexpectedError as e:
print(f"Unexpected error: {e.message}")
print(f"Original error: {e.original_error}")
print(f"Request context: {e.request_info}")
```
### Webhook Handling
```python
from ophelos_sdk.webhooks import WebhookHandler
# Initialize webhook handler
webhook_handler = WebhookHandler("your_webhook_secret")
# Validate and parse webhook
try:
event = webhook_handler.verify_and_parse(
payload=request.body,
signature=request.headers.get("Ophelos-Signature")
)
if event.type == "debt.created":
print(f"New debt created: {event.data.id}")
except Exception as e:
print(f"Webhook validation failed: {e}")
```
## API Resources
- **Debts**: Create, update, and manage debts with lifecycle operations
- **Customers**: Customer CRUD operations with contact detail management
- **Contact Details**: Manage customer contact information (email, phone, address)
- **Payments**: Payment processing and tracking
- **Organisations**: Organisation setup and configuration
- **Invoices**: Invoice creation and management
- **Communications**: Communication tracking and management
- **Payment Plans**: Payment plan management
- **Webhooks**: Webhook management and validation
## Pagination
```python
# List with automatic pagination
debts = client.debts.list(limit=50)
# Check pagination status
if debts.has_more:
print(f"Total count: {debts.total_count}")
# Navigate using cursors
next_page = client.debts.list(limit=50, after=debts.pagination['next']['after'])
# Memory-efficient iteration
for debt in client.debts.iterate(limit_per_page=100):
print(f"Processing debt: {debt.id}")
```
## Development
```bash
# Clone and install
git clone https://github.com/ophelos/ophelos-python-sdk.git
cd ophelos-python-sdk
pip install -e ".[dev]"
# Run tests (250+ tests including 143 model tests)
pytest
# Run linting
flake8 ophelos_sdk/
mypy ophelos_sdk/
black ophelos_sdk/ --line-length 120
```
## Support
- **API Reference**: [https://api.ophelos.com](https://api.ophelos.com)
- **Support Email**: support@ophelos.com
- **GitHub Issues**: [GitHub Issues](https://github.com/tomasz-oph/ophelos_python_sdk/issues)
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
Raw data
{
"_id": null,
"home_page": "https://github.com/tomasz-oph/ophelos_python_sdk",
"name": "ophelos-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "ophelos, api, sdk, debt, management, payments, collections",
"author": "Ophelos",
"author_email": "Ophelos <support@ophelos.com>",
"download_url": "https://files.pythonhosted.org/packages/dd/8d/df7eb19a1bcec66be7f8f8271c622f1f2504f2937e599ef4fe4c43398aa9/ophelos_sdk-1.4.1.tar.gz",
"platform": null,
"description": "# Ophelos Python SDK\n\nPython SDK for the Ophelos API - a comprehensive debt management and customer communication platform.\n\n## Installation\n\n### From PyPI (when published)\n\n```bash\npip install ophelos-sdk\n```\n\n### From Local Distribution\n\n```bash\n# Install from wheel (recommended)\npip install dist/ophelos_sdk-1.4.1-py3-none-any.whl\n\n# Or install from source distribution\npip install dist/ophelos-sdk-1.4.1.tar.gz\n\n# Or install in development mode\npip install -e .\n```\n\n### Requirements Files\n\nThe project includes separate requirements files:\n\n- **`requirements.txt`** - Runtime dependencies only (for end users)\n- **`requirements-dev.txt`** - Development dependencies only\n- **`pyproject.toml`** - Complete dependency specification (recommended)\n\n```bash\n# For end users (runtime only)\npip install -r requirements.txt\n\n# For developers (includes testing, linting, formatting tools)\npip install -r requirements-dev.txt\n\n# Or install everything via pyproject.toml (recommended)\npip install -e \".[dev]\"\n```\n\n## Quick Start\n\n```python\nfrom ophelos_sdk import OphelosClient\nfrom ophelos_sdk.models import Customer, Debt\n\n# Initialize client with your credentials\nclient = OphelosClient(\n client_id=\"your_client_id\",\n client_secret=\"your_client_secret\",\n audience=\"your_audience\",\n environment=\"staging\", # or \"production\"\n version=\"2025-04-01\" # API version (default: \"2025-04-01\")\n)\n\n# Option 1: Create using dictionaries (traditional approach)\ncustomer = client.customers.create({\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"contact_details\": [\n {\"type\": \"email\", \"value\": \"john.doe@example.com\", \"primary\": True}\n ]\n})\n\n# Option 2: Create using model instances (new approach)\nfrom ophelos_sdk.models import Customer, ContactDetail\n\ncustomer_model = Customer(\n id=\"temp_cust_123\", # Temporary ID\n first_name=\"Jane\",\n last_name=\"Smith\",\n contact_details=[\n ContactDetail(\n id=\"temp_cd_123\",\n type=\"email\",\n value=\"jane.smith@example.com\",\n primary=True\n )\n ]\n)\n\n# Pass model directly to API - automatic conversion to API body\ncustomer = client.customers.create(customer_model)\n\n# Create a debt using model instance\ndebt_model = Debt(\n id=\"temp_debt_123\",\n customer=customer.id, # Use real customer ID\n organisation=\"org_123\",\n currency=\"GBP\",\n account_number=\"ACC-001\",\n kind=\"purchased\"\n)\n\ndebt = client.debts.create(debt_model)\n\n# Prepare the debt for processing\nclient.debts.ready(debt.id)\n```\n\n\ud83d\udccb **For comprehensive usage examples and advanced features, see [USAGE.md](USAGE.md)**\n\n## Key Features\n\n- **Complete API Coverage**: All Ophelos API endpoints with comprehensive test coverage\n- **Type Safety**: Full type hints and Pydantic models with automatic API body generation\n- **Model-First Approach**: Create and pass Pydantic model instances directly to API calls\n- **Request/Response Transparency**: Access complete HTTP request and response details from any model instance\n- **Smart Field Management**: Automatic exclusion of server-generated fields and intelligent relationship handling\n- **Comprehensive Error Handling**: Full debugging context for all error types (API, timeout, parsing, unexpected)\n- **Authentication**: Automatic OAuth2 token management with thread-safe token caching\n- **Multi-Tenant Support**: Automatic tenant header injection\n- **Pagination**: Built-in pagination support with generators for memory-efficient iteration\n- **Webhooks**: Webhook event handling and validation with signature verification\n- **Concurrent Safe**: Thread-safe for use with concurrent request patterns\n\n## Request/Response Transparency\n\nEvery model instance returned by the SDK includes complete HTTP request and response details:\n\n```python\n# Get a customer\ncustomer = client.customers.get('cust_123')\n\n# Access request details\nprint(customer.request_info)\n# Output: {\n# 'method': 'GET',\n# 'url': 'https://api.ophelos.com/customers/cust_123',\n# 'headers': {'Authorization': 'Bearer ...', 'Ophelos-Version': '2025-04-01'},\n# 'body': None\n# }\n\n# Access response details\nprint(customer.response_info)\n# Output: {\n# 'status_code': 200,\n# 'headers': {'Content-Type': 'application/json', ...},\n# 'url': 'https://api.ophelos.com/customers/cust_123'\n# }\n\n# Access raw response object for advanced use cases\nresponse = customer.response_raw\nprint(f\"Response took: {response.elapsed.total_seconds()} seconds\")\nprint(f\"Server: {response.headers.get('Server')}\")\n\n# Works with all operations - create, update, list, search\ndebts = client.debts.list(limit=10)\nfor debt in debts.data:\n print(f\"Debt {debt.id} response time: {debt.response_raw.elapsed}\")\n\n# Also works with paginated responses\nprint(f\"List request: {debts.request_info}\")\nprint(f\"List response status: {debts.response_info['status_code']}\")\n```\n\nThis transparency enables:\n- **Request debugging**: See exactly what was sent to the API (works for errors too)\n- **Response monitoring**: Track response times, status codes, headers\n- **Error diagnosis**: Full request context available even for timeouts and failures\n- **Audit trails**: Log complete request/response details for compliance\n- **Performance analysis**: Monitor API response times and patterns\n\n## Model-First API Usage\n\nThe SDK supports both traditional dictionary-based API calls and a modern model-first approach:\n\n```python\nfrom ophelos_sdk.models import Customer, Debt, ContactDetail\n\n# Create models with type safety and validation\ncustomer = Customer(\n id=\"temp_123\", # Temporary ID for creation\n first_name=\"John\",\n last_name=\"Doe\",\n contact_details=[\n ContactDetail(\n id=\"temp_cd_1\",\n type=\"email\",\n value=\"john@example.com\",\n primary=True\n )\n ]\n)\n\n# Pass model directly to API - automatic conversion\ncreated_customer = client.customers.create(customer)\n\n# Smart API body generation - automatically excludes server-generated fields\napi_body = customer.to_api_body()\nprint(api_body)\n# Output: {\n# \"first_name\": \"John\",\n# \"last_name\": \"Doe\",\n# \"contact_details\": [\n# {\"type\": \"email\", \"value\": \"john@example.com\", \"primary\": True}\n# ]\n# }\n# Note: id, object, created_at, updated_at are automatically excluded\n```\n\n## Authentication\n\n### Option 1: OAuth2 Client Credentials (Recommended)\n\n```python\n# OAuth2 authentication (automatic token management)\nclient = OphelosClient(\n client_id=\"your_client_id\",\n client_secret=\"your_client_secret\",\n audience=\"your_audience\",\n environment=\"production\", # \"development\", \"staging\", or \"production\"\n version=\"2025-04-01\" # API version (default: \"2025-04-01\")\n)\n```\n\n### Option 2: Direct Access Token\n\n```python\n# Direct access token authentication\nclient = OphelosClient(\n access_token=\"your_access_token\",\n version=\"2025-04-01\"\n)\n```\n\n### Multi-Tenant Support\n\n```python\n# Initialize client with tenant ID\nclient = OphelosClient(\n client_id=\"your_client_id\",\n client_secret=\"your_client_secret\",\n audience=\"your_audience\",\n environment=\"production\",\n tenant_id=\"tenant_123\" # Automatically adds OPHELOS_TENANT_ID header\n)\n```\n\nContact Ophelos support to obtain credentials.\n\n## Examples\n\n### Working with Debts\n\n```python\nfrom ophelos_sdk.models import Debt\n\n# List debts with pagination\ndebts = client.debts.list(limit=10, expand=[\"customer\"])\n\n# Access request/response details\nprint(f\"Request URL: {debts.request_info['url']}\")\nprint(f\"Response time: {debts.response_raw.elapsed.total_seconds()}s\")\n\n# Search debts\nresults = client.debts.search(\"status:paying AND updated_at>=2024-01-01\")\n\n# Get debt details\ndebt = client.debts.get(\"debt_123\", expand=[\"customer\", \"payments\"])\n\n# Create using model instance\ndebt_model = Debt(\n id=\"temp_debt\",\n customer=\"cust_123\",\n organisation=\"org_123\",\n currency=\"GBP\",\n account_number=\"ACC-001\",\n kind=\"purchased\"\n)\n\ncreated_debt = client.debts.create(debt_model)\n\n# Access creation request details\nprint(f\"Created debt with request: {created_debt.request_info}\")\n```\n\n### Working with Contact Details\n\n```python\nfrom ophelos_sdk.models import ContactDetail\n\n# Create contact detail for a customer\ncontact = client.contact_details.create(\"cust_123\", {\n \"type\": \"email\",\n \"value\": \"john.doe@example.com\",\n \"primary\": True,\n \"usage\": \"billing\"\n})\n\n# Get specific contact detail\ncontact_detail = client.contact_details.get(\"cust_123\", contact.id)\n\n# Update contact detail\nupdated_contact = client.contact_details.update(\"cust_123\", contact.id, {\n \"usage\": \"notifications\"\n})\n\n# List all contact details for customer\ncontacts = client.contact_details.list(\"cust_123\")\n\n# Access request/response details\nprint(f\"Contact creation time: {contact.response_raw.elapsed.total_seconds()}s\")\nprint(f\"List request: {contacts.request_info['url']}\")\n```\n\n### Error Handling with Request/Response Debugging\n\n```python\nfrom ophelos_sdk.exceptions import (\n OphelosAPIError, AuthenticationError, TimeoutError,\n ParseError, UnexpectedError\n)\n\ntry:\n debt = client.debts.get(\"invalid_debt_id\")\nexcept OphelosAPIError as e:\n print(f\"API Error: {e.message} (Status: {e.status_code})\")\n print(f\"Request: {e.request_info}\") # Full request details\n print(f\"Response time: {e.response_raw.elapsed.total_seconds()}s\")\nexcept TimeoutError as e:\n print(f\"Request timed out: {e.message}\")\n print(f\"Request details: {e.request_info}\") # Available even for timeouts\nexcept UnexpectedError as e:\n print(f\"Unexpected error: {e.message}\")\n print(f\"Original error: {e.original_error}\")\n print(f\"Request context: {e.request_info}\")\n```\n\n### Webhook Handling\n\n```python\nfrom ophelos_sdk.webhooks import WebhookHandler\n\n# Initialize webhook handler\nwebhook_handler = WebhookHandler(\"your_webhook_secret\")\n\n# Validate and parse webhook\ntry:\n event = webhook_handler.verify_and_parse(\n payload=request.body,\n signature=request.headers.get(\"Ophelos-Signature\")\n )\n\n if event.type == \"debt.created\":\n print(f\"New debt created: {event.data.id}\")\n\nexcept Exception as e:\n print(f\"Webhook validation failed: {e}\")\n```\n\n## API Resources\n\n- **Debts**: Create, update, and manage debts with lifecycle operations\n- **Customers**: Customer CRUD operations with contact detail management\n- **Contact Details**: Manage customer contact information (email, phone, address)\n- **Payments**: Payment processing and tracking\n- **Organisations**: Organisation setup and configuration\n- **Invoices**: Invoice creation and management\n- **Communications**: Communication tracking and management\n- **Payment Plans**: Payment plan management\n- **Webhooks**: Webhook management and validation\n\n## Pagination\n\n```python\n# List with automatic pagination\ndebts = client.debts.list(limit=50)\n\n# Check pagination status\nif debts.has_more:\n print(f\"Total count: {debts.total_count}\")\n\n # Navigate using cursors\n next_page = client.debts.list(limit=50, after=debts.pagination['next']['after'])\n\n# Memory-efficient iteration\nfor debt in client.debts.iterate(limit_per_page=100):\n print(f\"Processing debt: {debt.id}\")\n```\n\n## Development\n\n```bash\n# Clone and install\ngit clone https://github.com/ophelos/ophelos-python-sdk.git\ncd ophelos-python-sdk\npip install -e \".[dev]\"\n\n# Run tests (250+ tests including 143 model tests)\npytest\n\n# Run linting\nflake8 ophelos_sdk/\nmypy ophelos_sdk/\nblack ophelos_sdk/ --line-length 120\n```\n\n## Support\n\n- **API Reference**: [https://api.ophelos.com](https://api.ophelos.com)\n- **Support Email**: support@ophelos.com\n- **GitHub Issues**: [GitHub Issues](https://github.com/tomasz-oph/ophelos_python_sdk/issues)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python SDK for the Ophelos API",
"version": "1.4.1",
"project_urls": {
"Bug Reports": "https://github.com/tomasz-oph/ophelos_python_sdk/issues",
"Changelog": "https://github.com/tomasz-oph/ophelos_python_sdk/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/tomasz-oph/ophelos_python_sdk",
"Homepage": "https://github.com/tomasz-oph/ophelos_python_sdk",
"Repository": "https://github.com/tomasz-oph/ophelos_python_sdk"
},
"split_keywords": [
"ophelos",
" api",
" sdk",
" debt",
" management",
" payments",
" collections"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "3d49490fa5b381457e51d7a863f9c28d69fdb6616073e8c2008257a75d75bc9d",
"md5": "299865f7358c16ebe24f26b7626c3215",
"sha256": "9424c4b25ad6c19bd2e0d695c636a9b8d9d5c34d49c4f8026b90287ac6682f83"
},
"downloads": -1,
"filename": "ophelos_sdk-1.4.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "299865f7358c16ebe24f26b7626c3215",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 44008,
"upload_time": "2025-07-08T19:40:29",
"upload_time_iso_8601": "2025-07-08T19:40:29.234546Z",
"url": "https://files.pythonhosted.org/packages/3d/49/490fa5b381457e51d7a863f9c28d69fdb6616073e8c2008257a75d75bc9d/ophelos_sdk-1.4.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dd8ddf7eb19a1bcec66be7f8f8271c622f1f2504f2937e599ef4fe4c43398aa9",
"md5": "4aa3086bf7b89dfd55bb724f2a69ccf9",
"sha256": "8f50727bca9623a732555e3a21fc66fe0959af3cd0db1c5586be745ebf6d6d78"
},
"downloads": -1,
"filename": "ophelos_sdk-1.4.1.tar.gz",
"has_sig": false,
"md5_digest": "4aa3086bf7b89dfd55bb724f2a69ccf9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 70359,
"upload_time": "2025-07-08T19:40:30",
"upload_time_iso_8601": "2025-07-08T19:40:30.380073Z",
"url": "https://files.pythonhosted.org/packages/dd/8d/df7eb19a1bcec66be7f8f8271c622f1f2504f2937e599ef4fe4c43398aa9/ophelos_sdk-1.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-08 19:40:30",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tomasz-oph",
"github_project": "ophelos_python_sdk",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "requests",
"specs": [
[
">=",
"2.31.0"
]
]
},
{
"name": "pydantic",
"specs": [
[
">=",
"2.0.0"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
">=",
"2.8.0"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
">=",
"4.0.0"
]
]
}
],
"lcname": "ophelos-sdk"
}