# USAC E-Rate School & Library Buyer Intelligence (`afkdigital/usac-erate-school-library-buyer-intelligence`) Actor

Official USAC Form 470 school/library network demand and original Form 471 requested funding. Separate modes, verified joins, public form contacts, provenance and Clay/n8n JSON/CSV. USD 7.50 per 1,000 unique records.

- **URL**: https://apify.com/afkdigital/usac-erate-school-library-buyer-intelligence.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$7.50 / 1,000 unique e-rate output 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

## USAC E-Rate School & Library Buyer Intelligence

Research school and library network demand using official USAC public data. Export certified Form 470 service requests or original Form 471 funding requests as clean JSON and CSV for Clay, n8n, spreadsheets and procurement analysis.

**Two separate modes, with explicit financial meaning.** Form 470 identifies certified competitive-bidding filings. Form 471 describes requested funding after services have been selected; it is funding history, not a current open tender.

### Quick start

Default example: 25 certified Form 470 applications for funding year 2027, all states and service categories. The verified local example completed in about 25 seconds including independent source comparisons; runtime varies with USAC availability.

```json
{
  "recordMode": "470",
  "fundingYear": 2027,
  "state": "TX",
  "serviceCategory": "C2",
  "minRequestedAmount": 0,
  "maxResults": 25,
  "maxChargeUsd": 1,
  "maxRuntimeSecs": 240
}
```

For funding history, choose a year with Form 471 filings:

```json
{
  "recordMode": "471",
  "state": "TX",
  "fundingYear": 2026,
  "serviceCategory": "C2",
  "minRequestedAmount": 1000,
  "maxResults": 25,
  "maxChargeUsd": 1
}
```

### Inputs

| Input | Default | Meaning |
| --- | --- | --- |
| recordMode | 470 | 470 or 471. One form type per run. |
| state | empty | Two-letter state/territory code, case insensitive. Empty means all states. |
| fundingYear | 2027 | Funding year, not filing date. Supported source coverage begins in 2016. Choose 2026 for current Form 471 history. |
| serviceCategory | ALL | ALL, C1 or C2. C1 means connectivity; C2 means internal connections, maintenance and managed internal broadband. |
| minRequestedAmount | 0 | Minimum requested discounted USD support per original FRN, only in 471 mode. Positive values in 470 mode fail validation. |
| maxResults | 25 | Maximum unique applications (470) or FRNs (471), up to 10,000. |
| maxChargeUsd | 1 | Additional event-cost limit, from USD 0 to USD 75. |
| maxRuntimeSecs | 240 | Extraction deadline, 10–900 seconds. Source timeouts or refreshes fail the run with delivered output retained. |

### What counts as one result?

| Mode | Output unit and deduplication key | Source version |
| --- | --- | --- |
| 470 | One application, key 470:funding_year:application_number | Current, Certified only |
| 471 | One funding request, key 471:funding_year:application_number:funding_request_number | Original (as certified) |

Form 470 service lines and RFP attachments can produce many raw rows. This Actor groups the matched rows into one application with a deduplicated service_requests array. Each service retains its ID, type, function, quantity, units, capacity and RFP URLs. If serviceCategory is selected, only matched category services are included.

Form 471 Basic Information is a many-to-one lookup using application number, funding year, form version and verified billed entity number. Identical duplicate Basic rows collapse. Conflicting matches fail rather than multiplying FRN records. No recipient-of-service or line-item join expands the output.

Form 470 and Form 471 application numbers are different namespaces. They are never joined by matching numbers. An establishing_form_470_number, if present, is exposed as a source-reported reference only; linked_470_verified is false because this Actor does not independently verify that relationship.

### Amounts and status

- Form 470 funding_request_amount_usd is always null: no bid budget is inferred from categories, quantities, historic awards or C2 program budgets.
- Form 471 funding_request_amount_usd comes only from the original FRN funding_commitment_request. USAC defines this as the discount amount after discount calculations. It is the requested discounted support in USD, not total pre-discount project value.
- Original means the form as submitted at certification. Current means the form processed by USAC. This Actor uses Original 471 values to preserve the requested amount. It does not substitute later commitment, revised or paid figures.
- status is reported from the selected source version. A Funded status does not change the amount field into an approved amount.
- A Certified Form 470 may have an expired RFP deadline or a contract already signed. Consult its RFP and procurement instructions; these results are not guaranteed open opportunities.
- Form 471 records are funding history, not fresh invitations to bid.

### Output fields

Each record includes application_number, billed_entity_name, entity_type, city_state, service_type, funding_request_amount_usd, contact_name, contact_email, contact_phone, form_type, funding_year, billed_entity_number, funding_request_number, status, source_url and fetched_at.

Additional fields explain provenance: record_key, form_version, service_category, amount_basis, contact_role, contact_phone_extension, source_updated_at and solicitation_note. Mode 470 adds service_requests, service_requests_json and allowable_contract_date. Mode 471 adds basic_join_status, basic_source_url and the source-reported 470 reference.

Missing source fields are null. No contact is guessed. The contact is the FCC form contact and may be a consultant; it is not a verified IT buyer, school employee, sales contact or purchasing decision-maker. source_updated_at is the source form modification timestamp when available, not an invented FRN update date. Dataset refresh epochs are recorded in the SUMMARY key-value record.

### Official sources and dictionaries

Verified against live USAC metadata and current attached glossaries on October 29, 2026:

