For insurance agents, underwriters and lenders
Which of your locations sit in a forecast county?
Send up to 500 locations. Get each one's county forecast status. County-level, not an address forecast.
Forecast risk: it could happen, not a promise. Free preview shows the price first.
Plain money math
Agents, underwriters, lenders
Look at the locations in forecast counties first. Skip the quiet ones. No yearly data contract.
How it works
Three steps. Worst first.
Send your list
Up to 500 addresses in one go.
Get a status each
The county forecast status, A to F.
Work the C, D and F first
Run it again after each forecast update.
What you get back
One county status per location.
| ID | Location | County status |
|---|
Sample layout with made-up statuses, to show the shape of a result. It is not a live call.
Easiest way to start
Just ask your AI.
Copy this, paste it into ChatGPT or Claude, and it does the work for you. It turns your list of locations into a list of county statuses, with one small test first.
Using the TrueFixR storm API (https://data.truefixr.com/llms.txt), give each location on my spreadsheet its county forecast status. Show me the price first. My key: YOUR_KEY
Paste it into ChatGPT or Claude, swap in your address and your key.
More detail for your AI
I am not a programmer. I have a list of property addresses in a spreadsheet and I want the county forecast status (A to F) for each one.
Base URL: https://data.truefixr.com
Docs: https://truefixr.com/docs.html
Free menu of everything the API offers: https://data.truefixr.com/v1/data
My API key is YOUR_KEY. Paid calls need the header Authorization: Bearer YOUR_KEY. Free previews need no key.
What to do: the route is POST https://data.truefixr.com/v1/portfolio/risk. The body is JSON like {"locations":[{"lat":30.27,"lon":-97.74,"label":"my id"}],"window":"24h"}. It takes up to 500 locations per call and returns one county status per location, in the same order. It costs $0.05 per location. A call with no key answers 402 with the price and charges nothing. Statuses are county-level, not address-level. A no or low risk, B moderate, C elevated, D severe, F extreme. It is a forecast: it could happen, it is not a promise.
The route needs latitude and longitude, not street addresses. Please: (1) show me how to turn my addresses into latitude and longitude with a free geocoder, (2) show me step by step how to send the list, in the simplest way for someone who does not code, (3) test with only 5 properties first and tell me the cost, (4) put the results back next to my addresses in a spreadsheet I can open.
Rules for you:
- Always start with the free preview and tell me the exact price before any paid call. Never make a paid call without asking me first.
- If you cannot call web addresses yourself, give me the exact link to open in my browser and I will paste back what I see.
- Talk to me like I am not a programmer. Short steps, plain words, tell me exactly what to click or paste.
- These are reported and radar-detected storm events and forecast risk. They are not an inspection and not a damage assessment, so say so in your answer.How to use it. 1. Press Copy. 2. Open Claude or ChatGPT and paste. 3. Swap YOUR_KEY for your key from Get started, or leave it and stay on the free previews.
About the status
A status that looks ahead.
The status is the forecast label for the county each location sits in, a quick screen of which locations need attention. It is not an address-level or property-level forecast. For the structure value and people at each address, use ML Storm Forecast by Address. It is forecast risk: it could happen, it is not a promise. Run the scan again after each forecast refresh to see the status change.
Using the TrueFixR storm API (https://data.truefixr.com/llms.txt), find the locations on my list in counties with status C, D or F. Ask before any paid call. My key: YOUR_KEY
Paste it into ChatGPT or Claude, swap in your address and your key.
More detail for your AI
Using https://data.truefixr.com (docs: https://truefixr.com/docs.html), take my list of properties and use POST /v1/portfolio/risk to find the ones in counties with status C, D or F. These are the locations to look at first. Start with the free preview, tell me the exact price before any paid call, and ask before you make one. Remind me it is forecast risk: it could happen, it is not a promise.
Have a developer?
Up to 500 addresses per request.
Your list is sent fresh each time and is not stored on our server. Add your own label to each row so you can match results back.
For developers: the request
Request
POST /v1/portfolio/risk
{
"locations": [
{ "lat": 30.27, "lon": -97.74, "label": "optional, your own reference" }
],
"window": "24h"
}You get back
One county status per location, in the same order you sent them.
{
"results": [
{ "lat": 30.27, "lon": -97.74, "county": "Travis", "state": "TX", "grade": "B" }
]
}Response shape as published in the API's own example. A real paid call costs money, so this page does not run one.
Try before you pay
See the price first.
Ask without a key and you are told the price. Nothing is charged.
For developers: what you see before you pay
curl -i -X POST https://data.truefixr.com/v1/portfolio/risk \
-H "Content-Type: application/json" \
-d '{"locations":[{"lat":30.27,"lon":-97.74,"label":"hq"}],"window":"24h"}'HTTP/2 402
content-type: application/json
payment-required: eyJ4NDAyVmVyc2lvbiI6Mi... (same object as the body, trimmed)
{"x402Version":2, "error":"Payment required",
"accepts":[{"scheme":"exact", "network":"eip155:8453", "amount":"50000", ...}],
...}Real response from the live API, trimmed. The price is $0.05 per location (amount 50000 in atomic USDC, 6 decimals). With a key, the same request returns the statuses.
Have a developer?
CSV in. CSV out.
Reads your property list, sends 500 at a time, writes one results file. Set TRUEFIXR_API_KEY to your key.
For developers: the full CSV script
Input file
id,lat,lon P0001,30.27,-97.74 P0002,32.78,-96.80
import csv, os, requests
URL = os.environ.get("TRUEFIXR_URL", "https://data.truefixr.com/v1/portfolio/risk")
KEY = os.environ["TRUEFIXR_API_KEY"]
BATCH = 500 # max locations per call
with open("properties.csv", newline="") as f: # columns: id,lat,lon
rows = list(csv.DictReader(f))
out = []
for i in range(0, len(rows), BATCH):
chunk = rows[i:i + BATCH]
r = requests.post(
URL,
headers={"Authorization": f"Bearer {KEY}"},
json={
"locations": [{"lat": float(p["lat"]), "lon": float(p["lon"]), "label": p["id"]} for p in chunk],
"window": "24h",
},
timeout=120,
)
r.raise_for_status() # a 402 here means the balance cannot cover this batch
results = r.json()["results"]
assert len(results) == len(chunk), "expected one result per location"
for p, res in zip(chunk, results):
out.append({"id": p["id"], "lat": p["lat"], "lon": p["lon"],
"county": res.get("county"), "state": res.get("state"), "grade": res.get("grade")})
print(f"batch {i // BATCH + 1}: {len(chunk)} locations scored")
with open("results.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=["id", "lat", "lon", "county", "state", "grade"])
w.writeheader()
w.writerows(out)
print(f"wrote results.csv, {len(out)} rows")import { readFileSync, writeFileSync } from "node:fs";
const URL = process.env.TRUEFIXR_URL || "https://data.truefixr.com/v1/portfolio/risk";
const KEY = process.env.TRUEFIXR_API_KEY;
const BATCH = 500; // max locations per call
// columns: id,lat,lon (no quoted commas)
const [head, ...lines] = readFileSync("properties.csv", "utf8").trim().split(/\r?\n/);
const cols = head.split(",");
const rows = lines.map((l) => Object.fromEntries(l.split(",").map((v, i) => [cols[i], v])));
const out = ["id,lat,lon,county,state,grade"];
for (let i = 0; i < rows.length; i += BATCH) {
const chunk = rows.slice(i, i + BATCH);
const r = await fetch(URL, {
method: "POST",
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
locations: chunk.map((p) => ({ lat: +p.lat, lon: +p.lon, label: p.id })),
window: "24h",
}),
});
if (!r.ok) throw new Error(`HTTP ${r.status}: ${await r.text()}`); // 402 = balance cannot cover this batch
const { results } = await r.json();
if (results.length !== chunk.length) throw new Error("expected one result per location");
chunk.forEach((p, j) => {
const x = results[j];
out.push([p.id, p.lat, p.lon, x.county, x.state, x.grade].join(","));
});
console.log(`batch ${i / BATCH + 1}: ${chunk.length} locations scored`);
}
writeFileSync("results.csv", out.join("\n") + "\n");
console.log(`wrote results.csv, ${out.length - 1} rows`);How this was tested: both scripts were run against a local mock server that returns the same response shape, with a 1,203-row file. They sent 3 batches (500, 500 and 203), wrote 1,203 result rows, and produced identical output files. No paid call was made. Python needs requests. JavaScript needs Node 18 or newer.
What it costs
$0.05 per location.
Prepaid balance. No contract, no seats. Pay only for the locations you send.
One full batch
500 x $0.05
A 2,000 property list (4 calls)
2,000 x $0.05
A 10,000 property list (20 calls)
10,000 x $0.05
How to use it
Three steps.
Get a key
Add a prepaid balance on the get started page. Start with a free preview if you like.
Export your list
One row per property: an ID you choose, plus its location. Save it as a spreadsheet file.
Run the script, join on ID
Run the code (or let your AI do it). Match the grades back to your list by ID. Re-run it whenever you want a fresh scan.
Honest limits
What a grade is, and is not.
Forecast risk
The status says what could happen soon in the county. It comes from probabilistic forecasts that refresh several times a day. It is not a statement that anything has happened.
Not a damage prediction
A county status is not a property score, an inspection or a damage assessment. Use it to decide which locations to look at first.
A quick scan, not a full pull
This route is a fast snapshot across a list. For address-level forecasts use ML Storm Forecast by Address. For one property's past, use Storm History by Address.
Limits per call
Up to 500 locations per call, with US coordinates. Batch larger lists in chunks, as the code above does. If your balance runs out, the call stops until you add more.
What you can build
Your data. Your template. Your brand.
We sell the storm data. You decide how it looks. Everything comes back as JSON you can save, and lists also come as a CSV file with format=csv.

A branded report
Your logo, your layout. Our data fills it in.
A spreadsheet
Storm facts in a column next to each customer.
A CRM field
Save storm history on every customer record.
Your own text or email alert
Check on a schedule, then send your own message when a storm is near.
A map
Drop every address on your own map.
A mobile app
Put a storm check in your team's pocket.
Use it in your own tools. We do not lock you into a report format.
Start free in 2 minutes. No contract.
Try the free preview first. Add money to your balance only when you want the full answer. You pay only for what you use.
- Free previews
- No contract
- Pay only for what you use