# GrantConnect Grant Awards Scraper & Monitor (`stefano_seggio/australia-grantconnect-monitor`) Actor

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.

- **URL**: https://apify.com/stefano\_seggio/australia-grantconnect-monitor.md
- **Developed by:** [Stefano Seggio](https://apify.com/stefano_seggio) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 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`.

| Field | Type | Default | Description |
|---|---|---|---|
| `keyword` | string | `""` (prefill) | Full-text search over grant title, purpose and activity (also accepts a GA ID such as GA578886). Matching mode below. |
| `keywordMatch` | string (enum: `AllWord`, `AnyWord`, `ExactPhrase`) | `AllWord` | How the keyword(s) must match. |
| `categories` | array 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'). |
| `agencyNameContains` | string | — | Case-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. |
| `recipientName` | string | — | Substring match on the recipient's legal name, e.g. 'Monash University' or 'Regional Express'. |
| `recipientAbn` | string (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. |
| `minValueAud` | integer | — | Only awards worth at least this amount. Tip: 1000000 narrows the 360,000-record register to roughly 28,000. |
| `maxValueAud` | integer | — | Only awards worth at most this amount. |
| `goId` | string (pattern: `GO` + digits) | — | All awards made under one Grant Opportunity (funding round), e.g. GO6105. |
| `dateType` | string (enum: `Publish Date`, `Approval Date`, `Start Date`, `End Date`, `Current`, `Closed`) | `Publish Date` | Which date the 'from'/'to' window applies to. 'Current' = grants running today and 'Closed' = grants whose term has ended (both ignore the window). |
| `dateFrom` | string (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). |
| `dateTo` | string (absolute or relative datepicker) | — | Absolute or relative upper bound of the window. Leave empty for 'today'. |
| `oneOffAdHoc` | string (enum: `any`, `yes`, `no`) | `any` | Ad hoc grants (no competitive round) are the ones probity and integrity teams watch most closely. |
| `aggregateGrantAward` | string (enum: `any`, `yes`, `no`) | `any` | Aggregate awards bundle several recipients into one record ('Multiple'). |
| `eventTypes` | array 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). |
| `onlyNew` | boolean | `false` (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. |
| `sortBy` | string (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. |
| `deltaStateName` | string (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. |
| `resetState` | boolean | `false` | Forget every previously delivered award for this delta state and re-baseline (the run then returns up to 'Max records' most recently updated awards). |
| `maxItems` | integer (1–100000) | `100` | Hard 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. |
| `fetchDetail` | boolean | `true` | Opens 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). |
| `maxConcurrency` | integer (1–10) | `5` | How many award pages are fetched at once. GrantConnect tolerates 10 comfortably; 5 keeps a 500-record run under two minutes. |
| `dateRange` | string (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

```json
{
  "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):

| Field | Type | Description |
|---|---|---|
| `record_id` | string | Same value as `gaId` — stable across runs (e.g. GA578886, GA270901-V1 for a variation). |
| `event_type` | string (enum: `NEW_LISTING`, `AWARD_VARIATION`, `UPDATED`) | NEW\_LISTING, AWARD\_VARIATION or UPDATED (a previously delivered award whose Last Updated stamp moved). |
| `scraped_at` | string | ISO-8601 UTC timestamp of this extraction. |
| `is_new` | boolean | true when this award was never delivered by a previous run of this delta state. |
| `source_url` | string | The official GrantConnect record page. |
| `data_source` | string | Attribution string (CC BY 3.0 AU). |

**Identity:**

| Field | Type | Description |
|---|---|---|
| `gaId` | string | GrantConnect's own award identifier (example: `GA578886`). |
| `gaUuid` | string | null | Stable identifier from the record URL. |
| `isVariation` | boolean | Is variation. |
| `variationNumber` | integer | null | 1 for GA270901-V1. |
| `baseGaId` | string | The original award this record belongs to (equals gaId for a base award). |
| `variesGaId` | string | null | Varies GA ID. |
| `variesUrl` | string | null | Varies URL. |
| `title` | string | null | Grant Activity title as shown on the listing. |

**Listing:**

| Field | Type | Description |
|---|---|---|
| `agency` | string | null | Awarding agency name as recorded at publication. |
| `category` | string | null | GrantConnect sub-category label, e.g. 'Medical Research'. |
| `publishDate` | string | null | Publish date, raw site string (example: `4-Sep-2026`). |
| `grantTerm` | string | null | Grant term, raw site string (example: `4-Sep-2026 to 30-Nov-2027`). |
| `valueAud` | string | null | Value AUD, raw site string (example: `$225,000.00`). |
| `recipientName` | string | null | Recipient name. |
| `lastUpdated` | string | null | Last updated, raw site string (example: `4-Sep-2026 4:16 pm (ACT Local Time)`). |
| `publishDateIso` | string | null | YYYY-MM-DD. |
| `lastUpdatedIso` | string | null | UTC ISO-8601 instant converted from Canberra local time — the register's only time-of-day field and the delta engine's change key. |
| `valueAudNumber` | number | null | Numeric value for sorting, summing and thresholds. |
| `valueBand` | string | null | <10k, 10k-100k, 100k-1M, 1M-10M, >=10M. |
| `grantStartDate` | string | null | Grant start, raw site string. |
| `grantEndDate` | string | null | Grant end, raw site string. |
| `grantStartDateIso` | string | null | Grant start (ISO date). |
| `grantEndDateIso` | string | null | Grant end (ISO date). |
| `grantTermDays` | integer | null | Grant term, in days. |
| `daysUntilGrantEnd` | integer | null | Negative once the term has ended — a renewal/re-tender signal. |
| `isCurrent` | boolean | null | true while today falls inside the grant term. |
| `financialYear` | string | null | Financial year (published), example: `2026-27`. |
| `grantStartFinancialYear` | string | null | Financial year (start). |
| `recipientEntityType` | string | null | company, local\_government, university, aboriginal\_corporation, incorporated\_association, trust, government, multiple or other — derived from the legal name. |

**Detail** (populated when `fetchDetail: true`):

| Field | Type | Description |
|---|---|---|
| `detailFetched` | boolean | false when fetchDetail was off or the award page could not be retrieved (see detailError). |
| `detailError` | string | null | Detail error. |
| `agencyCurrentName` | string | null | Agency name on the award page — reflects machinery-of-government renames. |
| `approvalDate` | string | null | Approval date, raw site string. |
| `approvalDateIso` | string | null | Approval date (ISO). |
| `variationPublishDate` | string | null | Variation publish date, raw site string. |
| `variationPublishDateIso` | string | null | Variation publish date (ISO). |
| `variationDate` | string | null | Variation date, raw site string. |
| `variationDateIso` | string | null | Variation date (ISO). |
| `oneOffAdHoc` | string | null | One-off / ad hoc, raw site string. |
| `isOneOffAdHoc` | boolean | null | Is one-off / ad hoc. |
| `aggregateGrantAward` | string | null | Aggregate grant award, raw site string. |
| `isAggregate` | boolean | null | Is aggregate. |
| `aggregateReason` | string | null | Aggregate reason. |
| `numberOfAwardsAggregated` | integer | null | Number of awards aggregated. |
| `gstInclusive` | boolean | null | true when the award page marks the value 'GST inclusive where applicable'. |
| `pbsProgramName` | string | null | PBS program name. |
| `grantProgram` | string | null | Grant program. |
| `grantActivity` | string | null | Grant activity. |
| `purpose` | string | null | Purpose. |
| `goId` | string | null | The originating Grant Opportunity (funding round), when linked. |
| `goUuid` | string | null | GO UUID. |
| `goTitle` | string | null | GO title. |
| `goUrl` | string | null | GO URL. |
| `internalReferenceId` | string | null | Internal reference ID. |
| `selectionProcess` | string | null | Selection process (example: `Demand Driven`). |
| `confidentialityContract` | string | null | Confidentiality — contract, raw site string. |
| `isContractConfidential` | boolean | null | Contract confidential. |
| `confidentialityReasonContract` | string | null | Confidentiality reason — contract. |
| `confidentialityOutputs` | string | null | Confidentiality — outputs, raw site string. |
| `isOutputsConfidential` | boolean | null | Outputs confidential. |
| `confidentialityReasonOutputs` | string | null | Confidentiality reason — outputs. |

**Recipient:**

| Field | Type | Description |
|---|---|---|
| `recipientAbn` | string | null | Recipient ABN, raw site string (example: `46 101 325 642`). |
| `recipientAbnNormalized` | string | null | 11 digits, no spaces — the join key for ABR, ASIC, CRM and credit data. |
| `recipientAbnValid` | boolean | null | ABN checksum valid. |
| `abrLookupUrl` | string | null | ABR lookup URL. |
| `recipientSuburb` | string | null | Recipient suburb. |
| `recipientTownCity` | string | null | Recipient town/city. |
| `recipientPostcode` | string | null | Recipient postcode. |
| `recipientState` | string | null | Recipient state. |
| `recipientCountry` | string | null | Recipient country. |

**Delivery location:**

| Field | Type | Description |
|---|---|---|
| `deliverySuburb` | string | null | Delivery suburb. |
| `deliveryTownCity` | string | null | Delivery town/city. |
| `deliveryPostcode` | string | null | Where the grant is delivered — can differ from the recipient's address (e.g. 'Multiple'). |
| `deliveryState` | string | null | Delivery state (example: `ACT, VIC`). |
| `deliveryCountry` | string | null | Delivery country. |

**Agency contact:**

| Field | Type | Description |
|---|---|---|
| `agencyContactName` | string | null | Agency contact name. |
| `agencyContactPhone` | string | null | Agency contact phone. |
| `agencyContactEmail` | string | null | Agency contact email. |

#### Sample dataset record

```json
{
  "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

```bash
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)

```python
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)

```javascript
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:

| Event | Price | When it fires on this Actor |
|---|---|---|
| `result` | **$0.003** per record | A 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 record | A 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.00005** | Once 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`.*

# Actor input Schema

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

Full-text search over grant title, purpose and activity (also accepts a GA ID such as GA578886). Matching mode below.

## `keywordMatch` (type: `string`):

How the keyword(s) must match.

## `categories` (type: `array`):

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').

## `agencyNameContains` (type: `string`):

Case-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.

## `recipientName` (type: `string`):

Substring match on the recipient's legal name, e.g. 'Monash University' or 'Regional Express'.

## `recipientAbn` (type: `string`):

Exact match on the recipient's 11-digit Australian Business Number (spaces optional). Returns every Commonwealth grant that entity has received.

## `minValueAud` (type: `integer`):

Only awards worth at least this amount. Tip: 1000000 narrows the 360,000-record register to roughly 28,000.

## `maxValueAud` (type: `integer`):

Only awards worth at most this amount.

## `goId` (type: `string`):

All awards made under one Grant Opportunity (funding round), e.g. GO6105.

## `dateType` (type: `string`):

Which date the 'from'/'to' window applies to. 'Current' = grants running today and 'Closed' = grants whose term has ended (both ignore the window).

## `dateFrom` (type: `string`):

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).

## `dateTo` (type: `string`):

Absolute or relative upper bound of the window. Leave empty for 'today'.

## `oneOffAdHoc` (type: `string`):

Ad hoc grants (no competitive round) are the ones probity and integrity teams watch most closely.

## `aggregateGrantAward` (type: `string`):

Aggregate awards bundle several recipients into one record ('Multiple').

## `eventTypes` (type: `array`):

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).

## `onlyNew` (type: `boolean`):

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.

## `sortBy` (type: `string`):

'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.

## `deltaStateName` (type: `string`):

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.

## `resetState` (type: `boolean`):

Forget every previously delivered award for this delta state and re-baseline (the run then returns up to 'Max records' most recently updated awards).

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

Hard 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.

## `fetchDetail` (type: `boolean`):

Opens 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).

## `maxConcurrency` (type: `integer`):

How many award pages are fetched at once. GrantConnect tolerates 10 comfortably; 5 keeps a 500-record run under two minutes.

## `dateRange` (type: `string`):

Kept for tasks created with version 1: '24h', '7d' or '30d' are interpreted as 'Date from'.

## Actor input object example

```json
{
  "keywordMatch": "AllWord",
  "categories": [],
  "dateType": "Publish Date",
  "oneOffAdHoc": "any",
  "aggregateGrantAward": "any",
  "eventTypes": [
    "NEW_LISTING",
    "AWARD_VARIATION",
    "UPDATED"
  ],
  "onlyNew": true,
  "sortBy": "Last Updated",
  "resetState": false,
  "maxItems": 100,
  "fetchDetail": true,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsNewestFirst` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `excel` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `recipients` (type: `string`):

No description

## `variations` (type: `string`):

No description

## `runSummary` (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 = {
    "keyword": "",
    "onlyNew": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("stefano_seggio/australia-grantconnect-monitor").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 = {
    "keyword": "",
    "onlyNew": True,
}

# Run the Actor and wait for it to finish
run = client.actor("stefano_seggio/australia-grantconnect-monitor").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 '{
  "keyword": "",
  "onlyNew": true
}' |
apify call stefano_seggio/australia-grantconnect-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stefano_seggio/australia-grantconnect-monitor"
        }
    }
}

```

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/gt7wS4T0uFRXDz49n/builds/s6lMYynnBXUUj3aFt/openapi.json
