Environmental health intelligence,
delivered as infrastructure.
One API call returns real-time environmental context, condition-specific risk scoring, and peer-reviewed citations — ready to embed in any digital health product, insurance workflow, or population health programme.
POST a condition and location. Receive risk level, environmental signals, synthesis paragraph, inline citations, and EHSPI score. No assembly required.
Every response cites the peer-reviewed papers that support it. 350,000+ articles. Semantic retrieval. LLM gate for relevance. Not a rule-based lookup.
Google AQ, Weather, and Pollen APIs — 7 signal types per tile, updated hourly. 22 global cities seeded. Custom tile support available.
No PII required or stored. Anonymous session tokens only. No user profiles. GDPR-compatible architecture. Pass a location string, get intelligence back.
Four-layer pipeline from raw signal
to cited intelligence
Each layer is independently cached and observable. The pipeline runs end-to-end
in under 4 seconds at P50. All layers write structured logs to Cloud Logging
with a shared X-Request-ID for full traceability.
env_hourly_cache (48h TTL) and pollen_daily_cache (5d TTL).
High-priority tiles refresh every 60 min; standard tiles every 180 min.
insight_requests with
full observability fields.
Complete API specification
All endpoints require the X-Api-Key header except GET /health.
Contact us to request credentials.
Authentication
Pass your API key in the X-Api-Key request header. Keys are issued per integration. Rate limiting is applied per key. There is no OAuth flow — the API is stateless.
Content type & encoding
All POST bodies are application/json. All responses are application/json. Responses are UTF-8 encoded. Timestamps are ISO 8601 UTC.
Accept: application/json
The core endpoint. Submit a condition sensitivity and location; receive a complete environmental health intelligence response including risk level, environmental signal breakdown, a synthesis paragraph grounded in peer-reviewed evidence, inline citations, EHSPI score, and structured recommendations. Optional enrichment fields personalise the synthesis to the user's specific subtype, triggers, and medication.
| Field | Type | Required | Description |
|---|---|---|---|
| condition | string | Required | Sensitivity key. One of: migraine · respiratory · cardiovascular · sleep · allergies |
| location | string | Required | Free-text location string — city name, city + country, or coordinates. Resolved to the nearest seeded tile. Examples: "London, UK" · "Delhi" · "Dubai, UAE" |
| window_hours | integer | Optional | Time window in hours. One of: 6 · 24 · 72. Default: 24 |
| direction | string | Optional | Temporal direction. "future" (forecast) or "past" (historical). Default: "future" |
| activity | string | Optional | User's activity context. One of: "mostly_indoors" · "mixed" · "outdoor_exercise". Modulates exposure weighting in synthesis. Default: "mostly_indoors" |
| enrichment | object | Optional | Personalisation object. See enrichment fields below. When provided, the synthesis is tailored to the user's specific subtype, triggers, and medication context. |
| Field | Type | Description |
|---|---|---|
| condition_subtype | string | Specific subtype within the sensitivity. E.g. "chronic migraine", "asthma", "hay fever" |
| onset_pattern | string | Typical onset pattern. E.g. "gradual onset over hours", "sudden onset" |
| known_triggers | string[] | Array of known trigger strings. E.g. ["weather changes", "stress", "bright light"] |
| trigger_onset_lag_hours | number | Typical hours between trigger exposure and symptom onset. Options: 0.25, 0.5, 1.0, 1.5, 3.0, 6.0, 12.0, 24.0, 48.0, 72.0 |
| medication | string | Current relevant medication. E.g. "sumatriptan", "salbutamol inhaler", "cetirizine" |
| comorbidities | string[] | Other relevant conditions. E.g. ["anxiety", "hypertension"] |
Returns EHSPI composite and per-sensitivity scores for monitored cities. Cache-first — responses served from ehspi_scores table, refreshed nightly at 02:00 UTC. Specify sensitivity=all to retrieve all five sensitivity dimensions in one call.
| Parameter | Type | Default | Description |
|---|---|---|---|
| sensitivity | string | all | Sensitivity to return. One of: all · migraine · respiratory · cardiovascular · sleep · allergies |
| mode | string | lifetime | Scoring window. lifetime · 30d · 90d. Lifetime uses all available history; rolling modes use recent data only. |
| tile_id | string | — | Optional. Filter to a specific tile. Format: r2:{lat2dp},{lon2dp}. E.g. r2:51.51,-0.13 for London. |
Returns a daily time series of EHSPI composite and per-sensitivity scores for a specific tile. Use to power trend visualisations or longitudinal analysis. Data available from the tile's first ingestion date.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tile_id | string | Required | Tile identifier. Format: r2:{lat2dp},{lon2dp} |
| sensitivity | string | Optional | Filter to a specific sensitivity. Default: returns all five plus composite. |
| days | integer | Optional | Number of days of history to return. Default: 90. Max: 365. |
Returns a time series of raw environmental signal values (not EHSPI scores) for a tile and sensitivity — useful for displaying individual signal trends (e.g. PM2.5 over 30 days, or pressure volatility over 7 days) in a partner dashboard.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sensitivity | string | Required | Sensitivity key |
| tile_id | string | Required | Tile identifier |
| window | string | Optional | Time window. 7d · 30d · 90d. Default: 30d |
Registers a Web Push subscription for a device. When the alert monitor job (runs hourly) detects that the risk level for the subscribed condition and location meets or exceeds the threshold, a Web Push notification is delivered. No account required — subscriptions are tied to device and session token only. Subscriptions expire after 30 days of inactivity.
| Field | Type | Required | Description |
|---|---|---|---|
| subscription | object | Required | Web Push subscription object from PushManager.subscribe(). Contains endpoint, keys.p256dh, keys.auth |
| condition | string | Required | Sensitivity key to monitor |
| location | string | Required | Location string to monitor |
| threshold | string | Optional | "High" (notify only on High risk) or "Moderate" (notify on Moderate or above). Default: "High" |
| session_token | string | Optional | Anonymous UUID identifying the device session. Used for deduplication and unsubscribe. Generated client-side — not linked to any user identity. |
Removes an active push subscription. Pass either the session_token or the push endpoint URL to identify the subscription to remove. Immediate effect — the hourly alert monitor will not fire for this device on the next run.
| Field | Type | Description |
|---|---|---|
| session_token | string | Anonymous session UUID. One of session_token or endpoint required. |
| endpoint | string | Web Push endpoint URL from the original subscription object. |
Captures structured feedback on a specific insight response. Feedback is linked to the original request_id for correlation with the full pipeline context. Anonymous — no PII required. All fields optional except helpful.
| Field | Type | Required | Description |
|---|---|---|---|
| helpful | boolean | Required | true = thumbs up. false = thumbs down. |
| request_id | string | Optional | The request_id from the insight response this feedback relates to. |
| feedback_categories | string[] | Optional | Issue chips (thumbs-down): risk_level_wrong · data_incorrect · recommendations_irrelevant · research_irrelevant · missing_info · hard_to_understand |
| feedback_positive_aspects | string[] | Optional | Positive chips (thumbs-up): risk_warning · recommendations · env_breakdown · research_evidence · pollen_data |
| risk_accuracy | string | Optional | User's assessment: accurate · too_high · too_low · not_yet_experienced |
| improvement_text | string | Optional | Free-text comment. Max 200 characters server-side. |
| session_token | string | Optional | Anonymous UUID. Used for device-level correlation only. Not linked to any user identity. |
Privacy architecture Patent pending
The API requires no user accounts, no PII, and no persistent user profiles.
Location strings are resolved to the nearest tile and are not stored beyond the request lifecycle.
The only persistent identifier is an optional anonymous session_token (UUID)
generated client-side — used solely for alert subscription deduplication and feedback correlation.
It cannot be linked to any individual. All data processing is governed by the exposomic.ai
privacy policy. GDPR-compatible by design.
Three integration patterns
Add an environmental risk check to your daily check-in flow.
A migraine app calls /v1/insight with the user's
home location each morning. The response drives a risk badge and a cited explanation
in the app. No PII sent — just a location string and condition key.
Monitor environmental health risk across a member population by city cohort.
Call /v1/ehspi nightly to pull composite scores
for all 20 monitored cities. Feed into underwriting models or proactive member
outreach when EHSPI drops below threshold in high-density cities.
Use the EHSPI history endpoint to pull daily environmental health scores across multiple cities and sensitivities for a defined time window. Correlate with clinical outcomes data. The published weight vectors allow full methodological transparency in any resulting publication.
Ready to integrate?
API credentials are issued directly. No self-serve sign-up — we want to understand your use case and make sure the integration is right for your product.
Digital health platforms, insurers, and population health programmes. Tell us your use case and we'll issue credentials.
Request access →The consumer SPA runs the same API you'd integrate. Try a real query — no account, no data stored. See exactly what the API returns.
Open the app →All five sensitivity weight vectors published transparently. Confidence levels, city coverage, and validation status — all documented.
View research →