DaedalMap
Docs / Agent Examples

Two calls to catalog.
One call to first rows.

Start here if you want a working first result fast. The path is three requests in order: read the catalog, read the pack, run one narrow query. Free packs return rows immediately. Paid packs return a 402 challenge first, then rows after the payment-aware retry.

If you are deciding between HTTP and MCP for the first run, do the HTTP flow here first. Once that works, mirror the same pack through MCP.

Step 1 - run these first

Treat these as the mandatory setup step. The first call tells you what is live. The second tells you exactly what one pack expects before you send a query. Run both once, then pick a pack below.

curl https://app.daedalmap.com/api/v1/catalog

curl https://app.daedalmap.com/api/v1/packs/earthquakes

Recommended first path: run the two discovery calls above, then use World Bank WDI if you want immediate free rows or Earthquakes if you want to use the full discovery -> 402 -> paid retry flow.

Step 2 - choose your pack for the first call

Pick the lane that matches what you want first: immediate free rows, or a paid pack that starts with a 402 challenge and then returns rows after payment.

request_id is optional. Keep it in examples when you want easier tracing, debugging, or idempotent retries.

Pick the right tool first

  • Catalog and pack detail: MCP get_catalog and get_pack, or HTTP /api/v1/catalog and /api/v1/packs/{pack_id}. Copy the request shape from the pack detail.
  • Rows, counts, rankings, time series: MCP get_data with a pack_id, or HTTP /api/v1/query/dataset with a source_id or pack_id. get_data accepts only pack_id; do not send source_id over MCP.
  • One disaster event: MCP get_event with an event_id from a get_data row, or HTTP /api/events/exact/{event_id}.
  • Geography: resolve_point for a coordinate, convert_reference for a ZIP, admin code, or other outside identifier, get_loc_id_info and get_geometry for a known loc_id. See Geography tools below.
  • Event chains: the aftershock and disaster-links HTTP helpers, or get_event with include=["relationships"].
  • Any tool contract: get_tool_help with a tool_name, or a topic of overview, data, disasters, custom_data, or geometry.

Keep the identifiers straight. event_id is for exact-event lookup. loc_id is for filters.region_ids in a data query.

Earthquakes - paid

Use source_id = "earthquakes_events". This paid source uses ISO date ranges, country-style region_ids such as JPN, CHL, and IDN, and event-style metrics such as event_count and magnitude. The first unpaid call should return a 402; the payment-aware retry returns rows.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_earthquakes_example",
    "source_id": "earthquakes_events",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["JPN", "CHL", "IDN"],
      "time": { "start": "2011-01-01", "end": "2011-12-31" }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'

The first success condition here is not "avoid the 402." The first success condition is: unpaid request returns 402, payment-aware retry returns rows.

Visible event properties and queryable metrics are not the same thing. For example, exact-event records can show helper fields such as source or event_subtype even when the dataset query lane only exposes metrics such as event_count, magnitude, and depth_km. Read the pack detail before you add fields.

Once that path works, move on to narrower variations:

  • Largest single event: metrics = ["magnitude"], sort value desc, limit = 1.
  • Events above a threshold: add filters.compare = [{"field":"magnitude","op":">=","value":6}].
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_earthquakes_largest_example",
    "source_id": "earthquakes_events",
    "metrics": ["magnitude"],
    "filters": {
      "region_ids": ["JPN"],
      "time": { "start": "2011-01-01", "end": "2011-12-31" }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 1,
    "output": { "format": "rows" }
  }'
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_earthquakes_threshold_count_example",
    "source_id": "earthquakes_events",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["JPN"],
      "time": { "start": "2011-01-01", "end": "2011-12-31" },
      "compare": [{ "field": "magnitude", "op": ">=", "value": 6 }]
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows" }
  }'

Earthquakes via MCP

On /mcp without a payment method, a paid call returns payment_choice_required with the price. Send an account API key in X-API-Key to /mcp/account to spend account credit. Over HTTP the same unpaid query returns 402.

curl -X POST https://app.daedalmap.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_data",
      "arguments": {
        "request_id": "docs_mcp_earthquakes_example",
        "pack_id": "earthquakes",
        "metrics": ["event_count"],
        "filters": {
          "region_ids": ["JPN", "CHL", "IDN"],
          "time": { "start": "2011-01-01", "end": "2011-12-31" }
        },
        "limit": 10,
        "output": { "format": "rows", "include_provenance": true }
      }
    }
  }'

