Changes to the Event Intelligence REST API and the MCP server. Newest first.
We aim not to break integrations. Additive, backward-compatible changes — new endpoints, new MCP tools/resources, new optional parameters, and new response fields — may ship without notice, so parse responses tolerantly (ignore unknown fields). Any breaking change is announced here first. The machine-readable contract is /api/v1/openapi.json, and the MCP server reports its version in the initialize response (registry id com.offnadir-delta/mcp).
Two measurements that already existed inside the product are now callable. measure_index_series (POST /api/v1/index-series) measures a spectral index over a polygon scene by scene back through the Sentinel-2 archive — NDVI, NBR, NDWI and the rest — metered per scene actually measured, with estimate_only returning the scene count, the true date span and the cost for free first. Three limits are in the response rather than in a footnote: the archive begins 2015-06-27 so an earlier start is clamped and says so, at most 24 scenes are measured per call so a longer period comes back as a sample with the remainder in skipped, and trend compares the first and last measured scene only, so it carries no rate and no confidence. detect_ships (POST /api/v1/ships) counts vessel-like targets in one Sentinel-1 scene using CFAR detection; read caveats before quoting count, because an unavailable land mask, the coastal exclusion buffer and partial scene coverage each change what the number means. A scene the detector refuses is not charged. Both call the same code as the in-app feature. MCP server 1.11.0, 24 tools.
Terrain over the API and MCP. lookup_elevation (GET/POST /api/v1/elevation) measures height from the Copernicus DEM GLO-30 at a point, over a bounding box, or inside a drawn polygon — min, max, mean, median, p10, p90 and relief. analyze_terrain (GET /api/v1/terrain) computes from the terrain rather than reading heights out of it: the share of an area lost to SAR layover and shadow for a given incidence angle and look direction plus the mean local incidence angle, and the ground profile between two points with a line-of-sight verdict including Earth curvature. Both are free of token charges. Three properties travel with every answer because they change what it means: it is a surface model (buildings and canopy included), a large area is read below the 30 m posting so extremes are smoothed inward, and no coverage over open water is absence rather than 0 m.
create_standing_order reported a cost ceiling that was not a ceiling. projected_monthly_tokens_max was computed from the OBSERVED MEDIAN cost per Analyst run, not the per-question cap, so it bounded how often an order could fire but not what a firing could cost — at daily cadence it advertised 1,370 tokens/month where the true worst case is 3,744. The field is now computed from the per-question cap and means what its name and documentation always said. A new additive field, projected_monthly_tokens_typical, carries the median-based forecast so the useful number is still available. If you sized a plan against the old value, re-check it: the ceiling did not change, only the number we published for it.
Delta Monitor over the API and MCP: create_monitored_area puts a place under continuous satellite measurement (pick a bounding box and a metric — the sensor follows from the metric, so ship counts use SAR and survive cloud and darkness), list_monitored_areas returns each area with its latest value, the change since the previous measurement and whether it was flagged anomalous, and get_monitored_area returns the full measurement time series. Creating and listing are free — you are metered only when new imagery is actually measured. REST equivalents: /api/v1/monitoring and /api/v1/monitoring/{areaId}. MCP server 1.8.0, 20 tools.
query_claims returned nothing for API and MCP callers. The claim ledger was only written from the in-app path, so claims asserted by an ask_analyst run started over the API were never recorded. Analyst runs now persist claims wherever they were started. Ledgers populate from this date forward; earlier API runs cannot be backfilled.
verification_status can now return disputed. The value was always in the published enum but was previously unreachable: an analyst authenticity review that finds the supporting media fabricated now demotes the signal, and a write-time notice that occurrence is unconfirmed caps it at corroborated instead of promoting it. New additive fields: intelligence.verification_review {flags, reviewed_at, source} and confirmation_basis (independent_reporting / corroborated_reporting / single_report / analyst_review / imagery / none). If you branch on verification_status, add a case for disputed.
ask_analyst and get_analyst_job accept an optional response_format of full or compact. compact omits the prose brief and returns only the structured result, materially reducing the context an agent spends re-fetching a finished run. Default is full, so existing callers are unaffected. snake_case argument aliases are now normalised rather than rejected, and unknown fields come back in an additive warnings array instead of being dropped silently; a missing required argument now lists the keys actually received.
get_analyst_job (MCP) and GET /api/v1/analyst/{jobId} (REST) now return an identical key set. REST gained idempotency_key, question, and deliverable_gaps, and the documented 200 response now includes structured, result_quality, freshness, result_schema_version, and chargeable.
predict_satellite_passes now states plainly that every pass it returns is a geometric access opportunity (geometry_only: true, acquisition_plan_verified: false) — it means the satellite could see the location, never that a collection was scheduled. Sentinel and Landsat passes are described as routinely collected and therefore near-certain rather than as acquisitions you are guaranteed to receive. With no start_date, the window begins now.
survey_observable_events documents that its population is not gated by tasking readiness, so its totals legitimately exceed rank_imaging_priority and count a different unit from query_signals (which collapses to event clusters). A new population_detail field explains the denominator; use each event’s collection_ready flag to narrow to what is actually taskable.
query_claims (free): an audit trail of what Delta told you. Every claim an Analyst run asserted on your key, with its evidence class (CONFIRMED / REPORTED / PARTY_CLAIM / ASSESSMENT), how many independent source families backed it, the publishers, and whether a later answer restated it with stronger or weaker evidence. Filters: restated_only, downgraded_only. Scoped to your own key.
Standing orders: create_standing_order saves a question plus a bounding box and re-answers it on a schedule, telling you only when the answer actually changed; list_standing_orders shows cadence, watched area, last check, last fire, and how many consecutive checks found nothing; delete_standing_order deletes, or pauses with active=false. Creating and listing are free — a check that finds nothing invokes no model and costs nothing, and only a firing check is metered. A bounding box is required, and cadence and order count are limited by plan (the error states which limit was hit). create_standing_order returns projected_monthly_tokens_max so the ceiling is visible before you commit.
Collection planning over the API and MCP: predict_satellite_passes (2 tokens) for when a place can next be imaged and by which satellite, separating free systematic Sentinel/Landsat coverage from taskable commercial windows; rank_imaging_priority (1 token) for where observation is most worthwhile and what class of satellite it needs; survey_observable_events (1 token) for which events a given sensor can actually resolve; and plan_event_imagery (4 tokens) for the deterministic plan for one event, which searches SAR and optical exactly once each so the all-weather look cannot be missed.
ask_analyst accepts an optional mode of fast or deep. Default remains fast, whose advertised 5–123 token band is unchanged. deep raises the per-question ceiling to 415 tokens for questions needing more retrieval and reasoning; charging stays metered by actual consumption, so the ceiling is a cap and not a price.
Data freshness: new GET /api/v1/status (free) and MCP status://current resource report how current the data is (ingestion / enrichment frontier), the Daily World Brief status, and an Operational / Delayed / Degraded roll-up.
Schema clarity: severity_score and geoint_score are documented with their 0–10 range; escalation_trend now publishes its enum (escalating, de-escalating, stable, new); the /signals parameters observability, open_data, min_information_gain, updated_since, and created_since are documented; sample responses were corrected to include the intelligence block. The machine-readable spec at /api/v1/openapi.json is the source of truth.
Signal filters (observability, min_information_gain, min_severity, markets, escalating) now apply across the full result window before ranking and pagination — a matching event deeper in the feed is no longer dropped, so filtered queries stop returning an empty result when matches exist. REST and MCP behave identically.
The Daily World Brief now passes a deterministic quality gate before publishing; a truncated or structurally-incomplete brief is held back and the previous good brief keeps serving.
Plan access clarified: the REST API, the MCP server, and the AI tools (assess_signal / ask_analyst) are available on every plan, including Free — the only gate is your token balance. get_world_brief and get_usage are free.
MCP: serverInfo.icons[].sizes is now an array per the MCP spec (SEP-973), so strict clients no longer fail to initialize. MCP surface version is 1.3.1.
See the API & MCP reference, the methodology & AI limitations, and MCP setup.