Alabama General Contractor Licenses Scraper avatar

Alabama General Contractor Licenses Scraper

Pricing

from $13.68 / 1,000 item extracteds

Go to Apify Store
Alabama General Contractor Licenses Scraper

Alabama General Contractor Licenses Scraper

Download and filter the official Alabama general contractor roster with license identity, contact, bid limit, classification, expiration, extension, status, and provenance.

Pricing

from $13.68 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Download and filter Alabama general contractor licenses from the official Alabama Licensing Board for General Contractors (LBGC) roster. The Actor turns the board's full CSV into typed records for contractor verification, vendor onboarding, compliance review, and recurring expiration checks.

One source request returns license identity, public address and contact fields, bid limit, specialty/classification, expiration, extension, derived standing, and provenance. You can export the result as JSON, CSV, Excel, XML, or RSS from the Apify dataset.

What does this Actor do?

  1. Downloads the current official LBGC License Verification List.
  2. Validates that the response is the expected government CSV.
  3. Normalizes dates and empty values.
  4. Derives licenseStatus from the later of expiration and extension dates.
  5. Applies all requested filters locally to the same roster snapshot.
  6. Saves up to maxItems matching records to the default dataset.

The Actor covers the Alabama LBGC commercial general-contractor and subcontractor roster. It does not claim to cover residential home-builder licenses administered by a different board.

Who is it for?

  • Procurement teams validating vendors before onboarding or renewal.
  • General contractors checking subcontractor license information.
  • Compliance teams reviewing expiration and extension dates.
  • Insurers and lenders enriching a contractor record with public license data.
  • Marketplaces verifying Alabama contractor suppliers.
  • Analysts building a current classification or geographic roster.

Why use it?

The official roster is authoritative but not shaped for recurring automation. This Actor provides:

  • one structured item per license;
  • combined list and detail fields from the official CSV;
  • filters for names, exact licenses, cities, states, and classifications;
  • active/expired and expiration-cutoff filtering;
  • normalized ISO dates alongside the published source fields;
  • stable provenance URLs and retrieval timestamps;
  • bounded output and pay-per-result billing.

No AI enrichment or third-party identity matching is added. Missing government values stay null.

Extracted Alabama contractor data

FieldMeaning
licenseNumberOfficial LBGC license number, including any prefix
businessNameLicensed business name
addressPublic mailing or street address
city, state, postalCodePublished business location
phone, faxPublic business contact details
bidLimitPublished bid limit, such as U UNLIMITED
specialtyComplete specialty/classification text
classificationsSpecialty text split into convenient entries
expirationDatePublished expiration normalized to YYYY-MM-DD
extensionDatePublished extension normalized to YYYY-MM-DD
effectiveExpirationDateLater of expiration and extension
licenseStatusACTIVE, EXPIRED, or UNKNOWN, derived as of run date
sourceUrlOfficial roster page
sourceDownloadUrlOfficial CSV endpoint used by the run
sourceAgencyAlabama LBGC
retrievedAtISO timestamp for this roster snapshot

How to get started

  1. Open the Actor input page.
  2. Add one or more filters, or leave filters empty to export the roster from the beginning.
  3. Set maxItems to bound the number of output records.
  4. Keep Apify Proxy enabled for reliable access to the Alabama state host.
  5. Click Start.
  6. Open the Dataset tab and export the records in your preferred format.

A useful first run is:

{
"companyNames": ["DUNN CONSTRUCTION"],
"maxItems": 10
}

Input parameters

InputTypeDefaultDescription
companyNamesstring[][]Business-name substring filters, case-insensitive
licenseNumbersstring[][]Exact LBGC license numbers
citiesstring[][]Exact cities, case-insensitive
statesstring[][]Exact business-address state abbreviations
classificationsstring[][]Specialty code/text substring filters
expiresBeforestringunsetKeep licenses effective on or before a YYYY-MM-DD cutoff
includeExpiredbooleantrueSet false to remove already expired records
maxItemsinteger100Save 1–20,000 matching records
proxyConfigurationobjectApify Proxy onNetwork routing for the state roster

Values within one filter are combined with OR. Different filters are combined with AND. For example, states: ["AL"] plus classifications: ["BC"] keeps Alabama-address records whose specialty contains BC.

Example output

This shortened item came from the documented company-name example:

{
"licenseNumber": "8",
"businessName": "DUNN CONSTRUCTION CO INC",
"address": "P O BOX 11967",
"city": "BIRMINGHAM",
"state": "AL",
"postalCode": "35202",
"phone": "(205) 592-3866",
"fax": "(205) 592-4632",
"bidLimit": "U UNLIMITED",
"specialty": "BC: BUILDING CONSTRUCTION, H/RR: HEAVY AND RAILROAD, HS: HIGHWAYS AND STREETS, MU: MUNICIPAL AND UTILITY",
"classifications": [
"BC: BUILDING CONSTRUCTION",
"H/RR: HEAVY AND RAILROAD",
"HS: HIGHWAYS AND STREETS",
"MU: MUNICIPAL AND UTILITY"
],
"expirationDate": "2026-09-30",
"extensionDate": null,
"effectiveExpirationDate": "2026-09-30",
"licenseStatus": "ACTIVE",
"sourceUrl": "https://licensesearch.alabama.gov/genconbd",
"sourceAgency": "Alabama Licensing Board for General Contractors (LBGC)",
"retrievedAt": "2026-09-12T14:14:18.480Z"
}

Dates and standing reflect the source and run time. A later run can legitimately return different values.

How much does it cost to export Alabama contractor licenses?

