Download OpenAPI specification:
REST API for running water resources simulations (SWMM, EPANET, HEC-RAS) on demand.
All endpoints except /, /health, and /openapi.yaml require a Bearer token in the Authorization header:
Authorization: Bearer <token>
Visit https://aip.neer.ai/user/keys or https://aip.neer.ai/teams/
Returns basic information about the API, including documentation links and available endpoints
{- "name": "Water Resources Modeling API",
- "version": "1.0.0",
- "contact": {
- "name": "NEER",
- "email": "support@neer.ai"
}, - "endpoints": {
- "health": "/health",
- "simulations": "/simulations"
}
}Returns all supported simulation engine types, their available versions, and the default version for each.
[- {
- "type": "swmm",
- "versions": [
- "5.1.15",
- "5.2.1",
- "5.2.2",
- "5.2.3",
- "5.2.4"
], - "default_version": "5.2.4"
}, - {
- "type": "epanet",
- "versions": [
- "2.2",
- "2.3",
- "2.3.1",
- "2.3.2",
- "2.3.3"
], - "default_version": "2.3.3"
}, - {
- "type": "hec_ras",
- "versions": [
- "6.6",
- "7.0.1"
], - "default_version": "6.6"
}
]Retrieves a list of simulations accessible to the authenticated user or team. Results can be filtered by simulation type.
| type | string (SimulationType) Enum: "swmm" "epanet" "hec_ras" Example: type=swmm Filter by simulation type |
[- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "user_id": "usr-123",
- "team_id": "team-456",
- "project_id": "proj-789",
- "label": "Storm water analysis",
- "type": "swmm",
- "version": "5.2.4",
- "context": {
- "rainfall": 100,
- "duration": 24
}, - "status": "pending",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": "2026-01-17T10:35:00Z"
}
]Creates a new simulation and submits it for execution.
For HEC-RAS simulations, hec_ras_plan_number is supported, along with optional floodplain controls:
generate_floodplain_maps (boolean)depth_threshold (number, feet)use_existing_results (boolean) — reuse results already in the package
rather than recomputingChoose your content type based on your input method:
application/json - For remote files (HTTPS or S3 URIs)
input_file_uri fieldmultipart/form-data - For local file uploads
file fieldInput file methods:
https://example.com/models/stormwater.inps3://my-bucket/models/project.zipField ordering (multipart only): the upload body is consumed as a
stream, so all form fields must be sent before the file field.
type in particular decides how the file is handled and is read from
the stream before the file itself. Standard clients (curl -F, browser
FormData, Go's multipart.Writer) preserve the order you add fields,
so putting file last is enough. A file field arriving before type
is rejected with 400.
Maximum upload size: uploads are limited to 5 GiB by default
(MAX_UPLOAD_BYTES), for every engine. Exceeding it returns 413.
No upload is held in server memory. A HEC-RAS archive is passed to the engine untouched and streams straight to S3. A SWMM or EPANET archive is unpacked first, but it is spooled to disk and its entries are streamed out one at a time.
Two smaller limits apply inside an archive. Its extracted contents
are bounded by the same 5 GiB ceiling, which a compressed archive can
otherwise far exceed, and it may hold at most 10,000 entries. The
input file itself is limited to 1 GiB
(MAX_BUFFERED_UPLOAD_BYTES), because it is validated as a whole and
searched for references to the other files, so it is the one entry that
must be read into memory. That limit also applies to a bare .inp
uploaded on its own, and to JSON request bodies.
For models above these limits, use POST /uploads to get presigned URLs,
transfer the file directly to S3, then pass the returned
input_file_uri here. An input_file_uri that already points into the
API's own bucket is referenced in place rather than being copied through
the server, so files of any size work by that route.
| type required | string (SimulationType) Enum: "swmm" "epanet" "hec_ras" Type of water resources simulation:
|
| engine_version | string Optional engine version to use for the simulation. Must be a version
supported by the chosen Supported versions per engine:
|
| label | string Human-readable label for the simulation |
| input_file_uri | string <uri> URI to the input file. Supported schemes:
If omitted and using multipart/form-data, a file can be uploaded directly. |
| hec_ras_plan_number | string HEC-RAS plan number to execute. Required when |
| generate_floodplain_maps | boolean Optional for |
| depth_threshold | number <double> >= 0 Optional for |
| preprocess | boolean Optional for |
| source_model_id | string or null <uuid> Optional. UUID of the HydraulicModel this simulation was launched from
(Console-initiated sims). Persisted on the simulation row so a model's
full simulation history can be retrieved by |
| source_layer_id | string or null <uuid> Optional. UUID of the specific child Layer of a HydraulicModel that
triggered this simulation, when run directly from a layer in the
Console object panel. Like |
| data_json_uri | string <uri> Optional. S3 URI of an editable non-spatial overlay ( |
{- "type": "swmm",
- "label": "Storm water analysis - HTTPS",
}{- "id": "550e8400-e29b-41d4-a716-446655440000",
- "user_id": "usr-123",
- "team_id": "team-456",
- "project_id": "proj-789",
- "label": "Storm water analysis",
- "type": "swmm",
- "version": "5.2.4",
- "context": {
- "rainfall": 100,
- "duration": 24
}, - "status": "pending",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": "2026-01-17T10:35:00Z"
}Retrieves detailed information about a specific simulation
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 Simulation ID (UUID) |
{- "id": "550e8400-e29b-41d4-a716-446655440000",
- "user_id": "usr-123",
- "team_id": null,
- "project_id": "proj-456",
- "label": "Storm water analysis",
- "type": "swmm",
- "version": "5.2.4",
- "context": {
- "rainfall": 100,
- "duration": 24
}, - "status": "running",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": null
}Retrieves all files associated with a simulation, including input files, output files, reports, and other simulation artifacts.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 Simulation ID (UUID) |
[- {
- "id": "file-001",
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "input",
- "uri": "s3://my-bucket/swmm/550e8400-e29b-41d4-a716-446655440000/input.inp",
- "size": 45000,
- "created_at": "2026-01-17T10:30:00Z"
}, - {
- "id": "file-002",
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "output",
- "uri": "s3://my-bucket/swmm/550e8400-e29b-41d4-a716-446655440000/output.out",
- "size": 120000,
- "created_at": "2026-01-17T10:35:00Z"
}, - {
- "id": "file-003",
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "auxiliary",
- "auxiliary": "rainfall",
- "uri": "s3://my-bucket/swmm/550e8400-e29b-41d4-a716-446655440000/sta15314.dat",
- "size": 30000,
- "created_at": "2026-01-17T10:36:00Z"
}
]Downloads all files associated with a simulation as a single ZIP archive. Files that cannot be retrieved are silently skipped.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 Simulation ID (UUID) |
{- "error": "missing authorization header"
}Retrieves logs for a simulation with pagination and sorting support. By default, logs are ordered by timestamp in descending order (newest first).
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 Simulation ID (UUID) |
| limit | integer [ 1 .. 500 ] Default: 50 Example: limit=25 Maximum number of logs to return (default 50, max 500) |
| offset | integer >= 0 Default: 0 Number of logs to skip for pagination (default 0) |
| sort | string Default: "desc" Enum: "asc" "desc" "ascending" "descending" Example: sort=desc Sort order by timestamp (default desc for newest first) |
{- "logs": [
- {
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "timestamp": "2026-01-17T10:35:00Z",
- "message": "Simulation completed successfully"
}, - {
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "timestamp": "2026-01-17T10:34:30Z",
- "message": "Running SWMM simulation"
}, - {
- "simulation_id": "550e8400-e29b-41d4-a716-446655440000",
- "timestamp": "2026-01-17T10:31:00Z",
- "message": "Simulation started"
}
], - "total": 15,
- "limit": 25,
- "offset": 0,
- "has_more": false
}Submits an async job to generate a water resources model (HEC-RAS, SWMM, or EPANET)
from geospatial data. Returns a job record with status: pending and a job ID
that can be used to poll for progress via GET /models/generate/{id}.
| software required | string (ModelSoftware) Enum: "hec_ras" "swmm" "epanet" "gis_tool" "report" Modeling software or tool type:
|
| project_name required | string Human-readable project name |
| build_type | string (BuildType) Enum: "brownfield" "greenfield"
|
| huc_id | string HUC watershed identifier for the study area |
object (BoundingBox) Geographic bounding box in WGS84 coordinates | |
| units | string Default: "US" Unit system ( |
| dem_resolution | integer Default: 10 DEM resolution in meters (default 10) |
| tool_name | string GIS tool function name (required when software = |
object Parameters for the GIS tool (required when software = | |
| user_dem_url | string <uri> URL to user-provided DEM raster (overrides default data source) |
| user_boundary_url | string <uri> URL to user-provided study area boundary (GeoJSON or shapefile) |
| user_streams_url | string <uri> URL to user-provided stream network layer |
| user_landcover_url | string <uri> URL to user-provided land cover raster |
| user_soils_url | string <uri> URL to user-provided soils data layer |
| user_roads_url | string <uri> URL to user-provided roads layer |
| user_parcels_url | string <uri> URL to user-provided parcels layer (greenfield builds) |
| user_buildings_url | string <uri> URL to user-provided buildings layer (greenfield builds) |
| sub_type | string (ModelSubType) Enum: "1d" "2d" "1d2d" HEC-RAS model dimensionality (required when
|
| design_storms | Array of strings Design storm return periods (HEC-RAS), e.g. |
| xs_spacing_ft | number <double> Cross-section spacing in feet (HEC-RAS 1D) |
| xs_half_width_ft | number <double> Cross-section half-width in feet (HEC-RAS 1D) |
| xs_sample_interval_ft | number <double> DEM sample interval along cross-sections in feet (HEC-RAS 1D) |
| xs_max_points | integer Maximum points per cross-section (HEC-RAS 1D) |
| cell_size_default_ft | number <double> Default 2D mesh cell size in feet (HEC-RAS 2D) |
| cell_size_channel_ft | number <double> Channel zone 2D mesh cell size in feet (HEC-RAS 2D) |
| cell_size_urban_ft | number <double> Urban zone 2D mesh cell size in feet (HEC-RAS 2D) |
| stream_source | string Source dataset for stream network (HEC-RAS) |
| road_breakline_mode | string How roads are used as breaklines in terrain (HEC-RAS) |
| storm_duration_hr | number <double> Storm duration in hours (HEC-RAS) |
| precip_distribution_type | string Precipitation distribution type (HEC-RAS) |
| user_breaklines_url | string <uri> URL to user-provided terrain breaklines (HEC-RAS) |
| user_cross_sections_url | string <uri> URL to user-provided cross-section geometry (HEC-RAS 1D) |
| user_structures_url | string <uri> URL to user-provided hydraulic structures (HEC-RAS) |
| user_mannings_url | string <uri> URL to user-provided Manning's n roughness polygons (HEC-RAS) |
| user_flow_data_url | string <uri> URL to user-provided flow data (HEC-RAS) |
| burn_culverts | boolean Burn culverts into the terrain DEM (HEC-RAS) |
| culvert_depth_ft | number <double> Culvert burn depth in feet (HEC-RAS) |
| user_culvert_lines_url | string <uri> URL to user-provided culvert centerlines (HEC-RAS) |
| auto_inflow_bc | boolean Automatically generate upstream inflow boundary conditions (HEC-RAS) |
| min_inflow_drainage_area_sqmi | number <double> Minimum drainage area (sq mi) for auto-inflow BC (HEC-RAS) |
| inflow_bc_line_width_ft | number <double> Width in feet of generated inflow BC lines (HEC-RAS) |
| user_inflow_csv_url | string <uri> URL to user-provided inflow hydrograph CSV (HEC-RAS) |
| user_bc_lines_url | string <uri> URL to user-provided boundary condition lines (HEC-RAS) |
| user_downstream_stage_url | string <uri> URL to user-provided downstream stage time series (HEC-RAS) |
| user_rating_curve_url | string <uri> URL to user-provided downstream rating curve (HEC-RAS) |
| downstream_bc | string Downstream boundary condition type, e.g. |
| downstream_slope | number <double> Downstream channel slope for normal depth BC (HEC-RAS) |
| downstream_stage_ft | number <double> Fixed downstream stage in feet (HEC-RAS) |
| rainfall_source | string Source for rainfall data (SWMM) |
| design_storm_type | string Design storm type (SWMM) |
| storm_duration_hrs | number <double> Default: 24 Storm duration in hours (SWMM), defaults to 24 |
| storm_return_years | Array of integers Return period years for design storms (SWMM) |
| subcatchment_method | string Default: "auto" Subcatchment delineation method (SWMM), defaults to |
| user_junctions_url | string <uri> URL to user-provided junction nodes (SWMM brownfield) |
| user_outfalls_url | string <uri> URL to user-provided outfall nodes (SWMM brownfield) |
| user_storage_url | string <uri> URL to user-provided storage units (SWMM brownfield) |
| user_conduits_url | string <uri> URL to user-provided conduit links (SWMM brownfield) |
| user_pumps_url | string <uri> URL to user-provided pump links (SWMM brownfield) |
| user_weirs_url | string <uri> URL to user-provided weir links (SWMM brownfield) |
| user_orifices_url | string <uri> URL to user-provided orifice links (SWMM brownfield) |
| user_subcatchments_url | string <uri> URL to user-provided subcatchment polygons (SWMM) |
| user_raingages_url | string <uri> URL to user-provided rain gauge locations (SWMM) |
| default_conduit_roughness | number <double> Default: 0.013 Default Manning's n for conduits (SWMM), defaults to 0.013 |
| default_conduit_shape | string Default: "CIRCULAR" Default conduit cross-section shape (SWMM), defaults to |
| default_conduit_diameter | number <double> Default: 18 Default conduit diameter in inches (SWMM), defaults to 18 |
| infiltration_method | string Default: "GREEN_AMPT" Infiltration method for subcatchments (SWMM), defaults to |
| flow_routing | string Default: "DYNWAVE" Flow routing method (SWMM), defaults to |
| system_type | string Stormwater system type (SWMM) |
| use_rdii | boolean Enable rainfall-derived inflow and infiltration (SWMM) |
| precip_distribution | string Precipitation temporal distribution (SWMM) |
| precip_quartile | string SCS precipitation quartile (SWMM) |
| precip_percentile | string NOAA precipitation percentile (SWMM) |
| user_epanet_junctions_url | string <uri> URL to user-provided junction nodes (EPANET brownfield) |
| user_reservoirs_url | string <uri> URL to user-provided reservoirs (EPANET brownfield) |
| user_tanks_url | string <uri> URL to user-provided tanks (EPANET brownfield) |
| user_pipes_url | string <uri> URL to user-provided pipe links (EPANET brownfield) |
| user_epanet_pumps_url | string <uri> URL to user-provided pump links (EPANET brownfield) |
| user_valves_url | string <uri> URL to user-provided valve links (EPANET brownfield) |
| user_demands_url | string <uri> URL to user-provided demand data (EPANET) |
| default_pipe_diameter | number <double> Default: 12 Default pipe diameter in inches (EPANET), defaults to 12 |
| default_pipe_roughness | number <double> Default: 130 Default Hazen-Williams C roughness coefficient (EPANET), defaults to 130 |
| default_demand_gpm | number <double> Default: 5 Default node demand in GPM (EPANET), defaults to 5 |
| headloss_formula | string Default: "H-W" Headloss formula (EPANET), defaults to |
{- "software": "hec_ras",
- "project_name": "Austin Creek Flood Study",
- "sub_type": "2d",
- "huc_id": "12090205",
- "design_storms": [
- "100yr",
- "500yr"
]
}{- "id": "550e8400-e29b-41d4-a716-446655440001",
- "user_id": "usr-123",
- "team_id": "team-456",
- "project_name": "Austin Creek Flood Study",
- "model_type": "hec_ras_2d",
- "status": "pending",
- "config": { },
- "output_uri": "s3://neeraip-models/generated/550e8400-e29b-41d4-a716-446655440001/model.zip",
- "error": "string",
- "progress": 45,
- "current_step": "Generating 2D mesh",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": "2026-01-17T10:45:00Z"
}Returns all model generation jobs accessible to the authenticated user or team.
[- {
- "id": "550e8400-e29b-41d4-a716-446655440001",
- "user_id": "usr-123",
- "team_id": "team-456",
- "project_name": "Austin Creek Flood Study",
- "model_type": "hec_ras_2d",
- "status": "pending",
- "config": { },
- "output_uri": "s3://neeraip-models/generated/550e8400-e29b-41d4-a716-446655440001/model.zip",
- "error": "string",
- "progress": 45,
- "current_step": "Generating 2D mesh",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": "2026-01-17T10:45:00Z"
}
]Returns the status and details of a specific model generation job.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440001 Model generation job ID (UUID) |
{- "id": "550e8400-e29b-41d4-a716-446655440001",
- "user_id": "usr-123",
- "team_id": "team-456",
- "project_name": "Austin Creek Flood Study",
- "model_type": "hec_ras_2d",
- "status": "pending",
- "config": { },
- "output_uri": "s3://neeraip-models/generated/550e8400-e29b-41d4-a716-446655440001/model.zip",
- "error": "string",
- "progress": 45,
- "current_step": "Generating 2D mesh",
- "created_at": "2026-01-17T10:30:00Z",
- "started_at": "2026-01-17T10:31:00Z",
- "ended_at": "2026-01-17T10:45:00Z"
}Returns presigned URLs that let a client upload a model file directly
to S3, bypassing the API's request size limit entirely. The file's
bytes never pass through the API, so the upload is bounded by S3 rather
than by server memory or load balancer timeouts. Use this for any file
too large for a multipart/form-data upload to POST /simulations.
The response mode tells you how to transfer the file:
single (files under 5GB) — send one PUT to the single URL in
parts[0].url with the file as the body. No completion call is needed.
multipart (files 5GB and over) — split the file into chunks of
exactly part_size bytes (the final chunk may be smaller) and PUT
each one to its matching URL in parts. S3 returns an ETag header
for each part; collect them and call POST /uploads/complete.
Either way, once the upload is finished, pass the returned
input_file_uri as input_file_uri to POST /simulations. The API
references the object in place — it is never copied through the server.
URL lifetime: URLs expire at expires_at (6 hours after issue).
Treat that as an upper bound, not a guarantee — when the API runs with
temporary credentials (an ECS task role in production), presigned URLs
stop working as soon as those credentials expire, which can be sooner.
If part uploads start returning 403 partway through a transfer, call
POST /uploads/abort and start a new upload rather than retrying.
| filename required | string Original file name. Only the base name is used, and it is sanitised; the storage key is chosen by the server. |
| size required | integer <int64> <= 68719476736 Exact size of the file in bytes. Required, because the number of presigned part URLs is derived from it. Limited to 64 GiB by default (configurable per
deployment via |
{- "filename": "hecras-model.zip",
- "size": 8800000000
}{- "mode": "multipart",
- "key": "uploads/team-abc/9f8e7d/hecras-model.zip",
- "upload_id": "2~Xy9...",
- "part_size": 33554432,
- "parts": [
], - "input_file_uri": "s3://neeraip-simulations-prod/uploads/team-abc/9f8e7d/hecras-model.zip",
- "expires_at": "2026-01-17T22:30:00Z"
}Assembles the parts of a multipart upload into a single object.
Required only for mode: multipart; single uploads are complete as
soon as the PUT succeeds.
Send every part you uploaded, with the ETag S3 returned in the
response header for that part. Parts must be ordered by part_number.
The upload key must belong to the calling API key's user or team.
| key required | string The |
| upload_id required | string The |
required | Array of objects One entry per uploaded part, ordered by part number |
{- "key": "uploads/team-abc/9f8e7d/hecras-model.zip",
- "upload_id": "2~Xy9...",
- "parts": [
- {
- "part_number": 1,
- "etag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}
]
}{- "key": "uploads/team-abc/9f8e7d/hecras-model.zip",
- "input_file_uri": "s3://neeraip-simulations-prod/uploads/team-abc/9f8e7d/hecras-model.zip",
- "size": 8800000000
}Discards an unfinished multipart upload and the parts already transferred, so they stop accruing storage charges. Use this when a large upload is cancelled or fails partway through.
The upload key must belong to the calling API key's user or team.
| key required | string |
| upload_id required | string |
{- "key": "uploads/team-abc/9f8e7d/hecras-model.zip",
- "upload_id": "2~Xy9..."
}{- "code": "BAD_REQUEST",
- "message": "type is required"
}