Zapier + Apify · Government and public records

New Grants.gov Opportunities to Google Sheets with Zapier

The Grants.gov API & SAM.gov Scraper searches the official Grants.gov API by keyword and, in monitor mode, returns only opportunities that are new or updated since its last run. Save it as an Apify task, schedule it daily, and a Zap built on Apify's official Zapier app adds one Google Sheets row per opportunity: a running pipeline sheet with no copy and paste.

Open the Actor on Apify Store

Grants.gov API & SAM.gov Scraper — Federal Grants Feed. Pay per result; see the Store page for current pricing.

What you build

A daily Apify schedule runs a saved task that searches Grants.gov for posted and forecasted opportunities about rural broadband and digital equity. When the run finishes, the Zap fetches its dataset and appends one row per opportunity to your sheet: number, title, agency, status, posted and close dates, award ceiling and the Grants.gov link.

Add "samGov" to sources (with your own free SAM.gov API key) to also get federal contract notices in the same sheet; see the SAM.gov guide.

Before you start

  • An Apify account. The Actor is billed per result to that account; the Store page lists the current prices. Set a maximum total charge in the task's run options to cap a run.
  • A Zapier account with Google Sheets connected. The Zap has more than two steps, so check that your Zapier plan allows multi-step Zaps.
  • A Google Sheet with a header row, for example: number, title, agency, status, postedDate, closeDate, awardCeiling, url, isUpdated.

Step 1: Save the input as an Apify task

Open the Actor in Apify Console from its Store page. On the Input tab, switch to the JSON editor, paste this input, change the keywords to your own, and click Save as a new task:

{
  "keywords": [
    "rural broadband",
    "digital equity"
  ],
  "sources": [
    "grantsGov"
  ],
  "oppStatuses": [
    "posted",
    "forecasted"
  ],
  "postedWithinDays": 30,
  "maxResults": 200,
  "fetchDetails": true,
  "maxDetails": 100,
  "onlyNewSinceLastRun": true,
  "stateStoreName": "zapier-sheets-broadband-grants"
}

In monitor mode each run returns only opportunities that are new (isNew: true) or changed (isUpdated: true) since the last run of this task. The first run has nothing to compare with, so it returns everything posted in the last 30 days: a good way to fill the sheet once. fetchDetails adds the award ceiling, eligibility and the agency contact for up to maxDetails records. Run the task once from Console now, so Zapier has a finished run to test with.

Then open Schedules in Console, create a daily schedule, and add the task to it.

Step 2: Build the Zap

1. Trigger: Apify, Finished task run

Create a Zap with Apify as the trigger app and the Finished task run event. Connect your Apify account (click Allow Access in the window that opens), pick the task, and click Test Trigger.

2. Search: Apify, Fetch dataset items

Add an Apify step with the Fetch dataset items search, map the dataset ID to the default dataset of the run from the trigger, and test it.

3. Loop over the items

Add Looping by Zapier and loop over the fetched items, mapping the fields you want in the sheet plus error.

4. Filter out error items

Add Filter by Zapier: continue only if error does not exist. A source that is down produces one coded error item instead of failing the run.

5. Action: Google Sheets, Create Spreadsheet Row

Add Google Sheets with Create Spreadsheet Row, pick the spreadsheet and worksheet, and map each column to a field from the loop. Test, then publish the Zap.

Fields to map

Each dataset item is one opportunity (recordType: "opportunity"). Useful columns:

FieldUse it for
number, titleOpportunity number and title
agency, agencyCodePosting agency
status, docTypeforecasted, posted, closed or archived; synopsis or forecast
postedDate, closeDateKey dates, YYYY-MM-DD
awardCeiling, awardFloor, estimatedTotalFundingWith fetchDetails; null when the agency did not set them
urlThe Grants.gov listing
isNew, isUpdatedWhether the row is a new opportunity or a change to one already in your sheet

All fields are described in the Grants.gov API guide.

Costs and limits

  • Apify bills the Actor per opportunity and per detail fetched, at the prices on its Store page. In monitor mode you pay only for new and updated records after the first run.
  • Zapier counts each step a Zap runs against your plan's task allowance; with a loop, each opportunity adds its own steps.
  • An updated opportunity arrives as a new row with isUpdated: true; the Zap does not edit the earlier row. Sort or filter the sheet on number to see an opportunity's history.
  • Grants.gov search matches keywords the way Grants.gov does; check a first run and tighten the keywords if it returns too much.

FAQ

Why not the Run Actor action on a Zapier schedule?

Apify's Zapier documentation gives synchronous runs a hard 30-second timeout, and a run with details for many records can take longer. The scheduled task with the Finished task run trigger has no such limit.

Can I export to Google Sheets without Zapier?

Apify Console lists a Google Sheets export among the ready-made integrations on a task's Integrations tab. Zapier is useful when you also want filters, other apps, or one row per record in a sheet you already have.

Do I need a Grants.gov key?

No. The Grants.gov API needs no key. SAM.gov, if you add it, needs your own free personal key in samApiKey.

Can I also rank opportunities by fit?

The Grant Matching & RFP Bid/No-Bid Scorer scores Grants.gov, SAM.gov and USAspending records against a description of your organization. The same Zap pattern works with its output.

Is this affiliated with Zapier, Google or Grants.gov?

No. owlabee is an independent developer on Apify Store, and the Zapier app used here is Apify's own. Not affiliated with or endorsed by Zapier, Google, Apify or any agency named.