# Tenders Wa Tas Scraper (`mrdoe/tenders-wa-tas-scraper`) Actor

- **URL**: https://apify.com/mrdoe/tenders-wa-tas-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.50 / 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

### What does WA & Tasmania Government Tender Scraper do?

WA & Tasmania Government Tender Scraper collects tenders, requests for quote, and awarded-contract notices from two Australian state government procurement portals: [Tenders WA](https://www.tenders.wa.gov.au/) and [Tenders Tasmania](https://www.tenders.tas.gov.au/). Each run returns the tender title, issuing agency, procurement category, region, key dates, and - for awarded contracts - the winning supplier. Use it to build a live bid pipeline for WA or Tasmanian government work, track which suppliers are winning contracts in your industry, or monitor a category without checking either portal by hand.

The Actor works fully logged out - no account required - and returns clean, structured JSON ready for CSV, Excel, or your own pipeline. Pick a **Jurisdiction** per run: Western Australia and Tasmania are run on two independent government systems with their own record ids, so one run covers one state.

### Why use WA & Tasmania Government Tender Scraper?

- **Two state governments, one consistent output shape** - the same fields whether you are pulling WA tenders or Tasmanian awarded contracts.
- **Every stage of the pipeline** - open, closed, withdrawn and awarded listings, with a `status` and `record_type` on every row.
- **Supplier intelligence** - Tasmanian awarded-contract records include the winning supplier's name, whether it is a Tasmanian business, and its address.
- **Filter the way buyers and sellers think** - by status, category and issuing agency (plus free-text keywords for Tasmania).
- **Clean, normalised output** - dates as ISO strings, `null` for anything not published, de-duplicated by tender id.

### How it works

1. **Your input** - choose a **Jurisdiction** (WA or Tasmania), leave **Operation** on Search, and pick a **Status**.
2. **The Actor collects it** - it reads the matching listing for that status and, unless you turn off "Return the full record", opens each result to collect the full record.
3. **Your output** - one clean row per tender or awarded contract, ready to export to CSV, Excel, JSON, Google Sheets, or your own system.

### What data can you extract?

| Field                 | Description                                                                          |
| ---------------------- | ------------------------------------------------------------------------------------- |
| `jurisdiction`         | `WA` or `TAS`                                                                        |
| `record_type`          | `tender` or `contract_award`                                                          |
| `id`                   | The site's own numeric tender / contract id                                          |
| `reference`            | The agency's reference number, when published                                        |
| `title`                | Tender or contract title                                                             |
| `agency`               | Issuing agency                                                                       |
| `agency_address`       | Agency postal address (Tasmania)                                                     |
| `category`             | UNSPSC procurement category                                                          |
| `region`               | Region(s) the tender covers                                                          |
| `status`               | Site-reported status, for example `Current`, `Closed`, `Awarded`, `Withdrawn`         |
| `type`                 | Procurement type, for example `Tender`, `Request for Tender`, `Standing Offer`        |
| `description`          | Tender or contract description                                                       |
| `opened_date`          | Date the tender opened / was published (ISO)                                         |
| `closing_date`         | Closing date and time (ISO)                                                          |
| `contract_start_date`  | Contract award / start date (ISO), for awarded contracts                             |
| `contract_end_date`    | Contract end date (ISO), for awarded contracts                                       |
| `contact_name`         | Contact person (WA)                                                                  |
| `contact_email`        | Contact email (WA)                                                                   |
| `contact_phone`        | Contact phone (WA)                                                                   |
| `awarded_suppliers`    | Winning supplier(s) as `{ supplier_name, tasmanian_business, address }` (Tasmania)    |
| `documents_url`        | Link to the tender's specification documents, when published (WA)                    |
| `url`                  | Canonical record page URL                                                            |

### How to use WA & Tasmania Government Tender Scraper

1. Open the Actor and choose **Jurisdiction** - Western Australia or Tasmania.
2. Leave **Operation** on *Search tenders* and pick one or more **Status** values (default is Open).
3. Optionally set **Category** or **Agency** to narrow the results (and **Keywords** for Tasmania).
4. Set **Max results** (default 20 per status).
5. Click **Start**, then download the dataset from the **Output** tab or connect it through the API.

To pull specific records, switch **Operation** to *Tender details* and paste tender/contract ids into **Tender / contract ids**, or full record URLs into **Start URLs**.

### Input Parameters

| Parameter            | Type    | Required | Default | Description                                                                                          |
| --------------------- | ------- | -------- | ------- | ------------------------------------------------------------------------------------------------------ |
| `jurisdiction`        | string  | No       | `wa`    | `wa` (Tenders WA) or `tas` (Tenders Tasmania).                                                        |
| `operation`           | string  | No       | `search`| `search` collects lists of matching records; `tenderDetails` returns full records for supplied ids.   |
| `statuses`            | array   | No       | `["Open"]` | Which listings to collect. See the input form for the options available per jurisdiction.          |
| `keywords`            | string  | No       | -       | Tasmania only: keep only results whose title or description contains this text.                      |
| `category`            | string  | No       | -       | Keep only results whose UNSPSC category contains this text.                                           |
| `agency`              | string  | No       | -       | Keep only results whose issuing agency contains this text.                                            |
| `recordType`          | string  | No       | `tender`| Tasmania only, for `tenderDetails` with plain ids: `tender` or `contract`.                             |
| `ids`                 | array   | No       | `[]`    | Numeric tender/contract ids for `tenderDetails`. Not limited by Max results.                           |
| `startUrls`           | array   | No       | `[]`    | Full Tenders WA or Tenders Tasmania record page URLs for `tenderDetails`.                              |
| `fetchDetails`        | boolean | No       | `true`  | Expand every result into its full record. Turn off for a faster, lighter run.                          |
| `maxItems`            | integer | No       | `20`    | Maximum records to collect per status, for Search.                                                     |
| `proxyConfiguration`  | object  | No       | Off     | Optional proxy settings. Both sites serve their public tender pages without a proxy.                   |

### Output Data

Each dataset item is one tender or one awarded-contract record. Example (a Tasmanian awarded contract):

```json
{
    "jurisdiction": "TAS",
    "record_type": "contract_award",
    "id": "14721",
    "reference": "DPAC 2026-27-14",
    "title": "Provision of learning and development training services trauma responsive courses for the Tasmanian Training Consortium",
    "agency": "Department of Premier and Cabinet",
    "agency_address": "15 Murray Street, Hobart Tasmania 7000",
    "category": "Education and Training Services",
    "region": "State-wide",
    "status": "Awarded",
    "type": "Standing Offer",
    "description": "Provision of learning and development training services trauma responsive courses for the TTC.",
    "contract_start_date": "2026-08-31",
    "contract_end_date": "2027-08-30",
    "awarded_suppliers": [
        { "supplier_name": "Second Mountain Pty Ltd", "tasmanian_business": true, "address": "138 Bell Buoy Beach Rd Low Head Tasmania Australia 7253" }
    ],
    "url": "https://www.tenders.tas.gov.au/ContractAwarded/Details/14721"
}
```

### Usage Examples

**All open WA construction tenders**

```json
{ "jurisdiction": "wa", "operation": "search", "statuses": ["Open"], "category": "Construction", "maxItems": 100 }
```

**Tasmanian contracts awarded to a named supplier**

```json
{ "jurisdiction": "tas", "operation": "search", "statuses": ["Awarded"], "keywords": "training", "maxItems": 100 }
```

**Full record for a known WA tender**

```json
{ "jurisdiction": "wa", "operation": "tenderDetails", "ids": ["70327"] }
```

### Tips for Best Results

- Western Australia and Tasmania are run on entirely different government systems - always set `jurisdiction` to match the ids or URLs you are working with.
- For Tasmania's `tenderDetails`, set `recordType` to `contract` when the id comes from an awarded-contract page, otherwise the Actor looks for it among open tenders.
- Use `startUrls` instead of `ids` when you already have the full record link - it works for both jurisdictions without needing `recordType`.
- Turn off "Return the full record" for a much faster run when you only need the fields already shown in the results list.

### Known Limitations

- Neither site's public listing paginates beyond one page per status in current testing; if a status ever grows past that, only the records shown on that page are returned.
- Western Australia's tender detail pages do not republish the closing date shown on the results list, so the Actor merges it in from the listing row - this only happens automatically when a search operation collects the record, not when you look it up directly by id with no matching listing row in the same run.
- `documents_url` (WA) and individual attachment names are not always published in a machine-readable form; download links may require a supplier login to actually retrieve files.
- Tasmania's own keyword search (via its `/Search/Index` form) is not used by this Actor; `keywords` filters the listing client-side instead.
- The Actor does not log in and cannot retrieve tender response documents that require supplier registration.

### Integrations

Connect the dataset through the Apify API, webhooks, Google Sheets, Make, Zapier, or scheduled runs. Every run's output is available as a dataset you can pull on a schedule into a CRM, a bid-management tool, or a data warehouse.

### Export Formats

JSON, CSV, Excel, XML, and JSONL via the Dataset tab or the Apify API.

### Frequently Asked Questions

#### Can one run collect both WA and Tasmania?

No. The two states run independent systems with their own ids, so `jurisdiction` scopes a run to one state. Run the Actor twice (or as two Tasks) to cover both.

#### Does it return awarded contracts with the supplier?

Yes for Tasmania (set `statuses` to include `Awarded`) - supplier name, whether it is a Tasmanian business, and address are included when published. Western Australia's "Awarded" status returns tenders with an awarded status but does not separately publish supplier/contract records the way Tasmania does.

#### Why are some fields null?

Agencies publish different levels of detail on each platform. When a field is not on the record, the Actor returns `null` rather than guessing.

#### How are duplicates handled?

Records are de-duplicated within a run by their site-native tender or contract id.

#### Can I get the full record for a tender I already know?

Yes. Set `operation` to `tenderDetails` and pass ids in `ids` (with `recordType` for Tasmania contract ids) or full URLs in `startUrls`.

#### Do I need an account or login?

No. The Actor collects only publicly available information and does not log in.

#### Am I charged for failed results?

You are only charged for records successfully returned in the dataset.

### 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 the Tenders WA and Tenders Tasmania terms of use, applicable law, and responsible data-use requirements. This Actor can collect business contact details that may be personal data; you are responsible for handling any personal data you collect in line with applicable privacy and data-protection law (for example the Privacy Act 1988 (Cth)).

# Actor input Schema

## `jurisdiction` (type: `string`):

Which government tender platform to collect from. Western Australia and Tasmania are run on two different systems, so pick one per run.

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

'Search' collects tenders and contract notices matching your status filter. 'Tender details' returns the full record for each id or URL you supply.

## `statuses` (type: `array`):

Which listings to collect. Western Australia offers Open, Closed, Awarded and New; Tasmania offers Open, Closed, Not Awarded, Withdrawn and Awarded (Awarded returns awarded-contract notices instead of tenders).

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

Only keep results whose title or description contains this text. Applies to Tasmania only - for Western Australia, use Category / Agency instead.

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

Only keep results whose UNSPSC category contains this text, for example 'Construction' or 'IT'. Case-insensitive.

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

Only keep results whose issuing agency contains this text, for example 'Health' or 'Transport'. Case-insensitive.

## `recordType` (type: `string`):

Whether the ids supplied for 'Tender details' are open-for-bids tenders or awarded contracts. Only used for Tasmania when 'ids' are plain numbers rather than full URLs.

## `ids` (type: `array`):

One or more numeric tender or contract ids from the site's own URLs. Used when Operation is 'Tender details'. Not limited by Max results.

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

Optional. Paste full Tenders WA or Tenders Tasmania record page URLs instead of plain ids.

## `fetchDetails` (type: `boolean`):

When on, every result is expanded into its full record (description, contacts, region, supplier). Turn it off for a faster run that returns only the fields shown in the results list.

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

Maximum number of records to collect per status, for Search.

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

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

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

Optional proxy settings. Both sites serve their public tender pages without a proxy.

## Actor input object example

```json
{
  "jurisdiction": "wa",
  "operation": "search",
  "statuses": [
    "Open"
  ],
  "recordType": "tender",
  "ids": [],
  "startUrls": [],
  "fetchDetails": true,
  "maxItems": 20,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (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 = {
    "jurisdiction": "wa",
    "operation": "search",
    "statuses": [
        "Open"
    ],
    "recordType": "tender",
    "ids": [],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/tenders-wa-tas-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 = {
    "jurisdiction": "wa",
    "operation": "search",
    "statuses": ["Open"],
    "recordType": "tender",
    "ids": [],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/tenders-wa-tas-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 '{
  "jurisdiction": "wa",
  "operation": "search",
  "statuses": [
    "Open"
  ],
  "recordType": "tender",
  "ids": [],
  "startUrls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/tenders-wa-tas-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/tenders-wa-tas-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/OwTA9GfJHFebC2G0T/builds/BlJP3ETRooMZxceHY/openapi.json
