# Austender Scraper (`mrdoe/austender-scraper`) Actor

- **URL**: https://apify.com/mrdoe/austender-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

![AusTender Scraper — search Australian Government contract notices and approaches to market](./assets/hero.png)

### What does AusTender Scraper do?

AusTender Scraper collects Australian Government procurement records from tenders.gov.au and returns them as clean, structured rows. It covers two record types: **contract notices** (contracts already awarded by federal agencies) and **approaches to market** (ATMs — open tenders and requests currently seeking suppliers). You give it keywords, an agency name, a category, a publish-date range or a contract-value range, and it returns one row per notice with the agency, supplier, supplier ABN, contract value in Australian dollars, UNSPSC category, procurement method, contract dates, and consultancy and confidentiality flags. It runs fully logged out — no AusTender account and no cookies.

Use it to monitor new federal contract awards, track a competitor's or a supplier's win history across every agency, watch for open tenders in your category, or build a procurement dataset for analysis.

### Why use AusTender Scraper?

- **Both record types in one run** — contract notices and approaches to market, searched together or filtered to one type.
- **Structured supplier intelligence** — supplier name, ABN and address, contract value, agency and UNSPSC category in a single row, ready for a spreadsheet or CRM.
- **Supplier win history** — filter by a supplier name to pull every federal contract that supplier has been awarded across all agencies.
- **Precise filtering** — keyword, agency, category, publish-date range and contract-value range, applied before results are collected.
- **Clean, normalised output** — dates as `YYYY-MM-DD`, values as numbers, missing fields as `null`, records deduplicated by notice ID.
- **No login** — works without an AusTender account or any credentials.
- **Automation-ready** — schedule runs, connect to Google Sheets, Make, Zapier, or pull results through the API.

### What makes this different

Most procurement trackers give you a title, an agency and a link. This Actor returns the full record in one row: **supplier ABN, contract value, UNSPSC category, procurement method, contract start and end dates, consultancy flag and confidentiality flag** — the fields you need for competitive analysis and supplier due diligence. Because you can filter by supplier name, one run produces a supplier's complete federal contract win history across every Australian Government agency.

### How it works

![How the AusTender Scraper works: your input, the collection engine, your output](./assets/how-it-works.png)

1. **Your input** — choose the *Search notices* operation, enter one or more keywords, and optionally narrow by agency, category, publish-date range or contract-value range.
2. **The Actor collects the data** — it searches AusTender's contract notices and its listing of current approaches to market, follows each result to its record page, paginates up to your limit, handles rate limits and retries for you, and removes duplicates.
3. **Your output** — a dataset with one row per notice, downloadable as JSON, CSV, Excel or XML, or available through the API.

### What data can you extract?

| Field                      | Description                                                               |
| -------------------------- | ------------------------------------------------------------------------- |
| `notice_type`              | `contract_notice` or `atm` (approach to market)                           |
| `notice_id`                | AusTender identifier (for example `CN4275454` or an agency ATM reference) |
| `title`                    | Notice title                                                              |
| `agency`                   | Publishing Australian Government agency                                   |
| `description`              | Full description of the goods or services                                 |
| `category_unspsc`          | UNSPSC category code                                                      |
| `category_text`            | UNSPSC category description                                               |
| `publish_date`             | Date the notice was published (`YYYY-MM-DD`)                              |
| `close_date`               | Closing date and time for an approach to market                           |
| `contract_start_date`      | Contract start date                                                       |
| `contract_end_date`        | Contract end date                                                         |
| `contract_value_aud`       | Contract value in Australian dollars (number)                             |
| `gst_inclusive`            | Whether the stated value includes GST, when published                     |
| `procurement_method`       | For example Open tender, Limited tender, Prequalified tender              |
| `atm_type`                 | Approach-to-market type, for example Request for Tender                   |
| `supplier_name`            | Awarded supplier                                                          |
| `supplier_abn`             | Supplier ABN, when published (11 digits)                                  |
| `supplier_address`         | Supplier location                                                         |
| `contact_name`             | Agency contact name                                                       |
| `contact_email`            | Agency contact email                                                      |
| `contact_phone`            | Agency contact phone                                                      |
| `amendment_history`        | List of amendments for an amended contract notice                         |
| `consultancy`              | Whether the contract is a consultancy                                     |
| `confidentiality_contract` | Whether confidential provisions apply to the contract                     |
| `url`                      | Link to the notice on tenders.gov.au                                      |

