GrantConnect Grant Awards Scraper & Monitor avatar

GrantConnect Grant Awards Scraper & Monitor

Pricing

from $3.00 / 1,000 grant award (full detail)s

Go to Apify Store
GrantConnect Grant Awards Scraper & Monitor

GrantConnect Grant Awards Scraper & Monitor

Scrape and monitor every Australian Government grant award on GrantConnect (grants.gov.au): recipient, ABN, agency, value, purpose, program, location. Server-side filters (keyword, category, ABN, value, dates), delta mode for new, varied and updated awards, ISO dates, numeric AUD. Pay per result.

Pricing

from $3.00 / 1,000 grant award (full detail)s

Rating

0.0

(0)

Developer

Stefano Seggio

Stefano Seggio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

GrantConnect Grant Awards Scraper & Monitor — Apify Store Overview

Actor: stefano_seggio/australia-grantconnect-monitor · Actor ID: gt7wS4T0uFRXDz49n · Store URL: https://apify.com/stefano_seggio/australia-grantconnect-monitor Version: 2.0 (.actor/actor.json) — latest published patch per CHANGELOG.md is 2.0.1 (2026-09-07)


Executive Summary & Business Use Case

This Actor extracts the Grant Awards register on GrantConnect (grants.gov.au) — the official, whole-of-government record of every grant a Commonwealth (Australian federal) entity has awarded since December 2017. GrantConnect is operated by the Department of Finance; under the Commonwealth Grants Rules and Principles every non-corporate Commonwealth entity is legally required to publish each grant it awards, and each subsequent variation, within 21 days of the agreement taking effect. The result — recipient name, ABN, awarding agency, dollar value, purpose, funding program, delivery location and grant term — is public data, but GrantConnect itself exposes it only through a manual search form and a report capped at 50,000 rows, with no API, no CSV feed and no email alert for awards (its native notifications cover open funding opportunities only, not awards already made). This Actor turns that register into structured JSON/CSV, with server-side filtering by keyword, category, recipient, ABN, value range, Grant Opportunity ID and date window, plus a delta ("Only new") mode that returns only what changed since the previous run.

Three concrete, source-grounded use cases: grant consultants and bid writers query agency, grantProgram, goId, valueAudNumber and selectionProcess to see which agency just funded organisations like their client under which program, so they can approach fresh winners about variation work or pitch the next funding round. Government relations, lobbying and integrity researchers filter on recipientAbn, agency, event_type and isOneOffAdHoc to get alerted the moment a named competitor, client interest or portfolio agency receives a new or varied award, and to flag large non-competitive ("ad hoc") awards for scrutiny — precisely the pattern the Australian National Audit Office has flagged, given ANAO's own count of 215,000+ grants worth A$118 billion (plus A$36 billion in variations) on the register. Suppliers to grant recipients (construction, professional services, equipment vendors) use deliveryState, deliveryPostcode, valueBand and purpose to identify who just received money to build, buy or deliver something in their region, and reach out within days of the award instead of months later when it surfaces in an annual report.

Every use case above maps to a field that actually exists in this Actor's dataset schema — there is no per-transaction pricing signal beyond the award's own face value (valueAudNumber), no procurement-bid data, and no data on Grant Opportunities (open funding rounds still accepting applications); this Actor covers awards already made, not rounds still open.

Technical Features & V2 Architecture Highlights

Delta engine with named, cross-run persistence. When onlyNew is true, the Actor writes each delivered award's lastUpdatedIso watermark to a private, named key-value store, australia-grantconnect-monitor-state-<deltaStateName> (the state name defaults to a fingerprint of the run's filter set, so unrelated schedules never collide unless you deliberately share a deltaStateName). Per the input schema's own description of onlyNew: it "remembers every award it has delivered (per filter set, in a named key-value store) and returns only awards that are new, varied or updated since. The walk stops as soon as it reaches already-known records, so a scheduled run costs a few pages instead of the whole register." State is written only for records that were actually stored in the dataset, and records are delivered oldest-first within a run, which is what makes a mid-run spending-limit cutoff or platform migration crash-safe: the next run simply resumes rather than silently losing an award. Version 2.0.1 fixed two edge cases in this engine specifically: a backlog floor, so that when a run stops at maxItems with more matching rows still below it, the next run walks all the way down through the already-known block to that floor before trusting an early stop (previously it could stall short of undelivered rows); and a baseline floor, so a cheap, capped first run doesn't cause every later run to slow-drain the entire historical archive.

