# Gulf Coast USACE Permits & Wetland Determinations Monitor (`maniginam/gulf-coast-usace-permits`) Actor

Search U.S. Army Corps of Engineers regulatory permits, pending applications, and approved wetland jurisdictional determinations across the New Orleans, Galveston, Mobile, Jacksonville, and Vicksburg districts, or monitor new and changed records on a schedule.

- **URL**: https://apify.com/maniginam/gulf-coast-usace-permits.md
- **Developed by:** [Gina Martiny](https://apify.com/maniginam) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 usace 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.

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

## Gulf Coast USACE Permits & Wetland Determinations Monitor

Search U.S. Army Corps of Engineers regulatory permit decisions, pending permit applications, and approved wetland jurisdictional determinations across the five Gulf Coast districts: New Orleans, Galveston, Mobile, Jacksonville, and Vicksburg.  Turn on monitor mode and schedule it to get only new and changed records since your last run.

### What does it do?

This Actor reads the public USACE Regulatory Program data that powers the Corps' ORM public permit viewer, and returns one clean record per permit decision, application, or determination.  Each record has the Department of the Army number, district, applicant, project name, permit type, status or action taken, the key dates, coordinates, a link to the published basis form when there is one, and a direct link to the record in the USACE viewer.

Besides permits and jurisdictional determinations, it also covers Section 408 permission requests, Section 214 and Gulf restoration funded actions, NEPA environmental assessments and impact statements, and emergency or natural disaster actions.  About 31,700 records are available across the five districts.  There is no browser, no proxy, and no login involved.

### Who is it for?

- Environmental and wetland consultants tracking Section 404 and Section 10 decisions near client sites.
- Developers, pipeline and energy companies, and port authorities watching competitors' and neighbors' permits.
- Land and title professionals, lenders, and buyers checking whether a tract has an approved jurisdictional determination.
- Coastal restoration, dredging, and marine contractors looking for newly permitted work.
- Journalists, parish and county governments, and advocacy groups following coastal and wetland impacts.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `districts` | list of districts | `MVN` New Orleans, `SWG` Galveston, `SAM` Mobile, `SAJ` Jacksonville, and `MVK` Vicksburg.  Empty means all five. |
| `recordTypes` | list of record types | `issued` final permit decisions, `pending` permit applications, `jds` approved jurisdictional determinations, `s408` Section 408 requests, `wrda` Section 214 funded actions, `dwhs` Gulf restoration funded actions, `nepa_ea` and `nepa_eis` NEPA documents, and `emergency` actions.  Empty means `issued`, `pending`, and `jds`. |
| `dateFrom` | date | Earliest action date, `YYYY-MM-DD`.  See `actionDateMeaning` below for what the date is for each record type. |
| `dateTo` | date | Latest action date, `YYYY-MM-DD`, inclusive. |
| `permitTypes` | list of permit types | Keep only these permit types, for example `Standard Permit` or `Letter of Permission`.  Only permit decisions and applications have a permit type. |
| `statusContains` | text | Case-insensitive text that must appear in the status, for example `Issued`, `Denied`, or `Withdrawn`.  Letters, digits, spaces, and `( ) / , . -`, up to 80 characters. |
| `keyword` | text | Words that must appear somewhere in the record, such as an applicant, project, or parish name.  Up to 8 words, case-insensitive. |
| `boundingBox` | text | Optional area as `west,south,east,north` in decimal degrees, for example `-94.1,28.9,-88.8,33.1`. |
| `maxResults` | number | Most records to publish in one run.  Default 1000, maximum 50,000. |
| `onlyNewOrChanged` | true or false | Monitor mode.  Outputs only records that are new or changed since the previous run of the same search. |

Record types are searched in the order listed above.  Within a record type, USACE groups records by district and, for permit decisions, applications, determinations, Section 408 requests, and funded actions, lists each district newest first.  Environmental assessments and emergency actions come in the order USACE stores them.  Because of that grouping, a small `maxResults` across several districts can fill up from the first district alone, so run one district at a time when you want the latest few records from each.

Sample input:

```json
{
  "districts": ["MVN", "SWG"],
  "recordTypes": ["issued", "jds"],
  "dateFrom": "2026-01-01",
  "keyword": "Cameron",
  "maxResults": 500
}
```

### Output

Each record is one dataset item.  This is a real approved jurisdictional determination from the New Orleans District:

```json
{
  "recordType": "jds",
  "recordTypeLabel": "Approved jurisdictional determination",
  "identifier": "MVN-2026-00538-SG",
  "daNumber": "MVN-2026-00538-SG",
  "districtCode": "MVN",
  "districtName": "New Orleans",
  "applicant": null,
  "projectName": "Bass, Installation of a water line from Muddy Creek Road to Diaz Road- Ascension",
  "permitType": null,
  "status": "Approved",
  "jdType": "PRE2015_POSTSACKETT",
  "actionDate": "2026-09-14",
  "actionDateMeaning": "determination",
  "dateReceived": null,
  "publicNoticeDate": null,
  "finalEaPublicationDate": null,
  "fundingSource": null,
  "event": null,
  "county": null,
  "state": null,
  "civilWorksProject": null,
  "reviewCategory": null,
  "locationName": null,
  "regulatoryPermitId": null,
  "documentUrl": "http://www.mvn.usace.army.mil/Portals/56/docs/regulatory/BasisForms/2026-00538-SG-Basis.pdf",
  "latitude": 30.33696,
  "longitude": -90.91483,
  "actionCount": 1,
  "viewerUrl": "https://permits.ops.usace.army.mil/orm-public?type=jds&q=MVN-2026-00538-SG",
  "sourceFields": {
    "vdate": "20260914",
    "jdType": "PRE2015_POSTSACKETT",
    "vtype": "jds",
    "daNumber": "MVN-2026-00538-SG",
    "identifier": "MVN-2026-00538-SG",
    "district": "New Orleans",
    "org": "MVN",
    "projectName": "Bass, Installation of a water line from Muddy Creek Road to Diaz Road- Ascension",
    "displayDate": "09/14/2026",
    "ajdUrl": "http://www.mvn.usace.army.mil/Portals/56/docs/regulatory/BasisForms/2026-00538-SG-Basis.pdf",
    "dtype": "DAJ",
    "count": "1"
  },
  "changeType": "notTracked"
}
```

You can download results as JSON, CSV, Excel, or XML, or read them through the Apify API.

- `identifier` is unique within a record type.  The same Department of the Army number can appear as both a pending application and a final decision, once per `recordType`.
- `actionDate` is the main date of each record, and `actionDateMeaning` says what it is: `decision` for permit decisions, `received` for pending applications, `determination` for jurisdictional determinations, `submitted` for Section 408 requests, `action` for funded actions and impact statements, `finalEaPublished` for environmental assessments, and `eventBegin` for emergency actions.
- `status` is the action taken as USACE publishes it, such as `Issued With Special Conditions` or `Withdrawn`.  Pending applications read `Pending` and approved jurisdictional determinations read `Approved`.
- `sourceFields` keeps the raw published fields, so nothing USACE provides is lost.
- `changeType` is `new` or `changed` in monitor mode and `notTracked` otherwise.
- Dates are calendar days, `YYYY-MM-DD`.  A value the source stores in an unusable form comes through as null instead of stopping the run.

### Monitor mode

Set `onlyNewOrChanged` to true and add a schedule, for example every weekday at 7 AM Central.  The Actor remembers each record's status, action date, permit type, determination type, public notice date, final EA date, and document link for that exact search in a named key-value store.  The first run outputs every matching record as `new`.  Later runs output only new records and records where one of those fields changed.  Unchanged records are skipped and you are not charged for them.

A few things are worth knowing before you rely on it:

- History is keyed on the districts, record types, dates, permit types, status text, keyword, and area of the search.  Order and letter case do not matter, and neither does `maxResults`.  If you change any of those filters, including a "from" date that you move forward each week, the Actor starts a fresh history and reports every matching record as `new` again.  Keep the filters fixed for a monitor.
- Each run stops after publishing `maxResults` records, so set it high enough to cover a busy week.
- A change to the applicant or project name alone does not count as a change.
- Two schedules running the same search at the same time share one history, and the run that finishes last wins.
- Each search's history holds the 100,000 records delivered most recently, about three times every record USACE publishes.  Past that, the record delivered longest ago is forgotten and would be reported as `new` if it ever came back.

### Pricing

This Actor uses pay-per-event pricing.

- **USACE permit record:** $5.00 per 1,000 records delivered to your dataset ($0.005 each).
- **Actor start:** Apify's standard start event ($0.00005).
- There is no separate charge per dataset item.

A daily monitor for one district usually delivers a handful of new records, so it costs pennies a month.  The default search (permit decisions, applications, and jurisdictional determinations in all five districts) is about 22,300 records, or about $111.  Every record type in every district is about 31,700 records, or about $158.  You can cap any run with `maxResults` or Apify's maximum charge setting.  The Actor stops cleanly when your limit is reached, and you are only charged for records that actually reach your dataset.

#### Estimated compute cost

Default memory is 512 MB.  A small filtered run (about 20 records) typically finishes in under a minute and costs well under $0.01 in Apify compute on top of the event charges.  The Actor reads up to 1,000 records per request and waits at least one second between requests, so a full pull of about 31,700 records is usually a few minutes at 512 MB, on the order of $0.02 to $0.10 in compute depending on USACE response times, plus about $158 in usace-permit-record events.

### Data source and freshness

Data comes from the U.S. Army Corps of Engineers Regulatory Program, through the public search service behind the ORM (OMBIL Regulatory Module) public permit viewer at `https://permits.ops.usace.army.mil/orm-public`.  USACE refreshes the public index daily, so a decision or determination usually appears within a day or two of being finalized.  The public data is what USACE chooses to publish, not the complete regulatory file, so some actions (for example many general permit verifications and preliminary jurisdictional determinations) never appear.

The service does not filter by area, received date, or emergency event date, so the Actor applies the area and those dates itself after reading each page.  Records outside your filters are read but never published or charged.

If the USACE service is down or blocks the request, the run retries politely, then fails with a short message and keeps every record it already delivered.  If the service asks the run to wait more than a minute, it stops at once rather than sit idle.  Run it again later.

Source endpoint: `https://permits.ops.usace.army.mil/orm-public-api/permits/search`

### Is it legal to use this data?

The Actor reads public records that the U.S. Army Corps of Engineers publishes for anyone to view, through the same public service that powers the USACE permit viewer.  Works of the U.S. federal government are generally not subject to copyright.  The data is provided as is, without any guarantee that it is complete or current.  It is not a jurisdictional determination, permit, or legal advice, so confirm anything important with the USACE district office or the official record.  This Actor is an independent tool and is not affiliated with or endorsed by the U.S. Army Corps of Engineers or the Department of the Army.

### FAQ

**Do I need a USACE account or API key?**  No.  The Actor reads the same public service that powers the USACE permit viewer.

**Which district covers my site?**  New Orleans (`MVN`) covers southern Louisiana, Galveston (`SWG`) covers coastal Texas, Mobile (`SAM`) covers Alabama, coastal Mississippi, and the Florida panhandle, Jacksonville (`SAJ`) covers peninsular Florida, and Vicksburg (`MVK`) covers Mississippi, northern Louisiana, and southern Arkansas.  Pick several if you are near a boundary, or set `boundingBox` to your area.

**Why is a permit I know about missing?**  USACE publishes only part of its regulatory workload, and districts can take a while to post an action.  If the record is not in the USACE permit viewer, this Actor cannot see it either.

**What is an approved jurisdictional determination?**  It is the Corps' official finding of whether a site has wetlands or other waters regulated under the Clean Water Act or the Rivers and Harbors Act.  `jdType` says which rule it was made under, and `documentUrl` links to the basis form when the district published one.

# Actor input Schema

## `districts` (type: `array`):

Pick one or more Gulf Coast Corps districts: MVN New Orleans (Louisiana), SWG Galveston (coastal Texas), SAM Mobile (Alabama, Mississippi coast, and the Florida panhandle), SAJ Jacksonville (peninsular Florida), and MVK Vicksburg (Mississippi, north Louisiana, and south Arkansas).  Leave empty to search all five.

## `recordTypes` (type: `array`):

Which USACE public records to search.  Leave empty for final permit decisions, pending applications, and approved jurisdictional determinations.

## `dateFrom` (type: `string`):

Earliest action date (YYYY-MM-DD).  The action date is the decision date for permits, the determination date for jurisdictional determinations, the received date for pending applications, and the event begin date for emergency actions.  Records with no action date are left out when a date range is set.  Leave empty for no lower bound.

## `dateTo` (type: `string`):

Latest action date (YYYY-MM-DD), inclusive.  Leave empty for no upper bound.

## `permitTypes` (type: `array`):

Keep only these permit types.  Applies to permit decisions and pending applications; other record types have no permit type and are left out when this is set.  Leave empty for all.

## `statusContains` (type: `string`):

Case-insensitive text that must appear in the record status, for example Issued, Denied, Withdrawn, or Under Construction.  Letters, digits, spaces, and ( ) / , . - only, up to 80 characters.  Leave empty for all statuses.

## `keyword` (type: `string`):

Words that must appear somewhere in the record, such as an applicant, project, or parish name (for example Cameron or pipeline).  Matching is case-insensitive and every word must match.  Up to 8 words.  Leave empty for no keyword filter.

## `boundingBox` (type: `string`):

Optional area as west,south,east,north in decimal degrees, for example -94.1,28.9,-88.8,33.1 for Louisiana.  Records without coordinates are left out when an area is set.  Leave empty for the whole district.

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

Upper limit on records published in this run.  USACE lists records district by district, newest first within each district for permits, applications, and determinations.  Each published record is charged as one usace-permit-record event.

## `onlyNewOrChanged` (type: `boolean`):

When on, the Actor remembers each record's status, action date, permit type, determination type, public notice date, final EA date, and document link for this exact search, and outputs only records that are new or changed since the previous run.  Unchanged records are skipped and not charged.  Use it with a schedule.

## Actor input object example

```json
{
  "districts": [
    "MVN"
  ],
  "recordTypes": [
    "issued",
    "pending",
    "jds"
  ],
  "dateFrom": "2026-01-01",
  "maxResults": 1000,
  "onlyNewOrChanged": false
}
```

# Actor output Schema

## `results` (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 = {
    "districts": [
        "MVN"
    ],
    "recordTypes": [
        "issued",
        "pending",
        "jds"
    ],
    "dateFrom": "2026-01-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maniginam/gulf-coast-usace-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 = {
    "districts": ["MVN"],
    "recordTypes": [
        "issued",
        "pending",
        "jds",
    ],
    "dateFrom": "2026-01-01",
}

# Run the Actor and wait for it to finish
run = client.actor("maniginam/gulf-coast-usace-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 '{
  "districts": [
    "MVN"
  ],
  "recordTypes": [
    "issued",
    "pending",
    "jds"
  ],
  "dateFrom": "2026-01-01"
}' |
apify call maniginam/gulf-coast-usace-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maniginam/gulf-coast-usace-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/dti2zmKFqvT8w5V4I/builds/d0auoQZ2hcbKcSH7C/openapi.json
