Skip to main content

Python client for Nova Poshta API

Project description

novaposhta-python-client

A Python client for interfacing with the Nova Poshta API. Designed to provide easy access to all API functionalities with emphasis on consistency and usability.

Tests License PyPI Downloads Downloads Python Versions Code style: black Imports: isort

Description

This client is compatible with python = "^3.9" and aims to mirror the Nova Poshta API's endpoints, offering a 1:1 mapping where possible. However, users should be aware of the inconsistencies and occasional ambiguities present in the API. This can affect the signatures of some methods, and special attention is needed when working with endpoints like the save method from some models which can create different items based on the provided input.

Efforts to enhance the consistency and robustness of the client are ongoing, and future releases will focus on thorough testing and refinement of all possible parameter combinations.

Installation

pip install novaposhta-python-client

Usage

Here's a basic example of how to use the client:

from novaposhta.client import NovaPoshtaApi

# Instantiate the client
client = NovaPoshtaApi('my-api-token', timeout=30)

# Example usage of different models
settlements = client.address.search_settlements(city_name='Київ', limit=5)
my_pack_list = client.common.get_pack_list(length=1, width=5)
return_reason = client.additional_service.get_return_reasons()

# Print results
print(settlements, my_pack_list, return_reason)
client.close_sync()

Please, close the client whenever you are done with it to avoid resource leaks.

You can also use async client:

import asyncio
from novaposhta.client import NovaPoshtaApi

async def use_api_async():
    async_client = NovaPoshtaApi('your_api_key', timeout=30, async_mode=True, raise_for_errors=True)
    address = async_client.address
    settlements = await address.search_settlements(city_name='Київ', limit=5)
    print(settlements)
    await async_client.close_async()
asyncio.run(use_api_async())

You can use context manager to automatically close the client:

from novaposhta.client import NovaPoshtaApi
def use_api_sync():
    with NovaPoshtaApi(api_key='your_api_key', async_mode=False) as api:
        # Do something with the API
        pass

async def use_api_async():
    async with NovaPoshtaApi(api_key='your_api_key', async_mode=True) as api:
        # Do something with the API
        pass

Error handling

import httpx
from novaposhta.client import NovaPoshtaApi, InvalidAPIKeyError, APIRequestError

# Instantiate the client
client = NovaPoshtaApi('your_api_key', timeout=30, raise_for_errors=True)

try:
    client.common.get_cargo_types()
except httpx.HTTPError as error:
    print(f"HTTP error: {error}")
except InvalidAPIKeyError as error:
    print(f"API key expired or otherwise invalid: {error}")
except APIRequestError as error:
    print(f"Something else is wrong with API request: {error}")

Extending the Client

Custom HTTP Client

While httpx is the default HTTP library, you can easily substitute it with requests or another library, provided it follows the same interface:

from novaposhta.client import NovaPoshtaApi
import my_http_client

client = NovaPoshtaApi('your_api_key', http_client=my_http_client.Client)

Adding New Methods

If a method isn’t implemented, or you prefer a custom implementation, extend the model as shown below:

from novaposhta.models.base import BaseModel, api_method


class MyCustomModel(BaseModel):
    @api_method('MissingMethod')
    def missing_method(self, some_param: str):
        return self._call_with_props(SomeParam=some_param)

The client caches all model instances. To reset and create a new model instance, use the new method:

from novaposhta.client import NovaPoshtaApi
from novaposhta.models.address import Address

client = NovaPoshtaApi('my-api-token')
address = client.new(Address)

To get your custom model instance, use the get method:

my_custom_model = client.get(MyCustomModel.name)

Experimental: Chain Operations

The chain functionality allows you to sequence multiple API operations, where each operation's output can be transformed and passed to the next operation. This is particularly useful for scenarios that require multiple dependent API calls, like searching for addresses or creating shipments. Each result of prepare_next is passed to the next operation as updated kwargs.

⚠️ Note: This feature is experimental and currently optimized for async usage.

Basic Usage

from novaposhta.client import NovaPoshtaApi
from novaposhta.chains import Chain 

# Initialize client in async mode
client = NovaPoshtaApi("API_KEY", async_mode=True)

# Create a chain of operations
chain = (
    Chain(
        client.address.get_areas,
        prepare_next=lambda x: {'ref': x['data'][0]['AreasCenter']}
    ) |
    Chain(
        client.address.get_cities,
        prepare_next=lambda x: {'city_ref': x['data'][0]['Ref']}
    ) |
    Chain(
        client.address.get_street,
        kwargs={'find_by_string': 'Street Name'}
    )
)

# Execute chain
results = await chain.execute_async()

Features

  • Chain multiple API operations using the | operator
  • Transform operation results for next operation using prepare_next
  • Automatic error handling and chain interruption on failure
  • Preserve both original API responses and transformed data
  • Initial parameters via kwargs

Common Patterns

# Address search chain
from novaposhta.client import NovaPoshtaApi

client = NovaPoshtaApi("API_KEY", async_mode=True)
from novaposhta.chains import Chain
address = client.address
chain = (
    Chain(
        address.search_settlements,
        kwargs={'city_name': 'Київ'},
        prepare_next=lambda x: {'settlement_ref': x['data'][0]['Ref']}
    ) |
    Chain(
        address.search_settlement_streets,
        kwargs={'street_name': 'Main'}
    )
)

# Execute and process results
results = await chain.execute_async()
for result in results:
    print(f"Success: {result.success}")
    print(f"Data: {result.data}")
    print(f"Next kwargs: {result.next_kwargs}")

Limitations

  • Currently optimized for async usage
  • Experimental API that may change
  • Sequential execution only (no parallel operations)

Testing and linting

Note: install dev dependencies first

poetry run black novaposhta/
poetry run isort novaposhta/
poetry run mypy novaposhta/
poetry run pytest --cov=novaposhta tests/

Contributing

We welcome contributions that can help in enhancing the functionality and improving the consistency of the client. For bugs or feature requests, please open an issue on the GitHub repository. Please, use black, isort and mypy as your instrument for code formatting and type checking.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

novaposhta_python_client-0.1.12.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

novaposhta_python_client-0.1.12-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

Details for the file novaposhta_python_client-0.1.12.tar.gz.

File metadata

  • Download URL: novaposhta_python_client-0.1.12.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.14.2 Darwin/25.2.0

File hashes

Hashes for novaposhta_python_client-0.1.12.tar.gz
Algorithm Hash digest
SHA256 92007f2447fb7fb17eeb77a977c8e90837c34611cffb9565abb8a30724b9309e
MD5 66035734343e3a03b66f2078734f97c3
BLAKE2b-256 2457507b3d72b7e735dd1e2795a5e69b71a27d3fbb13075589655ec4ac21303f

See more details on using hashes here.

File details

Details for the file novaposhta_python_client-0.1.12-py3-none-any.whl.

File metadata

File hashes

Hashes for novaposhta_python_client-0.1.12-py3-none-any.whl
Algorithm Hash digest
SHA256 6e41d8e43714a026c813236e19d368d24274c2914edf823ec3bf218fa43acc25
MD5 79b6e0a00a6a3a0bf4538c6b36efce01
BLAKE2b-256 7fcc3fc997ba8d2a41ab96f0544d6aea8a7002ed1f15a8fe8469b6195540ba1f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page