Reference
Exposures
Every storm day and live warning that touched something the team watches, in one inbox.
List activity
GET /api/v1/exposures
Everything that touched something the team watches, newest first.
exposures:read paginated
Query parameters
since
string
Only activity seen after this moment. The cursor for an incremental sync.
from
string
Only activity on or after this event date.
to
string
Only activity on or before this event date.
kind
enum
Archived record, or live warning.
open
boolean
Only activity nobody has acknowledged or dismissed.
subject
enum
Only activity at one kind of watched place.
min_measured_in
number
Only activity whose largest measured hail meets this size, in inches.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/exposures?since=2026-08-20T00%3A00%3A00Z&open=true \
-H "Authorization: Bearer $TITAN_API_TOKEN"
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->get('/api/v1/exposures', [
'query' => [
'since' => '2026-08-20T00:00:00Z',
'open' => true,
],
]);
$exposures = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/exposures?since=2026-08-20T00%3A00%3A00Z&open=true', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const exposures = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/exposures",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
params={
"since": "2026-08-20T00:00:00Z",
"open": True,
},
)
exposures = response.json()
{
"data": [
{
"id": 48213,
"object": "exposure",
"kind": "record",
"date": "2023-04-21",
"subject": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge"
},
"headline": "Hail to 2.75 in measured 0.8 miles away.",
"reports": 6,
"sources": 3,
"families": {
"hail": 5,
"wind": 1,
"tornado": 0,
"other": 0
},
"largest_measured_in": 2.75,
"largest_detected_in": 2.1,
"max_gust_mph": 61,
"nearest_miles": 0.8,
"observed": true,
"provisional": false,
"evidence": [
"ground",
"radar"
],
"record_ids": [
188204,
188207,
188213
],
"warning": null,
"first_seen_at": "2023-04-22T09:00:12Z",
"last_seen_at": "2023-05-02T09:00:04Z",
"notified_at": "2023-04-22T09:01:00Z",
"acknowledged_at": null,
"dismissed_at": null,
"report_id": null,
"links": {
"self": "https://titanweather.com/api/v1/exposures/48213",
"subject": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"report": null
}
}
],
"links": {
"first": "https://titanweather.com/api/v1/exposures?page=1",
"last": "https://titanweather.com/api/v1/exposures?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://titanweather.com/api/v1/exposures",
"per_page": 25,
"to": 1,
"total": 1
}
}
Retrieve one exposure
GET /api/v1/exposures/{exposure}
One storm day or warning at one watched place.
exposures:read
Path parameters
exposure
The exposure id, an integer from an activity listing.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/exposures/48213 \
-H "Authorization: Bearer $TITAN_API_TOKEN"
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->get('/api/v1/exposures/48213');
$exposure = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/exposures/48213', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const exposure = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/exposures/48213",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
exposure = response.json()
{
"data": {
"id": 48213,
"object": "exposure",
"kind": "record",
"date": "2023-04-21",
"subject": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge"
},
"headline": "Hail to 2.75 in measured 0.8 miles away.",
"reports": 6,
"sources": 3,
"families": {
"hail": 5,
"wind": 1,
"tornado": 0,
"other": 0
},
"largest_measured_in": 2.75,
"largest_detected_in": 2.1,
"max_gust_mph": 61,
"nearest_miles": 0.8,
"observed": true,
"provisional": false,
"evidence": [
"ground",
"radar"
],
"record_ids": [
188204,
188207,
188213
],
"warning": null,
"first_seen_at": "2023-04-22T09:00:12Z",
"last_seen_at": "2023-05-02T09:00:04Z",
"notified_at": "2023-04-22T09:01:00Z",
"acknowledged_at": null,
"dismissed_at": null,
"report_id": null,
"links": {
"self": "https://titanweather.com/api/v1/exposures/48213",
"subject": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"report": null
}
}
}
Acknowledge or dismiss
POST /api/v1/exposures/{exposure}/acknowledge
Mark activity as seen, or set it aside.
exposures:write
Path parameters
exposure
The exposure id, an integer from an activity listing.
Body
dismiss
boolean
Send true to set the activity aside instead of marking it seen. Omitted or false acknowledges it.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/exposures/48213/acknowledge \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"dismiss": false
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/exposures/48213/acknowledge', [
'json' => [
'dismiss' => false,
],
]);
$exposure = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/exposures/48213/acknowledge', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
dismiss: false,
}),
});
const exposure = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/exposures/48213/acknowledge",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
json={
"dismiss": False,
},
)
exposure = response.json()
{
"data": {
"id": 48213,
"object": "exposure",
"kind": "record",
"date": "2023-04-21",
"subject": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge"
},
"headline": "Hail to 2.75 in measured 0.8 miles away.",
"reports": 6,
"sources": 3,
"families": {
"hail": 5,
"wind": 1,
"tornado": 0,
"other": 0
},
"largest_measured_in": 2.75,
"largest_detected_in": 2.1,
"max_gust_mph": 61,
"nearest_miles": 0.8,
"observed": true,
"provisional": false,
"evidence": [
"ground",
"radar"
],
"record_ids": [
188204,
188207,
188213
],
"warning": null,
"first_seen_at": "2023-04-22T09:00:12Z",
"last_seen_at": "2023-05-02T09:00:04Z",
"notified_at": "2023-04-22T09:01:00Z",
"acknowledged_at": "2026-08-23T14:10:00Z",
"dismissed_at": null,
"report_id": null,
"links": {
"self": "https://titanweather.com/api/v1/exposures/48213",
"subject": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"report": null
}
}
}
Reopen an exposure
POST /api/v1/exposures/{exposure}/reopen
Put activity back in the inbox.
exposures:write
Path parameters
exposure
The exposure id, an integer from an activity listing.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/exposures/48213/reopen \
-H "Authorization: Bearer $TITAN_API_TOKEN"
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/exposures/48213/reopen');
$exposure = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/exposures/48213/reopen', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const exposure = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/exposures/48213/reopen",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
exposure = response.json()
{
"data": {
"id": 48213,
"object": "exposure",
"kind": "record",
"date": "2023-04-21",
"subject": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge"
},
"headline": "Hail to 2.75 in measured 0.8 miles away.",
"reports": 6,
"sources": 3,
"families": {
"hail": 5,
"wind": 1,
"tornado": 0,
"other": 0
},
"largest_measured_in": 2.75,
"largest_detected_in": 2.1,
"max_gust_mph": 61,
"nearest_miles": 0.8,
"observed": true,
"provisional": false,
"evidence": [
"ground",
"radar"
],
"record_ids": [
188204,
188207,
188213
],
"warning": null,
"first_seen_at": "2023-04-22T09:00:12Z",
"last_seen_at": "2023-05-02T09:00:04Z",
"notified_at": "2023-04-22T09:01:00Z",
"acknowledged_at": null,
"dismissed_at": null,
"report_id": null,
"links": {
"self": "https://titanweather.com/api/v1/exposures/48213",
"subject": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"report": null
}
}
}