REST API v1

Building Permit Data API

Real-time permit status for any building permit in 41+ jurisdictions. One API call.

playground · /api/v1
Try it live — no signup
cURL Python Node
Response
// hit Run to fetch permit data

How It Works

Three steps from zero to live permit data in your app.

01

Get an API Key

Sign up free. Get your key in seconds. No credit card required.

02

Make a Request

One API call with your permit number. We auto-detect the jurisdiction.

03

Get Permit Data

Real-time status, dates, and inspection history. JSON, always.

New Beta — live

Permit discovery

Query permits by criteria when you don't have a permit number — ZIP, lat/lon radius, permit type, date range, or valuation. Searches run live against the source portals, so results are what the jurisdiction has on file right now. Feed any hit into /permits/{number}/status and track it.

LADBS · City of Los Angeles EPIC-LA · LA County unincorporated

More markets next — tell us where to go:

discovery · /api/v1
GET /api/v1/permits/search ?zip=90064 &value_min=5000 &date_from=2026-04-01
// live from LADBS + EPIC-LA — merged, newest first { "results": [{ "permit_number": "26016-90000-16366", "jurisdiction": "ladbs", "address": "10960 WELLWORTH AVE", "permit_type": "Bldg-Addition", "status": "Issued", "valuation": 7500 }], "result_count": 1, "pagination": { "has_more": false } }

What you can build

Common building-permit API questions

Direct answers to the monitoring, identity, lifecycle, and integration questions teams ask before they build.

How can I get notified when a new building permit is filed?

Subscribe a signed webhook to permit_created to receive newly observed permit identities from the daily LADBS and EPIC-LA discovery monitor. This event requires a paid live key with the Permit Discovery add-on, starts after a no-event baseline, and reports when SignedOff first observes a permit — not the government’s legal filing time. New-permit event details →

How do I monitor a saved building-permit search?

Save supported discovery filters with POST /api/v1/saved-searches; after the first successful baseline, a daily evaluation emits criteria_match for each first-seen match. Monitoring requires a paid live key and the Permit Discovery add-on, with 3 active queries on Developer, 10 on Pro, and 50 on Enterprise. Saved-search monitoring details →

How do canonical building-permit IDs work?

SignedOff normalizes a permit number plus jurisdiction into an immutable canonical UUID, so every customer refers to the same tenant-neutral permit resource. Resolution does not scrape the portal; ambiguous permit formats require an explicit jurisdiction or return ranked choices. Canonical ID details →

Can the API track conditions, corrections, inspections, and history?

Yes. Dedicated endpoints return source-published conditions and holds, correction states, inspections, workflow activity, and lifecycle history from the latest successful portal representation. Detail varies by jurisdiction, and an unobserved field does not prove the agency has no matching record. Conditions, inspections, and history docs →

Is there an official Python or TypeScript building-permit API SDK?

Yes. The official signedoff-api Python package and @signedoff/api TypeScript package are generated from the committed API contract and include typed endpoints, models, and API-key configuration. SDK installation and examples →

How do I receive asynchronous permit refresh results without polling?

Request a durable refresh with Prefer: respond-async, then subscribe the same API key’s webhook to operation_completed. SignedOff delivers the terminal result or typed error without requiring a watched permit; asynchronous refresh requires a paid live key and webhooks use the plan’s active-webhook limit. Asynchronous refresh details →

SignedOff provides a REST API for querying real-time building permit status from municipal portals across the United States. The API returns structured JSON including permit status, inspection results, and processing milestones — data that would otherwise require manual lookups on individual city portals. A criteria-based discovery endpoint (/permits/search) additionally finds permits by ZIP, radius, permit type, date range, or valuation — currently covering the City of Los Angeles (LADBS) and unincorporated LA County (EPIC-LA) with live portal queries. Coverage spans Accela Citizen Access, LADBS, EPIC-LA, and EnerGov platforms, with new jurisdictions added on a rolling basis. Common integrations include solar installation pipelines, construction project management tools, and property due diligence platforms.

API Plans

API

Scale from prototype to production. All plans include every jurisdiction.

Free

$0 /mo

