# East Baton Rouge Building Permits - Contractor & Value (`j0401/ebr-building-permits`) Actor

East Baton Rouge Parish building permits (143,986, 2011 to today): type, residential or commercial, declared project value and fee, square footage, address, and the named contractor plus owner and applicant.

- **URL**: https://apify.com/j0401/ebr-building-permits.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 east baton rouge building permit records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## East Baton Rouge Building Permits - Contractor, Owner & Value

Every building permit East Baton Rouge Parish has issued - Baton Rouge, Baker,
Zachary and the surrounding area - straight from the City-Parish's own open
data portal. **~144k permits** (as of 2026-09-28), from 2011 to this week,
each carrying a named contractor and a named owner or applicant on most rows.

### Low cost

**From $0.00005 per record, down to $0.00003 at Gold.** Pay only for the
records you actually receive - the whole register stays queryable, you are
never billed for the scan behind it.

### What you get

- **Which permit** - the permit number and the permit type (New Building,
  Electrical, Occupancy, Gas Test, Plumbing, Remodel, Demolition, Fence,
  Swimming Pool, Sign, ), plus the residential/commercial designation
- **What the work is** - the project description, the subdivision and lot
  number, and the square footage
- **How much** - the declared project value and the permit fee
- **Where** - the full address and the street address, city, state and ZIP,
  plus latitude and longitude on the permits that carry coordinates
- **Who** - the **contractor** (named on most rows - ~44% are the placeholder
  `N/A` for owner-issued permits) plus the **owner** and the
  **applicant** where the source records them, with the contractor's address

### Modes

- **rows** (default) - permits matching your filters
- **aggregate** - counts by permit type or designation

### Filters

Permit number, permit type, designation, contractor name, owner name, applicant
name, street address, subdivision, city, ZIP, a project-value range, and an
issue-date range.

### Example inputs

**One contractor's new-builds**

```json
{ "contractorName": "D.R. Horton", "permitType": "New Building", "maxResults": 50 }
```

**Commercial projects above $1M**

```json
{ "designation": "Commercial", "minProjectValue": 1000000, "maxResults": 25 }
```

**All permits in one subdivision**

```json
{ "subdivision": "CHEVAL POINT", "maxResults": 100 }
```

**What was issued last month**

```json
{ "issuedFrom": "2026-08-01", "issuedTo": "2026-08-31", "maxResults": 200 }
```

**One permit by number**

```json
{ "permitNumber": "186061" }
```

**Permit volume by type**

```json
{ "mode": "aggregate", "groupBy": "permitType" }
```

### Example output

**One permit** - `permitNumber=186061`:

```json
{
 "platform": "ebr-building-permits",
 "source": "east-baton-rouge-parish-building-permits",
 "mode": "rows",
 "recordType": "permit",
 "groupKey": "",
 "groupCount": "",
 "groupBy": "",
 "permitId": "18508237",
 "permitNumber": "186061",
 "permitType": "New Building Permit (R)",
 "designation": "Residential",
 "description": "New single-family residential construction, Cheval Point Lot 100,; LA Plans LLC - Residential License RL.05808",
 "lotNumber": "100",
 "subdivision": "CHEVAL POINT",
 "squareFootage": "3192",
 "projectValue": "300000",
 "permitFee": "0",
 "creationDate": "2026-09-08",
 "issuedDate": "2026-09-25",
 "address": "7013 ARDENNES DR BATON ROUGE LA 70820",
 "streetAddress": "7013 ARDENNES DR",
 "city": "BATON ROUGE",
 "state": "LA",
 "zip": "70820",
 "parish": "East Baton Rouge",
 "ownerName": "",
 "applicantName": "Jeffery Vaccaro",
 "contractorName": "LA Plans LLC",
 "contractorAddress": ", Baton Rouge, LA 70810",
 "latitude": "30.377788497313698",
 "longitude": "-91.221329500538403",
 "sourceUpdatedAt": "2026-09-25"
}
```

**`mode=aggregate`, `groupBy=permitType`** - one count row per permit type:

```
Occupancy Permit (C)                24,579
Occupancy Permit (R)                14,613
Electrical Permit (R)               14,419
New Building Permit (R)             13,486
Gas Test Permit (R)                 12,378
Existing Bldg - Remodel Only (R)     9,858
Generator Permit (R)                 9,391
```

### Notes on the data, from the source

- **The contractor column is filled on every row - but 44% of those are the
  placeholder `N/A`** (63,308 of ~144k), because the permit was pulled by the
  owner rather than a contractor. "Homeowner" (1,862 rows) is the other
  self-issued spelling. The column is served as the source stores it; a
  contractor search returns real contractors, and the `N/A` rows are what an
  owner-issued permit looks like here.
