Documentation

Quick start

Get a test key, place a free sandbox order and receive its webhooks, then switch to a live key. The whole difference is the key prefix.

API reference

Base URL: https://api.roofquery.com. Authenticate with Authorization: Bearer <your key> — except the file routes (report and storm report files), 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.

Quick start

From no key to a delivered sandbox report in about a minute, without spending anything. The same calls then work live: only the key changes.

Get a key

Keys are made in the dashboard under API keys. There are two kinds, and the prefix is the whole difference between them. The base URL, the endpoints and the request bodies are identical, and nothing in a request can switch a key to the other environment.

KeyWhat an order does
rq_test_sk_…Runs a sandbox timeline: free, nothing is measured, a recorded real report is delivered, and your webhooks fire as they would live.
rq_live_sk_…A real order, measured by a technician and paid from your balance.

One key covers every product. Send it as Authorization: Bearer <key> on every call except the file routes, which take none.

Add a webhook endpoint

Add the URL that should hear about orders in the dashboard under Webhooks. One endpoint receives every status change of every order, sandbox orders included, so you can build your handler against sandbox. Each delivery is the same body as GET /reports/orders/:id.

Your first order, in three calls

1. Check the key. env is test for a sandbox key.

curl -H "Authorization: Bearer rq_test_sk_..." \
  "https://api.roofquery.com/api/v1/identity"

2. Order a report for the sandbox's happy_path address. The response is 201 with the order in processing.

curl -X POST "https://api.roofquery.com/api/v1/reports/orders" \
  -H "Authorization: Bearer rq_test_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "country": "US",
    "street": "6515 Turnbridge Pl",
    "city": "Prospect",
    "state": "KY",
    "postalCode": "40059",
    "latitude": 38.3526391,
    "longitude": -85.6208045,
    "scope": "primary_and_garage",
    "esx": true
  }'

3. Get the report. About 20 seconds later your endpoint receives a webhook with "status": "completed", carrying the measurements and the file links. Or read the order:

curl -H "Authorization: Bearer rq_test_sk_..." \
  "https://api.roofquery.com/api/v1/reports/orders/<orderId from step 2>"

totals and structures[] hold the measurements, and files[] links the PDF, XML and, because step 2 sent "esx": true, the ESX. Leave esx out and your account's default decides. To go live, swap in an rq_live_sk_ key and a real address. Nothing else changes.

Where next
  • Sandbox: the other seven test addresses, including holds, cancellations and failed orders.
  • Place an order: every field, and retrying safely with Idempotency-Key.
  • Order lifecycle: every status your webhook handler will see.
  • White labeling: your brand, or a contractor's, on the PDF.
  • Errors: every code, and what to do about it.