Off-Nadir Delta

Build with Off-Nadir Delta

Quick answer — what Off-Nadir Delta is

Off-Nadir Delta turns global news media and official hazard feeds into geolocated, source-linked event intelligence. Query it over a REST API, the open-source Python SDK, or an MCP server for AI agents — events and what changed about them, satellite imagery and collection planning, the Watchlist, the World Brief and AI analysis. All three are available on every plan, including Free, and metered calls spend your token balance.

Choose how to connect

Your own code — a backend, a dashboard, a scriptREST APIEvery operation and every field under /api/v1, cursor-paginated up to 500 rows a page, with an OpenAPI 3.1 spec.
Python, or an agent that runs code (Claude Code, Codex, Cursor)Python SDKThe same API with typed models, sync and async clients and automatic pagination.
A chat — claude.ai, ChatGPT, Claude Desktop, an editorMCP serverThe tools meant for a conversation; list results are digests that fit in a chat.
A ChatGPT custom GPTGPT ActionsThe conversational operations of the REST API in an OpenAPI document sized for Actions.

What you can pull

Event signals

GET /api/v1/signals

Geolocated geopolitical, security, disaster and infrastructure events from global news media and official hazard feeds — how precisely each is placed, severity, reporting breadth, and whether a satellite could see it.

What changed

GET /api/v1/developments

Changes to events in an area — new events told apart from updates to known ones — and one event end to end with every source behind it.

Imagery and collection planning

GET /api/v1/imagery

Sentinel-1, Sentinel-2 and NISAR L-band scenes over an area, the SAR + optical plan for one event, where imaging is most worthwhile, and the next satellite passes.

Watchlist and continuous watch

/api/v1/watches

Watch events, areas and sites; monitored areas measured on every new acquisition; standing orders that report only when something new crosses the bar.

World Brief

GET /api/v1/brief

The AI-synthesized daily brief (free of tokens); weekly and monthly by plan.

AI analysis

POST /api/v1/analyst

Ask the Delta Analyst a question and get a cited brief, or an AI remote-sensing assessment of one event.

Quickstart

1. Create a key at Account → Developer API (shown once — keep it out of client-side code). 2. Verify it with the World Brief, which is free. 3. Query events (3 tokens a page).

bash
# Free — a 200 means your key works
curl -H "Authorization: Bearer ond_..." "https://offnadir-delta.com/api/v1/brief"

# Armed conflict and strikes reported in an area over the last 24 hours
curl -H "Authorization: Bearer ond_..." \
  "https://offnadir-delta.com/api/v1/signals?bbox=22,44,40,53&recency=24h&categories=armed_conflict,kinetic&limit=50"

Python SDK

offnadir-delta wraps every REST endpoint with typed models (Pydantic v2), sync and async clients, automatic cursor pagination, retries with backoff and one exception hierarchy, plus a small client for the MCP server. Python 3.9–3.13, Apache-2.0.

python
# pip install offnadir-delta
from offnadir_delta import Client
from offnadir_delta.errors import InsufficientTokensError

with Client() as client:  # reads OFFNADIR_DELTA_API_KEY
    print(client.usage().tokens.remaining)  # free

    page = client.signals.list(
        bbox=[22, 44, 40, 53], recency="24h", categories=["armed_conflict", "kinetic"], limit=50
    )
    for signal in page.signals:
        print(signal.last_reported_at, signal.country_code, signal.title)

    # Every page (a date range needs a plan that includes it):
    try:
        for signal in client.signals.iterate(bbox=[22, 44, 40, 53], recency="24h"):
            ...
    except InsufficientTokensError as e:
        print("Need", e.required, "have", e.available)

AsyncClient has the same methods (async for signal in client.signals.iterate(...)). Source & README · PyPI · Runnable examples

Next

Frequently Asked Questions

Which plans include the API, the SDK and the MCP server?▼
All three are available on every plan, including Free. Metered calls spend the same token balance as the app; the World Brief and the usage endpoint are free. What a call returns follows your plan: a filter, time window or detail your plan does not include is reported in the response (meta.filter_clamp, meta.window_clamp, plan_lock) rather than applied silently, and a refusal names the plan that opens it.
How do I authenticate?▼
Create a key at Account → Developer API and pass it as a bearer token (Authorization: Bearer ond_…) or in the X-API-Key header. Keys are shown once. MCP clients such as claude.ai and ChatGPT can also connect over OAuth without a key.
What are the rate limits and pagination?▼
Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; exceeding the limit returns 429 with Retry-After. List endpoints are cursor-paginated: pass meta.next_cursor back until has_more is false (each page is billed). POST /api/v1/analyst accepts an Idempotency-Key header, so a retried call returns the same brief instead of being charged twice.
Is there an OpenAPI spec?▼
Yes — OpenAPI 3.1 at /api/v1/openapi.json for code generators and API explorers, and /api/v1/openapi-gpt-actions.json cut to the limits of GPT Actions for a ChatGPT custom GPT.

From headline to satellite evidence

One connected intelligence workflow across four surfaces — free to start, no GIS software or remote-sensing background required.