Skip to main content

airflow-provider-unirate

PyPI Apache Airflow License

Apache Airflow provider for UniRateAPI — real-time and historical currency exchange rates. Hook, two operators, and one sensor for plugging FX rates into your DAGs.

Install

pip install airflow-provider-unirate

Requires apache-airflow >= 2.10 (works on 2.10, 2.11, and 3.x).

Connection setup

Create an Airflow connection of type UniRate:

Field Value
Conn Id unirate_default (or your own)
Conn Type UniRate
API Key your UniRate key (password field)

Or via env var:

export AIRFLOW_CONN_UNIRATE_DEFAULT='unirate://:YOUR_API_KEY@'

Get a free key at https://unirateapi.com.

Components

Hook — UniRateHook

from unirate_provider.hooks.unirate import UniRateHook

hook = UniRateHook(unirate_conn_id="unirate_default")
rate = hook.get_rate("USD", "EUR")              # latest spot rate
amount = hook.convert("USD", "EUR", 100)        # convert 100 USD → EUR
hist = hook.get_historical_rate("2024-01-15", "USD", "EUR")  # Pro plan
codes = hook.list_currencies()                  # ['USD', 'EUR', ...]

Operators

from unirate_provider.operators.unirate import (
    UniRateGetRateOperator,
    UniRateConvertOperator,
)

latest = UniRateGetRateOperator(
    task_id="latest_eur",
    from_currency="USD",
    to_currency="EUR",
)

# Historical via the same operator (Pro plan; pass YYYY-MM-DD).
historical = UniRateGetRateOperator(
    task_id="hist_eur",
    from_currency="USD",
    to_currency="EUR",
    date="{{ ds }}",
)

convert = UniRateConvertOperator(
    task_id="convert_invoice",
    from_currency="USD",
    to_currency="EUR",
    amount="{{ ti.xcom_pull(task_ids='upstream', key='amount_usd') }}",
)

Both operators push their result (a float) to XCom. from_currency, to_currency, amount, and date are all templated.

Sensor — UniRateRateChangeSensor

Trigger downstream work when an FX rate moves beyond a threshold.

from unirate_provider.sensors.unirate import UniRateRateChangeSensor

# Wake up downstream tasks when EUR moves >1% from a fixed reference.
big_move = UniRateRateChangeSensor(
    task_id="watch_eur",
    from_currency="USD",
    to_currency="EUR",
    threshold_pct=0.01,        # 1%
    baseline_rate=0.92,        # if omitted, the first poke sets the baseline
    direction="any",           # 'any' | 'up' | 'down'
    poke_interval=3600,        # check hourly
    mode="reschedule",         # default; releases the worker slot between pokes
    timeout=60 * 60 * 24,      # give up after 24h
)

The crossing rate is pushed to XCom on success.

Example DAG

A complete example lives at unirate_provider/example_dags/example_unirate.py.

Testing

pip install -e ".[test]"
pytest

Status

v0.1.0 — initial release. Hook + 2 operators + 1 sensor. 30 unit tests.

License

MIT. UniRate client (unirate-api) is also MIT.

Links

Metadata

Release files for airflow-provider-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)

Source distribution for airflow-provider-unirate 0.1.0
File Size Uploaded
airflow_provider_unirate-0.1.0.tar.gz 10.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for airflow-provider-unirate 0.1.0
File Interpreter ABI Platform
airflow_provider_unirate-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 21.3 kB

Release files / airflow_provider_unirate-0.1.0.tar.gz

Download URL airflow_provider_unirate-0.1.0.tar.gz
Size 10.6 kB
Tags Source
SHA-256 checksum
How to use checksums
cf66b268ed3de1dcd1b82ff8ed2a13c7e1c220fe57f048729a7372257b92efe7
BLAKE2b-256 checksum
How to use checksums
d77c5160e1fb09c30a820e88474687ab127f6c59a89293e9311e8f4241ae8edb
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 May 4, 2026.

Transparency log

Release files / airflow_provider_unirate-0.1.0-py3-none-any.whl

Download URL airflow_provider_unirate-0.1.0-py3-none-any.whl
Size 10.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9ab36f6791ed134ea57844566da908e18495213d487b722829f6c065ee9c5318
BLAKE2b-256 checksum
How to use checksums
65b6165249f77fca2c4e7fcb853a46c1397d7bc197582ccfc7bbe5e547615bec
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 May 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page