API Reference
PermitIntel Data API
A REST API over the deepest Florida permit and contractor dataset. Authenticate with a bearer token or x-api-key header. All responses are JSON.
Authentication
Pass your key on every request. Start a free trial or buy a plan on the pricing page; your key is emailed instantly.
curl "https://permitintel.ai/api/v1/contractors?license=CPC1459679" \
-H "Authorization: Bearer pmit_your_key"
# or
curl "https://permitintel.ai/api/v1/contractors?license=CPC1459679" \
-H "x-api-key: pmit_your_key"Endpoints
GET /api/v1/permits
Permits by address or contractor. Filter by work_type, status, min_value, and date range.
curl "https://permitintel.ai/api/v1/permits?contractor=CCC1335488" \
-H "Authorization: Bearer pmit_your_key"GET /api/v1/contractors
A contractor by license, or search by name or specialty. Every result carries a permit-activity rollup: permit count, declared value, 12-month trend, top trades, top jurisdictions, and last-active date, plus verified workers-comp and EPA lead-safe signals and canonical contact.
curl "https://permitintel.ai/api/v1/contractors?specialty=roofing&county=Lee" \
-H "x-api-key: pmit_your_key"Rank a market by activity. Add sort (permits_12mo, permits, value_12mo, value, last_active) and floor it with min_permits or min_permits_12mo. This is the supplier and sales-intelligence workflow: the busiest roofers in a county, ranked, ready to call.
curl "https://permitintel.ai/api/v1/contractors?specialty=roofing&county=Lee&sort=permits_12mo&min_permits_12mo=5" \
-H "x-api-key: pmit_your_key"GET /api/v1/verify/license
The trust primitive. An authoritative DBPR license check by license (or name plus county), refreshed daily. Returns status, type, effective and expiration dates, the qualifier, and a computed is_active and expires_in_days. Available on every plan, including the free trial.
curl "https://permitintel.ai/api/v1/verify/license?license=CCC1331234" \
-H "Authorization: Bearer pmit_your_key"GET /api/v1/verify/insurance
Workers-comp coverage status and lapse intelligence for a licensed business, from Florida DWC and Texas DWC proof-of-coverage and California CSLB records. Returns wc_status (active, expired, cancelled, or not_found), carrier, and policy dates, plus a coverage array carrying general liability and surety bond where the state publishes them (WA L&I, OR CCB). A not_found result means we hold no matched workers-comp record for that license, not that the business is uninsured. Pass &state= when a bare license number exists in more than one state. B2B verification of a business, not consumer underwriting. Starter and up.
curl "https://permitintel.ai/api/v1/verify/insurance?license=CCC1331234" \
-H "x-api-key: pmit_your_key"GET /api/v1/verify/certifications
Compliance badges in one call: EPA RRP lead-safe certification and Florida minority or disadvantaged business designation, matched to the license. Starter and up.
curl "https://permitintel.ai/api/v1/verify/certifications?license=CCC1331234" \
-H "x-api-key: pmit_your_key"POST /api/v1/monitors
Turn a one-time lookup into an always-on subscription. Watch a license for a license lapse, an insurance lapse, a new permit, or a certification expiry, and get a webhook or poll for events. Built for insurers, lenders, GC networks, and marketplaces continuously verifying a roster. Growth and up.
To subscribe, POST to /api/v1/monitors with Content-Type: application/json. The body carries license, an events array drawn from license_lapse, insurance_lapse, new_permit and certification_expiry, and an optional webhook_url. Leave the webhook off and poll the events endpoint instead.
# list yours
curl "https://permitintel.ai/api/v1/monitors" -H "x-api-key: pmit_your_key"
# poll events (no webhook needed)
curl "https://permitintel.ai/api/v1/monitors/<id>/events?since=2026-06-01" -H "x-api-key: pmit_your_key"
# stop watching
curl -X DELETE "https://permitintel.ai/api/v1/monitors/<id>" -H "x-api-key: pmit_your_key"Webhook deliveries are signed X-PermitIntel-Signature: sha256=HMAC(secret, body) with a per-monitor secret returned once at creation.
GET /api/v1/supply/accounts
Roll every Florida contractor up into a supplier sales account: demand by trade, momentum (90 days versus the prior 90), an activity grade A to D, a territory rank, and serviceability (canonical email, phone, and workers-comp on record). Filter by county, trade, minimum 12-month permits, momentum band, and grade; sort by value, permit count, momentum, or roofing activity. Add format=csv to hand a rep the whole territory. Growth and up.
curl "https://permitintel.ai/api/v1/supply/accounts?county=Broward&trade=roofing&min_permits_12mo=5&momentum=growing&grade=A&sort=value_12mo" \
-H "x-api-key: pmit_your_key"
# whole territory as a spreadsheet
curl "https://permitintel.ai/api/v1/supply/accounts?county=Broward&trade=roofing&format=csv" \
-H "x-api-key: pmit_your_key"Demand figures are permit-activity proxies, a floor and not a complete record, and the activity grade is a sales-prioritization signal, not a credit score.
Supplier workspace (book, reps, territories)
Turn the scored-account feed into a working book of business: save accounts with a pipeline status, assign them to reps, store reusable territory filters, and put any account on a watch. A watched account reuses the monitoring engine, so a new permit, a license lapse, or an insurance lapse fires the same poll or signed webhook. Growth and up.
All three write endpoints take Content-Type: application/json. A rep needs name and email. A book entry needs license and status, and optionally rep_id, watch, and webhook_url to put the account on the monitoring engine. A territory needs name plus whichever account filters you want stored: county, trade, min_permits_12mo, momentum, grade, and rep_id. PATCH the book with a license and the new status to move an account down the pipeline.
# list the book (each row enriched with live demand, momentum, grade)
curl "https://permitintel.ai/api/v1/supply/book?status=contacted" -H "x-api-key: pmit_your_key"Pipeline statuses: prospect, contacted, active, won, lost. Resolve a saved territory by passing its fields to /api/v1/supply/accounts for the live ranked list.
GET /api/v1/roof/{address}
Roof state for one property: roof_age_years (derived from the most recent roof permit on record), roof_last_permit_date, and roof_material with source and confidence. Add ?zip= to disambiguate. Every response carries a per-jurisdiction coverage_grade (A, B, or C) so a miss reads as not covered, never as no roof work. On every plan, including the trial.
curl "https://permitintel.ai/api/v1/roof/2082%20HYDE%20PARK%20ST?zip=34239" \
-H "Authorization: Bearer pmit_your_key"GET /api/v1/roof/{address}/evidence
The citation layer behind a roof answer: the underlying roof permit record(s) with permit number, jurisdiction, issue date, contractor and license, declared value, and status. Proof an underwriter or inspector can file. On every plan.
curl "https://permitintel.ai/api/v1/roof/2082%20HYDE%20PARK%20ST/evidence?zip=34239" \
-H "x-api-key: pmit_your_key"POST /api/v1/roof/batch
Score a book of business: up to 1,000 addresses per request, returned in input order with match status, roof age, material, and jurisdiction. Loop requests for bigger books. Growth and up.
POST with Content-Type: application/json and a body containing an items array. Each entry carries an address and an optional zip to disambiguate.
GET /api/v1/roof/coverage
Public, no key: the per-jurisdiction coverage table behind the grades. Property counts, roof-age fill rate, material fill rate, data freshness, and the A/B/C grade. Filter by state, county, or grade.
curl "https://permitintel.ai/api/v1/roof/coverage?state=FL&grade=A"Permit data reflects records PermitIntel has ingested and is not represented as a complete record of all permits. Contractor data is public record; no disciplinary or negative information is exposed via the API.