Exact event lookup

Use the exact-event endpoint when you already know one event id and want the concrete row, geometry, and helper fields without building a structured query first.

curl "https://app.daedalmap.com/api/events/exact/NRCAN-20191231T235323Z-45.0834--74.7183-M1.90?pack_id=earthquakes"

That returns one canonical earthquake record from the published earthquakes_events lane. Expect fields such as: event_id, loc_id, magnitude, source, and event_subtype. For this NRCAN example the returned event-shaped loc_id is: CAN-EQ-NRCAN-20191231T235323Z-45.0834--74.7183-M1.90.

Use exact-event lookup when the question is "show me this event." Use /api/v1/query/dataset when the question is "rank, count, compare, or filter events like this."

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_earthquakes_exact_locid_example",
    "source_id": "earthquakes_events",
    "metrics": ["magnitude", "depth_km"],
    "filters": {
      "region_ids": ["CAN-EQ-NRCAN-20191231T235323Z-45.0834--74.7183-M1.90"],
      "time": { "value": 2019 }
    },
    "limit": 3,
    "output": { "format": "rows" }
  }'

The same pattern also works for marine events. Example event-shaped loc_id: XOP-EQ-NRCAN-20191231T122246Z-50.9130--130.5705-M3.40.

Event drill-down

Disaster get_data rows carry a stable event_id. Pass it to get_event for the full record, then ask for companion layers only when you need them.

curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_data",
      "arguments": {
        "pack_id": "volcanoes",
        "metrics": ["VEI"],
        "filters": { "region_ids": ["IDN"], "time": { "start": 2015, "end": 2024 } },
        "sort": { "field": "VEI", "direction": "desc" },
        "limit": 2
      }
    }
  }'

# -> rows with event_id values such as IDN-G165028918B43243108525571-VOLC-VE022513

curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "get_event",
      "arguments": {
        "event_id": "IDN-G165028918B43243108525571-VOLC-VE022513",
        "pack_id": "volcanoes"
      }
    }
  }'

# -> Semeru, VEI 4, 2017-06-06 to 2018-10-28, plus next calls for
#    include=["relationships"], ["affected_places"], or ["geometry"]

Geometry is never returned unless you include it. Volcanoes is a free pack; the same pattern works on the paid disaster packs after payment.

Geography tools

The geography tools are free within each tool's per-call allowance (see pricing). They are on the umbrella /mcp endpoint and on the /mcp/geography facade. Start with the one that matches the input you have; the returned loc_id carries into the next geography call or into a get_data filter.

  • I have a coordinate: resolve_point returns the administrative chain down to Admin 3. For Admin 4-6 or one other geometry family, pass the deepest returned loc_id to resolve_deep_point.
  • I have a ZIP, admin code, or other outside identifier: convert_reference converts it to a loc_id, or through loc_id to another system with to_system.
  • I do not know the identifier system: identify_reference_system for one column of codes, or identify_dataset_geography for a table when you do not know which column is geographic.
  • I have a loc_id: get_loc_id_info returns identity, hierarchy, and which data packs and geometry families cover it; get_geometry returns shape metadata, with include_polygon=true only when you need coordinates.
  • I have two loc_ids: compare_geographies checks containment and temporal validity.
  • I want to see what exists: get_catalog and get_pack with catalog="geometry" list geometry families and the countries that publish them.
curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": "1",
    "method": "tools/call",
    "params": {
      "name": "resolve_point",
      "arguments": { "lat": 34.0522, "lon": -118.2437 }
    }
  }'

# -> USA -> USA-CA -> USA-CA-037 (Los Angeles County) -> USA-CA-037-207400
#    (Census Tract 2074), with deeper_available admin_4 and admin_5.

curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": "2",
    "method": "tools/call",
    "params": {
      "name": "resolve_deep_point",
      "arguments": { "lat": 34.0522, "lon": -118.2437, "shallow_loc_id": "USA-CA-037-207400" }
    }
  }'

# -> USA-CA-037-207400-1-024 (Block 1024). Pass any level, such as USA-CA,
#    as filters.region_ids in a get_data query.
curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": "3",
    "method": "tools/call",
    "params": {
      "name": "convert_reference",
      "arguments": { "from_system": "zip", "value": "90012", "iso3": "USA" }
    }
  }'

