# Ireland eTenders Opportunities Scraper (`automation-lab/ireland-etenders-opportunities-scraper`) Actor

Discover current Irish public procurement Calls for Tenders from the official eTenders portal, with qualification fields, pagination, filters, and source links.

- **URL**: https://apify.com/automation-lab/ireland-etenders-opportunities-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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

## Ireland eTenders Opportunities Scraper

Discover current Irish public procurement opportunities from the official [eTenders portal](https://www.etenders.gov.ie/).

The Actor turns the public Calls for Tenders (CfT) listing into structured records for bid discovery, qualification, alerts, spreadsheets, databases, and procurement-intelligence feeds.

It runs with anonymous HTTP requests and does not require an eTenders account, a browser, or a proxy.

### What does Ireland eTenders Opportunities Scraper do?

The Actor scans the official current-opportunities listing and saves one dataset item for every accepted Call for Tenders.

It can:

- follow the portal's paginated current-CfT results;
- stop at a user-selected record or page limit;
- filter by keyword, contracting authority, displayed status, publication date, and submission deadline;
- process a public eTenders CfT resource URL directly;
- deduplicate records by the stable eTenders CfT resource ID;
- return notice-PDF and source links for verification;
- retry bounded transient website failures without hiding terminal errors.

The Actor does not submit tenders, log into supplier accounts, or download restricted tender documents.

### Who is it for?

**Suppliers and bid teams** can build a daily feed of newly published opportunities and review deadlines prior to deciding which bids to pursue.

**Business-development consultants** can monitor opportunities for a client sector or a named public authority.

**Procurement-intelligence teams** can ingest stable structured records instead of repeatedly copying a legacy HTML table.

**Data and automation teams** can send results to Google Sheets, Airtable, a CRM, a warehouse, Slack, or email through Apify integrations and webhooks.

### Why use this Actor?

The source is the official Ireland eTenders portal rather than a general web-search index.

Important qualification fields are returned together, including the authority, description, procedure, deadline, status, public notice link, and estimated value when the portal publishes them.

Only accepted records are charged and saved. Duplicate CfT IDs within one run are not emitted twice.

The implementation is HTTP-first, so it avoids browser overhead while retaining links back to each official record.

### What Ireland eTenders data can I extract?

| Field | Meaning |
| --- | --- |
| `cftId` | Official eTenders CfT resource identifier |
| `title` | Call for Tenders title |
| `authority` | Publishing contracting authority |
| `description` | Public opportunity description when available |
| `publishedAt` | Publication date/time as displayed in Irish local time |
| `submissionDeadline` | Submission deadline as displayed in Irish local time |
| `procedure` | Procurement procedure, such as Open |
| `status` | Current status displayed in the listing |
| `noticePdfUrl` | Public contract-notice PDF link when present |
| `awardDate` | Displayed award date, usually null for open opportunities |
| `estimatedValueEur` | Published estimated value parsed as a number |
| `cycle` | eTenders cycle number when shown |
| `detailUrl` | Canonical official CfT detail URL |
| `sourceUrl` | Exact listing or detail page used |
| `pageNumber` | Listing page number, or null for a direct detail URL |
| `scrapedAt` | Normalized ISO 8601 UTC extraction timestamp |

Source dates remain in the portal's `DD/MM/YYYY` display format so no Irish local-time assumption is lost.

### How to scrape current Ireland eTenders opportunities

1. Open the Actor in Apify Console.
2. Leave **eTenders URLs** at its official current-opportunities prefill, or remove it to use the same default automatically.
3. Set **Maximum opportunities** to the number of accepted records you need.
4. Optionally add a keyword, authority, status, or date window.
5. Set **Maximum listing pages** high enough for selective filters.
6. Click **Start**.
7. Open the **Tender opportunities** dataset view.
8. Export JSON, CSV, Excel, XML, or connect an integration.

A quick broad run:

```json
{
  "maxItems": 20,
  "maxPages": 5
}
```

### Input parameters

#### `startUrls`

Optional official `www.etenders.gov.ie` current-opportunities listing URLs or public `prepareViewCfTWS.do?resourceId=...` URLs.

Leave the field empty to scan the current Calls for Tenders listing.

Unsupported domains and paths fail closed instead of being fetched.

#### `keyword`

Case-insensitive text matched against the CfT ID, title, and description.

Example: `services`.

#### `authority`

Case-insensitive substring matched against the contracting authority.

Example: `University of Galway`.

#### `status`

Case-insensitive substring matched against the displayed status.

Example: `Tender Submission`.

#### Publication and deadline filters

`publishedFrom`, `publishedTo`, `deadlineFrom`, and `deadlineTo` use inclusive `YYYY-MM-DD` dates.

Records without the date needed by an active date filter do not match that filter.

#### Pagination controls

`startPage` selects the first listing page.

`maxPages` bounds how many 10-record listing pages are fetched per listing source.

`maxItems` bounds how many accepted records are saved across all sources.

### Output example

The following shape reflects a real current listing record, shortened only in its description:

```json
{
  "cftId": "8724059",
  "title": "GALW/COSE1847/26 Conducting technical and pre-clinical research and development of a novel cardiovascular medical device.",
  "authority": "University of Galway (ID 1400)",
  "description": "The University of Galway are developing a novel technology...",
  "publishedAt": "28/07/2026 03:12:20",
  "submissionDeadline": "25/08/2026 12:00:00",
  "procedure": "Open",
  "status": "Tender Submission",
  "noticePdfUrl": "https://www.etenders.gov.ie/epps/cft/downloadNoticeForAdvSearch.do?resourceId=8724059",
  "awardDate": null,
  "estimatedValueEur": 350000,
  "cycle": 1,
  "detailUrl": "https://www.etenders.gov.ie/epps/cft/prepareViewCfTWS.do?resourceId=8724059",
  "sourceUrl": "https://www.etenders.gov.ie/epps/quickSearchAction.do?searchType=cftFTS&latest=true&d-3680175-p=1",
  "pageNumber": 1,
  "scrapedAt": "2026-07-28T07:31:17.099Z"
}
```

Fields can be null when the portal does not publish them.

A direct detail URL provides only fields available on that detail page. Listing-only values such as publication time, status, award date, and cycle can therefore be null.

### How much does it cost to scrape Ireland eTenders opportunities?

This Actor uses pay-per-event pricing:

- **$0.005** once per run;
- a tiered `item` event charge for each accepted dataset item produced;
- rejected, duplicate, failed, and filtered-out records have no item event charge.

| Pricing tier | Price per opportunity |
| --- | ---: |
| FREE | $0.000041071 |
| BRONZE | $0.000035714 |
| SILVER | $0.000027857 |
| GOLD | $0.000021429 |
| PLATINUM | $0.000014286 |
| DIAMOND | $0.000010000 |

At the FREE tier, 20 records cost about **$0.00582** including the run fee.

At the FREE tier, 100 records cost about **$0.00911** including the run fee.

At the BRONZE tier, 1,000 records cost about **$0.04071** including the run fee.

The final total is shown in Apify Console prior to export. Platform plan and integration costs, if any, are separate.

### Monitoring and integration workflows

#### Daily bid alerts

Schedule the Actor once per day with a sector keyword and a deadline lower bound.

Use a webhook or Zapier/Make integration to notify a bid channel when a new CfT ID appears.

#### Contracting-authority watchlist

Create separate tasks for authorities important to your sales territory.

Send each dataset to a dedicated Sheet or CRM view.

#### Procurement data feed

Fetch dataset items through the Apify API after each run.

Use `cftId` as the external deduplication key in your warehouse.

#### Qualification queue

Filter for active tender-submission records, then sort downstream by `submissionDeadline` or `estimatedValueEur`.

Always verify final requirements and dates on `detailUrl` prior to acting.

### Use the Actor with the Apify API

Replace `<APIFY_TOKEN>` with your token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~ireland-etenders-opportunities-scraper/runs?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"services","status":"Tender Submission","maxItems":50,"maxPages":20}'
```

To wait for completion and receive dataset items:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~ireland-etenders-opportunities-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"authority":"University of Galway","maxItems":20,"maxPages":20}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/ireland-etenders-opportunities-scraper').call({
    keyword: 'services',
    status: 'Tender Submission',
    maxItems: 50,
    maxPages: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/ireland-etenders-opportunities-scraper").call(
    run_input={
        "keyword": "services",
        "status": "Tender Submission",
        "maxItems": 50,
        "maxPages": 20,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use Ireland eTenders data through MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/ireland-etenders-opportunities-scraper"
```