Real, domain-specific event types — deliberately no CLOSED. The dataset's event_type field is constrained to exactly three values: NEW_LISTING (a brand-new award), AWARD_VARIATION (a separate amendment record GrantConnect publishes when an award's value or term changes, e.g. GA270901-V1 varying base award GA270901), and UPDATED (an award already delivered by a previous run whose lastUpdated stamp moved — a correction or republish, delta mode only). There is no CLOSED event on this actor, unlike register actors that model listings which literally close: a GrantConnect award is a permanent record of money already paid, not an open listing that can be withdrawn, so the domain-correct signal for "this record changed" is UPDATED, and for "this is a new document tied to an old award" it's AWARD_VARIATION — not a status transition. sortBy defaults to Last Updated rather than Publish Date specifically to make variations visible: GrantConnect stamps a variation record with the original award's publish date, so ordered by publish date a fresh variation can sit 100,000 rows deep on the day it appears, while ordered by Last Updated it's on page one.

Envelope, not a 18-field UMS claim. This Actor's own dataset_schema.json defines a 6-field integration envelope — record_id, event_type, scraped_at, is_new, source_url, data_source — which the README states is "identical across all of this developer's public-register Actors, so one webhook parser serves them all." That envelope sits alongside roughly 84 award-specific fields (identity, listing, detail, recipient, delivery location, agency contact, provenance), for 90 properties total in the schema — the README's own "80+ fields" claim undercounts it slightly. No 18-field baseline is documented anywhere in this Actor's schema files, so that figure is not asserted here.

No browser, no proxy, no login. Per actor.json's meta.templateId (ts-crawlee-cheerio), this is a plain-HTTP Cheerio crawler, not a headless browser — it runs on 256–1024 MB of memory (minMemoryMbytes / maxMemoryMbytes), needs no residential proxy, and authenticates nothing because GrantConnect's award register is fully public. fetchDetail (default true) controls whether the Actor opens each award's own page for the ~30 detail-only fields (ABN, delivery location, purpose, program, Grant Opportunity link, selection process, confidentiality flags, agency contact) or stops at the cheaper listing-only summary; maxConcurrency (default 5, max 10) controls how many detail pages are fetched in parallel.

Input Schema & JSON Configuration Example

All fields below are read directly from .actor/input_schema.json.