- **The three money and size columns are frequently ZERO, and zero is
  indistinguishable from "not recorded".** The declared project value is 0 on
  80,095 rows (55.6%), the permit fee on 57,311 (39.8%) and the square footage
  on 100,027 (69.5%). That is why the value filter is a range
  (`minProjectValue` / `maxProjectValue`) rather than a "has a value" switch,
  and why nothing here treats a 0 as a recorded zero-dollar project.
- **The city is the same place spelled several ways** - "BATON ROUGE" on
  110,268 rows, "Baton Rouge" on 24,758, "baton rouge" on 267 and "BATONROUGE"
  on 38, plus Zachary, Baker, Pride, Greenwell Springs, Slaughter, and 2,142
  blanks. The city filter ignores case and matches anywhere in the value, so
  any spelling finds its permits; without that, a search would silently miss
  three-quarters of the city.
- **The permit number is not unique.** 591 permit numbers appear on more than
  one row (the most-shared appears 52 times) because one permit can carry
  several lines. The row is the unit here, and this actor returns all ~144k
  of them.
- **The owner is blank on 42,573 rows and the applicant on 29,386** - both are
  still usable filters, but a share of the register names no owner.
- **Two columns are single-valued and therefore not offered as filters**: the
  parish is "East Baton Rouge" on all ~144k rows and the state is "LA" on
  143,948.
- Invalid filter inputs (a `%` in a search, a non-numeric permit number, a
  negative project value, a malformed date) are rejected rather than passed to
  the source.

### Coverage and freshness

East Baton Rouge Parish building permits, all ~144k records, kept current by
the City-Parish. The newest permit issue date at the time of writing was
2026-09-25. Every record carries `sourceUpdatedAt`; the actor also carries a
count guard and a whole-corpus field-coverage guard, so a source that collapses
or changes shape fails loudly instead of returning an empty page as success.

# Actor input Schema

## `mode` (type: `string`):

rows = records matching your filters (default). aggregate = one count row per group (see groupBy).

## `permitNumber` (type: `string`):

Exact permit number, e.g. '186061'. Blank = any.

## `permitType` (type: `string`):

Substring, e.g. 'New Building', 'Electrical', 'Occupancy', 'Demolition'.

## `designation` (type: `string`):

Exact 'Residential' or 'Commercial'. Blank = any.

## `contractorName` (type: `string`):

Contractor substring, e.g. 'D.R. Horton'. Note 44% of permits carry the placeholder 'N/A' - those are owner-issued. Blank = any.

## `ownerName` (type: `string`):

Owner name substring. Blank = any.

## `applicantName` (type: `string`):

Applicant name substring. Blank = any.

## `address` (type: `string`):

Street address substring. Blank = any.

## `subdivision` (type: `string`):

Subdivision substring. Blank = any.

## `city` (type: `string`):

City substring. The source spells one city several ways, so this match ignores case, e.g. 'BATON ROUGE'. Blank = any.

## `zip` (type: `string`):

ZIP, matched as a prefix. Blank = any.

## `minProjectValue` (type: `number`):

Lowest declared project value, inclusive. Note 55.6% of permits record 0 - that is 'not recorded', not a zero-dollar project. Leave blank for any.

## `maxProjectValue` (type: `number`):

Highest declared project value, inclusive. Leave blank for any.

## `issuedFrom` (type: `string`):

Earliest issue date (YYYY-MM-DD). Blank = any.

## `issuedTo` (type: `string`):

Latest issue date (YYYY-MM-DD), inclusive. Blank = any.

## `maxResults` (type: `integer`):

Maximum records to return in rows mode (1-10000). Default 50.

## `groupBy` (type: `string`):

aggregate mode only: the dimension to count by.

## Actor input object example

```json
{
  "mode": "rows",
  "permitNumber": "",
  "permitType": "",
  "designation": "",
  "contractorName": "",
  "ownerName": "",
  "applicantName": "",
  "address": "",
  "subdivision": "",
  "city": "",
  "zip": "",
  "issuedFrom": "",
  "issuedTo": "",
  "maxResults": 50,
  "groupBy": "permitType"
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

East Baton Rouge building permits - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/ebr-building-permits").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/ebr-building-permits").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 '{}' |
apify call j0401/ebr-building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/ebr-building-permits"
        }
    }
}
```

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/BCIOh85XRJ7Dh7WwP/builds/y1CvQddCy0EWWrjuY/openapi.json
