litestar-unirate
Litestar plugin for the UniRate currency-exchange API:
UniRatePlugin— anInitPluginProtocolplugin that provides a shared, asyncUniRateClientto your handlers through Litestar's dependency injection (injected asunirateby default).- Prebuilt route handlers — a
UniRateControllermounted at/unirateexposingGET /unirate/rate,/convert,/currencies, and/vat, with full UniRate error mapping onto Litestar HTTP exceptions. - One HTTP client per app — an
httpx.AsyncClient-backed client opened on demand and closed on shutdown.
UniRate covers 593+ fiat, crypto, and commodity codes. Latest rates,
conversion, currencies, and VAT are on the free tier; historical endpoints
(convert_historical) require Pro.
Install
pip install litestar-unirate
Or with uv / Poetry:
uv add litestar-unirate
poetry add litestar-unirate
Quick start
from litestar import Litestar, get
from litestar_unirate import UniRateClient, UniRateConfig, UniRatePlugin
app = Litestar(
plugins=[UniRatePlugin(UniRateConfig())], # reads UNIRATE_API_KEY from env
)
That alone mounts the prebuilt endpoints:
$ curl 'localhost:8000/unirate/rate?from_currency=USD&to_currency=JPY'
{"rate":151.83}
$ curl 'localhost:8000/unirate/convert?from_currency=USD&to_currency=EUR&amount=100'
{"result":92.5}
$ curl localhost:8000/unirate/currencies
{"currencies":["USD","EUR","GBP", ...]}
$ curl 'localhost:8000/unirate/vat?country=DE'
{"country":"DE","vat_data":{"country_code":"DE","country_name":"Germany","vat_rate":19.0}}
The plugin also injects the client into your own handlers under the unirate
key:
@get("/summary")
async def summary(unirate: UniRateClient) -> dict[str, object]:
return {"usd_eur": await unirate.get_rate("USD", "EUR")}
Configuration
UniRateConfig controls the client and the routes:
UniRateConfig(
api_key=None, # default: $UNIRATE_API_KEY
base_url="https://api.unirateapi.com", # default: production
timeout=30.0, # HTTP timeout (seconds)
dependency_key="unirate", # DI name for the client
register_routes=True, # mount the prebuilt /unirate/* routes
route_path_prefix="/unirate", # where to mount them
)
Set register_routes=False to expose only the injectable client and wire your
own handlers.
Note: the prebuilt
UniRateControllerinjects the client under the nameunirate. If you set a customdependency_key, keepregister_routes=False(or use the default key) so the controller resolves its dependency.
Client methods
The injected UniRateClient is a small async wrapper over UniRate:
| Method | Returns |
|---|---|
get_rate(from_currency="USD", to_currency=None) |
float for a pair, else dict[str, float] |
convert(from_currency, to_currency, amount=1.0) |
float |
get_supported_currencies() |
list[str] |
get_vat_rates(country=None) |
dict (vat_rates map, or vat_data for one country) |
convert_historical(from_currency, to_currency, date, amount=1.0) |
float (Pro) |
Errors
The client raises UniRateAPIError (with status_code) on non-2xx responses.
The prebuilt handlers translate those onto Litestar HTTP exceptions:
| UniRate HTTP | Litestar exception | Response |
|---|---|---|
| 400 | ClientException |
400 |
| 401 | NotAuthorizedException |
401 |
| 403 | PermissionDeniedException |
403 (Pro required) |
| 404 | NotFoundException |
404 |
| 429 | TooManyRequestsException |
429 |
| 503 | ServiceUnavailableException |
503 |
| transport / other | HTTPException |
502 |
Compatibility
- Python 3.10 – 3.13
- Litestar ≥ 2.0
- httpx ≥ 0.27
Related
unirate-api— sync UniRate Python client.fastapi-unirate— FastAPI integration.flask-unirate— Flask integration.- Other UniRate integrations: dbt, Airflow, LangChain, MCP server. Full list at https://unirateapi.com.
Other UniRate clients
UniRate ships official client libraries and framework integrations across the ecosystem. The repos below are all maintained under the UniRate-API org.
- Languages: Python · Node.js / TypeScript · Go · Rust · Java · Ruby · PHP · .NET · Swift
- Web frameworks: FastAPI · Flask · NestJS · Django / Wagtail · React · tRPC
- Static-site generators: Astro · Eleventy · Hugo
- Data / orchestration: Airflow · dbt · LangChain
- Workflow / no-code: n8n · Google Sheets · MCP server
Get a free API key at unirateapi.com.
License
MIT
Metadata
Release files for litestar-unirate 0.1.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 | |
|---|---|---|---|
| litestar_unirate-0.1.0.tar.gz | 11.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| litestar_unirate-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.2 kB
Release files / litestar_unirate-0.1.0.tar.gz
| Download URL | litestar_unirate-0.1.0.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
83594bf2147ecea29029c10e63cba13d81e569ea698216616d99b599ef6deecd
|
|
BLAKE2b-256 checksum How to use checksums |
6baaaaa19ca5117ff930f84b32bb8a5d580495360bc0399a389d7a2886a675e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 17, 2026.
Transparency logRelease files / litestar_unirate-0.1.0-py3-none-any.whl
| Download URL | litestar_unirate-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
369ca16bdabfbe790493f440722a115b15f5e98a0d1b1e55230ca52b622c92af
|
|
BLAKE2b-256 checksum How to use checksums |
9c743536fd3141f1507fb5b09e9b2d63f4ce591ac72ce1788a7348c4284d92e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 17, 2026.
Transparency log