200 requests/mo

  • All jurisdictions
  • Live scraping
  • JSON responses
  • 1 active webhook
  • Community support
Start Free
Most Popular

Developer

$49 /mo

5,000 requests/mo

  • All jurisdictions
  • Live scraping
  • force_refresh param
  • 5 active webhooks
  • Email support
  • Usage dashboard
Get Started

Pro

$149 /mo

25,000 requests/mo

  • All jurisdictions
  • Live scraping
  • force_refresh param
  • 10 active webhooks
  • Priority support
  • Usage dashboard
Go Pro

Enterprise

Let's talk

Tailored limits + signed SLA

  • All jurisdictions
  • Live scraping
  • Custom rate limits
  • 25 active webhooks
  • Dedicated support
  • Signed SLA options
  • Bulk lookups
Contact Us

Add-ons

Permit Discovery

Free during beta

Search permits by criteria — ZIP, radius, type, date range, valuation — across LADBS + EPIC-LA.

+$39/mo on Developer (400 searches/mo + 3 monitored queries) · +$99/mo on Pro (1,500/mo + 10 monitored queries) · Enterprise 10,000/mo + 50 monitored queries (custom terms) · Free plan includes a 5-search monthly taste without monitoring.

41+ Jurisdictions and Growing

Every jurisdiction is available on every plan. Request a new city and we will add it.

City and County of Denver CO City of Alhambra CA City of Anaheim CA City of Carlsbad CA City of Carson CA City of Charlotte NC City of Cleveland OH City of Costa Mesa CA City of El Cajon CA City of El Monte CA City of Encinitas CA City of Fort Lauderdale (LauderBuild) FL City of Glendale CA City of Grass Valley CA City of Indio CA City of Laguna Niguel CA City of Mission Viejo CA City of Moorpark CA City of Murrieta CA City of Oakland CA City of Ontario CA City of Palm Springs CA City of Pasadena CA City of Pomona CA City of Poway CA City of Sacramento CA City of San Diego CA City of Santee CA City of Simi Valley CA City of South Pasadena CA City of Temecula CA City of Thousand Oaks CA City of Tustin CA City of Ventura CA City of Westminster CA EPIC-LA (LA County) CA LADBS (City of Los Angeles) CA Mecklenburg County NC Riverside County CA San Bernardino County CA Sarasota County FL

See full coverage →

Frequently asked

API questions, answered

Which cities and permit portals does the API cover?

The API returns live status from LADBS (City of Los Angeles), Accela Citizen Access cities, EPIC-LA (LA County), and EnerGov jurisdictions, with new cities added regularly. Call GET /api/v1/jurisdictions for the current machine-readable list, or browse the coverage page.

Is there a free tier?

Yes. The Free plan includes 200 requests per month with no credit card. Paid plans add higher limits and features: Developer is $49/mo for 5,000 requests, and Pro is $149/mo for 25,000 requests. Enterprise is custom.

How do I authenticate?

Pass your API key in the X-API-Key header on every request. Sign up free to get a key in about a minute, then start with 200 requests per month.

Can I try the API without signing up?

Yes. The interactive playground runs every endpoint against a curated demo dataset with no key and no signup (30 calls per day per IP). Sign up free when you want live data and your own key.

Is there an MCP server for AI agents?

Yes. SignedOff runs a remote Model Context Protocol server at /mcp, so Claude, Cursor, and other MCP-capable AI agents can look up live building-permit status as a tool. See the MCP setup page for connection details.

How fresh is the permit data?

Each response serves recently cached data when it is still fresh and falls back to a live scrape of the source portal otherwise, so you always get the current status of record. Paid plans can force a live re-scrape with the force_refresh parameter.

Can I search for permits without a permit number?

Yes. The permit discovery endpoint (GET /api/v1/permits/search) finds permits by criteria: ZIP, lat/lon radius, permit type, date range, or valuation. v1 covers LADBS (City of Los Angeles) and EPIC-LA (LA County unincorporated) with live portal queries, and every free key includes 5 searches per month. See the permit search API page for details.

Ready to build?

Get your API key in seconds. Start with 200 free requests per month.

Get Your API Key