Skip to main content

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 and pager.pages
  • Supported NOTAM endpoints:
    • GET /notams
    • GET /notams/raw
    • GET /notams/nearby
    • GET /notams/archive
    • POST /notams/briefing
    • GET /notams/briefing/{uuid}
    • POST /notams/prioritisation
  • Watcher listener management + webhook logs/secrets
  • Listener mode support (prod default, sandbox for test-only listeners)
  • Listener lifecycle support via lifecycle.enabled and lifecycle.types
  • Sandbox test delivery endpoint (POST /listeners/{id}/sandbox:send)
  • Webhook signature verification (X-Notamify-Signature)
  • Typed webhook event models for interpretation and lifecycle payloads
  • 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_TOKEN
  • NOTAMIFY_API_BASE_URL
  • NOTAMIFY_WATCHER_BASE_URL
  • NOTAMIFY_WEBHOOK_SECRET
  • NOTAMIFY_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(...), and client.get_historical_notams(...) return a single NotamListResult page.
  • client.notams.active(...), client.notams.raw(...), client.notams.nearby(...), and client.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-Signature using NOTAMIFY_WEBHOOK_SECRET.
  • Production watcher deliveries include kind, event_id, and notam.
  • Lifecycle watcher deliveries also include change.changed_notam_id for the original NOTAM that was cancelled or replaced.
  • Local development: expose your local app endpoint with cloudflared, then set watcher webhook_url to 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 receiver
  • examples/local_service_run.py: cloudflared tunnel + sandbox delivery flow
  • examples/notams_fetch.py: straightforward NOTAM query examples
  • examples/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)

Source distribution for notamify-sdk 0.3.0
File Size Uploaded
notamify_sdk-0.3.0.tar.gz 31.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for notamify-sdk 0.3.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

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