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 Currency 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: discover what is live and copy the contract from /api/v1/packs/{pack_id}.
  • Structured dataset query: use /api/v1/query/dataset or MCP query_dataset for normal rows, counts, rankings, and time-series work. This is also the default path for packs without a narrow tool.
  • Exact event lookup: use /api/events/exact/{event_id} when you already know one concrete event id.
  • Free geography lookup: use resolve_point when you need to turn a click or coordinate into a loc_id.
  • Preliminary live wrappers: use get_live_earthquake_events or get_live_volcano_events only when the caller explicitly wants live upstream updates rather than the canonical pack lane.
  • Event relationships: use the aftershock helper or disaster-links helpers when the question is about sequences or chains rather than a plain filtered query.

Keep the identifiers straight. event_id is for exact-event lookup. loc_id is for filters.region_ids in the dataset lane.

Currency - free

Use pack_id = "currency". This pack returns local_per_usd and expects ISO date ranges plus an explicit filters.time.granularity such as daily, weekly, or monthly. The first call below returns monthly rows for three countries over one quarter.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_currency_example",
    "pack_id": "currency",
    "metrics": ["local_per_usd"],
    "filters": {
      "region_ids": ["ARG", "BRA", "CHL"],
      "time": {
        "start": "2024-01-01",
        "end": "2024-03-31",
        "granularity": "monthly"
      }
    },
    "sort": { "field": "date", "direction": "asc" },
    "limit": 12,
    "output": { "format": "rows", "include_provenance": true }
  }'

Once that works, widen or reshape it with one small change at a time:

  • Daily rates: set filters.time.granularity to daily and narrow the date range.
  • Compare currencies: include multiple region_ids over the same range.
  • Cross-rate (e.g. CAD/EUR): query both, then compute cad_per_usd / eur_per_usd client-side.
curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_currency_daily_example",
    "pack_id": "currency",
    "metrics": ["local_per_usd"],
    "filters": {
      "region_ids": ["EUR", "CAN"],
      "time": {
        "start": "2024-01-01",
        "end": "2024-01-31",
        "granularity": "daily"
      }
    },
    "sort": { "field": "date", "direction": "asc" },
    "limit": 31,
    "output": { "format": "rows" }
  }'

Currency via MCP

curl -X POST https://app.daedalmap.com/mcp/currency \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_fx_rates",
      "arguments": {
        "request_id": "docs_currency_mcp_example",
        "metrics": ["local_per_usd"],
        "filters": {
          "region_ids": ["ARG", "BRA", "CHL"],
          "time": {
            "start": "2024-01-01",
            "end": "2024-03-31",
            "granularity": "monthly"
          }
        },
        "sort": { "field": "date", "direction": "asc" },
        "limit": 12,
        "output": { "format": "rows", "include_provenance": true }
      }
    }
  }'
Earthquakes - paid (x402)

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

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_earthquake_events",
      "arguments": {
        "request_id": "docs_mcp_earthquakes_example",
        "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.

Live wrappers

These tools are opt-in. Use them only when the question is explicitly about recent preliminary upstream activity that may not be in the canonical pack yet.

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_live_earthquake_events",
      "arguments": {
        "request_id": "docs_live_eq_example",
        "hours": 6,
        "min_magnitude": 5,
        "limit": 3,
        "orderby": "time"
      }
    }
  }'
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_live_volcano_events",
      "arguments": {
        "request_id": "docs_live_volcano_example",
        "days": 30,
        "limit": 3,
        "orderby": "time"
      }
    }
  }'

Live wrappers are upstream snapshots, not the canonical historical pack. If you need stable loc_id joins, pack metadata, or cross-pack comparison, start with the canonical tool first and only fall back to a live wrapper on purpose.

Geography tools - free

Resolve any coordinate or loc_id onto the shared geography spine, then query any pack with the result. Free, no payment - the /mcp/geography facade (also on the umbrella /mcp).

  • resolve_point - latitude/longitude -> deepest loc_id plus full parent chain
  • get_boundary - loc_id -> bbox + centroid (full polygon on request)
  • loc_id_hierarchy / loc_id_info - parent/ancestors/children and descriptive metadata
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 }
    }
  }'

# -> deepest loc_id USA-CA-037-207400-1-1024 plus the USA -> USA-CA -> USA-CA-037 chain.
# Take any level (e.g. USA-CA) and pass it as filters.region_ids in a pack 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": "2",
    "method": "tools/call",
    "params": {
      "name": "get_boundary",
      "arguments": { "loc_id": "USA-CA" }
    }
  }'

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": "loc_id_hierarchy",
      "arguments": { "loc_id": "USA-CA" }
    }
  }'

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": "loc_id_info",
      "arguments": { "loc_id": "USA-CA" }
    }
  }'

Use get_boundary for bounding boxes and centroids, loc_id_hierarchy to move up or down the spine, and loc_id_info when you just need the basic record for one geography.

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 Linking and Causal Chains.

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 (x402)

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 ocean-region ids such as XOO. 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", "XOO"],
      "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", "XOO"],
      "time": { "start": 2000, "end": 2024 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 1,
    "output": { "format": "rows" }
  }'
Hurricanes - paid (x402)

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 (x402)

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.
Distributed Manufacturing - free

Use source_id = "distributed_manufacturing". This is a static point-location source, so do not send a time filter. Start with latitude and longitude, then narrow by region_ids, facility_type, or source.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_distributed_manufacturing_example",
    "source_id": "distributed_manufacturing",
    "metrics": ["latitude", "longitude"],
    "filters": {
      "region_ids": ["DEU"],
      "facility_type": "fab_lab"
    },
    "sort": { "field": "name", "direction": "asc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Static source: omit filters.time.
  • Facility categories include fab labs, makerspaces, hackerspaces, Precious Plastic workshops, and Prusa World user printers.
OWID CO2 - free

Use source_id = "owid_co2". Time uses numeric years. Start with exact metric ids such as co2, co2_per_capita, cumulative_co2, or total_ghg.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_owid_co2_example",
    "source_id": "owid_co2",
    "metrics": ["co2", "co2_per_capita"],
    "filters": {
      "region_ids": ["CHN", "USA", "IND"],
      "time": { "start": 2020, "end": 2024 }
    },
    "sort": { "field": "year", "direction": "desc" },
    "limit": 50,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • Do not mix totals, per-capita rates, cumulative metrics, and shares without naming the unit.
  • Use numeric years, not ISO date strings.
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 (x402)

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.
WorldPop - paid (x402)

This pack is paid: the first unpaid call returns a 402 challenge with the exact price; a payment-aware client retries for rows. WorldPop data is CC-BY 4.0; attribution to WorldPop is included in the pack's upstream_sources metadata. Use source_id = "worldpop". This source requires a geo_level filter to select the geographic grain: admin_0 for country totals, admin_1 for states and provinces, admin_2 for districts. Country totals at admin_0 are pre-aggregated. The first call below returns population for three countries in 2020.

curl -X POST https://app.daedalmap.com/api/v1/query/dataset \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "docs_worldpop_example",
    "source_id": "worldpop",
    "metrics": ["population"],
    "filters": {
      "region_ids": ["USA", "BRA", "IND"],
      "geo_level": "admin_0",
      "time": { "value": 2020 }
    },
    "sort": { "field": "value", "direction": "desc" },
    "limit": 25,
    "output": { "format": "rows", "include_provenance": true }
  }'
  • geo_level is required - omitting it will return an error.
  • Coverage: global at admin_0, admin_1, admin_2; USA only at admin_3 (Census tract).
  • Temporal range: 2000-2030 (projections included).
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 (x402)

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.