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.
Reports carry your brand, or your customer's. Set a company name and the header, footer, cover-page attribution and legal contact block all become that company's; a small RoofQuery watermark remains in the footer. Leave the name blank and the report falls back to full RoofQuery branding. The XML carries no branding at all.
Three ways to supply it, for three different questions.
| Layer | Set where | Answers |
|---|---|---|
| Account defaults | Portal, Branding → Defaults | "What does a report look like when nobody says otherwise?" Your own brand, logo included. |
| Brand profile | /branding/profiles, or Branding → Profiles | "What does this customer's report look like?" One saved brand per customer, logo included, named on the link as ?brand=. |
| Per-download params | Query params on the PDF URL | "Change this one file." Name, contact block and colours for a single download. No logo. |
Most specific wins: params over profile over defaults. A profile is complete — when one is named, nothing falls through to your defaults — because a half-applied brand prints one company's name over another company's phone number.
# A customer's report, in their brand, with their logo
curl "https://api.roofquery.com/api/v1/reports/orders/rq_ord_8f3a21c9/pdf?brand=rq_brand_7f3a21c9d4e07b16" \
-o acme-report.pdf
# The same, as a one-off without a profile (no logo this way)
curl "https://api.roofquery.com/api/v1/reports/orders/rq_ord_8f3a21c9/pdf\
?companyName=Acme%20Roofing\
&address=900%20Bardstown%20Rd%2C%20Louisville%2C%20KY%2040204\
&publicPhone=5025559876\
&publicEmail=estimates%40acmeroofing.example\
&brandColor=%230F7A4D" \
-o acme-report.pdf
Your own defaults are configured once, by a person who can see the result — whether a colour reads against white, how a wordmark sits in the header. A preview answers that; an endpoint doesn't. Profiles are the opposite case: a platform with two hundred customers is not going to click through two hundred forms, and the id has to end up on a customer record in your database. So profiles are an API first and a portal tab second.
There is no field anywhere that takes a URL, and that's deliberate. A linked logo is
somebody else's uptime — a report that renders today comes back logo-less the day their
site moves — and it would mean this API fetching an arbitrary address on your say-so.
Upload the bytes once, to your account or to a profile, and they're ours to serve.
That is also why there is no ?logo= param: a URL is exactly what a logo
must never be.
Every logo is placed on a square canvas automatically. The report header gives the logo a 1:1 slot, so anything that isn't square would otherwise be letterboxed or centre-cropped at render time. Upload whatever shape you have — a wide wordmark, a tall badge, a favicon — and it's scaled to fit and padded with transparency to a 512×512 PNG. Nothing is ever cropped: your proportions are kept exactly, and the padding disappears into the header band. Small logos are scaled up to fill the canvas, so a 64px icon doesn't render as a speck.
Nothing is cached — the PDF is rendered at the moment you request it. Change a default or a profile and every report you've already ordered comes back re-skinned on its next download.