Reference
Account & platform
The credential, the plan, credits and limits, and the machine-readable description of this whole surface.
Retrieve the index
GET /api/v1
What this API is, and what this credential may do with it.
any valid token paginated
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1 \
-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');
$index = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const index = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
index = response.json()
{
"object": "index",
"version": "v1",
"documentation": "https://titanweather.com/api/v1/openapi.json",
"abilities": [
{
"name": "reports:read",
"label": "Read reports",
"description": "List reports and read their findings, records and coverage.",
"granted": true
},
{
"name": "reports:write",
"label": "Create and delete reports",
"description": "Request new reports, and delete existing ones.",
"granted": false
}
],
"endpoints": [
{
"method": "GET",
"path": "/api/v1/reports",
"name": "api.v1.reports.index",
"ability": "reports:read",
"granted": true
},
{
"method": "POST",
"path": "/api/v1/reports",
"name": "api.v1.reports.store",
"ability": "reports:write",
"granted": false
}
],
"limits": {
"per_page_max": 100,
"batch": {
"properties": 100,
"reports": 25
},
"download_link_ttl_minutes": 15,
"rate_limit_per_minute": 120,
"plan": "professional"
}
}
Retrieve the account
GET /api/v1/account
The credential, the plan, and the limits, before anything is spent.
any valid token
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/account \
-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/account');
$account = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/account', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const account = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/account",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
account = response.json()
{
"object": "account",
"team": {
"name": "North Texas Claims Group",
"plan": "professional",
"plan_label": "Professional",
"on_trial": false,
"lapsed": false
},
"limits": {
"lookback_years": 10,
"max_radius_miles": 10,
"monthly_reports": 25,
"reports_used": 7,
"reports_remaining": 18,
"pdf_export": true
},
"credits": {
"balance": 18,
"monthly_allowance": 25,
"used_this_period": 7,
"renews_at": "2026-09-01T00:00:00Z"
},
"token": {
"name": "Claims intake",
"prefix": "wt_9f3kd02m",
"abilities": [
"reports:read",
"reports:write",
"reports:export"
],
"expires_at": null,
"last_used_at": "2026-08-23T14:02:11Z"
}
}
Retrieve the team
GET /api/v1/team
What the plan includes, and how much of each allowance is spoken for.
account:read
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/team \
-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/team');
$team = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/team', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const team = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/team",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
team = response.json()
{
"object": "team",
"name": "North Texas Claims Group",
"timezone": "America/Chicago",
"plan": {
"tier": "professional",
"label": "Professional",
"on_trial": false,
"lapsed": false
},
"includes": {
"api": true,
"pdf_export": true,
"observations": true,
"imagery": true,
"compose_layout": true,
"report_branding": false,
"property_intelligence": true,
"live_warnings": true,
"record_alerts": true
},
"limits": {
"lookback_years": 10,
"max_radius_miles": 10,
"properties": {
"held": 61,
"limit": 250
},
"territories": {
"held": 3,
"limit": 10,
"max_area_sq_miles": 500
},
"watch_radius_miles": 5
},
"credits": {
"balance": 18,
"monthly_allowance": 25,
"used_this_period": 7,
"renews_at": "2026-09-01T00:00:00Z"
},
"links": {
"credits": "https://titanweather.com/api/v1/credits",
"monitoring": "https://titanweather.com/api/v1/monitoring/runs"
}
}
Retrieve the credit balance
GET /api/v1/credits
The balance, the allowance, and when it renews.
account:read
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/credits \
-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/credits');
$credits = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/credits', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const credits = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/credits",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
credits = response.json()
{
"object": "credits",
"balance": 18,
"monthly_allowance": 25,
"used_this_period": 7,
"renews_at": "2026-09-01T00:00:00Z",
"lapsed_this_period": 0,
"links": {
"transactions": "https://titanweather.com/api/v1/credits/transactions"
}
}
List credit transactions
GET /api/v1/credits/transactions
The ledger, newest first. Every charge names the report it paid for.
account:read paginated
Query parameters
kind
enum
Only movements of this kind.
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/credits/transactions?kind=spend \
-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/credits/transactions', [
'query' => [
'kind' => 'spend',
],
]);
$transactions = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/credits/transactions?kind=spend', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const transactions = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/credits/transactions",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
params={
"kind": "spend",
},
)
transactions = response.json()
{
"data": [
{
"id": 9412,
"object": "credit_transaction",
"kind": "spend",
"amount": -1,
"balance_after": 18,
"description": "Report compiled",
"note": null,
"report_id": "0198b6c0-51a9-70f2-8e4d-93b2a7c15f60",
"created_at": "2026-08-21T16:44:09Z"
}
],
"links": {
"first": "https://titanweather.com/api/v1/credits/transactions?page=1",
"last": "https://titanweather.com/api/v1/credits/transactions?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://titanweather.com/api/v1/credits/transactions",
"per_page": 25,
"to": 1,
"total": 1
}
}
List monitoring runs
GET /api/v1/monitoring/runs
When detection last ran, so quiet can be told from stopped.
account:read
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/monitoring/runs \
-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/monitoring/runs');
$runs = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/monitoring/runs', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const runs = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/monitoring/runs",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
runs = response.json()
{
"object": "list",
"data": [
{
"object": "monitoring_run",
"lane": "warnings",
"lane_label": "Live warnings",
"status": "complete",
"started_at": "2026-08-23T13:50:00Z",
"finished_at": "2026-08-23T13:50:04Z",
"watermark": "2026-08-23T13:50:00Z",
"candidates": 2,
"written": 1,
"notified": 1,
"failure_reason": null
}
],
"lanes": [
"record",
"warnings",
"surfaces"
]
}
Retrieve the OpenAPI document
GET /api/v1/openapi.json
This document.
any valid token
Answers
200
The answer.
Plus the shared refusals: 401, 402, 403, 404, 422 and 429, described on Errors.
curl https://titanweather.com/api/v1/openapi.json \
-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/openapi.json');
$specification = json_decode((string) $response->getBody(), true);
const response = await fetch('https://titanweather.com/api/v1/openapi.json', {
headers: {
Authorization: `Bearer ${process.env.TITAN_API_TOKEN}`,
},
});
const specification = await response.json();
import os
import requests
response = requests.get(
"https://titanweather.com/api/v1/openapi.json",
headers={
"Authorization": f"Bearer {os.environ['TITAN_API_TOKEN']}",
},
)
specification = response.json()
{
"openapi": "3.1.0",
"info": {
"title": "Titan Weather API",
"version": "1.0.0"
},
"servers": [
{
"url": "https://titanweather.com"
}
],
"security": [
{
"bearerAuth": []
}
],
"tags": [
{
"name": "Reports",
"description": "Compiling and reading weather reports, and their documents."
}
],
"paths": {
"...": "every endpoint on this surface, one path at a time"
}
}