# E-rate Incumbent Provider & Contract Expiry Lookup (`hamsmoothie/erate-incumbent-provider-lookup`) Actor

Who provides internet, WAN or voice to a school district or library, and when that E-rate contract expires. One row per FCC Form 471 funding request (FRN) from USAC Open Data: incumbent vendor, contract number, expiration date, bid count, discount rate and committed dollars. Look up by BEN, by…

- **URL**: https://apify.com/hamsmoothie/erate-incumbent-provider-lookup.md
- **Developed by:** [Maybe Quark](https://apify.com/hamsmoothie) (community)
- **Categories:** Other, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$50.00 / 1,000 frn row (one form 471 funding request)s

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

## E-rate Incumbent Provider and Contract Expiry Lookup (USAC Form 471 FRN)

**E-rate Incumbent Provider Lookup** answers "who provides internet to a school district or library, and when does that E-rate contract expire?" in one call from USAC's public FCC Form 471 FRN Status data. Give it a Billed Entity Number (BEN), an applicant name, or a state plus a date window, and get one clean row per funding request (FRN): incumbent service provider, contract number, contract expiration date, bid count, discount rate, pre-discount cost, committed dollars and FRN status. A free `SUMMARY` row rolls it up to incumbents and the next expiry date. No login, no API key, no personal contact fields.

### Input

Three modes: `ben`, `name` and `expiring`. This example lists every Texas internet-access contract expiring before July 2027:

```json
{
  "mode": "expiring",
  "state": "TX",
  "expiring_before": "2027-06-30",
  "service_type": "Data Transmission and/or Internet Access",
  "max_rows": 1000
}
```

- `mode`: `ben` (every FRN for one BEN, default), `name` (every FRN whose applicant name contains `organization_name`), or `expiring` (every FRN in a state whose contract expires in a window).
- `ben`: USAC Billed Entity Number (default `141146`, Midway ISD, TX). `organization_name`: case-insensitive substring.
- `state`: two-letter code for `expiring` mode (default `TX`). `expiring_after` / `expiring_before`: window start and end; defaults are today and one year from today.
- `funding_years`: for example `["2025", "2026"]`; empty means all (2016 onward).
- `service_type`: one of `Data Transmission and/or Internet Access`, `Internal Connections`, `Basic Maintenance of Internal Connections`, `Managed Internal Broadband Services`, `Voice Services`; empty means all.
- `form_version`: `current` (one row per FRN, default), `original` or `all`.
- `include_line_items`: add speed, function and product columns, one extra request per FRN (default false).
- `max_rows`: stop after this many rows (default 500, hard cap 5000).

### Output

One row per FRN. Real example row (BEN 141146):

```json
{
  "type": "FRN",
  "frn": "2699035597",
  "funding_year": 2026,
  "form_version": "Current",
  "organization_name": "Midway Indep School District",
  "ben": "141146",
  "state": "TX",
  "applicant_type": "School District",
  "form_471_service_type_name": "Data Transmission and/or Internet Access",
  "spin_name": "Grande Communications Networks, LLC",
  "contract_number": null,
  "contract_type_name": "Contract",
  "contract_expiration_date": "2029-06-30",
  "extended_expiration_date": "2034-06-30",
  "service_start_date": "2026-07-01",
  "award_date": "2026-03-18",
  "bid_count": 6,
  "has_voluntary_extension": "Yes",
  "remaining_extension_count": 5,
  "total_pre_discount_costs": 29100,
  "dis_pct": 0.6,
  "funding_commitment_request": 17460,
  "frn_status": "Funded",
  "frn_record_url": "https://opendata.usac.org/resource/qdmp-ygft.json?funding_request_number=2699035597",
  "retrieved_at": "2026-10-14T12:14:25.222Z"
}
```

Rows also carry `establishing_form_470`, monthly and one-time costs, `total_authorized_disbursement`, `pending_reason`, `nickname`, `narrative`, `application_number` and `source_url`; shortened here. The last row is a `SUMMARY` with the BENs, incumbents (FRN count, latest expiry, total commitment) and `next_expiry_date`.

### Use cases

Search phrases this actor is built for:

- **"E-rate: who provides internet to a school district"**: run `ben` or `name` mode on the district and read `spin_name`.
- **"E-rate contract expiration date by school district"**: run `expiring` mode for a state and window to build a list before Form 470 season.
- **"USAC Form 471 funding request incumbent vendor lookup"**: use `name` mode on "County Library" or "Unified School District" to see which carriers dominate a region and how many bids each FRN drew.

Typical users are telecom and managed-services sales teams, E-rate consultants and AI agents prospecting the E-rate market.

### Pricing

Pay per result: $0.05 per FRN row returned ($50 per 1,000). The `SUMMARY` row is free. A typical single-district lookup is 20 to 80 rows, under $4. Set a maximum charge on the run for a hard ceiling.

### Limits

- Data is USAC Open Data (dataset `qdmp-ygft`, plus `hbj5-2bpj` for line items), refreshed by USAC nightly. Contact-person names and e-mails in the source are dropped.
- `contract_expiration_date` excludes voluntary extensions; `extended_expiration_date` includes them.
- `max_rows` is capped at 5,000 per run. `spin_name` can be empty for cancelled FRNs or unregistered SPINs.

### FAQ

**What is an FRN?** A Funding Request Number: one line of a Form 471 asking for an E-rate discount on a specific contract with a specific provider.

**What is a BEN?** The Billed Entity Number, USAC's ID for the applicant. Find it with `name` mode; the SUMMARY row lists matching BENs.

**Why does USAC show twice as many rows?** USAC publishes Original and Current versions of each FRN. This actor returns Current by default, one row and one charge per FRN.

# Actor input Schema

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

ben = every FRN for one Billed Entity Number. name = every FRN whose applicant name contains organization_name. expiring = every FRN in a state whose contract expires between expiring_after and expiring_before.

## `ben` (type: `string`):

USAC Billed Entity Number of the school district, school, library or consortium. Used in ben mode. Default 141146 = Midway ISD, TX.

## `organization_name` (type: `string`):

Case-insensitive substring of the applicant's organization name, e.g. 'Midway Indep School District' or 'Houston'. Used in name mode. If several BENs match, every FRN is returned and the BENs are listed in the SUMMARY row.

## `state` (type: `string`):

Two-letter state code, used in expiring mode.

## `expiring_after` (type: `string`):

Start of the expiry window in expiring mode. Leave empty for today.

## `expiring_before` (type: `string`):

End of the expiry window in expiring mode. Leave empty for one year from today.

## `funding_years` (type: `array`):

Restrict to these E-rate funding years, e.g. 2025, 2026. Leave empty for all years (2016 onward).

## `service_type` (type: `string`):

Restrict to one Form 471 service type. Leave empty for all.

## `form_version` (type: `string`):

USAC publishes two rows per FRN: Original (as filed) and Current (after corrections and commitment). Current gives one row per FRN. 'all' returns both.

## `include_line_items` (type: `boolean`):

Also query the Form 471 line-item dataset for each FRN and add download/upload speed, function, product and purpose columns. Slower (one extra request per FRN); off by default.

## `max_rows` (type: `integer`):

Stop after this many FRN rows (hard cap 5000). The free SUMMARY row is not counted.

## Actor input object example

```json
{
  "mode": "ben",
  "ben": "141146",
  "organization_name": "Midway Indep School District",
  "state": "TX",
  "funding_years": [],
  "service_type": "",
  "form_version": "current",
  "include_line_items": false,
  "max_rows": 500
}
```

# Actor output Schema

## `results` (type: `string`):

One row per Form 471 funding request plus a final SUMMARY row (type = SUMMARY) with incumbents and next expiry; download as JSON, CSV or Excel.

# 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 = {
    "organization_name": "Midway Indep School District"
};

// Run the Actor and wait for it to finish
const run = await client.actor("hamsmoothie/erate-incumbent-provider-lookup").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 = { "organization_name": "Midway Indep School District" }

# Run the Actor and wait for it to finish
run = client.actor("hamsmoothie/erate-incumbent-provider-lookup").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 '{
  "organization_name": "Midway Indep School District"
}' |
apify call hamsmoothie/erate-incumbent-provider-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hamsmoothie/erate-incumbent-provider-lookup"
        }
    }
}
```

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/246FsYacjd3ut7Jb0/builds/cnKf0GI0Tt1LbWpEl/openapi.json
