# Grants.gov Scraper - Federal Grant Opportunities Feed (`groundplanes/grants-gov-funding-opportunities`) Actor

Scrape posted and forecasted federal grant opportunities from Grants.gov with award ceilings, floors, eligibility types, funding categories, Assistance Listings (CFDA), deadlines, and plain-text synopses.

- **URL**: https://apify.com/groundplanes/grants-gov-funding-opportunities.md
- **Developed by:** [Groundplane Labs](https://apify.com/groundplanes) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 opportunities

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

## Grants.gov Scraper - Federal Grant Opportunities Feed

Extract posted, forecasted, closed, and archived federal grant opportunities from Grants.gov (`api.grants.gov/v1/api/search2` and `fetchOpportunity`), complete with award ceilings and floors, total estimated program funding, expected award counts, cost-sharing flags, eligible applicant categories, funding activity categories, Assistance Listings (CFDA), deadlines, and clean plain-text synopses.

### What it does

Federal agencies publish thousands of discretionary funding opportunities and pre-solicitation forecasts on Grants.gov every year. The standard search endpoint returns only summary headers, while funding amounts, expected award counts, eligibility rules, and full descriptions require separate detail lookups and HTML cleanup.

This Actor:

- Searches `POST https://api.grants.gov/v1/api/search2` sorted newest first (`openDate|desc`) with your keyword, opportunity status, applicant eligibility, funding category, agency, and posting-window filters.
- Optionally hydrates each matching opportunity via `POST https://api.grants.gov/v1/api/fetchOpportunity` (rate-limited to at most 3 requests/second with automatic retry and exponential backoff).
- Normalizes `MM/DD/YYYY` and timestamp dates to ISO `YYYY-MM-DD`, strips HTML tags and entities from synopsis/forecast descriptions (capped at 5,000 characters), and extracts structured Assistance Listing (CFDA) numbers and titles.
- Keeps federal staff point-of-contact fields (`agencyContactName`, `agencyContactEmail`, `agencyContactPhone`) turned off by default (`includeAgencyContact: false`) and omits those keys unless explicitly enabled.

### Who it's for

- **Nonprofits, universities, and research institutes** monitoring newly posted and forecasted federal grants across health, education, energy, and science.
- **SBIR/STTR and small-business grant consultants** filtering opportunities open to small businesses (`"23"`) or for-profit organizations (`"22"`).
- **Municipal, county, tribal, and state grant writers** tracking infrastructure, community development, and environmental funding feeds.
- **GovTech and grant-intelligence platforms** ingesting structured daily or weekly Grants.gov feeds into CRM or alerting pipelines.

### Input

All filters have sensible defaults that return posted and forecasted federal grant opportunities from the last 30 days in under 2 minutes.

- **`keyword`** *(string)*: Optional keyword or phrase filter. Default: `""`.
- **`oppStatuses`** *(array of strings)*: Any combination of `"posted"`, `"forecasted"`, `"closed"`, `"archived"`. Default: `["posted", "forecasted"]`.
- **`eligibilities`** *(array of strings)*: Optional 2-digit Grants.gov applicant eligibility codes (see code table below). Default: `[]` (all applicant types).
- **`fundingCategories`** *(array of strings)*: Optional Grants.gov funding activity category codes (see code table below). Default: `[]` (all categories).
- **`agencies`** *(array of strings)*: Optional agency codes or prefixes (e.g. `["HHS", "DOE", "NSF", "DOD"]`). Each entry is matched as a prefix of the Grants.gov sub-agency code, so `"HHS"` matches `HHS-NIH11`, `HHS-CDC`, and every other HHS sub-agency; use a full sub-agency code such as `"HHS-NIH11"` to narrow to one office. If no opportunity matches an entry, the run status says there was no exact agency code match and suggests sub-agency codes like `HHS-NIH11`. Default: `[]`.
- **`postedWithinDays`** *(integer)*: Keep only opportunities posted within the last N days (`0` disables the date filter). Default: `30`.
- **`minAwardCeilingUsd`** *(integer)*: Minimum single-award ceiling in USD. Default: `0`.
- **`includeDetails`** *(boolean)*: Fetch full opportunity details (`fetchOpportunity`) for each result up to `maxItems`. Default: `true`.
- **`includeAgencyContact`** *(boolean)*: Include grantor staff contact fields (`agencyContactName`, `agencyContactEmail`, `agencyContactPhone`). Defaults to `false` for privacy compliance.
- **`maxItems`** *(integer)*: Maximum number of opportunities to return. Default: `200`.

#### Grants.gov Applicant Eligibility Codes (`eligibilities`)

| Code | Applicant Type |
|---|---|
| `"00"` | State governments |
| `"01"` | County governments |
| `"02"` | City or township governments |
| `"04"` | Special district governments |
| `"05"` | Independent school districts |
| `"06"` | Public and State controlled institutions of higher education |
| `"07"` | Native American tribal governments (Federally recognized) |
| `"08"` | Public housing authorities / Indian housing authorities |
| `"11"` | Native American tribal organizations (other than Federally recognized tribal governments) |
| `"12"` | Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education |
| `"13"` | Nonprofits that do not have a 501(c)(3) status with the IRS, other than institutions of higher education |
| `"20"` | Private institutions of higher education |
| `"21"` | Individuals |
| `"22"` | For-profit organizations other than small businesses |
| `"23"` | Small businesses |
| `"25"` | Others (see Additional Information on Eligibility) |
| `"99"` | Unrestricted (open to any type of entity above) |

#### Grants.gov Funding Category Codes (`fundingCategories`)

| Code | Category | Code | Category |
|---|---|---|---|
| `"AG"` | Agriculture | `"HO"` | Housing |
| `"AR"` | Arts | `"HU"` | Humanities |
| `"BC"` | Business and Commerce | `"IIJ"` | Infrastructure Investment and Jobs Act (IIJA) |
| `"CD"` | Community Development | `"ISS"` | Income Security and Social Services |
| `"CP"` | Consumer Protection | `"LJL"` | Law, Justice and Legal Services |
| `"DPR"` | Disaster Prevention and Relief | `"NR"` | Natural Resources |
| `"ED"` | Education | `"OZ"` | Opportunity Zone Benefits |
| `"ELT"` | Employment, Labor and Training | `"RT"` | Recreation and Tourism |
| `"EN"` | Energy | `"ST"` | Science and Technology and other R\&D |
| `"ENV"` | Environment | `"T"` | Transportation |
| `"FN"` | Food and Nutrition | `"O"` | Other |
| `"HL"` | Health | | |

#### Example input JSON

```json
{
  "keyword": "",
  "oppStatuses": ["posted", "forecasted"],
  "eligibilities": [],
  "fundingCategories": [],
  "agencies": [],
  "postedWithinDays": 30,
  "minAwardCeilingUsd": 0,
  "includeDetails": true,
  "includeAgencyContact": false,
  "maxItems": 200
}
```

#### Example run options (default max charge $50)

When starting a run via the Apify API or Console, set a default maximum charge of **$50** (`"maxTotalChargeUsd": 50`) in your run options:

```json
{
  "maxTotalChargeUsd": 50,
  "memoryMbytes": 256,
  "timeoutSecs": 300
}
```

### Output

Results are deduplicated by `opportunityId` and sorted newest first by `postedDate` descending.

| Field | Type | Description |
|---|---|---|
| `opportunityId` | `string` | Unique numeric Grants.gov opportunity ID. |
| `opportunityNumber` | `string \| null` | Funding Opportunity Number (FON). |
| `title` | `string \| null` | Opportunity title. |
| `agencyCode` | `string \| null` | Sub-agency or department code (e.g. `"DOI-USGS1"`, `"HHS-NIH11"`). |
| `agencyName` | `string \| null` | Federal agency or office name. |
| `status` | `string \| null` | Opportunity status (`"posted"`, `"forecasted"`, `"closed"`, `"archived"`). |
| `postedDate` | `string \| null` | Posted / open date (`YYYY-MM-DD`). |
| `closeDate` | `string \| null` | Application closing date or estimated response date (`YYYY-MM-DD`). |
| `archiveDate` | `string \| null` | Archive date (`YYYY-MM-DD`), if set. |
| `awardCeilingUsd` | `number \| null` | Maximum individual award amount in USD. |
| `awardFloorUsd` | `number \| null` | Minimum individual award amount in USD. |
| `estimatedFundingUsd` | `number \| null` | Total estimated program funding in USD. |
| `expectedAwards` | `integer \| null` | Expected number of awards. |
| `costSharing` | `boolean \| null` | Whether cost sharing or matching is required. |
| `eligibilities` | `array<string> \| null` | Eligible applicant categories (`"<id>: <description>"`). |
| `fundingCategories` | `array<string> \| null` | Funding activity categories (`"<id>: <description>"`). |
| `assistanceListings` | `array<string> \| null` | Assistance Listing (CFDA) numbers and titles. |
| `synopsis` | `string \| null` | Plain-text synopsis or forecast description (HTML stripped, max 5,000 chars). |
| `grantsGovUrl` | `string` | Direct URL (`https://www.grants.gov/search-results-detail/<opportunityId>`). |
| `agencyContactName` | `string \| null` | Grantor point-of-contact name *(present only when `includeAgencyContact: true`)*. |
| `agencyContactEmail` | `string \| null` | Grantor point-of-contact email *(present only when `includeAgencyContact: true`)*. |
| `agencyContactPhone` | `string \| null` | Grantor point-of-contact phone *(present only when `includeAgencyContact: true`)*. |

#### Sample output row (synthetic example)

```json
{
  "opportunityId": "999901",
  "opportunityNumber": "EX-RD-26-001",
  "title": "Example Clean Energy Grid Resilience Demonstration Program",
  "agencyCode": "DOE-GDO",
  "agencyName": "Grid Deployment Office",
  "status": "posted",
  "postedDate": "2026-10-28",
  "closeDate": "2027-01-15",
  "archiveDate": "2027-02-14",
  "awardCeilingUsd": 2500000,
  "awardFloorUsd": 250000,
  "estimatedFundingUsd": 25000000,
  "expectedAwards": 10,
  "costSharing": true,
  "eligibilities": [
    "12: Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education",
    "23: Small businesses"
  ],
  "fundingCategories": [
    "EN: Energy",
    "ST: Science and Technology and other Research and Development"
  ],
  "assistanceListings": [
    "81.999 - Example Grid Modernization Assistance Program"
  ],
  "synopsis": "The Example Grid Deployment Office invites applications for demonstration projects that improve distribution-level grid reliability and clean energy integration across rural and suburban service territories.",
  "grantsGovUrl": "https://www.grants.gov/search-results-detail/999901"
}
```

### How pricing works

Pay per result: **$3.00 per 1,000 results** ($0.003 per row). You only pay for rows returned. The Actor checks your run's maximum spending limit before every dataset push (recommended default: `"maxTotalChargeUsd": 50`) and stops cleanly if that limit is reached.

### Compliance

When `includeAgencyContact` is set to `true`, the output may include names, email addresses, and telephone numbers of federal grantor points of contact as published on Grants.gov. By default, `includeAgencyContact` is `false`.

- When `includeAgencyContact` is `false` (the default), email addresses and phone numbers embedded in the free-text synopsis are also redacted, so contact details do not leak through the description text.
- All contact details originate from public U.S. government grant notices published on Grants.gov for applicant inquiries.
- Buyers and users are solely responsible for complying with the Telephone Consumer Protection Act (TCPA), the National Do-Not-Call (DNC) Registry, the CAN-SPAM Act, the EU GDPR where it applies, and all applicable federal and state privacy and anti-solicitation laws before initiating any outreach.
- Do not use this data for consumer or individual targeting or unsolicited commercial marketing.

### Data source and terms

- **Official source:** [Grants.gov Search & Opportunity REST APIs](https://www.grants.gov/api/api-guide) (`api.grants.gov/v1/api/search2` and `fetchOpportunity`).
- **API terms and policy:** This Actor uses the Grants.gov API under the [Grants.gov API Terms and Conditions](https://grants.gov/api/terms-conditions). Grants.gov data is U.S. federal government data published for public reuse subject to those terms; this product uses the Grants.gov API but is not endorsed or certified by the U.S. Department of Health and Human Services.
- **Update frequency:** Federal agencies post and update grant synopses and forecasts continuously throughout each business day on Grants.gov.
- **Disclaimer:** This Actor is an independent tool and is **not affiliated with or endorsed by Grants.gov, the U.S. Department of Health and Human Services (HHS), or any U.S. federal agency**.

### Limits and FAQ

- **Why are `awardCeilingUsd` or `awardFloorUsd` null on some rows?**
  Many federal grant notices do not specify a fixed dollar ceiling or floor in the structured synopsis fields, and forecasted opportunities have no structured award ceiling or floor in the Grants.gov source at all (their detail record carries estimated total funding only). When Grants.gov leaves those fields blank or `"none"`, the Actor outputs `null`. Known null rates from a recent default run: `awardCeilingUsd` is null on about 20 percent of rows and `awardFloorUsd` on about 29 percent of rows (rates vary with the posting mix).
- **How fast is detail hydration?**
  When `includeDetails: true` (default), the Actor fetches each opportunity's detail record at up to 3 requests/second (~60 seconds for 180 opportunities). Set `includeDetails: false` if you only need summary headers (`opportunityId`, `opportunityNumber`, `title`, `agencyCode`, `agencyName`, `status`, `postedDate`, `closeDate`, `assistanceListings`, `grantsGovUrl`).

### Troubleshooting

- **Status `Complete:`** means every matched row was emitted and the counts in the status message are the counts that were actually scanned, matched, and pushed. A run that matches nothing ends `Complete: 0 rows matched your filters` with a note on which filters to widen; zero matches is a successful run, not an error.
- **Status `PARTIAL:`** means some matched data could not be delivered, and the message names the reason: for example a Grants.gov detail lookup failing for some opportunities (those rows are emitted with summary fields only), rows skipped because the source response shape changed, the detail hydration time budget being reached, or your run's charge limit stopping the push early. A PARTIAL caused only by your own limits (max items or charge cap) is reported without the issue line below.
- **Canary input:** `{ "keyword": "", "oppStatuses": ["posted"], "eligibilities": [], "fundingCategories": [], "agencies": [], "postedWithinDays": 30, "minAwardCeilingUsd": 0, "includeDetails": true, "includeAgencyContact": false, "maxItems": 5 }` returns at least 1 row in well under 30 seconds on a healthy Grants.gov.
- Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.

### Changelog

#### v0.1.4 (2026-11-01)

- Grok Red Team fix round. High fixed: the `agencies` filter no longer passes codes verbatim to `search2` (which matches exactly, so `"HHS"` returned 0 rows against hundreds open). Agencies are now omitted from the `search2` call and matched client-side as prefixes of `agencyCode` while paging, and a zero-match agency run says so in the status and suggests sub-agency codes like `HHS-NIH11`. Medium fixed: synopsis contact redaction now runs before truncation and the 5,000 character cap is re-applied after redacting, so redaction can no longer push a valid row past the cap and drop it as false schema drift. Medium fixed: retries are now 6 attempts with jittered backoff from 2 to 32 seconds capped at 120 seconds, `Retry-After` is honored as seconds or as an HTTP-date, and requests use a 30 second timeout with a 10 second connect timeout. Lows: `defaultRunOptions` gains `memoryMbytes` and `timeoutSecs` and an `exampleRunInput` was added; the pricing section states the per-1,000-results price; known null rates for the award ceiling and floor are documented; a Grants.gov API terms link was added; the store description now starts with "Scrape".

#### v0.1.3 (2026-10-31)

- Final-GO round returned NO-GO on two residuals, both fixed here. The end-of-hydration awardCeiling drift check is no longer gated on minAwardCeilingUsd: awardCeilingUsd is a headline output on every hydrated row, so if the field is absent from every detail response the run reports schema drift as a source-caused PARTIAL whether or not a ceiling filter was set. The synopsis phone redaction pattern was rebuilt: the old pattern opened with a word boundary that can never match before a parenthesis, so parenthesized area codes such as (202)555-0123 and (202) 555-0123 (including extension forms) were never redacted; the new pattern anchors on a non-digit lookbehind and consumes attached extensions, and every named format was re-tested against the shipped pattern.

#### v0.1.2 (2026-10-31)

- Red Team correction round. Blocker fixed: with minAwardCeilingUsd set, the scan no longer stops at a small candidate pool and calls the result Complete. It now examines up to 600 candidates (the detail scan budget); if the budget stops the scan with search hits still unexamined, the run ends PARTIAL saying so, never Complete. High fixed: the detail payload now has its own sentinel (the money fields awardCeiling, awardFloor, estimatedFunding, numberOfAwards are checked on the first detail response, and a run where awardCeiling is absent from every detail response reports schema drift instead of silently nulling every ceiling). Medium fixed: status counts now report hits actually examined and candidates that passed the search-level filters, and the zero-after-detail-filtering status carries the same counts. Lows: retries honor Retry-After with jittered backoff; the synopsis redaction also catches phone formats like (202)555-0123, contiguous 10-digit numbers, and extensions; GDPR added to the Compliance section.

- **v0.1.1 (2026-10-31):** Status messages now follow the Complete/PARTIAL contract (zero matches is a successful `Complete: 0` run); per-row validation and a core-field schema sentinel added; a failed detail lookup no longer loses the whole run; synopsis text is redacted for emails and phone numbers when agency contact output is off; store category corrected to Business only.

- **v0.1 (2026-10-31):** Initial release with `search2` pagination, `fetchOpportunity` detail hydration, HTML synopsis stripping, date normalization, and opt-in agency contact fields.

# Actor input Schema

## `agencies` (type: `array`):

Optional federal agency codes or prefixes (e.g. \["HHS", "DOE", "NSF", "DOD"]). Each entry is matched as a prefix of the Grants.gov sub-agency code, so "HHS" matches HHS-NIH11, HHS-CDC and every other HHS sub-agency; use a full sub-agency code like "HHS-NIH11" to narrow to one office. Leave empty for all federal agencies.

## `eligibilities` (type: `array`):

Optional Grants.gov applicant eligibility codes (e.g. \["23"] for Small businesses, \["12"] for 501(c)(3) Nonprofits, \["06", "20"] for Higher Education). See the README for the full code table.

## `fundingCategories` (type: `array`):

Optional Grants.gov funding activity category codes (e.g. \["ST"] Science & Technology, \["EN"] Energy, \["HL"] Health, \["ED"] Education). Leave empty for all categories.

## `includeAgencyContact` (type: `boolean`):

Defaults to false for privacy compliance because agency contact fields contain named federal program officers, emails, and phone numbers. Enable only when you need grantor point-of-contact details and comply with applicable outreach rules.

## `includeDetails` (type: `boolean`):

When true (default), calls fetchOpportunity for each matching grant (up to maxItems) to populate award ceiling/floor, estimated funding, expected awards, cost sharing, eligibilities, funding categories, and plain-text synopsis.

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

Optional keyword or phrase to search across grant titles, numbers, and descriptions. Leave empty for all opportunities.

## `maxItems` (type: `integer`):

Maximum number of grant opportunities to return.

## `minAwardCeilingUsd` (type: `integer`):

Minimum single-award ceiling in USD (requires includeDetails=true when > 0).

## `oppStatuses` (type: `array`):

Grant statuses to include: posted, forecasted, closed, archived.

## `postedWithinDays` (type: `integer`):

Keep only grant opportunities posted within this many days before today (e.g. 30 for the last 30 days). Set to 0 to disable the date window.

## Actor input object example

```json
{
  "agencies": [],
  "eligibilities": [],
  "fundingCategories": [],
  "includeAgencyContact": false,
  "includeDetails": true,
  "keyword": "",
  "maxItems": 200,
  "minAwardCeilingUsd": 0,
  "oppStatuses": [
    "posted",
    "forecasted"
  ],
  "postedWithinDays": 30
}
```

# 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 = {
    "agencies": [],
    "eligibilities": [],
    "fundingCategories": [],
    "includeAgencyContact": false,
    "includeDetails": true,
    "keyword": "",
    "maxItems": 200,
    "minAwardCeilingUsd": 0,
    "oppStatuses": [
        "posted",
        "forecasted"
    ],
    "postedWithinDays": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("groundplanes/grants-gov-funding-opportunities").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 = {
    "agencies": [],
    "eligibilities": [],
    "fundingCategories": [],
    "includeAgencyContact": False,
    "includeDetails": True,
    "keyword": "",
    "maxItems": 200,
    "minAwardCeilingUsd": 0,
    "oppStatuses": [
        "posted",
        "forecasted",
    ],
    "postedWithinDays": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("groundplanes/grants-gov-funding-opportunities").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 '{
  "agencies": [],
  "eligibilities": [],
  "fundingCategories": [],
  "includeAgencyContact": false,
  "includeDetails": true,
  "keyword": "",
  "maxItems": 200,
  "minAwardCeilingUsd": 0,
  "oppStatuses": [
    "posted",
    "forecasted"
  ],
  "postedWithinDays": 30
}' |
apify call groundplanes/grants-gov-funding-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,groundplanes/grants-gov-funding-opportunities"
        }
    }
}
```

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/2DFfJflOeWjcseLYr/builds/fejRXN1iL6JSQGqqa/openapi.json