- [Form 470 Tool Data — jt8s-3q52](https://opendata.usac.org/d/jt8s-3q52)
- [Form 471 FRN Status — qdmp-ygft](https://opendata.usac.org/d/qdmp-ygft)
- [Form 471 Basic Information — 9s6i-myen](https://opendata.usac.org/d/9s6i-myen)

Each dataset metadata endpoint is https://opendata.usac.org/api/views/DATASET_ID.json. Its attachments section links to the official data glossary. Data comes from the JSON SODA resource endpoint, not legacy beta APIs or browser scraping. No login, proxy, CAPTCHA bypass or Playwright is used.

The live client checks required source fields and rowsUpdatedAt. It traverses application numbers or SODA row IDs with ordered keyset pagination, checks for refreshes before delivering each batch, and refuses partial oversized detail groups. The source can be corrected by USAC and is self-reported by applicants.

### JSON, CSV, Clay and n8n

The Output tab exposes JSON, a flat CSV view and the run summary. Raw JSON retains service_requests arrays. The flat view includes service_requests_json as readable JSON text in one CSV cell; service_type is a semicolon-separated summary. Nulls export as blank CSV cells.

Start an asynchronous run with POST https://api.apify.com/v2/actors/afkdigital~usac-erate-school-library-buyer-intelligence/runs and pass the example JSON. Use your Apify API token in the Authorization: Bearer header. Poll GET /v2/actor-runs/RUN_ID until SUCCEEDED. Read defaultDatasetId from that response.

- JSON: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=json
- CSV: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv\&view=clay

In n8n use HTTP Request nodes for run creation, polling and dataset retrieval. In Clay import the CSV or connect to the JSON endpoint. Keep tokens in the integration's credential store. Avoid hardcoding them into shared URLs.

### Pricing and limits

**USD 0.0075 per successfully stored unique result — USD 7.50 per 1,000.** The configured Pay-per-Event event is apify-default-dataset-item. It applies to either mode, using the record_key units above. There is no Actor start fee and standard-run platform usage is not passed through to the user.

Source requests, failed requests, retries and duplicate source rows are not output events. Within a run, duplicate keys are skipped. On resurrection, keys are restored from the existing default Dataset before extraction. Dataset insert retries are disabled. A pending-write marker is persisted before insertion. On resurrection an already visible pending record is reconciled; an unresolved pending write fails closed without another append. Wait and resurrect again to reconcile late visibility. If visibility cannot be resolved, start a separate fresh run. Initial source refresh epochs are persisted before output and must still match after resurrection; otherwise a new run is required. Separate new runs are separate deliveries and may bill for the same source record again.

The lower of maxResults, the USD input limit and the Apify run spending limit controls output. Example: 25 records cost USD 0.1875; USD 0.015 permits two records. A limit below USD 0.0075 produces zero records. Accounts may display eligible subscription discounts or owner-run accounting separately from the configured retail price.

HTTP requests are sequential, spaced at least 600 ms apart, with 30-second timeouts and up to three bounded retries for network, 429 and 5xx failures. There is a maximum 50,000-row detail-group safety cap and a runtime deadline. Select a narrower state/category/year to keep large runs fast. Empty matching queries produce no paid output.

### Data use

USAC publishes these datasets as Public Domain and its [Data Hub](https://datahub.usac.org/) permits use, reuse and redistribution. This Actor adds processing and provenance; it is not affiliated with USAC or the FCC.

Use public business contacts only for permitted E-Rate procurement and related research. [USAC's privacy policy](https://www.usac.org/about/privacy-policies/) prohibits email harvesting for bulk mailing or spam. Review the Form 470/RFP communication instructions and applicable procurement rules before contacting an applicant. This Actor does not send messages.

### Development and verification

Node 22, pinned Apify SDK, HTTP/JSON only.

```bash
npm ci
npm test
npm run live
npx apify-cli validate-schema
```

The test suite covers input validation, amount semantics, null budgets, join ambiguity, cross-form keys, retry limits, refresh detection, cursor construction, output deduplication, resurrection and result/cost limits. Live tests compare both modes to original USAC rows. Version: 1.0.1.

# Actor input Schema

## `recordMode` (type: `string`):

470 produces one application with matched service requests. 471 produces one FRN; these are funding history, not open bids.

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

Optional two-letter US state or territory code. Empty means all states.

## `fundingYear` (type: `integer`):

Funding year, not calendar filing year. Example: 2027 for Form 470; choose 2026 for currently available Form 471 history.

## `serviceCategory` (type: `string`):

Filters source service requests. In 470 mode the service array contains only matching category rows.

## `minRequestedAmount` (type: `number`):

471 only: filters Original FRN funding_commitment_request. A positive value in 470 mode is rejected because no budget is provided.

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

470 applications or 471 FRNs. Duplicates do not consume the record limit.

## `maxChargeUsd` (type: `number`):

Additional result-cost cap at USD 0.0075 per item. The lower of this and the Apify run spending limit applies. No start fee.

## `maxRuntimeSecs` (type: `integer`):

Hard HTTP deadline. If source extraction cannot finish, the run fails with any already delivered records retained.

## Actor input object example

```json
{
  "recordMode": "470",
  "state": "",
  "fundingYear": 2027,
  "serviceCategory": "ALL",
  "minRequestedAmount": 0,
  "maxResults": 25,
  "maxChargeUsd": 1,
  "maxRuntimeSecs": 240
}
```

# Actor output Schema

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

No description

## `csv` (type: `string`):

No description

## `summary` (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("afkdigital/usac-erate-school-library-buyer-intelligence").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("afkdigital/usac-erate-school-library-buyer-intelligence").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 afkdigital/usac-erate-school-library-buyer-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/usac-erate-school-library-buyer-intelligence"
        }
    }
}
```

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/O1JbYsO2Px9wCutll/builds/XWcTDuC8fYTbNfPsy/openapi.json
