Discover/IARDC API
live

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.

Endpoints
2
Updated
2mo ago

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.

Try it
City to filter by.
Page number (1-based).
State to filter by.
County to filter by.
Registration status filter: 'All', 'Active', 'Inactive'.
Last name to search for.
Results per page: 5, 10, 25, 50, 75, or 100.
First name to search for.
How to match last name: 'Exact', 'BeginsWith', or 'Contains'.
api.parse.bot/scraper/920c0044-f2eb-4ad1-b3eb-26958f67469a/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
Python SDK · recommended

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()
All endpoints · 2 totalmissing one? ·

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.

Input
ParamTypeDescription
citystringCity to filter by.
pageintegerPage number (1-based).
statestringState to filter by.
countystringCounty to filter by.
statusstringRegistration status filter: 'All', 'Active', 'Inactive'.
last_namestringLast name to search for.
page_sizeintegerResults per page: 5, 10, 25, 50, 75, or 100.
first_namestringFirst name to search for.
last_name_matchstringHow to match last name: 'Exact', 'BeginsWith', or 'Contains'.
Response
{
  "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.

Reliability & maintenance

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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • 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_record field in get_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_lawyers results with page_size up to 100
  • Cross-reference admission dates from date_admitted to assess years of practice for a given attorney
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does IARDC have an official developer API?+
No. The Illinois ARDC does not publish a public developer API or documented data feed. The IARDC API on Parse provides structured programmatic access to the same attorney registration data available at iardc.org.
What does the `public_discipline_record` field include?+
It reflects the discipline information IARDC makes publicly available for that attorney, which can include disciplinary proceedings, sanctions, suspensions, or disbarments. If no public record exists, the field indicates that. It is a text field returned as part of get_lawyer_details, not a structured breakdown of individual cases.
Can I search for attorneys licensed in states other than Illinois?+
No — the IARDC database covers only attorneys registered with the Illinois Attorney Registration & Disciplinary Commission. Attorneys licensed solely in other states will not appear in 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?+
Not currently. The API exposes the 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`?+
Results are returned in alphabetical order. Use the 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.
Page content last updated . Spec covers 2 endpoints from iardc.org.
Related APIs in Government PublicSee all →
azbar.org API
Search for Arizona lawyers by name, location, specialty, or company to find the right legal professional for your needs. View detailed lawyer profiles including their specializations, licensed jurisdictions, law school, admission history, and any disciplinary records.
lawyers.com API
Search and discover lawyers and law firms with detailed profiles, client reviews, and practice area information. Find legal articles and featured firms by specialty to help you locate the right legal representation for your needs.
ailalawyer.com API
Search and find immigration lawyers on AilaLawyer.com by location, language, and specialty, then view detailed profiles including their credentials and practice information. Easily browse through filtered results and discover the right legal expert for your immigration needs.
idoi.illinois.gov API
Search for licensed insurance producers, agents, agencies, and public adjusters in Illinois while accessing their professional credentials and contact information. Quickly verify agent licensing status and retrieve detailed practitioner details through comprehensive site-wide search capabilities.
martindale.com API
Search for attorneys and law firms on Martindale-Hubbell by location, practice area, and ratings, then access detailed profiles including contact information, reviews, and verified credentials. Build comprehensive attorney databases or connect with qualified legal professionals using real-time directory data.
icrimewatch.net API
Search for sex offenders across multiple jurisdictions and retrieve detailed information including their physical descriptions, offenses, and dates of birth. Discover registered agencies and access comprehensive offender profiles to help protect your community.
justia.com API
Access Justia's legal database: search the lawyer directory by practice area and location, retrieve attorney profiles, browse state statutes and case law, explore legal guides, and look up law schools — all in one API.
illinoisreportcard.com API
Search and analyze comprehensive performance data for Illinois public schools, districts, and the state, including academic achievements in ELA, math, and science, student demographics, teacher and administrator information, school finances, and environmental conditions. Compare schools side-by-side, track growth metrics, and access accountability ratings and school highlights to make informed decisions about education quality.