Any field that AusTender does not publish for a given notice is returned as `null`.

### How to use AusTender Scraper

1. Open the Actor and select the **Search notices** operation.
2. Enter one or more **keywords** (one per line).
3. Optionally set an **agency**, **supplier**, **category**, **published from / to** dates, or a **min / max contract value**.
4. Set **max notices per keyword** (default 20).
5. Click **Start**.
6. When the run finishes, open the **Dataset** tab and download JSON, CSV, Excel or XML, or connect the dataset to your tools.

![AusTender Scraper input form with example values](./assets/input.png)

#### How do I get the full record for specific notices?

Switch the operation to **Notice details**, then put the notice IDs (for example `CN4275454`) in the Keywords field, or paste record URLs such as `https://www.tenders.gov.au/Cn/Show/<id>` into Start URLs. Every notice you list is returned in full, with no result limit.

### Input Parameters

| Parameter            | Type    | Required | Default                | Description                                                                             |
| -------------------- | ------- | -------- | ---------------------- | --------------------------------------------------------------------------------------- |
| `operation`          | string  | Yes      | `search`               | `search` filters notices; `noticeDetails` returns full records for supplied IDs or URLs |
| `keywords`           | array   | Yes      | `["software"]`         | Keywords to search (one per line). For `noticeDetails`, put notice IDs here             |
| `startUrls`          | array   | No       | `[]`                   | tenders.gov.au search URLs (search) or record page URLs (notice details)                |
| `noticeType`         | string  | No       | Any                    | Limit a search to `contract_notice` or `atm`                                            |
| `agency`             | string  | No       | —                      | Keep only notices whose agency name contains this text                                  |
| `supplier`           | string  | No       | —                      | Keep only contract notices whose supplier name contains this text                       |
| `category`           | string  | No       | —                      | Keep only notices whose category description contains this text                         |
| `publishedFrom`      | string  | No       | 60 days ago            | Earliest publish date, `YYYY-MM-DD`                                                     |
| `publishedTo`        | string  | No       | today                  | Latest publish date, `YYYY-MM-DD`                                                       |
| `minValue`           | integer | No       | —                      | Minimum contract value in AUD                                                           |
| `maxValue`           | integer | No       | —                      | Maximum contract value in AUD                                                           |
| `maxItems`           | integer | No       | 20                     | Maximum notices per keyword (ignored for `noticeDetails`)                               |
| `useCache`           | boolean | No       | `false`                | Reuse records collected in an earlier run to speed up recurring runs                    |
| `proxyConfiguration` | object  | No       | Australian residential | Proxy settings                                                                          |

### Output Data

Each dataset item is one notice. Example record:

```json
{
    "notice_type": "contract_notice",
    "notice_id": "CN4275454",
    "title": "Software Licence",
    "agency": "Department of Defence",
    "description": "Software Licence",
    "category_unspsc": "81112200",
    "category_text": "Software maintenance and support",
    "publish_date": "2026-09-09",
    "close_date": null,
    "contract_start_date": "2026-08-25",
    "contract_end_date": "2029-08-24",
    "contract_value_aud": 46629.53,
    "gst_inclusive": null,
    "procurement_method": "Limited tender",
    "atm_type": null,
    "supplier_name": "INTERSECT ALLIANCE INTERNATIONAL PT",
    "supplier_abn": "84151743976",
    "supplier_address": "ADELAIDE, SA, 5000, AUSTRALIA",
    "contact_name": "JCG - Cyber Warfare Division",
    "contact_email": "IWDCOORD@DEFENCE.GOV.AU",
    "contact_phone": null,
    "amendment_history": [],
    "consultancy": false,
    "confidentiality_contract": false,
    "url": "https://www.tenders.gov.au/Cn/Show/9dea7316-61e6-40f5-aa1d-673e2d187503"
}
```

