notamify-sdk (Python)
Python SDK for Notamify public APIs:
- Notamify API v2 (
https://api.notamify.com/api/v2) - Watcher API (
https://watcher.notamify.com)
Features
- Typed API client with one auth token
- Pydantic response/request models
- Pager-style NOTAM listing via
client.notams.*with item iteration andpager.pages - Supported NOTAM endpoints:
GET /notamsGET /notams/rawGET /notams/nearbyGET /notams/archivePOST /notams/briefingGET /notams/briefing/{uuid}POST /notams/prioritisation
- Watcher listener management + webhook logs/secrets
- Listener
modesupport (proddefault,sandboxfor test-only listeners) - Listener lifecycle support via
lifecycle.enabledandlifecycle.types - Sandbox test delivery endpoint (
POST /listeners/{id}/sandbox:send) - Webhook signature verification (
X-Notamify-Signature) - Typed webhook event models for
interpretationandlifecyclepayloads - Embedded receiver + cloudflared helper for local webhook testing
- Strict receiver mode fails fast when webhook secret is missing
Install
pip install notamify-sdk
Or with uv:
uv add notamify-sdk
For contributors working from a source checkout:
uv sync
Configuration
Environment variables (highest priority):
NOTAMIFY_TOKENNOTAMIFY_API_BASE_URLNOTAMIFY_WATCHER_BASE_URLNOTAMIFY_WEBHOOK_SECRETNOTAMIFY_CONFIG_FILE
Default config file: ~/.config/notamify/config.json
Qucik start
Get active NOTAMs
from datetime import datetime, timedelta
from notamify_sdk import NotamifyClient, ActiveNotamsQuery
client = NotamifyClient(token="YOUR_API_KEY")
query = ActiveNotamsQuery(
location=["KJFK", "KLAX"],
starts_at=datetime.now(),
ends_at=datetime.now() + timedelta(days=1)
)
Watcher flow
# Watcher sandbox flow
listener = client.create_listener(
"https://example.trycloudflare.com/webhooks/notamify",
mode="sandbox",
lifecycle={"enabled": False},
)
print(listener.webhook_secret)
sandbox_result = client.send_sandbox_message(listener.id, "SANDBOX-NOTAM-1")
print(sandbox_result.notam_id)
Pagination
The SDK exposes two NOTAM access styles:
client.get_active_notams(...),client.get_raw_notams(...),client.get_nearby_notams(...), andclient.get_historical_notams(...)return a singleNotamListResultpage.client.notams.active(...),client.notams.raw(...),client.notams.nearby(...), andclient.notams.historical(...)return a pager that fetches all pages lazily as you iterate.
Use the pager when you want all NOTAMs across pages:
pager = client.notams.active(
{"location": ["KJFK", "KLAX"]},
per_page=30,
)
for notam in pager:
print(notam.id)
If you want everything in memory at once, materialize the pager with list(...):
all_notams = list(
client.notams.active(
{"location": ["KJFK", "KLAX"]},
per_page=30,
)
)
If you need page metadata such as page, per_page, or total_count, iterate over pager.pages:
pager = client.notams.active(
{"location": ["KJFK", "KLAX"]},
per_page=30,
)
for page in pager.pages:
print(page.page, page.total_count, len(page.notams))
Local Webhook Testing
The example scripts live in the repository and source distribution under examples/.
They are intended to be run from a source checkout or source distribution, not from an installed wheel alone.
- Production: implement the webhook endpoint in your own application code.
- Verify
X-Notamify-SignatureusingNOTAMIFY_WEBHOOK_SECRET. - Production watcher deliveries include
kind,event_id, andnotam. - Lifecycle watcher deliveries also include
change.changed_notam_idfor the original NOTAM that was cancelled or replaced. - Local development: expose your local app endpoint with
cloudflared, then set watcherwebhook_urlto that tunnel URL. - Sandbox test sends use the same webhook payload DTO as production sends, with mock NOTAM content.
Prerequisite: cloudflared must be installed and available in PATH.
export NOTAMIFY_TOKEN="your_notamify_token"
export LOCAL_APP_URL="http://127.0.0.1:8080/webhooks/notamify"
uv run python ./examples/local_service_run.py
Examples
examples/service_receiver.py: minimal production-style webhook receiverexamples/local_service_run.py: cloudflared tunnel + sandbox delivery flowexamples/notams_fetch.py: straightforward NOTAM query examplesexamples/README.md: setup notes and sample payloads
Development
uv run python -m unittest discover -s tests -p 'test_*.py'
License
MIT
Release files for notamify-sdk 0.3.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 | |
|---|---|---|---|
| notamify_sdk-0.3.0.tar.gz | 31.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| notamify_sdk-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 52.2 kB
Release files / notamify_sdk-0.3.0.tar.gz
| Download URL | notamify_sdk-0.3.0.tar.gz |
|---|---|
| Size | 31.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8194361470e072119af003255a6650f3f7dd8540ab8895a08902e39e19ddd279
|
|
BLAKE2b-256 checksum How to use checksums |
75a57eff47664e06747ec9e9173f008259334264142cad18bf3caf078c3efddb
|
| 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 7, 2026.
Transparency logRelease files / notamify_sdk-0.3.0-py3-none-any.whl
| Download URL | notamify_sdk-0.3.0-py3-none-any.whl |
|---|---|
| Size | 20.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c53b06b62b78349391d78bde6c620fc2ba39ca6d938b37049fb415b7aa725c9f
|
|
BLAKE2b-256 checksum How to use checksums |
e6ca6c98a9a717e950887d8bb6c7c6a9b19d5bc357abf5c9f675889eda140843
|
| 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 7, 2026.
Transparency log