# Georgia Bar Attorneys Scraper (`automation-lab/georgia-bar-attorney-directory-scraper`) Actor

Search Georgia State Bar public member records and export attorney identity, bar status, admission, firm, contact, section, discipline indicator, and profile data.

- **URL**: https://apify.com/automation-lab/georgia-bar-attorney-directory-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Georgia Bar Attorneys Scraper

Search the official Georgia State Bar public member directory and export structured attorney credential records.

Georgia Bar Attorneys Scraper helps legal operations, compliance, research, and directory teams verify attorney credentials and refresh legal directories without manually copying profiles.

It accepts attorney names, exact bar numbers, firms, law schools, practice sections, and public address locations.

### What this Georgia Bar attorneys scraper does

The Actor queries the public directory data service used by `gabar.org`.

It exports normalized records containing:

- attorney name and Georgia Bar number;
- public membership status;
- admission date and admission method;
- law school and public firm or employer;
- public business address and contact fields;
- Georgia Bar practice sections;
- the source discipline indicator;
- public ReliaGuide profile linkage;
- search and extraction provenance.

Results are deduplicated by bar number across all searches in one run.

The Actor intentionally excludes sensitive upstream-only fields that are not part of the buyer job.

### Who is it for

**Legal operations teams** can verify membership status before onboarding outside counsel.

**Compliance and credentialing teams** can refresh attorney status and admission data on a schedule.

**Legal directories and CRM operators** can enrich existing profiles with public firm, location, and contact fields.

**Researchers and developers** can collect repeatable, typed Georgia attorney records through the Apify API.

### Why use this Actor

- Uses the Georgia State Bar's own public member-directory data surface.
- Supports exact bar-number lookup as well as broader directory searches.
- Paginates through source results while respecting a user-set maximum.
- Deduplicates records from overlapping searches.
- Emits typed JSON, CSV, Excel, XML, and RSS-compatible dataset exports.
- Uses lightweight direct HTTP requests instead of a browser or paid proxy fallback.
- Fails clearly when input is invalid or the upstream response changes.

### Input options

Provide one or more objects in `searches`.

Each object must contain at least one supported field.

Fields in the same object are combined to narrow the directory search.

Separate objects are executed as separate lookups.

| Field | Type | Description |
| --- | --- | --- |
| `firstName` | string | Attorney first name |
| `middleName` | string | Attorney middle name |
| `lastName` | string | Attorney surname or name phrase |
| `barNumber` | string | Exact 4–10 digit Georgia Bar number |
| `section` | string | Georgia Bar section code |
| `lawSchool` | string | Law school name or phrase |
| `company` | string | Firm, company, court, or agency |
| `city` | string | Public address city |
| `state` | string | Public address state, such as `GA` |
| `zip` | string | Public address ZIP code |
| `maxItems` | integer | Maximum unique records across the run, from 1 to 10,000 |

### Example inputs

Search by surname:

```json
{
  "searches": [{ "lastName": "Smith" }],
  "maxItems": 25
}
```

Verify one exact bar number:

```json
{
  "searches": [{ "barNumber": "558756" }],
  "maxItems": 1
}
```

Build a public firm roster:

```json
{
  "searches": [{ "company": "Troutman Pepper Locke LLP" }],
  "maxItems": 50
}
```

### Output fields

| Field | Meaning |
| --- | --- |
| `barNumber` | Georgia Bar member number |
| `fullName` | Normalized display name |
| `firstName`, `middleName`, `lastName` | Name components |
| `prefix`, `suffix`, `formerName`, `nickname` | Additional public name data when available |
| `status` | Public membership status from the source |
| `admissionDate` | Georgia admission date, normalized to `YYYY-MM-DD` |
| `admissionMethod` | Public admission method when present |
| `lawSchool` | Public law-school value |
| `company` | Public firm or employer |
| `address`, `city`, `state`, `zip`, `country`, `county` | Public address fields |
| `phone`, `cellPhone`, `fax`, `email` | Public contact fields when displayed and not hidden by the source |
| `otherStates` | Other-state information when supplied |
| `sections` | Practice-section code, name, and through date |
| `hasDiscipline` | Boolean discipline indicator supplied by the directory |
| `profileUrl` | Public ReliaGuide lawyer profile URL |
| `sourceUrl` | Official Georgia Bar member-directory URL |
| `searchCriteria` | Search object that produced the record |
| `scrapedAt` | UTC extraction timestamp |

