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.

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.

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 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.
Submit one site. Returns 202 with a job_id.
Job status and progress for each layer.
The result summary and the bundle_url for the full field.
Submit up to 100 sites in one request.
Batch progress counts.
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.
