IARDC APIiardc.org ↗
Search and retrieve Illinois lawyer registration data from IARDC. Access registration status, discipline records, contact info, and admission dates via 2 endpoints.
What is the IARDC API?
The IARDC API provides access to the Illinois Attorney Registration & Disciplinary Commission database through 2 endpoints, returning registration status, contact details, admission dates, malpractice insurance status, and public discipline records for Illinois-licensed attorneys. Use search_lawyers to query by name, city, state, county, or registration status, then call get_lawyer_details with a lawyer's IARDC GUID to retrieve their full profile including registered address and any public discipline history.
curl -X GET 'https://api.parse.bot/scraper/920c0044-f2eb-4ad1-b3eb-26958f67469a/search_lawyers?city=Chicago&page=1&last_name=Smith&page_size=10&last_name_match=BeginsWith' \ -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 iardc-org-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.
"""
IARDC Illinois Lawyer Search API - Parse Client
This module provides a Python client for searching and retrieving information about
lawyers registered with the Illinois Attorney Registration & Disciplinary Commission.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any
class ParseClient:
"""Client for the IARDC Illinois Lawyer Search API."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for Parse Bot. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "920c0044-f2eb-4ad1-b3eb-26958f67469a"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided and PARSE_API_KEY environment variable not set")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make an API call to the Parse Bot scraper.
Args:
endpoint: The endpoint name (e.g., 'search_lawyers')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters
Returns:
Response data as dictionary
Raises:
requests.RequestException: If the API call fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
try:
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
else:
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
raise requests.RequestException(f"API call failed: {e}")
def search_lawyers(
self,
last_name: str = "",
first_name: str = "",
last_name_match: str = "Exact",
status: str = "All",
city: str = "",
state: str = "",
county: str = "",
page: int = 1,
page_size: int = 100
) -> Dict[str, Any]:
"""
Search for lawyers in the IARDC database.
Args:
last_name: Last name to search for
first_name: First name to search for
last_name_match: Matching strategy ('Exact', 'BeginsWith', 'Contains')
status: Registration status filter ('All', 'Active', 'Inactive')
city: City to filter by
state: State to filter by
county: County to filter by
page: Page number (1-based)
page_size: Results per page (5, 10, 25, 50, 75, or 100)
Returns:
Dictionary containing lawyers list and pagination info
"""
params = {
"last_name": last_name,
"first_name": first_name,
"last_name_match": last_name_match,
"status": status,
"city": city,
"state": state,
"county": county,
"page": page,
"page_size": page_size
}
return self._call("search_lawyers", method="GET", **params)
def get_lawyer_details(self, lawyer_id: str) -> Dict[str, Any]:
"""
Get detailed profile information for a specific lawyer.
Args:
lawyer_id: The lawyer's IARDC GUID identifier (from search results)
Returns:
Dictionary containing detailed lawyer information
"""
params = {"lawyer_id": lawyer_id}
return self._call("get_lawyer_details", method="GET", **params)
def main():
"""Demonstrate practical usage of the IARDC Lawyer Search API."""
# Initialize the client
client = ParseClient()
print("=" * 80)
print("IARDC Illinois Lawyer Search - Practical Example")
print("=" * 80)
# Step 1: Search for active lawyers with last name "Smith" in Chicago
print("\n[Step 1] Searching for active lawyers with last name 'Smith' in Chicago...")
search_results = client.search_lawyers(
last_name="Smith",
last_name_match="Exact",
city="Chicago",
status="Active",
page_size=10
)
if search_results.get('status') == 'success':
data = search_results['data']
print(f"✓ Found {data['result_count']} results on page {data['page']} "
f"(Total pages: {data['total_pages']})")
else:
print("✗ Search failed")
return
# Step 2: Display search results summary
if not data['lawyers']:
print("No lawyers found matching the criteria.")
return
print("\n[Step 2] Search Results Summary:")
print("-" * 80)
for i, lawyer in enumerate(data['lawyers'], 1):
print(f"{i}. {lawyer['name']}")
print(f" Location: {lawyer['city']}, {lawyer['state']}")
print(f" Admitted: {lawyer['date_admitted']}")
print(f" Practice Status: {lawyer['authorized_to_practice']}")
print()
# Step 3: Get detailed information for the first lawyer
first_lawyer = data['lawyers'][0]
lawyer_id = first_lawyer['id']
lawyer_name = first_lawyer['name']
print(f"[Step 3] Fetching detailed profile for: {lawyer_name}")
print("-" * 80)
details_response = client.get_lawyer_details(lawyer_id)
if details_response.get('status') == 'success':
details = details_response['data']
print(f"Full Name: {details['full_name']}")
print(f"Licensed Name: {details['full_licensed_name']}")
print(f"Date Admitted: {details['date_admitted']}")
print(f"Registration Status: {details['registration_status']}")
print(f"Address: {details['registered_address']}")
print(f"Phone: {details['registered_phone']}")
print(f"Email: {details['registered_email']}")
print(f"Malpractice Insurance: {details['malpractice_insurance']}")
print(f"Discipline Record: {details['public_discipline_record']}")
else:
print("✗ Failed to fetch lawyer details")
# Step 4: Search for multiple lawyers and get details for each
print("\n" + "=" * 80)
print("[Step 4] Searching for lawyers in Cook County and fetching their details...")
print("-" * 80)
cook_county_search = client.search_lawyers(
county="Cook",
status="Active",
page_size=5
)
if cook_county_search.get('status') == 'success':
cook_data = cook_county_search['data']
print(f"Found {cook_data['result_count']} lawyers "
f"(showing {len(cook_data['lawyers'])} on this page)\n")
detailed_lawyers = []
for i, lawyer in enumerate(cook_data['lawyers'][:3], 1): # Get details for first 3
print(f"Fetching details for: {lawyer['name']}...")
detail = client.get_lawyer_details(lawyer['id'])
if detail.get('status') == 'success':
lawyer_detail = detail['data']
detailed_lawyers.append({
'name': lawyer_detail['full_name'],
'status': lawyer_detail['registration_status'],
'address': lawyer_detail['registered_address'],
'phone': lawyer_detail['registered_phone']
})
print(f" ✓ Retrieved details")
else:
print(f" ✗ Failed to retrieve details")
print("\n[Step 4] Summary of Detailed Profiles:")
print("-" * 80)
for lawyer in detailed_lawyers:
print(f"Name: {lawyer['name']}")
print(f"Status: {lawyer['status']}")
print(f"Phone: {lawyer['phone']}")
print()
# Step 5: Search with different criteria (first name search)
print("=" * 80)
print("[Step 5] Searching for lawyers whose last name begins with 'Johnson'...")
print("-" * 80)
johnson_search = client.search_lawyers(
last_name="Johnson",
last_name_match="BeginsWith",
status="Active",
page_size=5
)
if johnson_search.get('status') == 'success':
johnson_data = johnson_search['data']
if johnson_data['lawyers']:
print(f"Found {johnson_data['result_count']} results:\n")
for lawyer in johnson_data['lawyers']:
print(f" • {lawyer['name']}")
print(f" {lawyer['city']}, {lawyer['state']} | "
f"Admitted: {lawyer['date_admitted']}")
else:
print("No lawyers found with that criteria.")
print("\n" + "=" * 80)
print("Example completed successfully!")
print("=" * 80)
if __name__ == "__main__":
main()Search for lawyers in the IARDC database by last name, first name, status, city, state, or county. Results are paginated and sorted alphabetically by name.
| Param | Type | Description |
|---|---|---|
| city | string | City to filter by. |
| page | integer | Page number (1-based). |
| state | string | State to filter by. |
| county | string | County to filter by. |
| status | string | Registration status filter: 'All', 'Active', 'Inactive'. |
| last_name | string | Last name to search for. |
| page_size | integer | Results per page: 5, 10, 25, 50, 75, or 100. |
| first_name | string | First name to search for. |
| last_name_match | string | How to match last name: 'Exact', 'BeginsWith', or 'Contains'. |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"lawyers": "array of lawyer objects with id, name, city, state, date_admitted, authorized_to_practice",
"page_size": "integer - results per page",
"total_pages": "integer - total pages available",
"result_count": "integer - number of results on this page"
},
"sample": {
"data": {
"page": 1,
"lawyers": [
{
"id": "2f112aaf-a964-eb11-b810-000d3a9f4eeb",
"city": "Chicago",
"name": "Smith, Aaron Charles",
"state": "Illinois",
"date_admitted": "5/6/2004",
"authorized_to_practice": "Yes"
}
],
"page_size": 10,
"total_pages": 23,
"result_count": 10
},
"status": "success"
}
}About the IARDC API
Searching the IARDC Database
The search_lawyers endpoint accepts up to eight filter parameters — last_name, first_name, city, state, county, status, page, and page_size. Results are paginated and sorted alphabetically by name. The status parameter accepts 'All', 'Active', or 'Inactive', which is useful for narrowing to currently practicing attorneys. Each result object includes the lawyer's id (an IARDC GUID), name, city, state, date_admitted, and authorized_to_practice. Supported page sizes are 5, 10, 25, 50, 75, or 100 records per page; the response includes result_count, total_pages, and page for straightforward pagination.
Lawyer Detail Profiles
Passing a lawyer_id from search results to get_lawyer_details returns a complete profile: full_name, full_licensed_name, date_admitted, registration_status, registered_address, registered_phone, registered_email, malpractice_insurance status, and public_discipline_record. The public_discipline_record field reflects any discipline proceedings or sanctions that IARDC has made publicly available, making this endpoint the primary source for attorney credential verification and due-diligence workflows.
Coverage and Scope
Coverage is limited to attorneys registered with the Illinois ARDC. The database includes both active and inactive registrants, and historical discipline records where publicly available. This is not a national bar directory — attorneys licensed only in other states will not appear in results.
The IARDC API is a managed, monitored endpoint for iardc.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when iardc.org 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 iardc.org 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 an Illinois attorney's current registration status and authorization to practice before engaging their services
- Check the public discipline record of a lawyer using the
public_discipline_recordfield inget_lawyer_details - Build a legal directory filtered to active attorneys in a specific Illinois city or county
- Confirm malpractice insurance status for attorneys involved in business or litigation matters
- Retrieve registered contact information and business address for attorney outreach or service of process
- Audit a list of attorney IDs in bulk using paginated
search_lawyersresults withpage_sizeup to 100 - Cross-reference admission dates from
date_admittedto assess years of practice for a given attorney
| 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 IARDC have an official developer API?+
What does the `public_discipline_record` field include?+
get_lawyer_details, not a structured breakdown of individual cases.Can I search for attorneys licensed in states other than Illinois?+
search_lawyers results. You can fork this API on Parse and revise it to add endpoints pointing to other state bar directories.Does the API return individual disciplinary case records or hearing details?+
public_discipline_record summary field from the attorney's profile page but does not return individual case filings, hearing dates, or case-level metadata as separate structured fields. You can fork the API on Parse and revise it to add an endpoint targeting per-case discipline detail pages.How does pagination work in `search_lawyers`?+
page parameter (1-based) alongside page_size (accepted values: 5, 10, 25, 50, 75, or 100). The response includes total_pages and result_count so you can iterate through the full result set programmatically.