IDB Tenders Scraper — Latin America Procurement & Awards
Pricing
from $4.00 / 1,000 results
IDB Tenders Scraper — Latin America Procurement & Awards
Inter-American Development Bank (IDB/IADB) procurement notices: open tenders, RFPs, expressions of interest and contract awards across 26 Latin America & Caribbean countries. Filter by country, type, keyword, date. Bid documents, deadlines, sectors. B2G leads & tender intel.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
4
Monthly active users
12 days ago
Last modified
Categories
Share
IDB Tenders & Procurement Notices 🌎
foXLabs procurement series: EU TED · World Bank · Ukraine Prozorro · UK Contracts Finder · US federal awards · India
🎉 Turn the Inter-American Development Bank's procurement notices into clean, structured tender data — no login, no API key, one row per notice, with the project, country, notice type, deadline and a link to the notice document. Built for suppliers, consultants and bid teams pursuing IDB-financed contracts in Latin America and the Caribbean.
🔍 What is IDB Tenders — and when should you use it?
Give this Actor a notice kind (invitations and calls, contract awards or both), countries, a keyword and a date range, and it returns the matching notices from the IDB's own open-data portal — the "Procurement Notices" dataset, published under CC BY 4.0, 37,599 records on 2026-10-08 — as clean rows you can filter, export or feed to an AI agent. Every run reads the dataset live.
Use it when you need: IDB-financed tenders and consultancy calls by country or keyword; a scheduled pull of the newest notices; or the award notices of a country or a topic as market intelligence.
Use something else when: you need the buyer's contact person, the contract value or the winning firm. The dataset has no such columns, and the linked document is no sure source for them — see "What it does not do". For buyer e-mails on development-bank tenders see World Bank Tenders.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/iadb-tenders. Checked on 2026-10-08: the server lists it as the tool foxlabs--iadb-tenders.
Your agent can pay for its own runs. For an agent with a wallet and no human to sign in, Apify sells a prepaid, spend-capped API token over x402 at agi.apify.com; such a token runs any Actor that uses limited permissions, as this one does (the terms of that path are Apify's own — see apify.com/agents.md). The Actor also meets Apify's conditions for per-request agentic payments — pay-per-event only, limited permissions, no Standby — and Apify Store lists it as eligible for them (read from the Store on 2026-10-08). The Actor charges the same events either way: one per notice delivered, plus the run start.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want IDB (Inter-American Development Bank) procurement notices from the Apify Actor `foxlabs/iadb-tenders`.Input: `status` is "open" (specific and general procurement notices, expressions of interest, requests for information — by notice type; the deadline may have passed and many rows are amendments), "awarded" (contract awards) or "all". `countries` is a list of country names as the IDB writes them in English, e.g. BRAZIL, DOMINICAN REPUBLIC (empty = all; case and accents do not matter). `searchTerm` keeps the notices that contain every word given, as whole words — case and accents ignored, no stemming ("road" does not find "roads"); many notices are in Spanish or Portuguese, so use the notice's language ("agua potable"); a project number, loan number or notice ID written exactly ("BR-L1165") and a country written out by its English name ("Brazil", not "Brasil") work too. `datePreset` is last_24_hours, last_7_days, last_30_days, last_90_days, last_year, ytd, all_time or custom (then `dateFrom` / `dateTo` as YYYY-MM-DD). `maxResults` caps the rows (0 = no cap).Start with: {"status":"open","datePreset":"last_30_days","maxResults":500}Ask me what to look for, run the Actor, read its status message, keep the rows whose deadline is still ahead, then show them as a table with title, country, type, deadline and document link.
The machine-readable API and MCP config are at apify.com/foxlabs/iadb-tenders.md; the OpenAPI definition is linked from that page.
📋 Overview
Why teams pick this Actor:
- ✅ The IDB's own dataset, read live — every run queries the bank's open-data API, newest notice first.
- 📎 The notice document on every row —
documentUrllinks the notice's document on the IDB document server,projectUrlthe project page. - 🧾 Measured, not promised — this page says how often each field was filled and what a run does not give you.
- 💰 Pay only for notices delivered — a search that finds nothing costs only the run start, and its status message says why.
- 🤖 Agent-ready — MCP tool + agentic payments.
✨ Features
- 🚦 Notice kind —
open(invitations and calls),awarded(contract awards) orall; or exact types withnoticeTypes. - 🌎 Countries — one or more countries by the IDB's English name; case and accents do not matter, and a name the dataset does not have is reported. Several countries come as one newest-first list.
- 🔎 Keyword — keeps the notices that contain every word you type, as whole words, in the title, description, project name, sector, category or method; a project number, loan number or notice ID written exactly, and a country written out by its English name, are understood too.
- 📅 Dates — presets from the last 24 hours to all time, or a custom
YYYY-MM-DDrange, on the publication date. - 🧹 Clean schema — 19 camelCase fields, the same on every row, ready for CSV/Excel/JSON.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~iadb-tenders/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"status":"open","datePreset":"last_30_days","maxResults":500}'
The call starts a run and returns it; the rows are in the run's default dataset. On 2026-10-08 this search returned 151 notices and ended with the status message Delivered 151 notices, newest first. 98 of them had the deadline that day or later, and 56 of those were not amendments.
🚀 Getting Started (3 steps)
- Choose what to fetch — invitations and calls, awards or both; add countries, a keyword and a date range if you want fewer rows.
- Set the cap —
maxResultslimits the rows (default 500,0= no cap). - Run and export — get a clean dataset as JSON, CSV or Excel.
📥 Input
{"status":"open","datePreset":"last_30_days","maxResults":500}
Every field is optional; an empty input is this same search.
| Field | Type | Description |
|---|---|---|
status | string | open (default) — four notice types: SPECIFIC, GENERAL, EOI, REQUEST FOR INFORMATION. awarded — contract awards. all — everything. The filter is the notice type, not the deadline. |
countries | array | Country names as the IDB writes them in English: BRAZIL, DOMINICAN REPUBLIC, TRINIDAD AND TOBAGO, REGIONAL … Case and accents do not matter, and Brasil or República Dominicana are understood. Each name is checked against the dataset: one without a notice is left out and named in the status message; if none exists the run reads nothing. By the code, a name whose check gets no answer is used as written, and the status message says so. Empty = all countries. |
searchTerm | string | Keeps the notices that contain every word, as whole words; case and accents ignored, no stemming. See "What a keyword finds". |
datePreset | string | Window on the publication date: last_24_hours, last_7_days, last_30_days (default), last_90_days, last_year, ytd, all_time or custom. A preset starts at 00:00 UTC of its first day, so last_24_hours covers yesterday and today. |
dateFrom / dateTo | string | YYYY-MM-DD; used only when datePreset is custom, which needs at least one of them; with any other preset they are not used, and the status message says so. An empty dateFrom means no start, an empty dateTo no upper limit. A date that does not exist (2026-02-31), a dateFrom after dateTo, or custom with neither date stops the run with a message that says which. |
maxResults | integer | Most rows in one run. Default 500; 0 = no cap. A capped run holds the newest notices. |
noticeTypes | array | Exact notice types: SPECIFIC, GENERAL, EOI, REQUEST FOR INFORMATION, AWARD. When set, status is ignored. |
"Open" is a notice type, not a promise
status: "open" selects the notice types that invite a bid or an expression of interest. It does not check the deadline and it includes amendments; no input option changes that. Measured on 2026-10-08 with the default input (151 rows): the deadline had passed on 47, fell on the run day on 4 and was still ahead on 94; the 6 general notices carry none. 73 rows were amendments of an earlier notice, each a row of its own — 70 titles begin ENMIENDA, 3 are Portuguese (ALTERAÇÃO, PRORROGAÇÃO); English notices use AMENDMENT. 56 rows were not an amendment and had the deadline on the run day or later. Keep the rows whose deadline is today or later, and read the title.
What a keyword finds
The Actor matches the keyword itself; it does not use the IDB portal's search, which missed most notices for many words (potable: 3 of 1,113). A notice is kept when every word of searchTerm stands as a whole word in one of seven text columns of the row: title, description, project name, sector (English and Spanish label), category, method. Case and accents are ignored. Three identifiers and the country are matched whole: a project number, loan number or notice ID written exactly as the IDB writes it, and the notice's country written out by its English name. A keyword with no letter or digit (&) stops the run. Measured on 2026-10-08:
- Whole words, no stemming. On a copy of the whole dataset
roadmatches 1,100 notices androads320;consultoriaandconsultoríamatch the same 3,584. - A word of a label brings every notice with that label.
aguais in the Spanish sector labelAGUA Y SANEAMIENTO: 3,795 of the 5,258 records it matches in that copy have the word only there.consultingmatches 2,319 notices there, 1,029 only through the category label — 866Consulting Firmsand all 163Non-Consulting Services. - A project number, loan number or notice ID finds its notices when written exactly, a country when its English name is written out. In the saved copy of the dataset:
BR-L1165the 290 notices of that project,2151/OC-BRthe 290 of that loan,Brazil road140 (Brazilian notices withroadin a text column). Exactly means nothing added and nothing left out:BR-L1165,,(BR-L1165),BR L1165and2151 OC-BReach match nothing, and a part of a number or of a name is an ordinary word —L1165matches nothing,oc179 notices that have it in their text (not the 27,000 whose loan number contains it),costa161, not all of Costa Rica. A number that is also a notice ID brings that notice too (2024: 259 notices, one of them only for its ID). - The country counts in the IDB's English spelling only, and
REGIONALis one of the names. In the saved copyBrazilmatches 7,024 notices,Brasilthe 45 that have that word in their text;Dominican Republic1,210,República Dominicana169. For the country itself usecountries, which understands both spellings. The keywordregionalmatches 1,907 notices, 1,141 of them only because their country isREGIONAL. - Several words: all of them, in any order, in any of these columns — not a phrase. Of the 27 notices
agua potablereturned for the last 90 days, 11 have neither word in title or description:potablestands only in the project name. - The whole date range is read, until the run has
maxResultsmatches: the all-time runs forsolarandBR-L1165read 37,597 notices in 29 and 42 seconds (256 MB of memory). The status message gives both numbers:Delivered 27 notices, newest first. The keyword "agua potable" matched 27 of the 410 notices read.The keyword runs quoted on this page were made on 2026-10-08 with a test build; replayed on the saved copy of the dataset, the rule as it stands returns the same rows for each of them.
📤 Output
One row per notice, saved to the dataset, newest publication date first — also across several countries.
{"id": "39210","noticeType": "SPECIFIC","noticeTitle": "Adquisición de Equipo informático para la Dirección de Tecnología de la Información del MSPAS","noticeDate": "2026-10-05","deadline": "2026-11-18","country": "GUATEMALA","projectNumber": "GU-L1163","projectName": "Programa de Fortalecimiento de la Red Institucional de Servicios de Salud (PRORISS)","loanNumber": "4791/OC-GU","category": "Goods","procurementMethod": "International Competitive Bidding","sector": "HEALTH","sectorLocal": "SALUD","projectStatus": "ACTIVE","processDescription": "Equipamiento para fortalecer la DTI en la implementación de servicios","documentUrl": "https://idbdocs.iadb.org/wsdocs/getdocument.aspx?docnum=EZIDB0000271-152492547-10104","projectUrl": "https://www.iadb.org/en/project/GU-L1163","source": "Inter-American Development Bank (IDB) Procurement Notices (CC-BY 4.0)","scrapedAt": "2026-10-08T20:27:15.806Z"}
"Filled" is the number of rows that carried the field in one run on 2026-10-08: every notice of the last year, 2,784 rows — 1,491 of the open types and 1,293 awards.
| Field | What it is | Filled |
|---|---|---|
id | The IDB's notice ID — unique per notice | 2,784 of 2,784 |
noticeType | SPECIFIC, GENERAL, EOI, REQUEST FOR INFORMATION or AWARD | 2,784 |
noticeTitle | Title, in the language the notice was written in | 2,784 |
noticeDate | Publication date, YYYY-MM-DD | 2,784 |
deadline | Submission deadline, YYYY-MM-DD. It can be past; on 62 rows it is earlier than noticeDate | open types 1,443 of 1,491 (the 48 general notices have none); awards 0 of 1,293 |
country | Borrowing country in English, as the IDB writes it, or REGIONAL; no notice from MEXICO, NICARAGUA or VENEZUELA in the year | 2,784 |
projectNumber / projectName | The IDB project that finances the contract | 2,784 |
loanNumber | The loan or operation number | 2,783 |
category | Goods, Works, Consulting Firms, Individual Consultants or Non-Consulting Services | open types 878 of 1,491 (amendments 123 of 616); awards 1,273 of 1,293 |
procurementMethod | For example International Competitive Bidding, Quality-and-Cost Based Selection (QCBS) | same rows as category |
processDescription | Short description of what is being procured; on 809 of the 2,151 rows that have one it repeats the title | same rows as category |
sector | Project sector in English (TRANSPORT, HEALTH, WATER AND SANITATION …) | 2,784 |
sectorLocal | The same sector in Spanish, whatever the language of the notice | 2,766 |
projectStatus | ACTIVE or EXITED | 2,771 |
documentUrl | The notice document on the IDB document server. We opened two: both were PDF files; the one of an amendment row was, by its file name, the clarification notice itself. Both redirected to another storage address — keep the documentUrl | 2,784 |
projectUrl | The project page on iadb.org. The site is behind Cloudflare: one of our three automated visits got the page, two were refused | 2,784 |
source | Source and licence of the data | 2,784 |
scrapedAt | When the row was read (UTC) | 2,784 |
Titles, project names and descriptions stay in the language of the notice; sectorLocal is Spanish; the other fields are in English. The table describes the last year: notices published before April 2025 have no category, procurementMethod or processDescription — see the FAQ.
💼 Use cases
1. Bid pipeline for your countries — the newest calls of your markets, as one list.
Input: {"countries":["Brasil","peru"],"datePreset":"last_90_days","maxResults":50}. Output: on 2026-10-08 the 50 newest of the 66 open-type notices of the two countries — 29 from Peru, 21 from Brazil, mixed by date; 16 with the deadline that day or later. Status message: Delivered 50 notices, newest first (stopped at maxResults 50; the list was not read further).
2. Keyword watch — the notices that name your product or service.
Input: {"searchTerm":"agua potable","datePreset":"last_90_days","maxResults":0}. Output: 27 of the 410 open-type notices of the last 90 days on 2026-10-08, from 7 countries; 10 with the deadline that day or later.
3. Topic history and awards — what the bank financed on a topic over the years.
Input: {"status":"all","searchTerm":"solar","datePreset":"all_time","maxResults":0}. Output: 111 notices on 2026-10-08, from 15 countries and REGIONAL: 92 invitations and calls, 19 awards. 7 carry the stand-in date 2001-01-01 (see the FAQ); the others are dated 2010 to 2026. 105 of them have no category, procurementMethod or processDescription.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/iadb-tenders').call({"status":"open","datePreset":"last_30_days","maxResults":500});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/iadb-tenders').call(run_input={"status":"open","datePreset":"last_30_days","maxResults":500})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule a run with last_7_days → read the JSON dataset → keep the ids you have not seen → push them to a sheet, CRM or chat. The Actor remembers nothing between runs, and last_24_hours fits a schedule only at the right hour; see "What it does not do".
📊 Pricing
Pay-per-event. Read from the Store on 2026-10-08: $0.004 per notice written to the dataset ($4 per 1,000) plus Apify's run-start event of $0.00005; notices a keyword run reads without delivering are not charged. That day: the default input 151 rows, $0.60; solar over all time 111 rows, $0.44; every notice of the last year 2,784 rows, $11.14; all 37,597 notices would be about $150 (not run). maxResults: 0 has no ceiling of its own — set a cap or a maximum charge: with a limit of $0.06 a run delivered 14 notices and said in its status message that it had stopped there. A run that delivers nothing costs only the run start — checked with an unknown country name and with a keyword nothing matches: one start event, no notice charged. View current pricing.
🚧 What it does not do
- No buyer contact, contract value or winner columns. The source has 23 columns and none of these. The linked document is no sure source either: of three award documents we scanned (all for individual consultants), one stated an amount and none had a line naming the winner.
- No "still open" filter and no link between an amendment and its original. Both are rows like any other, and both are charged.
- It does not open or parse the documents — it gives you the link.
- No sector or category input. They are columns; filter the rows, or use a word of the label as the keyword.
- No stemming, no phrase search, no translation.
- Nothing is remembered between runs, and a schedule is not a guaranteed feed. The window is the notice's publication date, and
last_24_hoursstarts at 00:00 UTC of the day before the run. Measured on one day, 2026-10-08: the portal had last written its dataset at 13:04 UTC, and from 15:22 to 20:40 UTC the newest notices in it were dated the day before — alast_24_hoursrun of all types at 20:29 UTC returned 12 notices, all dated 2026-10-07. If the portal writes once a day at about that hour (not measured), a notice dated day D arrives on D+1 at about 13:00 UTC: a dailylast_24_hoursrun made later in the day delivers it once, and one made earlier never does — on D+1 it is not there yet, on D+2 it is outside the window. Notices also seem to arrive late: taken in the order of their IDs, 192 of the last year's 2,784 notices are dated earlier than a notice with a lower ID, 109 of them by two days or more and 10 by 8 to 20 days (this reads the ID as the order of entry; the dataset has no entry date). So schedulelast_7_days(26open-type notices that day, $0.10) and drop theids you already have: overlapping windows deliver — and charge — the same notice again. - It cannot always tell a dataset that is being rewritten from a complete one. The portal's record numbers are one unbroken block of 37,599 for notices dated 2000 to 2026, so it seems to write its table whole rather than add to it. A run that meets an answer without records, a page that stays short before the portal's own count is reached, or a count that falls while it reads says so or fails (see Troubleshooting); a run whose pages all come back full while the table is being rewritten cannot know. None of this was seen in a measured run.
❓ FAQ
Do I need an account, login or API key for the IDB? No. The Actor reads the IDB's public open-data API.
How current is the data? Every run queries the dataset live. On 2026-10-08 the portal showed the dataset as written at 13:04 UTC that day, and the newest notices in our runs of that afternoon and evening were dated the day before.
How many notices are there? 37,599 records on 2026-10-08, the oldest dated 2000 — 37,597 different notices, because two notice IDs appear twice and the Actor delivers each once. 2,784 were published in the last year, 777 in the last 90 days, and 151 of the open types in the last 30 days.
How fast is it? On 2026-10-08, with 256 MB of memory (the default was 1,024 MB), the default search took 2.5 seconds of run time, the 2,784 notices of the last year 3.6 seconds, and a keyword over all time 29 and 42 seconds.
Does the fill change with older notices? Yes. category, procurementMethod and processDescription exist only on notices published since April 2025. Counted on a copy of the whole dataset saved on 2026-10-08: none of the 33,328 notices published up to 2024 has them; 47% of the notices of 2025 and 78% of those of 2026 do — 7.3% of all. Also, 4,459 notices carry the publication date 2001-01-01, which is a stand-in: of the 4,071 that have a deadline, 3,774 have it in 2002–2010. A date range that does not contain 2001-01-01 never returns them, whatever their real year; all_time does. And 1,063 notices have no projectName.
What does each row represent? One procurement notice of an IDB-financed project — an original notice, an amendment or an award.
🐛 Troubleshooting
- The run succeeded but the dataset is empty — the run's status message says why, for example
No notice read. Not a country name of the IDB dataset: "Atlantis". Country names are English, as the IDB writes them: "BRAZIL", "PERU", "DOMINICAN REPUBLIC".For a keyword that no notice in range contains, it names the keyword, the filters and the number of notices in range (26 in our test). - Many rows are past their deadline or are amendments — see the subsection "Open" is a notice type, not a promise.
- A keyword returned a whole sector, category or country — the word is a sector or category label, or a country's English name written out (
regionalis one); see "What a keyword finds". - A keyword found too little — it matches whole words: try singular and plural, and the notice's language.
- Fewer rows than expected — the default window is 30 days and the default cap 500; widen
datePresetor raisemaxResults. A run that stopped at the cap or at its maximum charge says so in the status message. deadlineis empty — in the one-year run no award and no general notice had one.- The run failed — the status message carries the reason, for example
dateFrom 2026-10-05 is after dateTo 2026-10-01.A request to the IDB portal that gets no answer in 90 seconds, a server error or an answer without the records asked for is tried three times before the run fails; by the code a run also fails when the portal answers with an empty dataset or with none of the records it counts. A failed run is charged the run start; rows written before the failure stay in the dataset and stay charged. - The status message says the portal's list broke off, or that its count fell — the portal stopped returning records before the end of its list, or changed its dataset while the run was reading it. The rows delivered are real; the rest of the date range was not read, so run again later. By the code and against a simulated portal; not seen in a measured run.
⚖️ Is it legal to use this data?
The Actor reads procurement notices that the IDB publishes as open data under CC BY 4.0, which asks for attribution — every row names the source in source. Notices can still contain personal data — two award notices of the last year, for example, name a consultant in their description; personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. foXLabs is not affiliated with the Inter-American Development Bank.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor’s Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
Changelog
0.1.13 — 2026-10-09 — the keyword search finds what it should, large pulls no longer skip notices, several countries come as one list; README rewritten
- The keyword is matched by the Actor, not by the portal. The IDB portal's own search turned out to miss most notices for many words: measured on the whole dataset on 2026-10-08,
potablefound 3 of the 1,113 records that contain the word,consulting12 of 2,319,supervision1 of 1,293 (andsupervisión919),agua potable3 of 1,111. The Actor now reads the notices of the date range and keeps those that contain every word of the keyword, as whole words, in the title, description, project name, sector, category or method — case and accents ignored. A project number, loan number or notice ID written exactly, and a country written out by its English name, are matched as well (BR-L1165: the 290 notices of that project); a part of such a number is an ordinary word (oc: the 179 notices that have it in their text). What the portal's search returned for a number or a country name was not measured. Where the portal worked the count of records is the same (solar111 and 111,road1,100 and 1,100,water5,185 and 5,185). There is no stemming:roaddoes not findroads. - A pull that read more than 1,000 source records could miss a few notices. The Actor reads the IDB dataset in pages of 1,000, sorted by publication date. Notices of one day came back in a different order from one request to the next (two identical requests agreed on 296 of 1,000 positions), so at a page boundary some notices were read twice and others not at all: in a one-year pull, 4 of 2,784 notices were never delivered. The pages are now sorted by date and record number, which keeps the order fixed. A pull that needed fewer than 1,000 source records was not affected. The 1,000 are counted before the notice-type filter, so a run could be affected while returning far fewer than 1,000 rows: on 2026-10-08 the newest 1,000 records of all countries reached back to 2026-06-16.
- Several countries come as one newest-first list. They were read one after another, so a capped run filled up with the first country.
- Country names are checked.
Brasil,peruorRepública Dominicanaare read as the dataset writes them (BRAZIL,PERU,DOMINICAN REPUBLIC); a name with no notice at all is named in the run's status message — with the closest spelling where one is found —, where it used to match nothing without a word. When none of the given countries exists the run reads nothing. - A page that comes back short no longer ends the read without a word. The portal counts the records of the list it pages through. A short or empty page used to be taken for the end of the list whatever that count said, and an answer without records for "no notices". Now such an answer is tried again; a page that stays short before the count is reached ends the read with a sentence in the status message (how many records the portal counts and how many it returned), and so does a count that falls while the run is reading; a run that gets an empty dataset, or none of the records the portal counts, fails. A country the dataset is known to hold is no longer reported as "not a country name" when the portal counts 0 for it: the count is asked once more, and if it is still 0 the run fails. Exercised against a simulated portal only — no measured run met any of this — and not complete: see "What it does not do".
- A run that finishes ends with a status message, and a run that delivers nothing says why — including a keyword that none of the notices in range contains. A run that is aborted or cut off by its time limit ends without that message (the Apify SDK ends an aborted run at once); rows written until then stay in the dataset and are charged. Custom dates are validated:
2026-02-31was read as 3 March and an impossibledateTowas ignored; both now stop the run with a message that names the field;dateFrom/dateTofilled in next to another date range are still not used, and the status message now says so. A request that gets no answer or a server error is tried three times before the run fails, and the run stops at its maximum charge and says so. - The README described another Actor. Its examples used input keys this Actor does not have (
queries,maxResultsPerQuery, with a literalundefinedvalue), its input table listed phantom fields (maxConcurrency,includeRaw) and its text described a company registry ("relevance-ranked name search or exact registry-ID lookup", "legal form, formation date"). Every example now uses the real input and was run on the platform; the output table says how often each field was filled in a measured run. - The Python example works with the current Apify client. It read the results with
run['defaultDatasetId']; withapify-client3 for Pythoncall()returns a run object and that line raisedTypeError: 'Run' object is not subscriptableafter the run had finished. It now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. - No output field or pricing change. Behaviour changes for inputs that already exist: a keyword run returns the notices that contain the words (of 23 words tried, 15 gave more notices than the portal — most of them many more —, 4 the same and 4 fewer: three plurals the portal used to stem, and
obraby one notice); a capped run over several countries returns the newest notices of all of them;customwith neither date, adateFromafter thedateToand a keyword with no letter or digit now stop the run; a keyword that is a project number, a loan number, a notice ID or a country's English name follows the rule above (what the portal returned for these was not measured); a run fails — it used to end as an empty or a shorter result — when the portal answers with an empty dataset, with none of the records it counts, or three times without the records asked for.
0.1 — 2026-09-07
- The README was regenerated from a template shared by many Actors; the entry of that day read "Enabled AI-agent payments (x402) + rebuilt the README to the full standard". The label is the generator's: the builds of that day were numbered like the others of this Actor. That README is the one the entry above corrects — its examples and parts of its text did not describe this Actor.
0.2 — 2026-07-05
- Reworked docs: API quick-start, real sample output, full field table, measured fill rates, integration snippets (JS / Python / Make / MCP), FAQ and troubleshooting.
0.0
- Initial release (the Actor's first changelog called it 0.1): procurement notices of the Inter-American Development Bank from its open-data portal — notice type, title, dates, country, project and loan, sector, procurement method, document and project links.