Reference
Properties
The addresses the team watches: the book itself, the people attached to each place, and the storm days on record around it.
Create a property
POST /api/v1/properties
Watch an address. The plan's ceiling is a 402; a duplicate is a 409.
properties:write
Body
address
string
required
The address to watch, as a person would write it. The natural key: the same address twice is a 409 carrying the existing id.
label
string
A short name of your own for the place.
reference
string
Your own file or account number, carried unchanged.
kind
string
What stands there: residential, commercial, multifamily, industrial, land or other.
status
string
The watch state to start in: watching (the default), paused or archived.
watch_radius_miles
number
How far around the address monitoring looks, 0.5 to 10 miles, within the plan.
tags
array
Up to ten short strings of your own, for filtering the book.
notes
string
Free text, kept with the property.
Answers
201
Created.
409
The team already watches this address. The message carries the existing id.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/properties \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address": "1428 Cedar Ridge Dr, Plano, TX 75023",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
]
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/properties', [
'json' => [
'address' => '1428 Cedar Ridge Dr, Plano, TX 75023',
'label' => 'Cedar Ridge',
'reference' => 'CLM-48211',
'kind' => 'residential',
'watch_radius_miles' => 3,
'tags' => [
'plano',
'priority',
],
],
]);
$property = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
address: '1428 Cedar Ridge Dr, Plano, TX 75023',
label: 'Cedar Ridge',
reference: 'CLM-48211',
kind: 'residential',
watch_radius_miles: 3,
tags: [
'plano',
'priority',
],
}),
});
const property = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/properties",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
json={
"address": "1428 Cedar Ridge Dr, Plano, TX 75023",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"watch_radius_miles": 3,
"tags": [
"plano",
"priority",
],
},
)
property = response.json()
{
"data": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
List properties
GET /api/v1/properties
The addresses the team watches.
properties:read paginated
Query parameters
status
enum
Only properties in this watch state.
tag
string
Only properties carrying this tag.
search
string
Only properties whose name, address or reference contains this text.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/properties?status=watching \
-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/properties', [
'query' => [
'status' => 'watching',
],
]);
$properties = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties?status=watching', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const properties = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/properties",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
params={
"status": "watching",
},
)
properties = response.json()
{
"data": [
{
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
],
"links": {
"first": "https://titanweather.com/api/v1/properties?page=1",
"last": "https://titanweather.com/api/v1/properties?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://titanweather.com/api/v1/properties",
"per_page": 25,
"to": 1,
"total": 1
}
}
Retrieve a property
GET /api/v1/properties/{property}
One property, with its contacts.
properties:read
Path parameters
property
The property id, a uuid from a create or list response.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88 \
-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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88');
$property = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const property = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
property = response.json()
{
"data": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"contacts": [
{
"id": 3184,
"object": "contact",
"name": "Maria Delgado",
"role": "owner",
"company": null,
"phone": "+1 972 555 0164",
"email": "maria@example.com",
"notes": null,
"primary": true,
"source": "reported",
"created_at": "2026-06-02T19:21:10Z",
"updated_at": "2026-06-02T19:21:10Z",
"links": {
"property": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
],
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
Update a property
PATCH /api/v1/properties/{property}
Change a property.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
Body
address
string
A new address. Re-located when it changes.
label
string
A short name of your own for the place.
reference
string
Your own file or account number.
kind
string
What stands there.
status
string
The watch state: watching, paused or archived.
watch_radius_miles
number
How far around the address monitoring looks.
tags
array
Replaces the tag list as a whole.
notes
string
Free text, kept with the property.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X PATCH https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88 \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"label": "Cedar Ridge (sold)",
"status": "paused"
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->patch('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88', [
'json' => [
'label' => 'Cedar Ridge (sold)',
'status' => 'paused',
],
]);
$property = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
label: 'Cedar Ridge (sold)',
status: 'paused',
}),
});
const property = await response.json();
import os
import requests
response = requests.patch(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
json={
"label": "Cedar Ridge (sold)",
"status": "paused",
},
)
property = response.json()
{
"data": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
Create properties in a batch
POST /api/v1/properties/batch
Submit a book of addresses in one request, answered row by row.
properties:write Idempotency-Key honoured
Body
properties
array
required
The rows, up to the cap in GET /api/v1. Each carries its own address, and may carry label, reference, kind, status, watch_radius_miles, tags and notes.
Answers
200
Replayed. This Idempotency-Key was honoured before; the earlier answer is returned again, with an Idempotent-Replay: true header.
201
Every row was created.
207
The rows did not all end the same way. Each row answers for itself.
409
This Idempotency-Key was already used for a different request, or its first request is still being processed. A retry must resend the request it is retrying.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/properties/batch \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Idempotency-Key: a-key-you-chose-8f2c" \
-H "Content-Type: application/json" \
-d '{
"properties": [
{
"address": "1428 Cedar Ridge Dr, Plano, TX 75023",
"reference": "CLM-48211"
},
{
"address": "742 Bluebonnet Ln, Frisco, TX 75034",
"reference": "CLM-48214"
}
]
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/properties/batch', [
'headers' => ['Idempotency-Key' => 'a-key-you-chose-8f2c'],
'json' => [
'properties' => [
[
'address' => '1428 Cedar Ridge Dr, Plano, TX 75023',
'reference' => 'CLM-48211',
],
[
'address' => '742 Bluebonnet Ln, Frisco, TX 75034',
'reference' => 'CLM-48214',
],
],
],
]);
$batch = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Idempotency-Key': 'a-key-you-chose-8f2c',
'Content-Type': 'application/json',
},
body: JSON.stringify({
properties: [
{
address: '1428 Cedar Ridge Dr, Plano, TX 75023',
reference: 'CLM-48211',
},
{
address: '742 Bluebonnet Ln, Frisco, TX 75034',
reference: 'CLM-48214',
},
],
}),
});
const batch = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/properties/batch",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
"Idempotency-Key": "a-key-you-chose-8f2c",
},
json={
"properties": [
{
"address": "1428 Cedar Ridge Dr, Plano, TX 75023",
"reference": "CLM-48211",
},
{
"address": "742 Bluebonnet Ln, Frisco, TX 75034",
"reference": "CLM-48214",
},
],
},
)
batch = response.json()
{
"object": "property_batch",
"submitted": 2,
"created": 1,
"duplicate": 1,
"rejected": 0,
"skipped": 0,
"plan_limit_reached": false,
"required_plan": null,
"results": [
{
"index": 0,
"address": "1428 Cedar Ridge Dr, Plano, TX 75023",
"status": "duplicate",
"message": "This address is already on the team's book.",
"property": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
},
{
"index": 1,
"address": "742 Bluebonnet Ln, Frisco, TX 75034",
"status": "created",
"message": null,
"property": {
"id": "0198a3f4-1b06-7e92-88d1-4c7f2a9e6053",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "742 Bluebonnet Ln, Frisco, TX 75034",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f4-1b06-7e92-88d1-4c7f2a9e6053",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f4-1b06-7e92-88d1-4c7f2a9e6053/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f4-1b06-7e92-88d1-4c7f2a9e6053"
}
}
}
]
}
Create a report for a property
POST /api/v1/properties/{property}/reports
Ask for a report about this property.
properties:write Idempotency-Key honoured
Path parameters
property
The property id, a uuid from a create or list response.
Body
window_start
string
The first day of the period to search. Defaults to the plan's full lookback.
window_end
string
The last day of the period. Defaults to today.
radius_miles
number
How far around the property to search. Defaults to the property's own watch radius.
recipient
string
Who the document is prepared for, printed on the cover.
layout
array
Which sections, imagery and map layers the document is composed with. Requires a plan that can compose layouts.
Answers
200
Replayed. This Idempotency-Key was honoured before; the earlier answer is returned again, with an Idempotent-Replay: true header.
202
Accepted. The report exists but is not yet generated; poll links.self for the result.
409
This Idempotency-Key was already used for a different request, or its first request is still being processed. A retry must resend the request it is retrying.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/reports \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Idempotency-Key: cedar-ridge-annual-2026" \
-H "Content-Type: application/json" \
-d '{
"window_start": "2016-08-23",
"window_end": "2026-08-23"
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/reports', [
'headers' => ['Idempotency-Key' => 'cedar-ridge-annual-2026'],
'json' => [
'window_start' => '2016-08-23',
'window_end' => '2026-08-23',
],
]);
$report = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/reports', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Idempotency-Key': 'cedar-ridge-annual-2026',
'Content-Type': 'application/json',
},
body: JSON.stringify({
window_start: '2016-08-23',
window_end: '2026-08-23',
}),
});
const report = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/reports",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
"Idempotency-Key": "cedar-ridge-annual-2026",
},
json={
"window_start": "2016-08-23",
"window_end": "2026-08-23",
},
)
report = response.json()
{
"data": {
"id": "0198b6c1-22e4-7f88-a1c9-5d40b7e2913a",
"object": "report",
"status": "pending",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": null,
"city": null,
"state": null,
"postal_code": null,
"county": null,
"latitude": null,
"longitude": null
},
"window": {
"start": "2016-08-23",
"end": "2026-08-23",
"radius_miles": 5,
"narrowed_by_plan": false
},
"property_id": null,
"event_count": 0,
"observation_count": 0,
"coverage": {
"complete": false,
"provisional": false,
"summary": null,
"sources_searched": []
},
"headline": null,
"findings": null,
"failure_reason": null,
"plan_tier": "professional",
"layout": {
"sections": [
"summary",
"findings",
"map",
"events"
],
"imagery": [
"aerial",
"street_view"
],
"elements": [
"key_figures"
],
"map": null
},
"created_at": "2026-08-23T14:02:11Z",
"generated_at": null,
"pdf": {
"status": null,
"rendered_at": null
},
"links": {
"self": "https://titanweather.com/api/v1/reports/0198b6c1-22e4-7f88-a1c9-5d40b7e2913a",
"events": null,
"pdf": null
}
}
}
List activity at a property
GET /api/v1/properties/{property}/exposures
Every storm day and warning that touched this property.
properties:read paginated
Path parameters
property
The property id, a uuid from a create or list response.
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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures?min_measured_in=1 \
-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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures', [
'query' => [
'min_measured_in' => 1,
],
]);
$exposures = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures?min_measured_in=1', {
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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
params={
"min_measured_in": 1,
},
)
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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures?page=1",
"last": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"per_page": 25,
"to": 1,
"total": 1
}
}
Enrich a property
POST /api/v1/properties/{property}/enrich
Ask the parcel provider what it knows about this address.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
Answers
202
Accepted. The parcel provider is being asked.
409
The property has not been located yet, so there is nothing to ask about.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/enrich \
-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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/enrich');
$property = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/enrich', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const property = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/enrich",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
property = response.json()
{
"data": {
"id": "0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"object": "property",
"name": "Cedar Ridge",
"label": "Cedar Ridge",
"reference": "CLM-48211",
"kind": "residential",
"status": "watching",
"address": {
"query": "1428 Cedar Ridge Dr, Plano, TX 75023",
"street": "1428 Cedar Ridge Dr",
"city": "Plano",
"state": "TX",
"postal_code": "75023",
"county": "Collin",
"county_fips": "48085",
"latitude": 33.0412,
"longitude": -96.6996,
"located": true
},
"watch_radius_miles": 3,
"tags": [
"plano",
"priority"
],
"notes": null,
"last_activity_on": "2023-04-21",
"contacts": [
{
"id": 3184,
"object": "contact",
"name": "Maria Delgado",
"role": "owner",
"company": null,
"phone": "+1 972 555 0164",
"email": "maria@example.com",
"notes": null,
"primary": true,
"source": "reported",
"created_at": "2026-06-02T19:21:10Z",
"updated_at": "2026-06-02T19:21:10Z",
"links": {
"property": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
],
"created_at": "2026-06-02T19:20:44Z",
"updated_at": "2026-08-21T16:44:09Z",
"links": {
"self": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
"exposures": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/exposures",
"reports": "https://titanweather.com/api/v1/reports?property=0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
List contacts
GET /api/v1/properties/{property}/contacts
The people attached to this property.
properties:read
Path parameters
property
The property id, a uuid from a create or list response.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts \
-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/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts');
$contacts = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const contacts = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
contacts = response.json()
{
"data": [
{
"id": 3184,
"object": "contact",
"name": "Maria Delgado",
"role": "owner",
"company": null,
"phone": "+1 972 555 0164",
"email": "maria@example.com",
"notes": null,
"primary": true,
"source": "reported",
"created_at": "2026-06-02T19:21:10Z",
"updated_at": "2026-06-02T19:21:10Z",
"links": {
"property": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
]
}
Create a contact
POST /api/v1/properties/{property}/contacts
Attach a person to this property.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
Body
name
string
required
The person's name.
role
string
How they relate to the property: owner, occupant, manager, insured, adjuster, attorney, contractor, client or other.
company
string
Who they work for, when that is the point.
phone
string
A phone number, stored as written.
email
string
An email address.
notes
string
Free text, kept with the contact.
primary
boolean
Whether this is the person to reach first. Setting it clears the flag on the others.
Answers
201
Created.
409
The per-property contact cap is reached. Remove one to add another.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X POST https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Maria Delgado",
"role": "owner",
"phone": "+1 972 555 0164",
"primary": true
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->post('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts', [
'json' => [
'name' => 'Maria Delgado',
'role' => 'owner',
'phone' => '+1 972 555 0164',
'primary' => true,
],
]);
$contact = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Maria Delgado',
role: 'owner',
phone: '+1 972 555 0164',
primary: true,
}),
});
const contact = await response.json();
import os
import requests
response = requests.post(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
json={
"name": "Maria Delgado",
"role": "owner",
"phone": "+1 972 555 0164",
"primary": True,
},
)
contact = response.json()
{
"data": {
"id": 3184,
"object": "contact",
"name": "Maria Delgado",
"role": "owner",
"company": null,
"phone": "+1 972 555 0164",
"email": "maria@example.com",
"notes": null,
"primary": true,
"source": "reported",
"created_at": "2026-06-02T19:21:10Z",
"updated_at": "2026-06-02T19:21:10Z",
"links": {
"property": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
Update a contact
PATCH /api/v1/properties/{property}/contacts/{contact}
Change a contact.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
contact
The contact id, an integer from the property or contact list.
Body
name
string
The person's name.
role
string
How they relate to the property.
company
string
Who they work for.
phone
string
A phone number.
email
string
An email address.
notes
string
Free text.
primary
boolean
Whether this is the person to reach first.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X PATCH https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184 \
-H "Authorization: Bearer $TITAN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"phone": "+1 972 555 0199"
}'
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->patch('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184', [
'json' => [
'phone' => '+1 972 555 0199',
],
]);
$contact = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
phone: '+1 972 555 0199',
}),
});
const contact = await response.json();
import os
import requests
response = requests.patch(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
json={
"phone": "+1 972 555 0199",
},
)
contact = response.json()
{
"data": {
"id": 3184,
"object": "contact",
"name": "Maria Delgado",
"role": "owner",
"company": null,
"phone": "+1 972 555 0164",
"email": "maria@example.com",
"notes": null,
"primary": true,
"source": "reported",
"created_at": "2026-06-02T19:21:10Z",
"updated_at": "2026-06-02T19:21:10Z",
"links": {
"property": "https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88"
}
}
}
Delete a contact
DELETE /api/v1/properties/{property}/contacts/{contact}
Remove a contact.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
contact
The contact id, an integer from the property or contact list.
Answers
204
Deleted.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X DELETE https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184 \
-H "Authorization: Bearer $TITAN_API_TOKEN"
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->delete('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184');
$response = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const response = await response.json();
import os
import requests
response = requests.delete(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88/contacts/3184",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
response = response.json()
No body. The contact is removed from the property.
Delete a property
DELETE /api/v1/properties/{property}
Stop watching an address. Reports about it stay.
properties:write
Path parameters
property
The property id, a uuid from a create or list response.
Answers
204
Deleted. Reports about the address stay on file.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl -X DELETE https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88 \
-H "Authorization: Bearer $TITAN_API_TOKEN"
$titan = new \GuzzleHttp\Client([
'base_uri' => 'https://titanweather.com',
'headers' => ['Authorization' => 'Bearer '.getenv('TITAN_API_TOKEN')],
]);
$response = $titan->delete('/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88');
$response = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const response = await response.json();
import os
import requests
response = requests.delete(
"https://titanweather.com/api/v1/properties/0198a3f2-6d7e-7b41-92c5-2f6a1c9d4e88",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
response = response.json()
No body. The property and its recorded activity are gone; reports about the address stay on file.