# -> USA-CA-037, with the measured ZIP-to-county overlap share.

curl -X POST https://app.daedalmap.com/mcp   -H "Content-Type: application/json"   -H "MCP-Protocol-Version: 2025-06-18"   -d '{
    "jsonrpc": "2.0",
    "id": "4",
    "method": "tools/call",
    "params": {
      "name": "get_geometry",
      "arguments": { "loc_id": "USA-CA", "include_polygon": false }
    }
  }'

# -> has_shape, centroid, and bbox for California. Set include_polygon to true
#    only when you need the GeoJSON coordinates.

These calls compose, but you do not need all of them. Use the one that answers the immediate question, then carry the returned loc_id forward only when the next question needs it.

Free linking helpers

Two free helper paths sit next to the main pack/query flow. Use them when you already have an exact event id and want either a same-pack earthquake sequence or a cross-hazard chain.

  • /api/v1/earthquakes/aftershocks/{event_id} - earthquake-native same-pack sequence helper
  • /api/v1/disaster-links/event/{event_id} and /api/v1/disaster-links/chain/{event_id} - exact-event cross-hazard link helpers
  • /api/v1/disaster-links/search - discovery helper for ranked cross-hazard chains when you do not know the seed event yet

Rule of thumb: aftershocks stay in the earthquake pack. Cross-hazard cascades such as earthquake-to-tsunami or volcano-to-tsunami use the shared disaster-links helper.

Link assumptions and confidence thresholds are documented at Disaster event methodology.

curl https://app.daedalmap.com/api/v1/earthquakes/aftershocks/us20002bi4

curl "https://app.daedalmap.com/api/v1/disaster-links/event/NOAA-SIG-2?pack_id=earthquakes"

curl "https://app.daedalmap.com/api/v1/disaster-links/chain/NOAA-SIG-2?pack_id=earthquakes&depth=1"

curl "https://app.daedalmap.com/api/v1/disaster-links/search?start_event_type=volcano&via_event_type=earthquake&end_event_type=tsunami&limit=5"
Volcanoes - free

