The HASTE API provides 41 HTTP endpoints and 6 queue-triggered workers (plus a poison-queue handler) for managing disaster assessment projects, processing satellite imagery, and running AI models for damage assessment. A separate TiTiler-based tile server handles geospatial imagery visualization.
The API layer consists of three Azure Functions apps:
hastefuncapi— 41 HTTP-triggered endpoints (projects, image layers, models, labels and validation, building features, users and admin, model catalog, plus dashboard/stats, visualizer, chunked upload, and Azure Maps token)hastefuncqueues— 6 queue-triggered workers plus a poison-queue handler for async processing (imagery, training, embedding, inference, stats, and artifact zipping)titilerfuncapi— a TiTiler0.21.1tile server for Cloud Optimized GeoTIFF serving
All apps share the hastegeo core library for models, processors, and storage backends.
Authentication is environment-dependent:
- Local / development (
DEVELOPMENT_MODE=true) — endpoints are anonymous (func.AuthLevel.ANONYMOUS) for convenient local testing. - Production (
DEVELOPMENT_MODE=false, the default) — endpoints require a Function key (func.AuthLevel.FUNCTION). Azure API Management fronts the app and injects the Function host key into its backends; the React UI authenticates users via Entra ID (MSAL) at the Static Web App.
Admin endpoints additionally enforce an administrators role decoded from the SWA-provided
x-ms-client-principal header, and the Model Catalog endpoints are always FUNCTION.
- Local — the UI is served by the SWA CLI at
http://localhost:4280; API calls go through the nginxapi-proxyathttp://localhost:7071/api/. - Production — the API is fronted by Azure API Management, and the Static Web App
proxies
/api/*to it.
Responses are shaped per endpoint — there is no global response envelope. Successful reads return the resource directly, sometimes under a named key:
{ "projects": [], "project_count": 0, "layer_count": 0, "model_count": 0 }Errors return an appropriate HTTP status code with either a plain-text message or a JSON body such as:
{ "error": "Project not found." }Some write endpoints (e.g. the Model Catalog) return a small status wrapper:
{ "success": true, "message": "…", "catalogModel": {} }API throughput is bounded by the underlying platform:
- Azure Functions plan limits (Flex Consumption)
- Cosmos DB request-unit (RU) quotas, when the Cosmos metadata backend is used
- API Management policies in front of the API
- Blob storage bandwidth
- 200 OK — request successful
- 201 Created — resource created successfully
- 400 Bad Request — invalid request data
- 401 Unauthorized — authentication required
- 403 Forbidden — authenticated but missing the required role
- 404 Not Found — resource not found
- 500 Internal Server Error — server error