# Global Tenders API: Canada, France, NL, EU & Australia (`crawlwren/global-tenders`) Actor

Government tenders from official open data: Canada (CanadaBuys, incl. award notices), France (BOAMP), the Netherlands (TenderNed), EU-institution calls for tenders and Australian contract awards, in one schema with source licences. Optional World Bank, EU TED and UK. $2 per 1,000.

- **URL**: https://apify.com/crawlwren/global-tenders.md
- **Developed by:** [Chordio, Inc.](https://apify.com/crawlwren) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 tender notices

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Government tenders from official open-data feeds, in one clean table.** This actor reads **CanadaBuys** (Canada, tenders and award notices), **BOAMP** (France), **TenderNed** (Netherlands), **AusTender** (Australia, awarded contracts) and the **EU Funding & Tenders Portal** (calls for tenders from the EU institutions and agencies). It normalises them all to one schema with a deadline countdown, a `source` and a `licence` field, and **no personal contact data**. You can also add **World Bank** procurement notices and contract awards (projects in borrower countries worldwide), the EU's **TED** and the UK's **Find a Tender** and **Contracts Finder** in the same run.

Use it to:

- **Find bids abroad.** Get a daily list of open tenders in Canada, France, the Netherlands and the EU institutions that match your keywords or CPV/UNSPSC codes. Add the World Bank feed for bids on development projects.
- **Do market and competitor intelligence.** See who wins public contracts and for how much: Canadian award notices, Australian contract awards, French *avis d'attribution*, Dutch *gegunde opdrachten* and World Bank signed contracts.
- **Feed bid tools and AI agents.** CSV, Opendatasoft JSON, TNS JSON, OCDS and the World Bank and European Commission search APIs arrive as one JSON schema.

### Why this actor

| | This actor | Typical tender scrapers |
|---|---|---|
| Coverage | **4 countries + the EU institutions in one run** (+ optional World Bank, EU TED and UK) | One portal per actor |
| Data access | **Official open-data feeds and APIs only**: no HTML scraping, no logins, no browser | Often HTML scraping |
| Schema | One schema: `source`, `country`, `noticeStage`, `deadlineAt`, `daysToDeadline`, `valueAmount`, CPV + UNSPSC `classifications`, `awards`, `licence` | Source-specific fields |
| Personal data | Buyer contact names, e-mails and phones are **never** output. Labelled contacts in free text are redacted, and sole-trader suppliers are withheld | Usually included |
| Failure handling | Per-source success rates in `RUN_STATS`. One broken feed doesn't stop the others, and a run where everything fails **fails loudly** | Often silent empties |
| Price | **$2.00 per 1,000 notices**, and you only pay for notices that pass your filters | $2–$4 per 1,000 for a single country |

### Sources

| `source` | Country | What it covers | Stages | Licence |
|---|---|---|---|---|
| `canadabuys` | 🇨🇦 Canada | Federal tender notices and contract award notices (CanadaBuys open-data CSVs, EN/FR) | open, planning (RFI/ACAN/LOI), awarded, cancelled, expired | Open Government Licence – Canada |
| `boamp` | 🇫🇷 France | BOAMP official bulletin: all French public procurement notices | open, awarded, planning, amendments | Licence Ouverte / Etalab 2.0 |
| `tenderned` | 🇳🇱 Netherlands | TenderNed publications (open TNS JSON) with CPV + NUTS codes | open, awarded, planning (market consultations), amendments, cancelled | CC0 1.0 |
| `austender` | 🇦🇺 Australia | **Awarded contract notices only** (AusTender OCDS API). AusTender publishes no open tenders as open data | awarded | CC BY 3.0 AU |
| `eu_funding_tenders` | 🇪🇺 EU institutions | Calls for tenders from the European Commission, EU agencies and EU external action (Funding & Tenders Portal search API). **Tenders only, no EU grants.** No award results | open, planning (forthcoming), closed | CC BY 4.0 (Commission reuse policy) |
| `worldbank` | 🌍 World Bank borrowers | Optional: procurement notices for World Bank-financed projects (invitations for bids, expressions of interest, general procurement notices, contract-award notices) in EN/FR/ES/PT | open, planning, awarded | CC BY 4.0 |
| `worldbank_contracts` | 🌍 World Bank borrowers | Optional: **signed contracts only**, with supplier and amount in USD | awarded | CC BY 4.0 |
| `ted` · `find_a_tender` · `contracts_finder` | 🇪🇺 / 🇬🇧 | Optional: EU TED and the UK portals (same parsers as our UK & EU actor) | all | EU reuse decision / OGL v3 |

**Canadian award notices** are read only when `noticeStage` is `awarded` or `all` (they come from separate yearly award files). Each row is one contract award with the supplier's name, city, province and country. Street addresses are not output, and suppliers whose name looks like a private person (a sole trader) are shown as `[individual supplier]`.

**EU Funding & Tenders is on by default; the World Bank is opt-in.** EU-institution tenders are few (29 open calls were published in the 7 days to Oct 9, 2026) and open to bidders from every EU country, so they fit a default run. The World Bank feeds serve a different audience (bidders on development projects in borrower countries) and are much larger (on Oct 8, 2026 the World Bank published 204 notices, 46 of them open for bids and 157 contract-award notices), so they would dominate a default run and its cost. Add `worldbank` and/or `worldbank_contracts` to `sources` to use them. `eu_funding_tenders` rows have `country: "EU"`; World Bank rows have the project country (null for regional projects, with the region in `regions`).

**Australia is awarded-only.** AusTender rows have `awardedOnly: true` and `sourceLabel: "Australia AusTender (awarded contracts)"`. AusTender is skipped when you ask for open or planning notices, and the run log and `RUN_STATS.skippedSources` say so.

### How to use it

1. Keep the default sources or pick some.
2. Add **keywords** in the notices' own languages (e.g. `software`, `logiciel`, `programmatuur`) and/or **CPV codes** (FR/NL/EU/UK) and **UNSPSC codes** (CA/AU). Codes use prefix match.
3. Choose a **stage**: `open` (default), `awarded`, `planning` or `all`.
4. Set **last N days** (default 3) and click **Start**.

#### Input example

```json
{
  "sources": ["canadabuys", "boamp", "tenderned", "austender", "eu_funding_tenders"],
  "noticeStage": "open",
  "keywords": ["software", "logiciel", "programmatuur"],
  "cpvCodes": ["72", "48"],
  "unspscCodes": ["43", "8111"],
  "daysBack": 3,
  "maxResults": 200
}
```

| Field | What it does |
|---|---|
| `sources` | Default `canadabuys`, `boamp`, `tenderned`, `austender`, `eu_funding_tenders`. Optional: `worldbank`, `worldbank_contracts`, `ted`, `find_a_tender` and `contracts_finder` |
| `noticeStage` | `open` · `awarded` · `planning` · `all` |
| `keywords` | Matches ANY term in the title, description or buyer name (case-insensitive) |
| `cpvCodes` / `unspscCodes` | Prefix match on the scheme each source uses. A CPV filter doesn't remove UNSPSC-only sources unless `strictClassification` is on |
| `buyerCountries` | ISO alpha-2. Mostly useful with TED and the World Bank sources (project country). Use `EU` for EU Funding & Tenders rows |
| `daysBack` / `publishedFrom` / `publishedTo` | Publication window |
| `onlyOpenDeadlines` | Drops open tenders whose deadline has passed (default on) |
| `minValue` / `maxValue` | In the notice's own currency |
| `maxResults` | Cap **per source** (0 = unlimited) |
| `tendernedDetails` | Fetch CPV/NUTS codes for Dutch notices (default on) |

#### Daily alert

Schedule the actor every morning with `daysBack: 1`, then send the dataset to Google Sheets, Slack, e-mail or your CRM through Apify integrations. AI agents can call it through Apify's MCP server: *"Find open French and Dutch tenders for cybersecurity services closing in the next month."*

### Output

Every notice has the same fields whatever its source. Here's a sample from a real run:

```json
[
  {
    "source": "boamp",
    "sourceLabel": "France BOAMP",
    "country": "FR",
    "noticeId": "26-95981",
    "ocid": "276779eb-ec73-4815-ba5e-0557a28f98bc",
    "url": "https://www.boamp.fr/pages/avis/?q=idweb:26-95981",
    "title": "Collecte et traitement de déchets industriels dangereux, des boues, des effluents des aires de lavage et assainissement",
    "description": "Collecte et traitement de déchets industriels dangereux, des boues, des effluents des aires de lavage et assainissement\n4 lots",
    "language": "fr",
    "noticeType": "Avis de marché",
    "stage": "APPEL_OFFRE",
    "noticeStage": "open",
    "awardedOnly": false,
    "status": "INITIAL",
    "buyerName": "EID Méditerranée",
    "buyerId": null,
    "buyerCountry": "FR",
    "buyerCity": null,
    "buyerPostcode": null,
    "buyerWebsite": null,
    "cpvCodes": [
      "90000000",
      "90520000",
      "90513700"
    ],
    "classifications": [
      {
        "scheme": "CPV",
        "code": "90000000",
        "description": null
      },
      {
        "scheme": "CPV",
        "code": "90520000",
        "description": null
      },
      {
        "scheme": "CPV",
        "code": "90513700",
        "description": null
      }
    ],
    "mainCategory": "services",
    "procedure": "Procédure Ouverte",
    "valueAmount": null,
    "valueCurrency": null,
    "publishedAt": "2026-10-07T00:00:00+02:00",
    "deadlineAt": "2026-11-10T11:30:00+00:00",
    "daysToDeadline": 33,
    "contractStart": null,
    "contractEnd": null,
    "regions": [
      "FR-dept-11",
      "FR-dept-13",
      "FR-dept-30"
    ],
    "suitableForSme": null,
    "awards": [],
    "documents": [],
    "licence": "Licence Ouverte / Open Licence 2.0 (Etalab). Source: DILA, BOAMP, https://www.boamp.fr",
    "licenceUrl": "https://www.etalab.gouv.fr/licence-ouverte-open-licence/",
    "scrapedAt": "2026-10-08T02:06:11.106407+00:00"
  },
  {
    "source": "tenderned",
    "sourceLabel": "Netherlands TenderNed",
    "country": "NL",
    "noticeId": "443485",
    "ocid": "611919",
    "url": "https://www.tenderned.nl/aankondigingen/overzicht/443485",
    "title": "Inkoop softwareoplossing doelgroepenvervoer",
    "description": "Vervoer Gooi en Vechtstreek BV dient een leverancier te contracteren die in staat is om per 1 januari 2028 een werkende integrale softwareoplossing aan te bieden voor het doelgroepenvervoer",
    "language": "nl",
    "noticeType": "Marktconsultatie",
    "stage": "MAC",
    "noticeStage": "planning",
    "awardedOnly": false,
    "status": "Gepubliceerd",
    "buyerName": "Vervoer Gooi en Vechtstreek B.V.",
    "buyerId": null,
    "buyerCountry": "NL",
    "buyerCity": null,
    "buyerPostcode": null,
    "buyerWebsite": null,
    "cpvCodes": [
      "72263000",
      "72260000"
    ],
    "classifications": [
      {
        "scheme": "CPV",
        "code": "72263000",
        "description": "Software-implementatiediensten"
      },
      {
        "scheme": "CPV",
        "code": "72260000",
        "description": "Diensten in verband met software"
      }
    ],
    "mainCategory": "services",
    "procedure": "Marktconsultatie",
    "valueAmount": null,
    "valueCurrency": null,
    "publishedAt": "2026-10-07T21:54:00.602411+02:00",
    "deadlineAt": "2026-10-14T00:00:00+02:00",
    "daysToDeadline": 5,
    "contractStart": null,
    "contractEnd": null,
    "regions": [
      "NL327"
    ],
    "suitableForSme": null,
    "awards": [],
    "documents": [
      {
        "description": "Notice PDF",
        "url": "https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties/443485/pdf"
      }
    ],
    "licence": "CC0 1.0. Source: TenderNed (PIANOo), https://www.tenderned.nl",
    "licenceUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
    "scrapedAt": "2026-10-08T02:06:11.106407+00:00"
  },
  {
    "source": "canadabuys",
    "sourceLabel": "Canada CanadaBuys",
    "country": "CA",
    "noticeId": "cb-575-61739960-000",
    "ocid": "W8482-275752/A",
    "url": "https://canadabuys.canada.ca/en/tender-opportunities?search_filter=W8482-275752%2FA",
    "title": "UNIVERSAL JOINT, NONVEHICULAR- Halifax Class Spares",
    "description": "NOTICE OF PROPOSED PROCUREMENT\nThe Department of National Defence has a requirement for the items detailed below. The delivery is requested at CFB Halifax and CFB Esquimalt. This procurement of UNIVERSAL JOINT,NONVEHICULAR and UNIVERSAL JOINT,GEARED,NONVEHICULAR Spares will su...",
    "language": "en",
    "noticeType": "Request for Proposal",
    "stage": "Open",
    "noticeStage": "open",
    "awardedOnly": false,
    "status": "Open",
    "buyerName": "Department of National Defence (DND)",
    "buyerId": null,
    "buyerCountry": "Canada",
    "buyerCity": "Ottawa",
    "buyerPostcode": "K1A 0K2",
    "buyerWebsite": null,
    "cpvCodes": [],
    "classifications": [
      {
        "scheme": "UNSPSC",
        "code": "26111510",
        "description": "Transmission shafts"
      }
    ],
    "mainCategory": "goods",
    "procedure": "Competitive - Open bidding",
    "valueAmount": null,
    "valueCurrency": null,
    "publishedAt": "2026-10-06T00:00:00-05:00",
    "deadlineAt": "2026-10-22T14:00:00-05:00",
    "daysToDeadline": 14,
    "contractStart": null,
    "contractEnd": null,
    "regions": [
      "World"
    ],
    "suitableForSme": null,
    "awards": [],
    "documents": [
      {
        "description": "Attachment",
        "url": "https://canadabuys.canada.ca/sites/default/files/webform/tender_notice/108951/w8482-275752-a%2C-rfp-en.pdf"
      },
      {
        "description": "Attachment",
        "url": "https://canadabuys.canada.ca/sites/default/files/webform/tender_notice/108951/w8482-275752-a.-sor--en.xlsx"
      }
    ],
    "licence": "Open Government Licence - Canada. Contains information licensed under the Open Government Licence - Canada (CanadaBuys).",
    "licenceUrl": "https://open.canada.ca/en/open-government-licence-canada",
    "scrapedAt": "2026-10-08T02:06:11.106407+00:00"
  }
]
```

Key fields: `source`, `sourceLabel`, `country`, `noticeId`, `url`, `title`, `description`, `language`, `noticeType` (original wording), `noticeStage` (normalised), `awardedOnly`, `buyerName`, `buyerId`, `classifications` (`CPV`/`UNSPSC`/`GSIN` codes), `cpvCodes`, `valueAmount`/`valueCurrency`, `publishedAt`, `deadlineAt`, `daysToDeadline`, `regions`, `awards` (suppliers and award values), `documents`, `licence`, `licenceUrl`.

### Pricing

Pay-per-event: you pay only for notices delivered after your filters.

| Event | Price | What it is |
|---|---|---|
| Run start | $0.0005 | Charged once per run (covers start-up compute). |
| Tender notice | $0.002 ($2.00 per 1,000) | One normalised tender/award notice delivered to the dataset (after your filters). |

**Examples:**

- A daily IT-tenders alert across all four countries (~40 notices/day): about **$0.08/day (≈ $2.50/month)**.
- One-off export of 5,000 awarded contracts: about **$10**.
- World Bank open notices, every day, all countries, no keyword filter (46 open notices on Oct 8, 2026): about **$0.10/day**. Adding all World Bank contract-award notices (157 that day) would add about $0.31/day, so use keywords or `buyerCountries` if you only need some of them.

Set a **maximum cost per run** in Apify, and the actor stops cleanly when it reaches it.

### Data sources and licences

- **CanadaBuys** (Public Services and Procurement Canada): tender notice CSVs on open.canada.ca. *Contains information licensed under the [Open Government Licence – Canada](https://open.canada.ca/en/open-government-licence-canada).*
- **BOAMP** (DILA): BOAMP dataset API on Opendatasoft. [Licence Ouverte / Open Licence 2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence/).
- **TenderNed** (PIANOo / Ministry of Economic Affairs): open TNS publication API. [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/).
- **AusTender** (Department of Finance): OCDS API. [CC BY 3.0 AU](https://creativecommons.org/licenses/by/3.0/au/).
- **CanadaBuys award notices**: yearly award-notice CSVs on open.canada.ca, same [Open Government Licence – Canada](https://open.canada.ca/en/open-government-licence-canada).
- **EU Funding & Tenders Portal** (European Commission): the Commission's search API with the portal's public `SEDIA` key (no account, no login). Reused under the Commission's [reuse policy](https://commission.europa.eu/legal-notice_en) ([CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)): *Source: European Commission, EU Funding & Tenders Portal. Changes: fields selected and normalised, text cleaned, e-mail addresses and labelled phone numbers removed.* Only calls for tenders are read; EU grants are not.
- **World Bank** (optional): search.worldbank.org procurement-notice and contract APIs, [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) under the World Bank's [dataset terms](https://www.worldbank.org/ext/en/legal/terms-conditions/datasets). Required attribution, which you must pass on if you share the data: *The World Bank: Procurement Notice: World Bank Finances One* and *The World Bank: Contract Awards in Investment Project Financing: World Bank Finances One*. Each row's `licence` field carries the right line. Changes: fields selected and renamed; contact people, World Bank staff names and individual consultants removed.
- Every record carries `licence` and `licenceUrl` so you can attribute correctly downstream. This actor is not affiliated with any of these publishers.

### FAQ

**Do I need API keys or accounts?** No. Every source is a public, keyless open-data feed.

**Why don't I see contact names, e-mails or phone numbers?** That's on purpose: they're personal data. Each notice links to the official page (`url`), where you'll find the contact route.

**Why does Australia only have awarded contracts?** AusTender's open-data API publishes contract notices (awards). Open approaches to market aren't released as open data.

**Why do Canadian tender notices have no value?** CanadaBuys tender notices don't publish an estimated value. Set `noticeStage` to `awarded` (or `all`) to get Canadian award notices, which include the contract value and the supplier.

**Why is a supplier shown as `[individual supplier]`?** When an award goes to a private person (a sole trader or individual consultant), we withhold the name. France flags natural persons in their data; for Canada and the World Bank we use the World Bank's "Individual Consultant Selection" method and a name check. The name check is cautious: on the 2026-27 Canadian award file it withheld 47 of 4,441 rows (about 1%), and a handful of those were small firms with person-like names.

**What time zone are World Bank deadlines in?** The borrower's local time. The World Bank API gives no time zone, so `deadlineAt` has no UTC offset for these rows and `daysToDeadline` is approximate (±1 day).

**Why do World Bank contract awards from last week keep appearing?** `worldbank_contracts` uses the contract signing date, and borrowers often record contracts days or weeks after signing. For a complete picture use a window of 14 days or more and de-duplicate on `noticeId`.

**Are EU Funding & Tenders notices also on TED?** Most larger ones are. When the portal links a TED notice, it's in `documents`. If you select both `ted` and `eu_funding_tenders`, expect some overlap.

**Do Dutch and French notices have values?** When the buyer publishes one. BOAMP values come from the structured notice, and TenderNed's open list doesn't include values.

**What if one country's feed is down?** The other sources still deliver. `RUN_STATS.perSource` shows requests, success rate and items per source, and `failedSources` names any feed that failed completely. A run where every source fails ends as **failed**, not as an empty success.

**Is the TenderNed API stable?** It's the official open endpoint, but TenderNed notes it may change without notice. If it changes, TenderNed results may stop or be incomplete until we update the parser. The other sources aren't affected, and the per-source counts in `RUN_STATS.perSource` make a drop visible.

### Support

Found a bug or need a source? Open an issue on the actor's **Issues** tab or email hello@crawlwren.com. Built and maintained by **Crawlwren**. Our sibling actors: [UK & EU Public Tenders](https://apify.com/crawlwren/uk-eu-tenders) and [SAM.gov Contract Opportunities](https://apify.com/crawlwren/sam-gov-opportunities).

# Actor input Schema

## `sources` (type: `array`):

Official open-data sources to search. On by default: CanadaBuys (tenders, and award notices when the stage is 'awarded' or 'all'), BOAMP, TenderNed, AusTender and the EU Funding & Tenders Portal (EU-institution tenders). Optional extras: World Bank procurement notices and contract awards (worldwide, high volume), EU TED and the UK portals.

## `noticeStage` (type: `string`):

Open tenders you can still bid on, awarded contracts, or early-market notices. Australia (AusTender) and World Bank contract awards only have awarded contracts, so they are skipped for 'Open' and 'Planning'. The EU Funding & Tenders Portal has no award results, so it is skipped for 'Awarded'.

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

Keep notices whose title, description or buyer contains ANY of these (case-insensitive). Notices are in their own language: add translations (e.g. software, logiciel, programmatuur, software).

## `cpvCodes` (type: `array`):

EU Common Procurement Vocabulary, prefix match (72000000 or 72 = IT services). Applies to sources that use CPV (FR, NL, TED, UK).

## `unspscCodes` (type: `array`):

UN product/service codes, prefix match (43 = IT equipment, 8111 = computer services). Applies to Canada and Australia.

## `strictClassification` (type: `boolean`):

Off (default): a CPV filter does not remove Canadian/Australian notices (they use UNSPSC) and vice versa. On: only notices that match one of your codes.

## `buyerCountries` (type: `array`):

ISO alpha-2 codes (e.g. FR, DE, IE, KE). Mostly useful with TED and the World Bank sources (project country); other sources are single-country. EU Funding & Tenders rows use the code EU. Empty = all.

## `daysBack` (type: `integer`):

Used when 'Published from' is empty. Use 1 with a daily schedule.

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

YYYY-MM-DD. Overrides 'last N days'.

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

YYYY-MM-DD, inclusive. Defaults to now.

## `onlyOpenDeadlines` (type: `boolean`):

Applies to the 'Open tenders' stage.

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

In the notice's own currency. Notices without a published value are excluded when set (many open notices don't publish one).

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

In the notice's own currency.

## `maxResults` (type: `integer`):

Stop each source after this many notices (0 = no limit). You are only charged for notices delivered.

## `maxPagesPerSource` (type: `integer`):

Safety cap on API pages/files fetched per source.

## `tendernedDetails` (type: `boolean`):

TenderNed's list doesn't include CPV/NUTS codes; this fetches one detail record per kept notice (slower, ~1 s each).

## Actor input object example

```json
{
  "sources": [
    "canadabuys",
    "boamp",
    "tenderned",
    "austender",
    "eu_funding_tenders"
  ],
  "noticeStage": "open",
  "keywords": [
    "software",
    "logiciel"
  ],
  "strictClassification": false,
  "daysBack": 3,
  "onlyOpenDeadlines": true,
  "maxResults": 200,
  "maxPagesPerSource": 40,
  "tendernedDetails": true
}
```

# Actor output Schema

## `results` (type: `string`):

Normalised notices from CanadaBuys, BOAMP, TenderNed, EU Funding & Tenders, AusTender and optional sources, one row per notice, each with its licence.

## `runStats` (type: `string`):

JSON summary of the run: results delivered, items filtered, request success per source, skipped sources and any errors.

# 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 = {
    "sources": [
        "canadabuys",
        "boamp",
        "tenderned",
        "austender",
        "eu_funding_tenders"
    ],
    "keywords": [
        "software",
        "logiciel"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlwren/global-tenders").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 = {
    "sources": [
        "canadabuys",
        "boamp",
        "tenderned",
        "austender",
        "eu_funding_tenders",
    ],
    "keywords": [
        "software",
        "logiciel",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("crawlwren/global-tenders").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 '{
  "sources": [
    "canadabuys",
    "boamp",
    "tenderned",
    "austender",
    "eu_funding_tenders"
  ],
  "keywords": [
    "software",
    "logiciel"
  ]
}' |
apify call crawlwren/global-tenders --silent --output-dataset

```

## MCP server setup

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

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/HiTbwmGgXNmaRpgTj/builds/3KNZSW0vwxObJkSWS/openapi.json
