Base URL and authentication
Every endpoint is underhttps://api.roofkit.ai/api/v1. Send a workspace API key as a Bearer token on each request.
Verify the API key
API keys
Create and manage keys in workspace settings. Keep keys on your server and rotate them when ownership changes.
OpenAPI document
Download the OpenAPI 3.1 contract that this reference is built from.
Contract
RoofKit Partner API v1 authenticates requests with workspace API keys. API keys bind each request to exactly one workspace; Partner API paths do not accept roofer_id, workspace_id, or tenant identifiers. Authenticated endpoints are limited to 60 requests per minute per API key, method, and route template; invalid authentication attempts are limited separately at 20 requests per minute per client and endpoint. Date-time parameters and fields accept ISO 8601 with Z or a ±HH:MM offset, for example 2026-09-07T04:00:00Z or 2026-09-07T00:00:00-04:00. Both name the same instant and return the same result. Encode + as %2B in a query string. Responses return UTC. A date-time without an offset, for example 2026-09-07T04:00:00, is deprecated. Until the sunset on 2027-01-10T00:00:00Z it is read as UTC, and the response carries aDeprecation header (RFC 9745) and a Sunset header (RFC 8594). From the sunset, Z or a ±HH:MM offset is required. A date-time without an offset then returns 400 with the VALIDATION_ERROR code, and the response carries no Deprecation or Sunset header.
Each API key holds only the scopes that a workspace owner or admin chose when the key was created, and its scopes never change. Each operation lists the scopes it requires in x-required-scopes. A new key in Settings starts on the Read-only preset: leads.read, analytics.read, reports.read, and data_objects.read. A Read-only key can call every read operation except exports, Sales Visualizer reads, and trashed Data Objects, and it cannot call any write operation. A call that needs a scope the key does not hold returns 403 FORBIDDEN, and error.details.required_scope names a missing scope.
Errors
Every error returns the same body.code is stable. Use request_id when you contact support.
Error body
details is optional. Each endpoint page lists the statuses that it returns.
Pagination
Cursor-paged list endpoints takelimit and cursor, and return a pagination object with limit, next_cursor, and has_more. Send next_cursor as cursor to read the next page. Stop when has_more is false. Each endpoint page shows its own limits.
Try it out
Each endpoint page has a playground. It sends the request from your browser straight toapi.roofkit.ai, so your API key does not pass through the docs host.