#### Claude Desktop, Cursor, and VS Code

Use this JSON configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/ireland-etenders-opportunities-scraper"
    }
  }
}
```

Example prompts:

- “Find current Irish public tenders mentioning professional services.”
- “Collect active University of Galway Calls for Tenders and summarize their deadlines.”
- “Create a table of Irish tender title, authority, estimated value, deadline, and official source URL.”

MCP calls use the same Actor input, output, and pricing contract as Console runs.

### Tips for reliable results

Start with a broad, low `maxItems` run to inspect current wording used by the portal.

Increase `maxPages` when a selective filter may match records beyond the first few pages.

Use one simple keyword or authority substring rather than a long sentence.

For incremental monitoring, deduplicate downstream on `cftId` and retain `scrapedAt` as observation time.

Keep the official `detailUrl` and `noticePdfUrl` in downstream records for auditability.

### Limits and source behavior

The Actor reads the portal's public current-CfT surfaces; it does not guarantee that every historical or restricted procurement record is present there.

The listing currently exposes 10 rows per page. Portal pagination or markup can change.

The website can temporarily return network errors, 403, 429, or 5xx responses. The Actor retries those responses a bounded number of times and fails if recovery does not occur.

A successful no-result run is possible when filters are narrower than the current public data.

Direct detail inputs have fewer listing-specific fields.

The Actor deliberately does not offer an automatic residential proxy fallback, so there is no unmeasured proxy mode or proxy transfer charge.

### Responsible use and legality

This Actor accesses publicly visible procurement information.

You are responsible for complying with eTenders terms, procurement rules, applicable law, database rights, and your organization's data-retention policy.

Do not use the Actor to overload the portal, bypass authentication, misrepresent tender information, or automate prohibited submissions.

Public procurement records can change after extraction. Confirm dates, eligibility, documents, clarifications, and submission instructions on the official source prior to making a commercial decision.

### Troubleshooting

#### Why did my run return no records?

Remove filters and run with `maxItems: 10` and `maxPages: 2`.

If broad discovery returns records, restore filters one at a time. Remember that date filters are inclusive and use `YYYY-MM-DD`.

#### Why are fields null for my direct URL?

The public detail page does not repeat every value from the current-opportunities listing. Use a listing input when you need publication time, status, award date, or cycle.

#### Why did the run fail after retries?

Inspect the run log for the URL and HTTP status. A continuing 403, 429, 5xx, unexpected content type, or changed table shape is treated as an error rather than a misleading empty result.

Retry later if the official portal was unavailable. Contact Actor support with the run link if a broad official listing still fails.

#### Can I use arbitrary URLs?

No. The Actor accepts only supported public `www.etenders.gov.ie` listing and CfT detail paths.

### Related Automation Labs actors

- [Singapore GeBIZ Tender Opportunities Scraper](https://apify.com/automation-lab/singapore-gebiz-tender-opportunities-scraper) for Singapore public-sector opportunities.
- [AusTender Current Tender Opportunities Scraper](https://apify.com/automation-lab/austender-current-tender-opportunities-scraper) for Australian Government opportunities.
- [CanadaBuys Tender Opportunities Scraper](https://apify.com/automation-lab/canadabuys-tender-opportunities-scraper) for Canadian public procurement.
- [UK Find a Tender Scraper](https://apify.com/automation-lab/uk-find-a-tender-scraper) for UK procurement notices.
- [TED Europa Tenders Scraper](https://apify.com/automation-lab/ted-europa-tenders-scraper) for EU-wide TED notices.

Choose this Actor when Ireland's official eTenders CfT source is the required market.

### FAQ

#### Does it require an eTenders login?

No. Version 0.1 uses anonymous public listing and detail pages.

#### Does it use a browser or proxy?

No. It uses lightweight HTTP requests and HTML parsing.

#### Can it paginate beyond the first page?

Yes. Set `startPage`, `maxPages`, and `maxItems` for the desired bounded scan.

#### Are filtered-out opportunities charged?

No item event is charged for filtered, duplicate, rejected, or failed records. The one-time run-start event still applies.

#### Are source dates converted to UTC?

No. `publishedAt` and `submissionDeadline` preserve the Irish portal display values. Only `scrapedAt` is normalized to ISO 8601 UTC.

#### Does it submit or manage bids?

No. It is a discovery and extraction Actor. Tender submission remains on the official procurement workflow.

# Actor input Schema

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

Optional official current-opportunities listing URLs or public prepareViewCfTWS.do?resourceId=... detail URLs. Leave empty to scan current Calls for Tenders.

## `keyword` (type: `string`):

Keep opportunities whose CfT ID, title, or description contains this case-insensitive text.

## `authority` (type: `string`):

Keep opportunities whose contracting authority contains this case-insensitive text.

## `status` (type: `string`):

Keep opportunities whose displayed status contains this case-insensitive text, for example Tender Submission.

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

Optional inclusive publication-date lower bound in YYYY-MM-DD format.

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

Optional inclusive publication-date upper bound in YYYY-MM-DD format.

## `deadlineFrom` (type: `string`):

Optional inclusive tender-submission deadline lower bound in YYYY-MM-DD format.

## `deadlineTo` (type: `string`):

Optional inclusive tender-submission deadline upper bound in YYYY-MM-DD format.

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

Stop after this many matching opportunities are saved.

## `startPage` (type: `integer`):

Start listing discovery on this eTenders results page. A page number already present in a start URL is used when this field is omitted.

## `maxPages` (type: `integer`):

Fetch at most this many 10-record eTenders listing pages per listing source.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.etenders.gov.ie/epps/prepareCurrentOpportunities.do?currentType=cft"
    }
  ],
  "maxItems": 20,
  "startPage": 1,
  "maxPages": 5
}
```

# Actor output Schema

## `dataset` (type: `string`):

Structured CfT records from the official eTenders portal.

# 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.etenders.gov.ie/epps/prepareCurrentOpportunities.do?currentType=cft"
        }
    ],
    "maxItems": 20,
    "maxPages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/ireland-etenders-opportunities-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 = {
    "startUrls": [{ "url": "https://www.etenders.gov.ie/epps/prepareCurrentOpportunities.do?currentType=cft" }],
    "maxItems": 20,
    "maxPages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/ireland-etenders-opportunities-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 '{
  "startUrls": [
    {
      "url": "https://www.etenders.gov.ie/epps/prepareCurrentOpportunities.do?currentType=cft"
    }
  ],
  "maxItems": 20,
  "maxPages": 5
}' |
apify call automation-lab/ireland-etenders-opportunities-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/ireland-etenders-opportunities-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/JNZqXnO7o94TQJ6KI/builds/8GUbEVxg0sQt9Z5em/openapi.json
