Quick overview
Every morning, this workflow checks US city, county and state procurement portals through two Apify Actors, keeps only new bids that match your keywords and states, drops past-due ones and emails one digest, soonest deadline first. Slack is optional. If one source fails, the other still delivers.
How it works
- A daily schedule (7 AM) starts the run. Config holds your keywords, states, email, Slack channel and a cost cap per Actor run.
- Build Actor Inputs checks your settings before anything is spent and builds both Actor inputs.
- Run Government Bids Scraper calls the Apify Actor that reads 550+ local-government OpenGov portals by state, plus PlanetBids portals you list.
- Run State Bids Scraper calls the Actor for the official IL, MA, NJ, OR and NV state portals.
- Combine and Normalize turns both outputs into one shape: title, agency, state, deadline, posted date, link and source.
- Filter Bids re-checks keywords (word start), excluded words and states, and drops anything already past due.
- Keep Only Unsent Bids uses n8n workflow static data as a second memory, so a copied workflow or a new stateKey never repeats a bid you already got. Keys are saved only after the email or Slack message was delivered. No new bids means no message. Otherwise one HTML email and/or one Slack post goes out, soonest deadline first. A failed Actor call or an unreadable portal sends one short problem alert, while bids from the working source still go out.
Setup
- Create a free Apify account and copy your API token from Apify Console > Settings > API & Integrations.
- In n8n, create a Header Auth credential with name Authorization and value "Bearer <your token>", and select it in both Run nodes. The token is never stored in the workflow.
- Connect your Gmail account in the two email nodes, and Slack (chat:write) if you want Slack messages.
- Open Config and set keywords, governmentBidsStates (any 2-letter codes), stateBidsStates (IL, MA, NJ, OR or NV), emailTo, and optionally sendSlack and slackChannelId.
- Run it once by hand to check the output, then activate it. The first run returns every current match as the baseline; later runs only new ones.
Additional info
Uses two Apify Actors:
- Government Bids Scraper (OpenGov + PlanetBids): https://apify.com/chimey_forearm/opengov-bids-scraper
- State Bids Scraper (IL BidBuy, MA COMMBUYS, NJSTART, OregonBuys, NevadaEPro): https://apify.com/chimey_forearm/state-bids-scraper
Cost: each Actor charges $0.01 per bid returned plus $0.02 per run start (the Government Bids Scraper is $0.002 per bid until Nov 20, 2026). A day with nothing new costs only the start fees. maxChargePerActorUsd (default $1) caps each run. Apify's free plan includes monthly platform credit.
Customize: change the schedule, add OpenGov agency codes or PlanetBids portal IDs, keep stateKey fixed (a new one starts a fresh baseline), set includeUpdates to false to skip addendum alerts, or swap Gmail for SMTP or Outlook.