REST API

Flood Risk API

Programmatically get riverine and coastal flood fields across four return periods, at any site globally.

Depth in metres, cell by cell, across a 6 km grid around the site, from the 1-in-10 to the 1-in-500-year flood.

We will email your API key and the docs.

Flood risk API: illustrative 3D view of flood water around city buildings on a street grid

What the Flood Risk API Returns for Every Site

The whole grid around the site

Every cell of a 6 km box centred on your coordinate. The site cell is one value in that grid, and the cells around it show where the water sits and how close it comes.

Depth in metres, cell by cell

Riverine depth at about 90 m resolution and coastal depth at about 1 km. Coastal arrives in two versions, with and without land subsidence.

Four return periods

The 1-in-10, 1-in-50, 1-in-100 and 1-in-500-year floods, so you can see how far the water reaches and how deep it gets as events get rarer.

Submit one coordinate and get the whole field: both layers, four return periods and every cell in the box, as one downloadable JSON file.

Riverine and Coastal Flood Depth Grids

Riverine flood depth at 90 m resolution

Each cell holds the flood depth in metres above local ground for the selected return period, across around 4,700 cells near the tropics and more toward the poles. Cells outside the mapped floodplain are null, and whenever the box holds a flooded cell, the response gives the distance from the site to the nearest one.

Flood risk API: riverine flood depth grid in metres around a site at the 1-in-100-year return period
Riverine flood depth in metres across a 6 km box at the 1-in-100-year return period. Source: Continuuiti.

Coastal flood depth at 1 km resolution

Each cell holds the coastal inundation depth in metres for the selected return period, across about 8 by 8 cells near the tropics and more columns toward the poles. Modelled dry land reads 0.0, and sea and unmodelled cells are null. Every field carries the coastal grid twice, with and without land subsidence. The coastal layer covers the world’s coastlines.

Flood risk API: coastal flood depth grid in metres around a site at the 1-in-100-year return period
Coastal flood depth in metres across a 6 km box at the 1-in-100-year return period. Source: Continuuiti.

Flood Risk API Endpoints

The flood field endpoints sit under https://api.continuuiti.com/api/v1/flood-field/ and take the same X-API-Key header as every Continuuiti API.

POST/flood-field/analyze/

Submit one site. Returns 202 with a job_id.

GET/flood-field/jobs/{job_id}/

Job status and progress for each layer.

GET/flood-field/results/{job_id}/

The result summary and the bundle_url for the full field.

POST/flood-field/batch/analyze/

Submit up to 100 sites in one request.

GET/flood-field/batch/{batch_id}/

Batch progress counts.

GET/flood-field/batch/{batch_id}/results/

Per-site results, paginated.

Request and Response Examples

Each site runs asynchronously and typically completes in about a minute. Submit the coordinate, poll the job, read the result, then download the field from bundle_url.

Step 1 · Submit

POST the coordinate. Returns 202 with a job_id.

→

Step 2 · Poll

PENDING, QUEUED, RUNNING, then COMPLETED, PARTIAL or FAILED. Stop polling at any of the last three.

→

Step 3 · Retrieve

GET the result: the summary and the bundle_url.

→

Step 4 · Download

GET the bundle_url for the full grids as plain JSON.

Submit a site

POST /api/v1/flood-field/analyze/
Content-Type: application/json
X-API-Key: YOUR_API_KEY

{
  "lat": 23.69,
  "lon": 58.17,
  "label": "site-01"
}

→ 202 Accepted
{
  "job_id": "ff_5c99a1e6a6c4",
  "status": "PENDING",
  "error": null
}

Retrieve the result (abridged)

GET /api/v1/flood-field/results/ff_5c99a1e6a6c4/
X-API-Key: YOUR_API_KEY

→ 200 OK
{
  "job_id": "ff_5c99a1e6a6c4",
  "status": "COMPLETED",
  "method_version": "flood_field_v1.0",
  "input": {"lat": 23.69, "lon": 58.17, "label": "site-01", "half_km": 3.0},
  "layers": {
    "riverine": {
      "status": "ok",
      "return_periods": [10, 50, 100, 500],
      "depth_semantics": "depth above local ground, metres",
      "width": 71, "height": 65, "native_scale_m": 92.766,
      "site_cell": {"RP10": null, "RP50": null, "RP100": null, "RP500": null},
      "nearest_real_cell_m": 93,
      "band_audit": {
        "RP100_depth": {"real_cells": 1415, "p50": 0.972, "real_max": 4.634}
      }
    },
    "coastal": {
      "status": "ok",
      "return_periods": [10, 50, 100, 500],
      "width": 8, "height": 8, "native_scale_m": 927.662,
      "site_cell": {"RP10": 0.0, "RP50": 0.0, "RP100": 0.0, "RP500": 0.0},
      "site_cell_wtsub": {"RP10": 0.0, "RP50": 0.0, "RP100": 0.0, "RP500": 0.0},
      "subsidence_delta_max_m": {"RP10": 0.0321, "RP50": 0.0321, "RP100": 0.0321, "RP500": 0.0321}
    }
  },
  "generated": "2026-10-21T10:18:25+00:00",
  "bundle_url": "https://<storage>/flood-field-bundles/ff_5c99a1e6a6c4/bundle.json",
  "expires_at": "2027-04-19T10:18:29.236354+00:00"
}

In this example the riverine site cell sits just outside the mapped floodplain at every return period, and the nearest flooded cell is 93 m away. The grid shows the floodplain across the whole box.

