Ca APIwww2.dre.ca.gov ↗
Look up and search California DRE real estate licenses. Get license status, expiration dates, broker details, disciplinary actions, and mailing addresses.
What is the Ca API?
The California DRE License API exposes 2 endpoints for querying public license records maintained by the California Department of Real Estate. The lookup_license endpoint returns 10 structured fields per record — including license type, status, issue and expiration dates, mailing address, and responsible broker details — while search_license lets you find licenses by name, city, or license ID.
curl -X GET 'https://api.parse.bot/scraper/92e6588e-1ceb-405b-be6a-488d067f7d2c/lookup_license?license_id=02120862' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace www2-dre-ca-gov-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: California DRE License Lookup — bounded, re-runnable."""
from parse_apis.california_dre_license_lookup_api import CaliforniaDRE, LicenseNotFound
client = CaliforniaDRE()
# Search for agents by name in a city; limit caps total items fetched.
for summary in client.licensesummaries.search(name="Smith", city_state="Los Angeles", limit=3):
print(summary.name, summary.license_type, summary.city)
# Drill down: take one result and fetch full license details.
result = client.licensesummaries.search(name="Johnson", limit=1).first()
if result:
license_detail = result.details()
print(license_detail.name, license_detail.license_status, license_detail.expiration_date)
print(license_detail.mailing_address)
print(license_detail.disciplinary_action)
# Direct lookup by known license ID with typed error handling.
try:
license_info = client.licenses.get(license_id="01871851")
print(license_info.name, license_info.license_type, license_info.license_status)
except LicenseNotFound as exc:
print(f"License not found: {exc.license_id}")
print("exercised: licensesummaries.search / details / licenses.get")Look up a California real estate license by license ID. Returns full license details including license type, holder name, mailing address, expiration date, license status, issue date, former names, responsible broker (for salespersons), and disciplinary action. The license_id is an 8-digit DRE number. Returns one complete record per call; no pagination.
| Param | Type | Description |
|---|---|---|
| license_idrequired | string | The DRE license ID number (8-digit string, e.g. '01871851') |
{
"type": "object",
"fields": {
"name": "string - licensee name",
"issue_date": "string (MM/DD/YY)",
"license_id": "string - DRE license ID",
"former_names": "string",
"license_type": "string - BROKER, SALESPERSON, or CORPORATION",
"broker_address": "string - broker's address (salesperson licenses only)",
"license_status": "string - e.g. LICENSED, EXPIRED",
"expiration_date": "string (MM/DD/YY)",
"mailing_address": "string - multi-line mailing address",
"broker_license_id": "string - broker's license ID (salesperson licenses only)",
"responsible_broker": "string - broker name (salesperson licenses only)",
"disciplinary_action": "string"
},
"sample": {
"data": {
"name": "Novak, Paul Graham",
"issue_date": "09/30/11",
"license_id": "01871851",
"former_names": "NO FORMER NAMES",
"license_type": "BROKER",
"broker_address": "",
"license_status": "EXPIRED",
"expiration_date": "12/23/19",
"mailing_address": "2212 THE STRAND\nAPT B\nMANHATTAN BEACH, CA 90266",
"broker_license_id": "",
"responsible_broker": "",
"disciplinary_action": "NO DISCIPLINARY ACTION\nNO OTHER PUBLIC COMMENTS"
},
"status": "success"
}
}About the Ca API
Endpoints and Data Coverage
The API covers two operations against the California DRE public license database. lookup_license accepts an 8-digit license_id and returns a single record with fields covering the licensee's full name, license_type (BROKER, SALESPERSON, or CORPORATION), license_status (e.g. LICENSED or EXPIRED), issue_date, expiration_date, and mailing_address. For salesperson licenses it also returns broker_license_id and broker_address, identifying the responsible broker of record. The former_names field surfaces any name history on file.
Search Behavior
search_license accepts up to three optional parameters — name, city_state, and license_id — but at least one of license_id or name must be supplied. Results come back as an array of summary records, each containing license_id, name, license_type, city, and mortgage_loan_originator status, plus a total count of matches. The name parameter supports last-name-only or last, first format, making it practical for partial lookups when you don't have an exact ID.
Data Source and Freshness
All records reflect the California DRE's publicly accessible license database at www2.dre.ca.gov. The data is limited to what the DRE makes available in its public-facing lookup tool: individual license records and search results. Disciplinary action information is included in lookup_license responses where the DRE has recorded it.
The Ca API is a managed, monitored endpoint for www2.dre.ca.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when www2.dre.ca.gov changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official www2.dre.ca.gov API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Verify a real estate agent's current license status before a transaction closes
- Batch-check expiration dates across a brokerage's roster of salesperson licenses
- Look up the responsible broker tied to a salesperson license using
broker_license_id - Screen for disciplinary actions on record before onboarding a new agent
- Search licenses by city to build a directory of active brokers in a given market
- Cross-reference former names to match licensees across different data sources
- Confirm whether a licensee holds a mortgage loan originator designation
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the California DRE provide an official developer API?+
What does the `lookup_license` endpoint return for broker vs. salesperson licenses?+
name, license_type, license_status, issue_date, expiration_date, mailing_address, and former_names. Salesperson records additionally include broker_license_id and broker_address identifying their responsible broker. CORPORATION license records return the core fields only.Does the API return disciplinary action details such as case numbers or violation types?+
lookup_license endpoint indicates whether disciplinary action is on record for a licensee, as the DRE exposes it in the public record. Structured case details, violation descriptions, or hearing outcomes are not broken out as discrete fields in the current response. You can fork this API on Parse and revise it to add an endpoint targeting the DRE's disciplinary action detail pages if that granularity is needed.Can I retrieve a list of all licenses in a given city without a name or license ID?+
search_license requires at least one of name or license_id to be provided; city_state alone is not a valid query. The current API does not support open-ended geographic browsing. You can fork it on Parse and revise to add a broader geographic search endpoint if the DRE's public interface supports that query pattern.How many results does `search_license` return for a broad name query?+
total field indicating the number of matches found. The DRE's public lookup imposes its own result limits for broad queries; results beyond that threshold are not guaranteed to be returned. Narrowing queries with city_state in addition to name reduces ambiguity and typically yields more targeted result sets.