See llms.txt for all machine-readable content.

Back to Templates

Find US federal grants and contract awards with Apify, ranked by deadline and size

Searches open and forecasted grant opportunities on Grants.gov and recent contract and grant awards on USAspending.gov for your keywords, then scores each record: opportunities by award size, days to deadline, status and agency; awards by amount, how recently they started and place of performance. See what you can apply for now and who has been winning in your niche. Built for grant writers, government contractors, nonprofits and BD teams.

How it works

  1. Daily schedule / manual run reads every setting from Config. A weekly schedule uses the same Config to send a report instead of running the actor.
  2. Starts the Apify actor asynchronously, then waits and polls the run; FAILED, ABORTED, TIMED-OUT or too many polls stop with an error.
  3. Downloads the dataset, validates rows and dedupes within the run and across runs (workflow static data, dedupeMemoryDays).
  4. A transparent rule score runs first, then an LLM chain with a structured output parser reads each record against your plain-English aiCriteria and returns a fit score, verdict, summary, outreach angle and red flags. Calls are batched with a delay for rate limits, retried, and fall back to the rule score if the model fails.
  5. Upserts every row to Google Sheets. Hot rows go to Slack as one approve / dismiss message (send-and-wait, 24 h limit) and the decision is written back to the sheet; warm rows go to an HTML email digest; cold rows stay in the sheet.
  6. Weekly report: reads the sheet, summarises the last 7 days (tiers, approvals, top 10) and emails it.
  7. A separate Error Trigger branch posts any failure to Slack.

Setup (about 15 minutes)

  1. Create an HTTP Header Auth credential: name Authorization, value Bearer <APIFY_API_TOKEN> (Apify Console > Settings > API & Integrations). Select it on the 3 Apify HTTP nodes.
  2. Create a Google Sheet with a tab named in sheetTab and a header row matching the sheet columns (see Upsert to Google Sheets, plus status and reviewedAt). Paste its ID into googleSheetId.
  3. Connect OpenAI (or swap the chat model sub-node for Anthropic, Gemini, Ollama...), Slack and Gmail; set slackChannelId and digestEmail in Config (also the channel on Slack: error alert).
  4. In Config set actorInput.keywords, mode (opportunities, awards or both), closingWithinDays, awardsLookbackDays, plus priorityAgencies, minAmount, closingSoonDays and targetStates. Both sources are official US government data.
  5. Write your ideal-lead description in aiCriteria; set aiWeight (0 = rules only, 1 = AI only).
  6. Run once manually, check the sheet, then activate.

Customize

  • Edit weights in Score grant or award (size 20-30, deadline 20, status 10, priority agency 15, award recency 15, state 10).
  • Add agencies, eligibilityCodes, naicsCodes or placeOfPerformanceStates to actorInput to narrow results at the source.
  • Opportunity rows are keyed by opportunity number and award rows by award ID, so each is alerted once.
  • Swap Gmail/Slack for Teams, Discord, HubSpot, Airtable, etc. Each delivery node only reads $json.

Disclosure: I maintain these Apify actors (account transparent_meteorite). The actor is a paid pay-per-event Apify tool; check its Store page for current pricing before scheduling.