FieldTypeDefaultDescription
keywordstring"" (prefill)Full-text search over grant title, purpose and activity (also accepts a GA ID such as GA578886). Matching mode below.
keywordMatchstring (enum: AllWord, AnyWord, ExactPhrase)AllWordHow the keyword(s) must match.
categoriesarray of string (29 category-code enum)[]GrantConnect's 29 top-level categories. Select several to get their union. The record's own 'category' field shows the finer sub-category label (e.g. 'Medical Research').
agencyNameContainsstringCase-insensitive substring match on the awarding agency, e.g. 'Health' or 'Infrastructure'. Applied client-side (GrantConnect's public form has no agency parameter), so combine it with a category, keyword or date window to keep the walk short.
recipientNamestringSubstring match on the recipient's legal name, e.g. 'Monash University' or 'Regional Express'.
recipientAbnstring (pattern: 11 digits, spaces optional)Exact match on the recipient's 11-digit Australian Business Number (spaces optional). Returns every Commonwealth grant that entity has received.
minValueAudintegerOnly awards worth at least this amount. Tip: 1000000 narrows the 360,000-record register to roughly 28,000.
maxValueAudintegerOnly awards worth at most this amount.
goIdstring (pattern: GO + digits)All awards made under one Grant Opportunity (funding round), e.g. GO6105.
dateTypestring (enum: Publish Date, Approval Date, Start Date, End Date, Current, Closed)Publish DateWhich date the 'from'/'to' window applies to. 'Current' = grants running today and 'Closed' = grants whose term has ended (both ignore the window).
dateFromstring (absolute or relative datepicker)Absolute (2026-07-01) or relative ('7 days', '3 months', '1 year' back from today, Canberra time). Leave empty for the whole archive (December 2017 onwards).
dateTostring (absolute or relative datepicker)Absolute or relative upper bound of the window. Leave empty for 'today'.
oneOffAdHocstring (enum: any, yes, no)anyAd hoc grants (no competitive round) are the ones probity and integrity teams watch most closely.
aggregateGrantAwardstring (enum: any, yes, no)anyAggregate awards bundle several recipients into one record ('Multiple').
eventTypesarray of string (enum: NEW_LISTING, AWARD_VARIATION, UPDATED)["NEW_LISTING", "AWARD_VARIATION", "UPDATED"]NEW_LISTING = a brand-new award; AWARD_VARIATION = a variation/amendment record (value or term changed, e.g. GA270901-V1); UPDATED = an award you already received whose 'Last Updated' stamp moved (delta mode only).
onlyNewbooleanfalse (prefill true in the Console UI)Remembers every award it has delivered (per filter set, in a named key-value store) and returns only awards that are new, varied or updated since. The walk stops as soon as it reaches already-known records, so a scheduled run costs a few pages instead of the whole register.
sortBystring (enum: Last Updated, Publish Date, Relevance)Last Updated'Last updated' (recommended, and required for reliable monitoring): variations and corrections of old awards keep their original publish date, so only this order surfaces them. 'Relevance' needs a keyword.
deltaStateNamestring (pattern: alphanumeric/hyphen, 1–30 chars)— (fingerprint of filters)Optional label for the memory of a monitoring task. Defaults to a fingerprint of your filters, so different schedules never interfere. Set the same name on two tasks to make them share one memory.
resetStatebooleanfalseForget every previously delivered award for this delta state and re-baseline (the run then returns up to 'Max records' most recently updated awards).
maxItemsinteger (1–100000)100Hard cap on delivered records (and therefore on cost: you pay per record). In delta mode anything beyond the cap is simply delivered by the next run.
fetchDetailbooleantrueOpens each award's page (one extra request) for recipient ABN and location, delivery location, purpose, program, Grant Opportunity link, selection process, confidentiality flags and the agency contact. Off = listing-only summary records (cheaper 'result-summary' price).
maxConcurrencyinteger (1–10)5How many award pages are fetched at once. GrantConnect tolerates 10 comfortably; 5 keeps a 500-record run under two minutes.
dateRangestring (hidden, pattern: 24h, 7d, 30d)Kept for tasks created with version 1: '24h', '7d' or '30d' are interpreted as 'Date from'.

Valid JSON configuration example

{
"keyword": "renewable energy",
"keywordMatch": "AnyWord",
"categories": ["211", "301"],
"minValueAud": 250000,
"dateType": "Publish Date",
"dateFrom": "90 days",
"eventTypes": ["NEW_LISTING", "AWARD_VARIATION"],
"onlyNew": true,
"sortBy": "Last Updated",
"deltaStateName": "renewables-watch",
"maxItems": 500,
"fetchDetail": true,
"maxConcurrency": 5
}

This example combines category 211 (Environment, Energy and Resources) and 301 (Science and Technology), a $250,000 floor, a rolling 90-day publish window, and delta mode under a named state (renewables-watch) so a schedule reusing this exact input only ever receives new activity.

Output Dataset Sample & Data Dictionary

Fields below are taken directly from .actor/dataset_schema.json. Every property is nullable/optional except the six required fields (record_id, event_type, scraped_at, is_new, source_url, gaId).

Integration envelope (identical across this developer's public-register Actors):

FieldTypeDescription
record_idstringSame value as gaId — stable across runs (e.g. GA578886, GA270901-V1 for a variation).
event_typestring (enum: NEW_LISTING, AWARD_VARIATION, UPDATED)NEW_LISTING, AWARD_VARIATION or UPDATED (a previously delivered award whose Last Updated stamp moved).
scraped_atstringISO-8601 UTC timestamp of this extraction.
is_newbooleantrue when this award was never delivered by a previous run of this delta state.
source_urlstringThe official GrantConnect record page.
data_sourcestringAttribution string (CC BY 3.0 AU).

Identity:

FieldTypeDescription
gaIdstringGrantConnect's own award identifier (example: GA578886).
gaUuidstring | nullStable identifier from the record URL.
isVariationbooleanIs variation.
variationNumberinteger | null1 for GA270901-V1.
baseGaIdstringThe original award this record belongs to (equals gaId for a base award).
variesGaIdstring | nullVaries GA ID.
variesUrlstring | nullVaries URL.
titlestring | nullGrant Activity title as shown on the listing.

Listing:

FieldTypeDescription
agencystring | nullAwarding agency name as recorded at publication.
categorystring | nullGrantConnect sub-category label, e.g. 'Medical Research'.
publishDatestring | nullPublish date, raw site string (example: 4-Sep-2026).
grantTermstring | nullGrant term, raw site string (example: 4-Sep-2026 to 30-Nov-2027).
valueAudstring | nullValue AUD, raw site string (example: $225,000.00).
recipientNamestring | nullRecipient name.
lastUpdatedstring | nullLast updated, raw site string (example: 4-Sep-2026 4:16 pm (ACT Local Time)).
publishDateIsostring | nullYYYY-MM-DD.
lastUpdatedIsostring | nullUTC ISO-8601 instant converted from Canberra local time — the register's only time-of-day field and the delta engine's change key.
valueAudNumbernumber | nullNumeric value for sorting, summing and thresholds.
valueBandstring | null<10k, 10k-100k, 100k-1M, 1M-10M, >=10M.
grantStartDatestring | nullGrant start, raw site string.
grantEndDatestring | nullGrant end, raw site string.
grantStartDateIsostring | nullGrant start (ISO date).
grantEndDateIsostring | nullGrant end (ISO date).
grantTermDaysinteger | nullGrant term, in days.
daysUntilGrantEndinteger | nullNegative once the term has ended — a renewal/re-tender signal.
isCurrentboolean | nulltrue while today falls inside the grant term.
financialYearstring | nullFinancial year (published), example: 2026-27.
grantStartFinancialYearstring | nullFinancial year (start).
recipientEntityTypestring | nullcompany, local_government, university, aboriginal_corporation, incorporated_association, trust, government, multiple or other — derived from the legal name.

Detail (populated when fetchDetail: true):

FieldTypeDescription
detailFetchedbooleanfalse when fetchDetail was off or the award page could not be retrieved (see detailError).
detailErrorstring | nullDetail error.
agencyCurrentNamestring | nullAgency name on the award page — reflects machinery-of-government renames.
approvalDatestring | nullApproval date, raw site string.
approvalDateIsostring | nullApproval date (ISO).
variationPublishDatestring | nullVariation publish date, raw site string.
variationPublishDateIsostring | nullVariation publish date (ISO).
variationDatestring | nullVariation date, raw site string.
variationDateIsostring | nullVariation date (ISO).
oneOffAdHocstring | nullOne-off / ad hoc, raw site string.
isOneOffAdHocboolean | nullIs one-off / ad hoc.
aggregateGrantAwardstring | nullAggregate grant award, raw site string.
isAggregateboolean | nullIs aggregate.
aggregateReasonstring | nullAggregate reason.
numberOfAwardsAggregatedinteger | nullNumber of awards aggregated.
gstInclusiveboolean | nulltrue when the award page marks the value 'GST inclusive where applicable'.
pbsProgramNamestring | nullPBS program name.
grantProgramstring | nullGrant program.
grantActivitystring | nullGrant activity.
purposestring | nullPurpose.
goIdstring | nullThe originating Grant Opportunity (funding round), when linked.
goUuidstring | nullGO UUID.
goTitlestring | nullGO title.
goUrlstring | nullGO URL.
internalReferenceIdstring | nullInternal reference ID.
selectionProcessstring | nullSelection process (example: Demand Driven).
confidentialityContractstring | nullConfidentiality — contract, raw site string.
isContractConfidentialboolean | nullContract confidential.
confidentialityReasonContractstring | nullConfidentiality reason — contract.
confidentialityOutputsstring | nullConfidentiality — outputs, raw site string.
isOutputsConfidentialboolean | nullOutputs confidential.
confidentialityReasonOutputsstring | nullConfidentiality reason — outputs.

Recipient:

FieldTypeDescription
recipientAbnstring | nullRecipient ABN, raw site string (example: 46 101 325 642).
recipientAbnNormalizedstring | null11 digits, no spaces — the join key for ABR, ASIC, CRM and credit data.
recipientAbnValidboolean | nullABN checksum valid.
abrLookupUrlstring | nullABR lookup URL.
recipientSuburbstring | nullRecipient suburb.
recipientTownCitystring | nullRecipient town/city.
recipientPostcodestring | nullRecipient postcode.
recipientStatestring | nullRecipient state.
recipientCountrystring | nullRecipient country.

Delivery location:

FieldTypeDescription
deliverySuburbstring | nullDelivery suburb.
deliveryTownCitystring | nullDelivery town/city.
deliveryPostcodestring | nullWhere the grant is delivered — can differ from the recipient's address (e.g. 'Multiple').
deliveryStatestring | nullDelivery state (example: ACT, VIC).
deliveryCountrystring | nullDelivery country.

Agency contact:

FieldTypeDescription
agencyContactNamestring | nullAgency contact name.
agencyContactPhonestring | nullAgency contact phone.
agencyContactEmailstring | nullAgency contact email.

Sample dataset record

{
"record_id": "GA578886",
"event_type": "NEW_LISTING",
"scraped_at": "2026-09-06T10:15:57.202Z",
"is_new": true,
"source_url": "https://www.grants.gov.au/Ga/Show/937de059-5cbb-415f-bc83-bcb5619e1379",
"data_source": "GrantConnect (grants.gov.au), Australian Government Department of Finance, CC BY 3.0 AU",
"gaId": "GA578886",
"gaUuid": "937de059-5cbb-415f-bc83-bcb5619e1379",
"isVariation": false,
"baseGaId": "GA578886",
"title": "The Activity is to support low volume and/or new commercial airline routes to regional and remote communities...",
"agency": "Department of Infrastructure, Transport, Regional Development, Communications, Sport and the Arts",
"category": "Transport",
"publishDate": "4-Sep-2026",
"publishDateIso": "2026-09-04",
"lastUpdated": "4-Sep-2026 4:16 pm (ACT Local Time)",
"lastUpdatedIso": "2026-09-04T06:16:00.000Z",
"valueAud": "$225,000.00",
"valueAudNumber": 225000,
"valueBand": "100k-1M",
"grantTerm": "4-Sep-2026 to 30-Nov-2027",
"grantStartDateIso": "2026-09-04",
"grantEndDateIso": "2027-11-30",
"grantTermDays": 453,
"daysUntilGrantEnd": 450,
"isCurrent": true,
"financialYear": "2026-27",
"recipientName": "Regional Express Pty Ltd",
"recipientEntityType": "company",
"recipientAbn": "46 101 325 642",
"recipientAbnNormalized": "46101325642",
"recipientAbnValid": true,
"abrLookupUrl": "https://abr.business.gov.au/ABN/View?abn=46101325642",
"recipientSuburb": "MASCOT",
"recipientState": "NSW",
"recipientPostcode": "2020",
"deliveryState": "NSW",
"deliveryPostcode": "2020",
"approvalDateIso": "2026-08-21",
"selectionProcess": "Demand Driven",
"isOneOffAdHoc": false,
"isAggregate": false,
"isContractConfidential": false,
"pbsProgramName": "ITRDCSA 26/27 2.3 Air Transport",
"grantProgram": "Airservices Australia Enroute Charges Payment Scheme",
"purpose": "To provide regional and remote communities with access to essential air services...",
"goId": "GO6105",
"goTitle": "Airservices Australia Enroute Charges Payment Scheme",
"goUrl": "https://www.grants.gov.au/Go/Show?GoUuid=706c1e7b-90df-4e26-b6e3-757c464a717f",
"agencyContactEmail": "EGMO@infrastructure.gov.au",
"detailFetched": true
}

Multi-language Integration Snippets

All three snippets call the same endpoint with the same real input: category 231 (Health, Wellbeing and Medical Research) at minValueAud 500,000, in delta mode, capped at 500 records.

cURL

curl -X POST "https://api.apify.com/v2/acts/stefano_seggio~australia-grantconnect-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"categories": ["231"],
"minValueAud": 500000,
"onlyNew": true,
"maxItems": 500
}'

Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient(token="$APIFY_TOKEN")
run = client.actor("stefano_seggio/australia-grantconnect-monitor").call(
run_input={
"categories": ["231"],
"minValueAud": 500000,
"onlyNew": True,
"maxItems": 500,
}
)
for award in client.dataset(run["defaultDatasetId"]).iterate_items():
print(award["gaId"], award["event_type"], award["recipientName"], award["valueAudNumber"])

Node.js (apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '$APIFY_TOKEN' });
const run = await client.actor('stefano_seggio/australia-grantconnect-monitor').call({
categories: ['231'],
minValueAud: 500000,
onlyNew: true,
maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const award of items) {
console.log(award.gaId, award.event_type, award.recipientName, award.valueAudNumber);
}

Pricing Model Explanation

This Actor is pay-per-event, verified live via the Apify API:

EventPriceWhen it fires on this Actor
result$0.003 per recordA record delivered with the full detail page fetched — i.e. fetchDetail: true and the award's detail page was successfully retrieved (detailFetched: true), carrying all ~30 detail-only fields (ABN, delivery location, purpose, program, GO link, selection process, confidentiality flags, agency contact) on top of the listing fields.
result-summary$0.001 per recordA listing-only record — either because fetchDetail was set to false for the run, or because fetchDetail was true but that specific award's detail page could not be fetched (detailFetched: false, with detailError set, e.g. a NOT_FOUND on a withdrawn page). In both cases the record still carries the full listing fields, just none of the detail-page fields.
apify-actor-start$0.00005Once per run, regardless of how many records it delivers.

The two-tier result / result-summary split on this Actor is specifically about whether the award's own detail page was fetched, not about "new vs. previously seen" — that distinction is handled entirely by delta mode, separately from pricing tier. Worked examples from the Actor's own README: a filtered 500-record pull with fetchDetail: true costs about $1.50; the same 500 records listing-only (fetchDetail: false) would cost about $0.50; a daily monitor that finds 40 new or varied awards costs roughly $0.12/day; a quiet monitoring run that finds nothing new costs the $0.00005 start fee only.

Delta mode and billing. When onlyNew: true, an award that GrantConnect has not changed since the last run for that deltaStateName is never delivered at all — the crawler's own walk stops as soon as it reaches records it already has recorded in the named key-value store. An unchanged record is therefore not created as a dataset item and is not a billable event of any kind; it is not billed at $0, it simply never exists as an item for that run. Only awards that are genuinely new (NEW_LISTING), amended (AWARD_VARIATION) or whose lastUpdated stamp moved (UPDATED) are written to the dataset and billed at the result or result-summary rate above, plus the one-time per-run start fee.


Source files read: .actor/actor.json, .actor/input_schema.json, .actor/dataset_schema.json, README.md, CHANGELOG.md — all from C:\Users\Stef\apify-portfolio\australia-grantconnect-monitor.