This is a pay-per-event Actor. Each run has a $0.005 start fee, then charges for each contractor record saved. Empty searches incur only the start fee. The final six plan-tier record prices are shown by Apify on the Actor pricing tab; BRONZE is $0.0228 per record, with lower rates on higher plans.

Approximate BRONZE examples:

Useful recordsBRONZE calculation
1$0.005 + 1 × $0.0228
10$0.005 + 10 × $0.0228
100$0.005 + 100 × $0.0228
1,000$0.005 + 1,000 × $0.0228

Set maxItems and narrow filters to control the bill. Apify displays the applicable plan-tier price before a Store run.

Vendor verification workflow

Search by an exact licenseNumbers value when a vendor supplied a credential. Save the returned identity, classifications, bid limit, and effective expiration in your onboarding record. A zero-item result means no row matched the current official roster; it is not proof of misconduct and should be reviewed with the board.

Expiration and compliance workflow

Schedule the same input weekly or monthly with Apify Tasks. Use includeExpired: false for currently effective licenses and expiresBefore to select an upcoming review window. Compare datasets downstream by licenseNumber to identify changed dates, classifications, contacts, or bid limits.

The Actor itself produces current snapshots. It does not send alerts or calculate historical changes.

Classification and location export

Use a code or descriptive text in classifications, such as BC: BUILDING CONSTRUCTION, and optionally combine it with cities or states. The roster includes Alabama-licensed contractors with out-of-state business addresses, so states: ["AL"] is a meaningful additional filter rather than an assumed default.

Integrations

Connect the dataset to:

  • Google Sheets or Microsoft Excel for vendor review;
  • webhooks for an internal onboarding pipeline;
  • Make, Zapier, or n8n for scheduled checks;
  • BigQuery, Snowflake, or another warehouse for snapshot comparison;
  • a CRM keyed by licenseNumber;
  • Python or JavaScript compliance jobs through the Apify API.

Run through the REST API

Replace <APIFY_TOKEN> with your token:

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~alabama-general-contractor-license-registry/runs?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"classifications":["BC: BUILDING CONSTRUCTION"],"states":["AL"],"includeExpired":false,"maxItems":25}'

Read items after the run succeeds from its defaultDatasetId.

Use from JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/alabama-general-contractor-license-registry').call({
licenseNumbers: ['8'],
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use from Python

from apify_client import ApifyClient
client = ApifyClient(token='YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/alabama-general-contractor-license-registry').call(run_input={
'states': ['AL'],
'expiresBefore': '2027-12-31',
'includeExpired': False,
'maxItems': 50,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use with MCP and AI clients

Add the remote Apify MCP server to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/alabama-general-contractor-license-registry"

Claude Desktop, Cursor, and VS Code setup

Use this same remote-server JSON in Claude Desktop, Cursor, or VS Code (in the MCP servers section supported by that client):

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/alabama-general-contractor-license-registry"
}
}
}

Example prompts:

  • “Find the Alabama LBGC record for license 8 and summarize its expiration and classifications.”
  • “Export 50 active Alabama-address building contractors for vendor review.”
  • “Return licenses effective on or before 2027-12-31 so I can prepare a review list.”

Treat AI conclusions separately from the official fields returned by the Actor.

Reliability and failure behavior

The Actor uses the official downloadable roster rather than thousands of detail-page requests. It validates the HTTP status and expected CSV header before accepting data. Transient transport failures receive bounded retries within one coherent datacenter proxy session.

A recognizable but empty filtered result succeeds with zero dataset rows. An invalid input, unreachable source after retries, or unexpected response shape fails the run rather than silently returning a misleading empty dataset.

Limitations

  • Coverage is limited to the roster published by Alabama LBGC.
  • licenseStatus is derived from published dates; the CSV has no separate standing field.
  • UNKNOWN means no parseable effective date was available.
  • The source can change columns, availability, or records without notice.
  • Classification splitting is a convenience view; specialty preserves the complete source text.
  • The Actor does not provide disciplinary history, bonds, insurance, or residential home-builder records.
  • The Actor returns snapshots, not built-in change alerts.

Responsible use and legality

The source is a public professional-license roster. Use the data for lawful verification, research, procurement, and compliance purposes. Follow applicable privacy, employment, credit, insurance, anti-discrimination, retention, and notice requirements. Do not treat an automated match or no-match as the sole basis for a consequential decision. Consult the Alabama board when authoritative confirmation is required.

Troubleshooting

Why did I receive zero records?

Check whether exact filters are too narrow. licenseNumbers, cities, and states require exact case-insensitive values; company and classification values are substring filters. Try one filter at a time.

Why does a license show EXPIRED?

The Actor compares the later of expiration and extension with the run date. Review both date fields and confirm consequential decisions with LBGC.

Why did source access fail?

Keep the default Apify Proxy configuration enabled. The Actor fails explicitly if the official state host remains unavailable or stops returning its expected CSV.

Can I download the entire roster?

Yes. Leave filters empty and increase maxItems up to 20,000. The current roster size can change; pay-per-record billing applies to the output.

FAQ

How current are the results?

Each run downloads the official roster at run time. retrievedAt records when that snapshot was obtained.

Are extension dates respected?

Yes. effectiveExpirationDate uses the later of expiration and extension, and status/cutoff filtering uses that effective date.

Can I filter several companies or classifications at once?

Yes. Values in the same array use OR logic; filters across fields use AND logic.

Is a no-match definitive evidence that a contractor is unlicensed?

No. It only means the current official roster returned no row matching the supplied filters. Check spelling and contact LBGC for authoritative confirmation.

Use a state-specific Actor because agencies publish different fields and license populations.