### Real output example

This abbreviated record comes from the current public source behavior; public contact values are omitted from the documentation example.

```json
{
  "barNumber": "558756",
  "firstName": "Vania",
  "middleName": "Smith",
  "lastName": "Allen",
  "fullName": "Mrs. Vania Smith Allen",
  "status": "Active Member in Good Standing",
  "admissionDate": "2007-12-14",
  "admissionMethod": "EXAM",
  "lawSchool": "Catholic University-Washington",
  "company": "US Bankruptcy Court Northern District of Georgia",
  "city": "Atlanta",
  "state": "GA",
  "sections": [{
    "code": "BANKR05",
    "name": "Bankruptcy Law",
    "throughDate": "2027-06-30"
  }],
  "hasDiscipline": false,
  "profileUrl": "https://gabar.reliaguide.com/lawyer/GA22451",
  "sourceUrl": "https://www.gabar.org/member-directory",
  "searchCriteria": { "barNumber": "558756" }
}
```

### How to run it

1. Open the Actor in Apify Console.
2. Add one or more search objects.
3. Set a practical `maxItems` limit.
4. Click **Start**.
5. Review the default dataset.
6. Export results as JSON, CSV, Excel, XML, or another supported format.
7. Save the input as a Task if you need scheduled refreshes.

### Search and pagination behavior

The source returns up to 25 members per page.

The Actor follows pages sequentially until it reaches `maxItems` or the source reports no more results.

A broad name or company phrase can match many records according to the official directory's own search semantics.

Use multiple fields in one search object when you need narrower results.

Overlapping searches do not create duplicate dataset rows for the same bar number.

A valid no-match search succeeds with an empty dataset.

### How much does it cost to verify Georgia Bar attorneys?

The Actor uses pay per event:

- a **$0.025** one-time start event per run;
- a tiered per-attorney event, **$0.00534 per saved record at BRONZE**.

At the BRONZE rate, estimate a run as the **$0.025** start event plus the number of saved attorneys multiplied by the **$0.00534** attorney event.

| Saved attorneys | Charge calculation |
| ---: | --- |
| 1 | start event + 1 attorney event |
| 25 | start event + 25 attorney events |
| 100 | start event + 100 attorney events |
| 1,000 | start event + 1,000 attorney events |

Only normalized, unique records accepted for the dataset trigger the attorney event.

Failed requests, duplicate records, and rejected source rows do not trigger per-attorney events.

Check the live pricing panel before running because your Apify tier determines the active per-record price.

### Scheduling credential refreshes

Save a tested input as an Apify Task.

Use a schedule to rerun it weekly, monthly, or at another interval appropriate for your compliance process.

Connect the resulting dataset to your data warehouse or automation platform.

Compare records by stable `barNumber` rather than display name.

The Actor reports current source data; change detection and alerts should be implemented in your downstream workflow.

### cURL API example

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~georgia-bar-attorney-directory-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searches":[{"barNumber":"558756"}],"maxItems":1}'
```

For production secrets, prefer an authorization header rather than placing tokens in logs or committed files.

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/georgia-bar-attorney-directory-scraper').call({
  searches: [{ company: 'Troutman Pepper Locke LLP' }],
  maxItems: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/georgia-bar-attorney-directory-scraper').call(
    run_input={
        'searches': [{'lastName': 'Smith'}],
        'maxItems': 25,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### MCP setup

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/georgia-bar-attorney-directory-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Desktop and editor clients can use this MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/georgia-bar-attorney-directory-scraper"
    }
  }
}
```

Example prompts:

- “Verify Georgia Bar number 558756 and summarize its public membership status.”
- “Export up to 50 public Georgia Bar records associated with Troutman Pepper Locke LLP.”
- “Search Georgia Bar attorneys matching the surname Smith and return bar number, status, and admission date.”