Download the full field

GET https://<storage>/flood-field-bundles/ff_5c99a1e6a6c4/bundle.json

→ 200 OK, plain JSON
{
  "summary": { ... },
  "bands": {
    "riverine": {
      "RP10_depth":  [ ...4,615 cells... ],
      "RP50_depth":  [ ... ],
      "RP100_depth": [ ... ],
      "RP500_depth": [ ... ],
      ...
    },
    "coastal": { ...8 grids: four return periods, with and without subsidence... }
  }
}

Grids are flat row-major lists with row 0 at the north edge. The summary’s origin, dx_deg and dy_deg place every cell on a map, and pin.idx marks the site cell.

Batch Processing for Portfolios

Send up to 100 sites in one request as a locations array. Each site runs as its own job and returns its own field. An optional top-level half_km applies to every site. Poll the batch for progress, then page through the per-site results; each result carries its own bundle_url and expiry date.

POST /api/v1/flood-field/batch/analyze/
Content-Type: application/json
X-API-Key: YOUR_API_KEY

{
  "locations": [
    {"lat": 23.69, "lon": 58.17, "label": "site-01"},
    {"lat": 24.34, "lon": 56.71, "label": "site-02"}
  ]
}

→ 202 Accepted
{
  "batch_id": "batch_ff_ab12cd34ef56",
  "status": "PROCESSING",
  "total": 2,
  "skipped": 0
}

Put Flood Risk Data in Your Stack

Drop your email and we will send your API key and the integration docs.

Test Your Integration with Dry Run

Add "dry_run": true to any POST. A single-site dry run returns straight away with the summary and a mock field inline under bundle, laid on the real grid geometry, so you can test parsing and mapping before you run real sites. Dry-run responses report the method version flood_field_v1.0_dry_run, which keeps mock results easy to tell apart.

Production

POST /api/v1/flood-field/analyze/
{
  "lat": 23.69,
  "lon": 58.17
}

→ 202 Accepted, job_id
  full field in about a minute

Dry run

POST /api/v1/flood-field/analyze/
{
  "lat": 23.69,
  "lon": 58.17,
  "dry_run": true
}

→ 200 OK, mock field
  inline under "bundle"

Key Response Fields

status (job) COMPLETED when both layers are read; PARTIAL when one layer has data, with the field still delivered; FAILED when no field could be delivered.
status (layer) Read before any value. ok is published data. empty_confirmed means the layer was read in full and every cell in the box is null, as with the coastal layer for an inland site. unavailable means the location falls outside that layer’s coverage. failed means the read did not finish; treat it as unknown.
site_cell Depth at the site cell for each return period. Coastal adds site_cell_wtsub, the same values with land subsidence.
nearest_real_cell_m Distance in metres from the site to the nearest riverine cell with real depth at any return period; null when the box holds none.
band_audit Per band: counts of valid, masked, zero, fill-value and real-depth cells, plus min, median and max depth. Riverine cells of exactly 1.000 m are a fill value on permanent water and are counted on their own.
origin, dx_deg, dy_deg, width, height, pin Everything needed to place each cell on a map.
bundle_url, expires_at The full grids as plain JSON, kept for 180 days. Every result states its expiry date.
license, attribution Each layer carries its own licence and attribution strings.

Technical Specifications

Base URL https://api.continuuiti.com/api/v1/flood-field/
Authentication X-API-Key header
Input lat, lon, optional label, optional half_km (greater than 0, up to 3.0, default 3.0)
Layers Riverine at about 90 m; coastal at about 1 km
Grid 6 km by 6 km around the coordinate by default
Return periods 1-in-10, 1-in-50, 1-in-100 and 1-in-500 years, all four in every field
Coastal versions With and without land subsidence
Processing Asynchronous, about a minute per site
Batch Up to 100 sites per request
Retention 180 days per field
Format JSON

Flood Risk API Use Cases

Portfolio flood screening

Run every site in a portfolio and rank them by flood depth and how close flooding comes, at each return period.

Site context for due diligence

See the flooded area around a site before an acquisition, lease or loan, and how far the water reaches from the 1-in-10 to the 1-in-500-year flood.

Flood maps in your own platform

Draw the grids in your own app or GIS. Each response carries the geometry to place every cell.

Related APIs

Frequently Asked Questions

How do I get an API key?

Enter your email in the form on this page and we will send your key and the docs. Every request carries the key in the X-API-Key header.

What does one submission return?

One submission per site returns a summary and a link to the full field. The field holds both layers, four return periods and every cell in a 6 km box, as one JSON file kept for 180 days.

How large is the grid, and how fine are the cells?

The box is 6 km by 6 km around your coordinate by default. Riverine cells are about 90 m, around 4,700 cells near the tropics and more toward the poles. Coastal cells are about 1 km, roughly 8 by 8 near the tropics over the same box.

Which return periods does the Flood Risk API cover?

The 1-in-10, 1-in-50, 1-in-100 and 1-in-500-year floods, for both layers, in every field.

How can I test my integration before running real sites?

Add "dry_run": true to the request. A single dry run returns at once with a mock field on the real grid geometry and the method version flood_field_v1.0_dry_run.

I used the Flood Depth endpoints. What do I call now?

Call the flood field endpoints under /api/v1/flood-field/. The Flood Depth analyze endpoint now answers with a 410 that names this replacement.

Start Building with the Flood Risk API

Create an account to get your API key, or book a demo to walk through a response with our team.