# AU Government Tenders Scraper (`he_work/au-gov-tenders-scraper`) Actor

Scrapes AU Government tenders from AusTender (Commonwealth), NSW, and QLD. Structured data: title, description, agency, close dates, estimated values. Ideal for procurement monitoring and bid intelligence.

- **URL**: https://apify.com/he\_work/au-gov-tenders-scraper.md
- **Developed by:** [HE\_Work](https://apify.com/he_work) (community)
- **Categories:** Other
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00005 / actor start

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## AU Government Tenders Scraper — Apify Actor

[![Python](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org)

**The most comprehensive Australian tender scraper on Apify — covering government, council, utility, and procurement portals across the entire country.**

---

### Quick Overview

This actor scrapes tender opportunities from **12 Australian sources** — state/federal government portals, council aggregators, utilities, and procurement platforms:

#### Government Portals

| ## | Jurisdiction | Portal | Tenders | Status |
|---|-------------|--------|:------:|:------:|
| 🇦🇺 | Commonwealth | tenders.gov.au | 15 | ✅ requests |
| 🔵 | NSW | buy.nsw.gov.au | 135+ | 🛡️ Playwright (needs residential proxy) |
| 🟤 | QLD | etender.hpw.qld.gov.au | 90 | ✅ requests |
| 🔷 | VIC | vic.consolidatedtenders.com | 62 | ✅ requests |
| 🟡 | WA | tenders.wa.gov.au | 141 | ✅ requests |
| 🔴 | SA | tenders.sa.gov.au | TBD | 🛡️ requests (needs AU proxy for Cloudflare) |
| 🟢 | TAS | tenders.tas.gov.au | 35 | ✅ requests |
| 🟠 | NT | tendersonline.nt.gov.au | 35 | ✅ requests |

#### Council, Utility & Aggregator Sources

| ## | Source | Tenders | Status |
|---|--------|:------:|:------:|
| ⭐ | **VendorPanel** | 462 | ✅ requests — 100+ councils, QLD Health, universities |
| 🌐 | **Tenders.Net** | 1,130 | 🛡️ requests (needs proxy for Cloudflare) |
| 🛒 | **Local Buy** | 42 | ✅ requests — QLD/NT council procurement |
| 🏙️ | Brisbane City Council | 7 | ✅ requests |
| 💧 | Sydney Water | ready | ✅ requests — NSW utility |

**12 sources covering ~2,000+ tenders.** Residential proxy recommended for NSW, SA, and Tenders.Net to bypass WAF/Cloudflare. All other 9 sources work without proxy.

**What you get:**
- Structured tender data: ID, title, description, agency, category, close date, estimated value, status, and direct URL
- Filter by keywords, source state, and category
- Automatic status detection: open, closing soon (≤7 days), closed
- Cross-source category normalization — consistent labels across all portals
- Historical tracking across runs — see when tenders first appeared and were last updated
- Runs on Apify's reliable infrastructure — schedule daily via Apify Cron

**Use cases:**
- Procurement teams monitoring relevant opportunities
- Bid managers tracking competitor activity
- SMEs searching for government contracts
- Market research and government spending analysis

---

### Data Schema

Each dataset item is a single tender with these fields:

| Field | Type | Description |
|-------|------|-------------|
| `tender_id` | string | Unique identifier from source (e.g., `ATM_2026_2772`) |
| `title` | string | Tender title |
| `description` | string | Full description of the opportunity |
| `agency` | string | Government agency/department |
| `location` | string | Geographic location (state/region) |
| `category` | string | Source-specific industry category (e.g., "Information Technology") |
| `normalized_category` | string | Cross-source standardized category (one of 18 normalized labels) |
| `type` | string | Procurement type: RFT, RFP, EOI, RFQ |
| `status` | string | `open` / `closing_soon` (≤7 days) / `closed` |
| `close_date` | ISO 8601 | Submission deadline |
| `publish_date` | ISO 8601 | When the tender was published |
| `estimated_value` | string | Dollar value if disclosed |
| `source` | string | `austender`, `nsw`, `qld`, `vic`, `wa`, `sa`, `tas`, `act`, or `nt` |
| `url` | string | Direct link to full tender details |
| `last_updated` | string | Source's last-updated timestamp |
| `first_seen` | ISO 8601 | When this tender was first detected (historical archive) |
| `last_seen` | ISO 8601 | When this tender was last confirmed active |
| `scraped_at` | ISO 8601 | When the data was scraped |

**Example output:**

```json
{
  "tender_id": "ATM_2026_2772",
  "title": "Mechanical Services Infrastructure Upgrade - Questacon",
  "description": "Questacon is seeking work to ensure its mechanical services...",
  "agency": "Department of Industry, Science and Resources",
  "location": "ACT",
  "category": "Pneumatic and hydraulic and electric control systems",
  "normalized_category": "Construction & Engineering",
  "type": "Request for Tender",
  "status": "closing_soon",
  "close_date": "2026-05-12T15:00:00",
  "publish_date": "2026-04-10T00:00:00",
  "estimated_value": "$500,000",
  "source": "austender",
  "url": "https://www.tenders.gov.au/Atm/Show/8becfc76-a89a-4db7-bad0-4653860c328d",
  "last_updated": "30-Apr-2026 3:41 pm (ACT Local Time)",
  "first_seen": "2026-04-10T15:13:29.070193+00:00",
  "last_seen": "2026-05-11T15:13:29.070193+00:00",
  "scraped_at": "2026-05-11T15:13:29.070193+00:00"
}
````

***

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `states` | string | `"Commonwealth"` | Comma-separated: Commonwealth, NSW, QLD, VIC, WA, SA, TAS, NT, vendorpanel, tendersnet, localbuy, brisbane, sydneywater |
| `keywords` | string | `""` | Comma-separated search keywords (e.g., `"IT, construction"`) |
| `maxPages` | number | `3` | Max listing pages to scrape per source |
| `proxyConfiguration` | object | Residential | Apify proxy config — residential recommended for NSW, SA, Tenders.Net |

All parameters are optional — defaults scrape current Commonwealth tenders.

***

### Output

The actor outputs:

1. **Tender records** — one dataset item per tender with all 18 fields
2. **Run summary** — metadata: total count, status breakdown, errors, run duration
3. **Archive changes** — new, updated, and closed tender counts since last run
4. **Historical archive** (KV store) — persistent cross-run archive with first/last seen tracking

Dataset items are viewable in Apify Console as a sortable table with 5 views (Overview, Closing Soon, Full Detail, Run Summary, Historical Archive). Export as JSON, CSV, XML, or Excel.

***

### What Makes This Actor Different

- **Most comprehensive AU tender coverage on Apify** — 12 sources, 2,000+ tenders
- **Government + council + utility** — state portals, VendorPanel (100+ councils), Tenders.Net, utilities
- **Cross-source category normalization** — consistent labels across all 12 sources
- **Historical tracking** — persistent archive across runs tracks first\_seen, last\_seen, and status changes
- **Residential proxy included** — pre-configured for WAF-protected sources (NSW, SA, Tenders.Net)
- **Mostly requests-based** — 9 of 12 sources use lightweight HTTP scraping, no browser needed

***

### Pricing

**$1.00 per 1,000 tender records.** Each record represents a government contract typically worth $10K–$10M+. Free tier: first 100 records/month for evaluation. No monthly subscription — pay only for what you use.

***

### Scheduling

For ongoing monitoring, configure Apify Cron to run daily or twice-daily. The historical archive accumulates automatically across runs — each run builds on the last. Combine with Apify webhooks to receive alerts when new tenders match your criteria.

***

### Who Is This For?

- **Procurement teams** at companies that bid on government contracts
- **Bid managers** tracking competitor opportunities and market intelligence
- **SMEs** looking to enter the government procurement market
- **Consultants and researchers** analyzing government spending patterns
- **Industry associations** keeping members informed of relevant opportunities

***

### FAQ

**Is this legal?** Yes. AusTender data is published for public access under Creative Commons Attribution 3.0 Australia (CC BY 3.0 AU). NSW and QLD tender portals similarly publish data for public use. Our actor operates within each site's terms of use.

**How often should I run this?** Daily at minimum. Twice daily catches new postings faster. The historical archive automatically tracks changes across runs — no data is lost between runs.

**Can I get historical data?** Yes — the actor maintains a persistent historical archive across runs. Each run automatically records when tenders first appeared, were last updated, or closed. Run it daily to build a comprehensive archive over time.

**Do I need a paid Apify plan?** No — free tier users can run the actor with the included free monthly results.

**Which sources are supported?** 12 sources: Commonwealth (AusTender), NSW (buy.nsw.gov.au), QLD (eTender construction), VIC (Consolidated Tenders), WA (Tenders WA), SA (Tenders SA), TAS, NT (QTOL), VendorPanel (100+ councils/orgs), Tenders.Net (local government), Local Buy (QLD/NT procurement), Brisbane City Council, and Sydney Water. Select any combination via `states`.

**Are categories consistent across states?** Yes — raw portal-specific categories from all 9 portals are mapped to 18 normalized categories (e.g., "Information Technology", "Construction & Engineering", "Healthcare & Medical"), so you can filter across all sources with a single category selection.

***

*Built on the Apify platform. Part of the AU Data Suite — Australian web data for developers and businesses.*

# Actor input Schema

## `states` (type: `string`):

Comma-separated jurisdictions. Commonwealth, NSW, QLD, VIC, WA, SA, TAS, NT. Aggregator sources (VendorPanel, Tenders.Net) auto-included.

## `sources` (type: `string`):

Optional: comma-separated source names to run instead of auto-detected sources. E.g. 'vendorpanel,tendersnet'

## `keywords` (type: `string`):

Search keywords (comma-separated)

## `maxPages` (type: `number`):

Maximum pages per source (1-50)

## `proxyConfiguration` (type: `object`):

Residential proxy recommended for NSW, SA, and Tenders.Net to bypass Cloudflare/WAF.

## Actor input object example

```json
{
  "states": "Commonwealth",
  "sources": "",
  "keywords": "",
  "maxPages": 3
}
```

# Actor output Schema

## `tenderResults` (type: `string`):

Dataset containing all tender records with status, agency, close dates, estimated values, normalized categories, source portal, and first\_seen/last\_seen archive timestamps — plus run summary and archive change metadata

## `storageState` (type: `string`):

Key-value store containing seen tender hashes and run state for cross-run deduplication

## `tenderArchive` (type: `string`):

Key-value store archive of all tenders seen across runs with first\_seen and last\_seen timestamps, status change detection, versioned metadata, and automated pruning — providing persistent historical tracking

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("he_work/au-gov-tenders-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("he_work/au-gov-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call he_work/au-gov-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=he_work/au-gov-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AU Government Tenders Scraper",
        "description": "Scrapes AU Government tenders from AusTender (Commonwealth), NSW, and QLD. Structured data: title, description, agency, close dates, estimated values. Ideal for procurement monitoring and bid intelligence.",
        "version": "1.2",
        "x-build-id": "6ceWs3IRtad2ye1eh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/he_work~au-gov-tenders-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-he_work-au-gov-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/he_work~au-gov-tenders-scraper/runs": {
            "post": {
                "operationId": "runs-sync-he_work-au-gov-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/he_work~au-gov-tenders-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-he_work-au-gov-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "states": {
                        "title": "States / Territories",
                        "type": "string",
                        "description": "Comma-separated jurisdictions. Commonwealth, NSW, QLD, VIC, WA, SA, TAS, NT. Aggregator sources (VendorPanel, Tenders.Net) auto-included.",
                        "default": "Commonwealth"
                    },
                    "sources": {
                        "title": "Override Sources",
                        "type": "string",
                        "description": "Optional: comma-separated source names to run instead of auto-detected sources. E.g. 'vendorpanel,tendersnet'",
                        "default": ""
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Search keywords (comma-separated)",
                        "default": ""
                    },
                    "maxPages": {
                        "title": "Max Pages",
                        "type": "number",
                        "description": "Maximum pages per source (1-50)",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxy recommended for NSW, SA, and Tenders.Net to bypass Cloudflare/WAF."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