![AusTender Scraper dataset output table](./assets/output.png)

![One AusTender record with every field labelled](./assets/fields.png)

### Usage Examples

#### Recent federal software contracts

Operation `search`, keywords `software`, published from `2026-07-01`. Returns contract notices and current ATMs mentioning software.

#### One supplier's win history

Operation `search`, keywords `services`, supplier `Deloitte`, published from `2025-07-01`, max notices per keyword `500`. Returns every matching contract awarded to that supplier.

#### High-value consulting contracts for one agency

Operation `search`, keywords `consulting`, agency `Health`, min value `500000`. Returns large consulting contracts published by Health portfolio agencies.

#### Full details for known notices

Operation `noticeDetails`, keywords `CN4275454`, `CN4274900`. Returns both complete records with no limit.

### Tips for Best Results

- Contract notices are searched newest-first, so a **publish-date range** keeps runs fast and focused.
- Approaches to market are drawn from AusTender's list of **currently open** opportunities; the publish-date range is not applied to them.
- Use several **specific keywords** rather than one broad term to improve coverage of a category.
- Raise **max notices per keyword** for a full export; keep it low for a quick test.
- Filter by **supplier** to build win-history datasets; filter by **category** or **agency** for market monitoring.

### Known Limitations

- AusTender publishes **contract notices and approaches to market**. Australian Government grants are published separately (on GrantConnect) and are not covered.
- The approach-to-market search returns **currently open** opportunities. Closed ATMs can still be retrieved individually with the `noticeDetails` operation.
- Some fields are not published for every notice — for example `supplier_abn` is often `Exempt` for individuals or overseas suppliers, and `gst_inclusive` is only set when AusTender states it. Missing values are returned as `null`.
- Search filters for agency, supplier and category match on text contained in the field, not exact codes.
- Very large exports (thousands of notices per keyword) take longer because each notice's full record page is visited.

### Integrations

Connect the dataset to Google Sheets, Make, Zapier or Slack, call the Actor and its dataset through the Apify API, trigger runs with webhooks, or run it on a schedule for ongoing monitoring.

### Export Formats

JSON, CSV, Excel and XML, from the Dataset tab or the API.

### Frequently Asked Questions

#### Does it need an AusTender login or account?

No. The Actor works fully logged out. There are no credentials to configure.

#### How many notices can it return?

As many as match your filters. `maxItems` caps the number per keyword (default 20); raise it for a full export. The `noticeDetails` operation is never capped.

#### Can I search by contract value or date range?

Yes. Set `minValue` / `maxValue` for contract value in AUD and `publishedFrom` / `publishedTo` for the publish-date window. The date window applies to contract notices; approaches to market are returned from AusTender's current-opportunities list.

#### Can I get every contract awarded to one supplier?

Yes. Use the `supplier` filter with the supplier's name. Combine it with a wide publish-date range and a high `maxItems` for a complete win history.

#### How are duplicates handled?

Records are deduplicated by `notice_id` within a run, so the same contract notice or ATM appears only once.

#### Why are some fields null?

AusTender does not publish every field for every notice. When a value is not available, the Actor returns `null` rather than guessing.

#### How fresh is the data?

Every run reads AusTender live at the time it runs. Contract notices appear on AusTender after an agency reports an awarded contract; approaches to market appear while they are open.

#### What does "use cache" do?

