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.
The white-labeled report, rendered at the moment you request it, in the brand the order was
placed with: the contractor named as brand when ordering, or your account's own
branding. Nothing is cached, so editing that brand updates the report on its next download.
No API key required — see
Sharing a report.
A storm report id takes its own parameters: see
Storm report PDFs.
All optional, all query parameters. Only download applies to every order:
the branding parameters apply only to orders placed before 22 October 2026, which have no
brand of their own. On later orders they're ignored.
| Field | Required | Description |
|---|---|---|
download | No | 1 forces a save dialog. Without it the PDF is served inline, so you can iframe it |
brand | No | Orders placed before 22 October 2026: a brand profile id. The report renders in that customer's brand, logo included |
companyName | No | Name on the header band, footer and cover attribution. Up to 80 characters |
address | No | First line of the contact block, under the name. Up to 160 characters |
publicPhone | No | Contact block. A 10-digit number is formatted (502) 555-0100; anything else prints as sent. Up to 32 characters |
publicEmail | No | Contact block. Up to 160 characters |
brandColor | No | Hex, #RGB through #RRGGBBAA. URL-encode the # as %23 |
brandTextColor | No | Hex. Text on the header band |
Which brand wins, on an order from before 22 October 2026. Most specific first:
these params, then a brand profile, then your account defaults. Later orders
always print the brand they were ordered with. See
White labeling.
Override the contact block as a unit. The header renders the company
name with the address, phone and email stacked underneath it, so passing
companyName alone puts a different company's name above your
phone number — a report that tells the reader to call someone other than who it claims
to be from. If you're rebranding a download, send all four.
There is no logo param: a logo is bytes, not something that fits in a URL. To put a
contractor's logo on their reports, upload it once to a
brand profile and name the
profile as brand when you order.
curl "https://api.roofquery.com/api/v1/reports/orders/rq_ord_8f3a21c9d4e07b16/pdf?download=1" \
-o report.pdf
The PDF bytes:
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="RoofQuery_6515_Turnbridge_Pl_Prospect_KY_40059_USA_rq_ord_8f3a21c9d4e07b16.pdf"
Content-Length: 1370151
Cache-Control: no-store
Before the report is delivered:
HTTP/1.1 409 Conflict
{
"error": "not_ready",
"error_description": "Report has not completed yet — no PDF available.",
"status": "in-progress"
}
A colour that isn't a hex string returns 400 validation rather than rendering
something strange, and text over its length is refused the same way rather than silently cut,
because these render in a fixed-height header (checked on every order, even where the
params are then ignored). An unknown order, or an unknown brand on an older order,
returns 404 not_found. Every code is under Errors.