### Integrations

Send results to Google Sheets through Make or Zapier.

Load JSON or CSV exports into a legal CRM.

Use a webhook to trigger a credential-review workflow when a scheduled Task completes.

Join records with an internal roster using `barNumber` as the stable key.

Archive dated dataset exports when auditability is required.

### Limits and responsible operation

The Actor accesses public directory data without a login.

It does not bypass access controls or retrieve member-only records.

Source availability, fields, search semantics, and freshness are controlled by the Georgia State Bar.

The discipline field is an indicator, not a complete disciplinary history.

Verify consequential legal or employment decisions against the current official profile and applicable primary records.

The Actor does not provide legal advice.

### Privacy and legal use

Use public attorney data for lawful purposes with an appropriate basis.

Follow applicable privacy, anti-spam, professional-responsibility, and data-retention rules.

Do not use output for harassment, discrimination, deceptive outreach, or unsupported legal conclusions.

Respect the source website's terms and avoid unnecessarily broad collection.

Remove stale downstream copies when your use no longer requires them.

### Troubleshooting

#### The run returns no records

Confirm that the spelling, bar number, firm, or location exists in the public directory.

Try one criterion first, then add fields to narrow it.

An exact no-match search correctly produces an empty dataset.

#### The run fails with an upstream error

The Actor retries transient network, rate-limit, and server failures up to three times.

If all attempts fail, check the run log and retry later rather than treating an empty result as proof that no attorney exists.

#### A name search returns unexpected people

The official directory may match the phrase against former or middle names as well as current surnames.

Use an exact bar number for credential verification, or add other fields to narrow the source search.

#### A contact field is null

The public source may omit or hide that field.

The Actor preserves nullability and does not guess missing contact data.

### FAQ

#### Does it search by exact Georgia Bar number?

Yes. Supply `barNumber` as a 4–10 digit string in a search object.

#### Does it download disciplinary documents?

No. It exports the public source's discipline indicator and profile linkage, not case documents or a complete disciplinary history.

#### Does it need a proxy or browser?

No. The current official public JSON route works through direct HTTP. The Actor has no automatic residential-proxy or browser fallback.

#### Can I search several attorneys in one run?

Yes. Add multiple objects to `searches`. Results are deduplicated by bar number.

#### Can I export to Excel?

Yes. Open the default dataset and choose Excel, CSV, JSON, XML, or another supported export format.

#### Is every source record guaranteed to have contact details?

No. Public contact availability varies by member and source privacy settings.

### Related Automation Lab Actors

- [Maryland Attorney Directory Scraper](https://apify.com/automation-lab/maryland-attorney-directory-scraper) for Maryland Courts attorney records.
- [Texas TREC License Holder Search Scraper](https://apify.com/automation-lab/texas-trec-license-holder-search-scraper) for Texas real-estate professional license verification.

Use the Actor matching the official registry and professional population you need.

### Support

When reporting a problem, include the run URL, sanitized input, expected behavior, and a short output sample.

Do not post API tokens or private downstream data in support messages.

# Actor input Schema

## `searches` (type: `array`):

One or more search objects. Each object must contain at least one supported field. Combine fields in one object to narrow a search; use multiple objects for separate lookups.

## `maxItems` (type: `integer`):

Maximum unique attorney records saved across all searches. Duplicate bar numbers are saved once.

## Actor input object example

```json
{
  "searches": [
    {
      "lastName": "Smith"
    },
    {
      "barNumber": "558756"
    }
  ],
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset in the attorney overview view.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searches": [
        {
            "lastName": "Smith"
        },
        {
            "barNumber": "558756"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/georgia-bar-attorney-directory-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searches": [
        { "lastName": "Smith" },
        { "barNumber": "558756" },
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/georgia-bar-attorney-directory-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searches": [
    {
      "lastName": "Smith"
    },
    {
      "barNumber": "558756"
    }
  ],
  "maxItems": 20
}' |
apify call automation-lab/georgia-bar-attorney-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/georgia-bar-attorney-directory-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dmnDp2HD4UoqacR9R/builds/hXv5GQ701n35omixr/openapi.json