When enabled, the Actor reuses notice records collected in an earlier run instead of fetching them again, which speeds up recurring runs. It is disabled by default so every run returns current data.

#### Am I charged for failed results?

You are only charged for notices that are successfully returned in the dataset.

#### Can I export to Google Sheets?

Yes. Connect the dataset to Google Sheets directly, or through Make or Zapier.

### Support

Questions or issues: use the **Issues** tab on the Actor's page in Apify Console.

### Legal / Responsible Use

You are responsible for complying with tenders.gov.au's terms of use, applicable law, and responsible data-use requirements. AusTender data is published by the Department of Finance under a Creative Commons Attribution licence. This Actor can collect personal data such as agency contact names, emails and phone numbers; you are responsible for handling any personal data in line with applicable privacy and data-protection law, including the Australian Privacy Act and the GDPR where relevant.

# Actor input Schema

## `operation` (type: `string`):

What the run does. 'Search notices' filters Australian Government contract notices and approaches to market (ATMs) by keyword, agency, category, date range, value range and supplier. 'Notice details' takes one or more notice ids or record URLs and returns the full record for each, with no result cap.

## `keywords` (type: `array`):

One keyword or phrase per line (for example 'software', 'cyber security', 'cloud hosting'). Each keyword is searched separately. For the 'Notice details' operation, put notice ids here instead (for example 'CN4275454' or a Department of Parliamentary Services ATM reference).

## `startUrls` (type: `array`):

Optional. For 'Search notices': paste tenders.gov.au keyword search URLs. For 'Notice details': paste record page URLs such as https://www.tenders.gov.au/Cn/Show/<id> or https://www.tenders.gov.au/Atm/Show/<id>.

## `noticeType` (type: `string`):

Limit a search to one notice type. 'Any' returns both contract notices and approaches to market.

## `agency` (type: `string`):

Optional. Only keep notices whose publishing agency name contains this text (for example 'Defence', 'Health', 'Australian Federal Police').

## `supplier` (type: `string`):

Optional. Only keep contract notices whose supplier name contains this text. Useful for building a supplier's federal win history.

## `category` (type: `string`):

Optional. Only keep notices whose category description contains this text (for example 'software', 'construction', 'consulting').

## `publishedFrom` (type: `string`):

Optional. Earliest publish date to include, as YYYY-MM-DD. Defaults to 60 days ago when left blank.

## `publishedTo` (type: `string`):

Optional. Latest publish date to include, as YYYY-MM-DD. Defaults to today when left blank.

## `minValue` (type: `integer`):

Optional. Only keep contract notices with a contract value at or above this amount in Australian dollars.

## `maxValue` (type: `integer`):

Optional. Only keep contract notices with a contract value at or below this amount in Australian dollars.

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

Maximum number of notices to return for each keyword. Keep this low for quick test runs and raise it for full exports. Ignored for the 'Notice details' operation, which always returns every notice you asked for.

## `useCache` (type: `boolean`):

Reuse notice records collected in an earlier run to speed up recurring runs. Disabled by default so every run returns fresh data.

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

Proxy settings. AusTender is a public Australian Government service. Residential IPs located in Australia are prefilled for the most reliable access; you can switch to a cheaper tier if runs stay stable.

## Actor input object example

```json
{
  "operation": "search",
  "keywords": [
    "software"
  ],
  "startUrls": [],
  "noticeType": "",
  "agency": "",
  "supplier": "",
  "category": "",
  "publishedFrom": "",
  "publishedTo": "",
  "maxItems": 20,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

## `notices` (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 = {
    "keywords": [
        "software"
    ],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/austender-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 = {
    "keywords": ["software"],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/austender-scraper").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 '{
  "keywords": [
    "software"
  ],
  "startUrls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call mrdoe/austender-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/austender-scraper"
        }
    }
}
```

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/bLv9OUkHNraYI0mgm/builds/sTyrDR5RvcUpuZ2HT/openapi.json
