# GETS New Zealand Government Tenders API (`helixdatalabs/nz-gets-tenders-api`) Actor

Scrapes the public New Zealand Government Electronic Tenders Service (GETS) index and extracts live RFx opportunities with agencies, tender types and ISO close dates for automation and alerts.

- **URL**: https://apify.com/helixdatalabs/nz-gets-tenders-api.md
- **Developed by:** [Luke](https://apify.com/helixdatalabs) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 4 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## New Zealand GETS Tender Feed

The GETS Tender Feed actor scrapes the public [New Zealand Government Electronic Tenders Service](https://www.gets.govt.nz/ExternalIndex.htm) index to generate a filtered feed of live RFx opportunities—no RealMe login required.

### 🚀 Functional Overview

This actor downloads the public tender table, parses every row with `CheerioCrawler`, and outputs normalized JSON containing RFx ID, titles, tender types, agencies, and close dates in ISO 8601.

### 💡 Key Features

- **No login / no CAPTCHA**: Pulls straight from the public metadata page.
- **Category + keyword filters**: Focus on UNSPSC codes or industry phrases.
- **Tender-type controls**: Only watch ROIs, RFQs, or RFTs that matter.
- **Clean ISO timestamps**: Close dates converted to UTC for downstream automation.
- **Low CU footprint**: Single HTTP request + HTML parse keeps costs near zero.

### 🎯 Who Is It For?

- SME biz-dev teams that need daily procurement alerts without logging into GETS.
- GovTech and compliance SaaS platforms building automated tender monitors.
- Consultants/analysts tracking signal volume for specific agencies or UNSPSC codes.

### 📊 Data Extracted

| Field | Description |
|-------|-------------|
| `id` | Official RFx identifier shown in the GETS table. |
| `reference` | Secondary reference / agency code when provided. |
| `title` | Tender title. |
| `tender_type` | RFx type (NOI, ROI, RFP, RFQ, RFT). |
| `organisation` | Publishing agency or council. |
| `close_date` | ISO timestamp (Pacific/Auckland → UTC). |
| `close_date_raw` | Original close date text for auditing. |
| `detail_url` | Direct link to the GETS detail page. |
| `source_url` | Listing page used for the run. |
| `categoryMatches` | Array of matched category codes (optional). |
| `extracted_at` | ISO timestamp when the record was scraped. |

### ⚡ Quick Start Guide

1. Open the actor on Apify Store and click **Try for free**.
2. Leave the default `startUrls` (or add filtered/sorted GETS list URLs).
3. Enter UNSPSC or agency codes in `categoryCodes` to pre-filter.
4. Add include/exclude keywords to tighten the feed; pick tender types (ROI/RFP/RFT/etc.).
5. Set `maxItems` (e.g., 100). Click **Run**.
6. When the run finishes, download the Dataset as JSON/CSV or access via API/webhooks.

### 📥 Input Parameters

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `startUrls` | Array<Request> | ✅ | `ExternalIndex.htm` | GETS listing URLs to crawl. Accepts sorted versions (`orderBy=ref`, etc.). |
| `categoryCodes` | Array<String> | ❌ | `[]` | Optional UNSPSC/agency codes to match against title/reference text. |
| `keywordIncludes` | Array<String> | ❌ | `[]` | Only emit tenders that contain at least one keyword (case-insensitive). |
| `keywordExcludes` | Array<String> | ❌ | `[]` | Drop tenders containing any of these keywords. |
| `tenderTypes` | Array<Enum> | ❌ | `[]` | Limit to specific RFx types (`NOI`, `RFQ`, `RFP`, `ROI`, `RFT`). |
| `maxItems` | Integer | ❌ | `200` | Hard cap on number of records pushed per run. |
| `proxyConfiguration` | Object | ❌ | Apify datacenter | Use default Apify proxy. Residential pools rarely required. |

### 📤 Output Schema

```json
{
  "id": "33592807",
  "reference": "NZBS-2026-P2P",
  "title": "Procure to Pay Platform (P2P)",
  "tender_type": "ROI",
  "organisation": "New Zealand Blood Service",
  "close_date": "2026-03-04T23:00:00.000Z",
  "close_date_raw": "12:00 PM 5 Mar 2026 (Pacific/Auckland UTC+13:00)",
  "detail_url": "https://www.gets.govt.nz/NZBS/ExternalTenderDetails.htm?id=33498430",
  "source_url": "https://www.gets.govt.nz/ExternalIndex.htm",
  "categoryMatches": ["93131700"],
  "extracted_at": "2026-03-04T08:15:33.102Z"
}
```

### 💰 Pricing & Compute Units

- **Estimated CU**: ~0.02 CU per 500 tenders (one HTML request + Cheerio parse).
- **Scaling tip**: Increase `maxItems` gradually; CU usage scales linearly with rows processed.
- **Proxy cost**: Default Apify datacenter proxy is sufficient; residential proxies optional.

### 🛠️ FAQ & Troubleshooting

**Do I need a RealMe login?** No. The actor uses only the public tender index.

**The run returned zero items. Why?** Most likely filters were too strict. Remove `categoryCodes`/keywords to confirm data is flowing, then reintroduce them.

**Can I fetch full tender documents?** No, RealMe authentication is required for downloads. This actor is best for discovery feeds and alerting.

**How do I get notified on new tenders?** Use Apify webhooks (ACTOR.RUN.SUCCEEDED) or schedule the actor hourly and connect the dataset to Make/Zapier.

### 🔌 Integrations

- **Apify API**: Access datasets via `https://api.apify.com/v2/datasets/<datasetId>/items`.
- **Make / Zapier**: Consume dataset webhooks to populate Slack, email digests, or CRMs.
- **Google Sheets**: Use Apify’s Google Sheets integration to auto-sync the dataset.

### 📈 Maintenance & Quality

- Built with `CheerioCrawler` for deterministic output (no browser flakiness).
- Limited permissions by default—only accesses its own storages.
- Designed per Apify Playbook best practices with logging + schema validation hooks.

Need additional fields (e.g., auto-follow detail pages)? Open an issue on the Actor page and we can extend the extractor.

# Actor input Schema

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

List of GETS listing URLs to crawl. Defaults to the current tenders page.

## `categoryCodes` (type: `array`):

Optional UNSPSC or agency codes to match within the tender reference/title (e.g., 93131700 for health programmes).

## `keywordIncludes` (type: `array`):

Only emit tenders containing at least one of these keywords in the title, organisation, or reference.

## `keywordExcludes` (type: `array`):

Discard tenders containing any of these keywords.

## `tenderTypes` (type: `array`):

Restrict results to specific RFx types (supported values: NOI, RFQ, RFP, ROI, RFT). Leave empty for all.

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

Maximum number of records to output per run.

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

Proxy settings. Datacenter proxies usually suffice for GETS, but residential pools can be used if blocks occur.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.gets.govt.nz/ExternalIndex.htm"
    }
  ],
  "categoryCodes": [
    "93131700"
  ],
  "keywordIncludes": [
    "digital",
    "health"
  ],
  "keywordExcludes": [
    "construction"
  ],
  "tenderTypes": [
    "ROI",
    "RFP",
    "RFT"
  ],
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.gets.govt.nz/ExternalIndex.htm"
        }
    ],
    "categoryCodes": [
        "93131700"
    ],
    "keywordIncludes": [
        "digital",
        "health"
    ],
    "keywordExcludes": [
        "construction"
    ],
    "tenderTypes": [
        "ROI",
        "RFP",
        "RFT"
    ],
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("helixdatalabs/nz-gets-tenders-api").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 = {
    "startUrls": [{ "url": "https://www.gets.govt.nz/ExternalIndex.htm" }],
    "categoryCodes": ["93131700"],
    "keywordIncludes": [
        "digital",
        "health",
    ],
    "keywordExcludes": ["construction"],
    "tenderTypes": [
        "ROI",
        "RFP",
        "RFT",
    ],
    "maxItems": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("helixdatalabs/nz-gets-tenders-api").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 '{
  "startUrls": [
    {
      "url": "https://www.gets.govt.nz/ExternalIndex.htm"
    }
  ],
  "categoryCodes": [
    "93131700"
  ],
  "keywordIncludes": [
    "digital",
    "health"
  ],
  "keywordExcludes": [
    "construction"
  ],
  "tenderTypes": [
    "ROI",
    "RFP",
    "RFT"
  ],
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call helixdatalabs/nz-gets-tenders-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=helixdatalabs/nz-gets-tenders-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qJUUZx9zFhKHQakQY/builds/fUFokm52qXBOjXOJy/openapi.json
