# Qtenders Qld Scraper (`mrdoe/qtenders-qld-scraper`) Actor

- **URL**: https://apify.com/mrdoe/qtenders-qld-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 QTenders Queensland Government Tender Scraper do?

QTenders Queensland Government Tender Scraper collects tender, request-for-quote, and awarded-contract records from [QTenders](https://qtenders.hpw.qld.gov.au/), the Queensland Government's procurement portal. Every run returns the tender title, issuing agency and department, procurement category, region, product/service group, key dates, and - once a tender is decided - the awarded supplier and price. Use it to build a live bid pipeline for Queensland Government work, track which suppliers are winning contracts in your industry, or monitor a category without checking the portal by hand.

The Actor works fully logged out - no account, no cookies, no browser required - and returns clean, structured JSON ready for CSV, Excel, or your own pipeline.

### Why use QTenders Queensland Government Tender Scraper?

- **One dataset, every stage** - open tenders, closed tenders, and awarded contracts side by side, with a `status` field on every row.
- **Supplier intelligence** - awarded records include the winning supplier's name, location, and price where the agency has published it.
- **Filter the way buyers and sellers think** - by keyword, status, category, and issuing agency.
- **Bulk and repeatable** - pull hundreds of records per run and schedule the Actor to re-run daily for monitoring.
- **Clean, normalised output** - `null` for anything not published, de-duplicated by tender id, category and location lists de-duplicated and stripped of search-highlight formatting.

### How it works

1. **Your input** - choose Search, set a keyword (or leave the default), and optionally filter by status, category, or agency.
2. **The Actor collects it** - it reads matching tenders from the QTenders search index and keeps paging until it reaches your Max results.
3. **Your output** - one clean row per tender, ready to export to CSV, Excel, JSON, Google Sheets, or your own system.

### What data can you extract?

| Field                | Description                                                          |
| -------------------- | --------------------------------------------------------------------- |
| `id`                 | QTenders internal tender id                                           |
| `reference`          | VP reference number (for example `VP495780`)                          |
| `buyers_reference`   | The issuing agency's own reference number                             |
| `title`              | Tender title                                                          |
| `agency`             | Issuing agency                                                        |
| `department`         | Queensland Government department, when published separately          |
| `status`             | `Open`, `Closed`, or `Awarded`                                        |
| `categories`         | Procurement categories                                                |
| `locations`          | Queensland regions the tender covers                                  |
| `products_services`  | Product / service groups                                              |
| `description`        | Tender description                                                    |
| `opens_at`           | Date and time the tender opened                                       |
| `closes_at`          | Date and time the tender closes                                       |
| `published_at`       | Date the record was first published on QTenders                       |
| `updated_at`         | Date the record was last updated                                      |
| `awarded_suppliers`  | Winning supplier(s) as `{ supplier_name, supplier_location, price_ex_gst }`, when published |
| `url`                | Link to the tender's access page                                      |
| `preview_url`        | Link to the tender's preview page                                     |

### How to use QTenders Queensland Government Tender Scraper

1. Open the Actor and leave **Operation** on *Search tenders*.
2. Enter one or more **Keywords** (the default is `services`).
3. Optionally set **Tender status**, **Category**, or **Agency**.
4. Set **Max results** (default 20).
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 VP reference numbers, buyer reference numbers, or tender ids into **References / ids**.

### Input Parameters

| Parameter            | Type    | Required | Default    | Description                                                                                    |
| --------------------- | ------- | -------- | ---------- | ------------------------------------------------------------------------------------------------ |
| `operation`           | string  | No       | `search`   | `search` collects lists of matching tenders; `tenderDetails` returns full records for supplied references. |
| `keywords`            | string  | No       | `services` | Free-text search across titles, descriptions, agencies, categories and reference numbers.       |
| `statuses`            | array   | No       | `[]`       | Which tender statuses to include (`Open`, `Closed`, `Awarded`). Empty means all.                |
| `category`            | string  | No       | -          | Keep only results whose category or product/service group contains this text.                  |
| `agency`              | string  | No       | -          | Keep only results whose issuing agency or department contains this text.                        |
| `sortBy`              | string  | No       | `Relevance`| Order results are read in.                                                                       |
| `references`          | array   | No       | `[]`       | VP references, buyer references, or ids for `tenderDetails`. Not limited by Max results.         |
| `maxItems`            | integer | No       | `20`       | Maximum tender records to collect for Search.                                                    |
| `proxyConfiguration`  | object  | No       | Off        | Optional proxy settings. QTenders serves its search API without a proxy.                         |

### Output Data

Each dataset item is one tender or awarded-contract record. Example:

```json
{
    "id": 309,
    "reference": "VP463382",
    "buyers_reference": "QFD300463",
    "title": "QFD Frontline Vehicle Connectivity",
    "agency": "Queensland Fire Department",
    "department": "Queensland Government",
    "status": "Awarded",
    "categories": ["IT & Telecomms"],
    "locations": ["Brisbane"],
    "products_services": ["Hardware - Computer Hardware", "Services - Networks"],
    "description": "Refer to attached documentation",
    "opens_at": "2025-06-03T06:14:00",
    "closes_at": "2025-07-02T04:00:00",
    "published_at": "2025-11-06T06:10:46",
    "updated_at": "2025-11-06T06:10:46",
    "awarded_suppliers": [{ "supplier_name": "Ipex Consulting Pty Ltd", "supplier_location": "London GB", "price_ex_gst": 349150 }],
    "url": "https://www.vendorpanel.com.au/PublicTenderAccess.aspx?id=...",
    "preview_url": "https://www.vendorpanel.com.au/PublicTenderPreviewPop.aspx?id=..."
}
```

### Usage Examples

**All open construction tenders**

```json
{ "operation": "search", "keywords": "construction", "statuses": ["Open"], "maxItems": 100 }
```

**Track a competitor's Queensland Government wins**

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

**Full records for specific references**

```json
{ "operation": "tenderDetails", "references": ["VP495780", "QBCC-2026132"] }
```

### Tips for Best Results

- Leave `keywords` blank and use `category` or `agency` to sweep a whole procurement area.
- `category` and `agency` are matched on the record itself, so they work even when combined with a keyword.
- Awarded supplier and price are only present once an agency has published them - most awarded tenders do not carry a price.
- Schedule the Actor daily to keep a monitoring dataset current.

### Known Limitations

- QTenders' own search index decides what a keyword matches; very broad terms return large result sets, so set `maxItems` accordingly.
- Full tender specification documents live on the awarding agency's own e-tender site (linked from the description) or on VendorPanel and are not downloaded by this Actor.
- Awarded supplier and price fields are only populated when the agency chooses to publish them.
- The Actor does not log in and cannot retrieve 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

#### How many records can I collect in one run?

As many as you set in `maxItems`. There is no hard cap; large runs simply take longer and page deeper.

#### Can I search by agency or by category?

Yes. Use `category` for the procurement category or product/service group and `agency` for a partial agency or department match. Combine them with a keyword and a status filter.

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

Yes, when the agency has published them. Set `statuses` to `["Awarded"]` to focus on decided tenders.

#### Why are some fields null or empty?

Queensland agencies publish different levels of detail. When a field such as awarded supplier or department is not on the record, the Actor returns `null` or an empty array rather than guessing.

#### How are duplicates handled?

Records are de-duplicated within a run by their QTenders tender id.

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

Yes. Set `operation` to `tenderDetails` and pass VP references, buyer references, or ids in `references`. This list is not limited by `maxItems`.

#### Can it export to Google Sheets?

Yes, through the Apify integration for Google Sheets, or via Make, Zapier, or the API.

#### How fresh is the data?

Every run reads the live QTenders search index, so results reflect what is published at run time. Schedule the Actor to keep a dataset current.

#### 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 QTenders 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

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

'Search' collects tenders and contract notices that match your filters. 'Tender details' returns the full record for each reference or id you supply.

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

Free-text search across titles, descriptions, agencies, categories and reference numbers. Leave blank to return everything that matches the other filters.

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

Which tender statuses to include. Leave empty for all statuses.

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

Only keep results whose category or product/service group contains this text, for example 'Construction' or 'IT'. Case-insensitive.

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

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

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

Order results are read in.

## `references` (type: `array`):

One or more VP reference numbers (for example VP495780), buyer reference numbers, or QTenders ids. Used when Operation is 'Tender details'. This list is not limited by Max results.

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

Maximum number of tender records to collect for Search.

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

Reuse records collected in an earlier run to speed up recurring monitoring and avoid re-charging for the same tender. Disabled by default so every run returns fresh data.

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

Optional proxy settings. QTenders serves its search API without a proxy, so this is off by default.

## Actor input object example

```json
{
  "operation": "search",
  "keywords": "services",
  "statuses": [],
  "sortBy": "Relevance",
  "references": [],
  "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 = {
    "operation": "search",
    "keywords": "services",
    "statuses": [],
    "sortBy": "Relevance",
    "references": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/qtenders-qld-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 = {
    "operation": "search",
    "keywords": "services",
    "statuses": [],
    "sortBy": "Relevance",
    "references": [],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/qtenders-qld-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 '{
  "operation": "search",
  "keywords": "services",
  "statuses": [],
  "sortBy": "Relevance",
  "references": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/qtenders-qld-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/qtenders-qld-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/SPiElqfV4ytbgKtOP/builds/zjCdBEuulZJ47rXjx/openapi.json