Use source_id = "volcanoes_events". This source uses year-style time filters, so pass time.value or a numeric year range rather than ISO date strings. The first call below returns event_count rows for three countries in one year.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_volcanoes_example",
    "source_id": "volcanoes_events",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["IDN", "JPN", "CHL"],
      "time": { "value": 2020 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Largest eruption by VEI: metrics = ["VEI"], sort value desc, limit = 1.
  • Eruptions above a threshold: add filters.compare against VEI.
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_volcanoes_largest_example",
    "source_id": "volcanoes_events",
    "metrics": ["VEI"],
    "filters": {
      "region_ids": ["IDN"],
      "time": { "start": 2015, "end": 2024 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 1,
    "output": { "format": "rows" }
  }'
Tsunamis - paid

Use source_id = "tsunamis_events". This paid source uses year-style time filters, so pass numeric years rather than ISO dates. Region filters accept both ISO3 country ids such as JPN and reviewed named-water loc_ids such as IHO1953-240001002 for the Mediterranean Sea. The legacy XOO id is deprecated. The first unpaid call should return a 402; the payment-aware retry returns rows.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_tsunamis_example",
    "source_id": "tsunamis_events",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["JPN", "IDN", "IHO1953-240001002"],
      "time": { "value": 2011 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Largest wave height: metrics = ["max_water_height_m"], sort value desc, limit = 1.
  • Events above a threshold: add filters.compare against max_water_height_m.
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_tsunamis_largest_example",
    "source_id": "tsunamis_events",
    "metrics": ["max_water_height_m"],
    "filters": {
      "region_ids": ["JPN", "IHO1953-240001002"],
      "time": { "start": 2000, "end": 2024 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 1,
    "output": { "format": "rows" }
  }'
Hurricanes - paid

This pack is paid: the first unpaid call returns a 402 challenge with the exact price; a payment-aware client retries for rows. Use source_id = "hurricanes". This source uses ISO date ranges, not numeric years. Region filters accept basin ids such as XNA, XOP, and XIN, and they also accept ISO3 country ids for landfall-style queries. The first call below returns event_count rows for one basin over a date range.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_hurricanes_example",
    "source_id": "hurricanes",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["XNA"],
      "time": { "start": "2000-01-01", "end": "2024-12-31" }
    },
    "sort": { "field": "timestamp", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Most intense storm: metrics = ["max_wind_kt"], sort value desc, limit = 1.
  • Landfalling storms in a country: replace basin code with an ISO3 id such as USA or PHL.
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_hurricanes_intensity_example",
    "source_id": "hurricanes",
    "metrics": ["max_wind_kt"],
    "filters": {
      "region_ids": ["XNA"],
      "time": { "start": "2005-01-01", "end": "2005-12-31" }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 5,
    "output": { "format": "rows" }
  }'
UN SDG - free

UN SDG is pack-shaped but source-driven: use goal ids 01 through 17 as the source_id. Time uses numeric years. Metrics are indicator ids scoped to that goal. The first call below uses source 01 and one poverty indicator across three countries.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_unsdg_example",
    "source_id": "01",
    "metrics": ["ind_1_1_1"],
    "filters": {
      "region_ids": ["BRA", "IND", "NGA"],
      "time": { "start": 2010, "end": 2022 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Check the pack detail for available indicator codes per goal before querying.
  • Track one indicator over time or compare the same indicator across countries in a single year.
  • Separate questions by SDG goal using source ids 01 through 17.
Wildfires - paid

This pack is paid: the first unpaid call returns a 402 challenge with the exact price; a payment-aware client retries for rows. Use source_id = "global_fire_atlas" for global fire events (or wildfires_usa / can_wildfires for those countries). This source uses ISO date ranges. event_count is the easiest first metric and must be requested on its own.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_wildfires_example",
    "source_id": "global_fire_atlas",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["BRA", "AUS", "CAN"],
      "time": { "start": "2019-01-01", "end": "2023-12-31" }
    },
    "sort": { "field": "timestamp", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • event_count must be requested on its own; do not combine it with other metrics.
  • Use ISO date ranges, not numeric years, for the time filter.
  • Use wildfire_aggregates for yearly admin2 rollups and regional rankings.
World Bank WDI - free

World Bank WDI is pack-shaped but source-driven: choose one category source_id at a time - wb_economy, wb_environment, wb_health, wb_education, wb_debt, wb_infrastructure, or wb_social. Time uses numeric years and metric ids are category-specific. Each metric carries a tier (core, extended, experimental); prefer core for a first query. The first call below uses wb_economy and GDP across three countries.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_wbwdi_example",
    "source_id": "wb_economy",
    "metrics": ["gdp_current_usd"],
    "filters": {
      "region_ids": ["USA", "CHN", "IND"],
      "time": { "start": 2010, "end": 2024 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Check the pack detail for the metric ids in each category source before querying; casing matters.
  • Pick one category source_id at a time (economy, health, education, debt, environment, infrastructure, social).
  • Prefer core-tier metrics first; treat experimental metrics as sparse or uncertain.
CEJST environmental justice - free

Use cejst_classification for tract classification flags and cejst_burdens for individual burden metrics. This is the CEJST v2.0 2024 screening snapshot.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_cejst_example",
    "source_id": "cejst_classification",
    "metrics": ["total_categories_exceeded"],
    "filters": {"region_ids": ["USA-CA"], "disadvantaged": 1, "time": {"value": 2024}},
    "sort": {"field": "total_categories_exceeded", "direction": "desc"},
    "limit": 25
  }'
ERA5-Land monthly temperature - free

Use era5_land_temperature for historical monthly reanalysis. It is not a forecast; anomaly values use the 1991-2020 baseline.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_era5_temperature_example",
    "source_id": "era5_land_temperature",
    "metrics": ["air_temperature_2m_anomaly_c"],
    "filters": {"region_ids": ["USA", "CAN", "MEX"], "time": {"start": "2024-01-01", "end": "2024-12-31"}},
    "sort": {"field": "timestamp", "direction": "asc"},
    "limit": 50
  }'
NWS historical alerts - free

Use nws_alerts_historical for the retained archive of U.S. watches, warnings, and advisories. The current live NWS feed remains a separate Ops surface.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_nws_alerts_example",
    "source_id": "nws_alerts_historical",
    "metrics": ["event_count"],
    "filters": {"region_ids": ["USA-CA"], "time": {"start": "2024-01-01", "end": "2024-12-31"}},
    "limit": 25
  }'
U.S. Opportunity Zones - free

Use usa_opportunity_zones for the canonical 2020-tract view of OZ 1.0 designation and OZ 2.0 eligibility. The pack carries the 2010/2020 crosswalk needed for historical tract identity.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_usa_opportunity_zones_example",
    "source_id": "usa_opportunity_zones",
    "metrics": ["oz2_eligible"],
    "filters": {"region_ids": ["USA-CA"], "oz2_eligible": 1},
    "limit": 25
  }'
U.S. industrial activity packs - free

Use pack_id = "usa_lodes" for tract-level workplace jobs, usa_cbp for county establishments and payroll, and usa_susb for county firm and enterprise-size structure. Each pack is independently callable and downloadable.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_usa_lodes_example",
    "source_id": "lodes",
    "metrics": ["CNS05"],
    "filters": {
      "region_ids": ["USA-GA"],
      "time": { "value": 2022 }
    },
    "sort": { "field": "CNS05", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • LODES is tract-level; CBP and SUSB are county-level.
  • CBP manufacturing sector rows use naics = "31----".
  • SUSB manufacturing rows use naics = "31-33" and can filter enterprise_size.
UN World Population Prospects - free

Use source_id = "un_wpp". Time uses numeric years. Historical estimates and medium-variant projections live in the same country-year source, so describe future years as projections.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_un_wpp_example",
    "source_id": "un_wpp",
    "metrics": ["TPopulation1July", "PopGrowthRate"],
    "filters": {
      "region_ids": ["NGA", "IND", "BRA"],
      "time": { "start": 2020, "end": 2050 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 50,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Use exact WPP metric ids such as TPopulation1July, TFR, LEx, or NetMigrations.
  • Values after the latest historical year are projections.
FEMA NRI - free

NRI is pack-shaped but hazard-source driven: choose one member source_id at a time, such as nri_wildfire or nri_inland_flood. It is static county data, so do not send a time filter.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_nri_example",
    "source_id": "nri_wildfire",
    "metrics": ["risk_score"],
    "filters": {
      "region_ids": ["USA-CA"]
    },
    "sort": { "field": "risk_score", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Use USA state or county loc_ids such as USA-CA or USA-CA-037.
  • Future scenario fields exist only for selected hazard members and scenarios; inspect the selected source metrics first.
World Factbook - paid

This pack is paid: the first unpaid call returns a 402 challenge with the exact price; a payment-aware client retries for rows. Use source_id = "world_factbook". This source uses numeric years and returns country-level reference metrics whose field names map directly to the metric ids. Returned annual rows should carry a year field. Start with a dense metric such as population for the first time-series request.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_worldfactbook_example",
    "source_id": "world_factbook",
    "metrics": ["population"],
    "filters": {
      "region_ids": ["USA", "CAN", "BRA", "AUS", "IND"],
      "time": { "start": 2010, "end": 2024 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Check the pack detail for available metric names - Factbook field names map directly.
  • If you are testing row shape, prefer one dense metric before trying a sparse multi-metric yearly request.
  • Works well as a cross-reference layer alongside disaster or SDG data.
Floods - free

Use source_id = "floods". This source uses numeric years and returns admin2-level aggregate metrics including event counts, severity, affected area, and duration. Coverage runs 1985-2019.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_floods_example",
    "source_id": "floods",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["BGD", "IND", "CHN"],
      "time": { "start": 2000, "end": 2019 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Coverage ends at 2019 - queries for later years will return no rows.
  • Check pack detail for the full metric list including area, duration, and severity fields.
Tornadoes - paid

This pack is paid: the first unpaid call returns a 402 challenge with the exact price; a payment-aware client retries for rows. Use source_id = "tornadoes". This source uses numeric years and returns admin2-level aggregate metrics including event counts, EF scale severity, track miles, casualties, and damage. Coverage runs 1950-2025. Data is primarily USA-focused.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_tornadoes_example",
    "source_id": "tornadoes",
    "metrics": ["event_count"],
    "filters": {
      "region_ids": ["USA"],
      "time": { "start": 2010, "end": 2024 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Results are at admin2 (county) level - use a state prefix such as USA-TX- in region_ids to scope to one state.
  • Check pack detail for EF scale and damage metrics.