Documentation

Order a storm report

POST /api/v1/storm/orders and GET /api/v1/storm/orders/:id: the request fields, the 201 with the whole report, and re-reading it with a new date of loss.

API reference

Base URL: https://api.roofquery.com. Authenticate with Authorization: Bearer <your key> — except the four file routes, which take no key.

Copies this whole page as Markdown, so you can paste it into an assistant and have it write the integration. Nothing secret goes on the clipboard — your keys aren't included.

POST /api/v1/storm/orders Open beta

Order a storm report. Returns 201 with the whole report in the body, about two seconds after you send it. Retrying with the same Idempotency-Key returns the same report with 200 and never charges twice.

curl -X POST "https://api.roofquery.com/api/v1/storm/orders" \
  -H "Authorization: Bearer rq_live_sk_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2e0a-storm-001" \
  -d '{
    "street": "3208 Riviera Dr", "city": "Norman", "state": "OK",
    "postalCode": "73072", "country": "US",
    "latitude": 35.182884, "longitude": -97.458908,
    "dateOfLoss": "2025-05-25",
    "claim": "CLM-20419",
    "insuredName": "Jordan Smith",
    "notes": "Inspection booked for Monday."
  }'
FieldTypeNotes
street, city, state, postalCode, countrystringRequired. The same address rules as roof orders; country is US or CA.
latitude, longitudenumberRequired. Decimal degrees.
dateOfLossYYYY-MM-DDOptional. Highlights that date and enables the Date of Loss PDF. Can't be in the future.
claimstring ≤ 64Optional. Printed on the report.
insuredNamestring ≤ 120Optional. Printed on the report.
notesstring ≤ 450Optional. Printed on the five writing lines of the Notes box on every PDF; line breaks are kept. The lines left over stay blank to write on.
reportNamestring ≤ 300Optional. Your own label.

There is no scope or reportType: a storm report covers the property. Ordering needs $3 available even when the result turns out free; otherwise the answer is 402 INSUFFICIENT_CREDITS and nothing is looked up. If weather data doesn't answer in time the answer is 503 service_unavailable, with no order and no charge.

GET /api/v1/storm/orders/:orderId

The report as stored. Pass any of dateOfLoss, claimNumber, insuredName and notes to read it with different details; an empty value clears one. The weather data is the same on every read.

curl -H "Authorization: Bearer rq_live_sk_..." \
  "https://api.roofquery.com/api/v1/storm/orders/rq_ord_7f3c2a91d04be615?dateOfLoss=2024-11-02"

GET /api/v1/reports/orders/:orderId answers with the same JSON for a storm report id, so one lookup works for every order. Storm reports have no revisions: change the details on read, or order again for fresh data.