ophelos-sdk


Nameophelos-sdk JSON
Version 1.4.1 PyPI version JSON
download
home_pagehttps://github.com/tomasz-oph/ophelos_python_sdk
SummaryPython SDK for the Ophelos API
upload_time2025-07-08 19:40:30
maintainerNone
docs_urlNone
authorOphelos
requires_python>=3.8
licenseMIT
keywords ophelos api sdk debt management payments collections
VCS
bugtrack_url
requirements requests pydantic python-dateutil typing-extensions
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.46217s