Kazakhstan Public Procurement Tenders (goszakup.gov.kz) avatar

Kazakhstan Public Procurement Tenders (goszakup.gov.kz)

Pricing

from $2.10 / 1,000 tender row returneds

Go to Apify Store
Kazakhstan Public Procurement Tenders (goszakup.gov.kz)

Kazakhstan Public Procurement Tenders (goszakup.gov.kz)

State procurement announcements and lots from Kazakhstan's official goszakup.gov.kz portal: one row per announcement or lot with number, name, amount in tenge, procurement method, status and application dates. Filter by keyword, customer, method, status, amount or financial year.

Pricing

from $2.10 / 1,000 tender row returneds

Rating

0.0

(0)

Developer

Samat Makatov

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

State procurement announcements and lots from Kazakhstan's official goszakup.gov.kz portal: one row per announcement or lot with number, name, amount in tenge, procurement method, status and application dates. Filter by keyword, customer, method, status, amount or financial year.

The public search of the Republic of Kazakhstan's state procurement portal, turned into clean rows. Pick announcements to see which tenders were published — amount in tenge, procurement method, status, the window in which applications are accepted — or lots to see what is actually being bought, with the lot name, its quantity and its own amount. Search by Russian or Kazakh keyword, by buying organisation, by procurement method, status, amount band or financial year, and switch on the customer details to get the buyer's full name, its BIN and its registered address. No API key, no login, no proxy and no browser: the portal publishes these pages for everyone.

Need it tailored to your workflow? Missing a field, a filter, another source or a different output format? Open an issue and describe what you need — we read every request and adapt the actor.

Use cases

  • Find work to bid on: a contractor or supplier searches ремонт, строительство or компьютер, takes the rows whose status is still open for applications, and reads the deadline out of applicationEndDate.
  • Watch one buyer: set customer to a ministry, a city administration or a state company and run it on a schedule with onlyNew — each run writes only the announcements that appeared since the last one.
  • Alert on big money: amountFrom: 500000000 plus sinceDays: 1 on an hourly schedule gives journalists and compliance teams the half-billion-tenge purchases the day they are published.
  • Study a market: status: ["Завершено"] with a financialYear and a method is the base table for "how much was spent on what, and how was it awarded".
  • Vet a counterparty before a deal: includeCustomer: true adds the buyer's registered name, BIN and address, so the rows join straight onto your own supplier or tax data.
  • Answer questions in an agent: one call per question ("any open tenders for school furniture in Kazakhstan?") — the actor takes the keyword as typed and returns rows, not HTML.

Input

Nothing is required: with no input at all the run returns the newest announcements.

FieldTypeDefaultAllowed values / notes
modestring (enum)announcementsannouncements (one row per announcement) or lots (one row per lot). Strict: any other value is refused by the platform before the run starts.
querystringemptyKeyword searched by the portal inside the announcement name (and the lot name in lots mode). Sent exactly as typed, so Russian and Kazakh words work and part of a word matches longer forms; Latin transliteration does not match. Empty = no name filter.
customerstringemptySubstring of the buying organisation's registered name (школа, больница, акимат, КазМунайГаз). Sent as typed.
announcementNumberstringemptyOne announcement by its number, with or without the lot suffix: 17911453 or 17911453-1. Narrows the search to that single announcement.
methodstring[]emptyProcurement methods, one per line, as the portal prints them — see Procurement methods. Case, extra spaces, the Kazakh spelling and the portal's numeric id are accepted; anything else stops the run with the closest names. Empty = every method.
statusstring[]emptyAnnouncement statuses (or lot statuses in lots mode) — see Statuses. Same forgiving matching as method. Empty = every status.
amountFromintegeremptyKeep only rows whose published amount is at least this many tenge. Applied by the portal.
amountTointegeremptyUpper bound of the published amount in tenge. Applied by the portal.
financialYearintegeremptyBudget year of the purchase, 2015–2030. Empty = every year the portal holds, newest first.
sinceDaysintegerempty1–365. Keep only rows whose application window starts within this many days back from today (UTC), and stop paging once a whole page is older. announcements mode only — the lot registry prints no dates, and the run says so in its status.
onlyNewbooleanfalseRemember the announcement or lot numbers written, and on the next run of the same actor or task write only numbers not written before. The memory is kept per filter set, so two schedules watching two customers never mix.
includeCustomerbooleanfalseOpen the announcement page of every row as well, to add customerName, customerBin, customerAddress, subjectType, purchaseType and lotCount. One extra request per row at five seconds each — use it with a small row cap. Contact people printed on those pages are never written out.
maxItemsinteger501–1000. Hard cap on the rows this run writes, and so on what it costs.
fieldsstring[]allKeep only these columns, in this order. mode, announcementNumber, announcementName, amountTenge, status, url and fetchedAt are always kept — they come first unless you list them, and a name you do list stays where you put it. A name that is not a column is reported in the run status.

Reference

All dictionaries below are the portal's own select lists, read from old.goszakup.gov.kz on 2026-11-04. You can type the Russian name, the Kazakh name of a method, a different case or spacing, or the numeric id.

Procurement methods

IdName on the portal
2Открытый конкурс
3Запрос ценовых предложений
6Из одного источника по несостоявшимся закупкам
7Аукцион (до 2022)
22Конкурс с применением двухэтапных процедур
32Конкурс с предварительным квалификационным отбором
50Закупка жилища
52Закупка по государственному социальному заказу
77Аукцион (с 2022)
78Аукцион
120Конкурс по приобретению услуг по организации питания воспитанников и обучающихся
121Конкурс по приобретению товаров, связанных с обеспечением питания воспитанников и обучающихся
124Тендер
125Из одного источника по несостоявшимся закупкам не ГЗ
126Запрос ценовых предложений (не ГЗ new)
128Конкурс с применением специального порядка
130Государственные закупки с применением особого порядка
132Первый этап конкурса с использованием рамочного соглашения
133Второй этап конкурса с использованием рамочного соглашения
177Аукцион (не ГЗ) с 2022 г
178Аукцион (не ГЗ)
188Конкурс с использованием рейтингово-балльной системы
190Тендер с применением особого порядка
200Тендер с использованием рейтингово-балльной системы
201Конкурс по строительству «под ключ»
202Тендер по строительству «под ключ»

The Kazakh spelling of each method is accepted as well (Ашық конкурс = 2, Бағалы ұсыныныстарға сұраным = 3, …). Two exceptions: ids 125 and 126 have no Kazakh form of their own, because the portal prints for them the same Kazakh name as for 6 and 3 — use their Russian name or their id.

Announcement statuses

Used in announcements mode.

IdStatusIdStatus
190Изменена документация410Отказ от закупки
210Опубликовано420Приостановлено
220Опубликовано (прием заявок)430Отменено
230Опубликовано (дополнение заявок)440На обжаловании
240Опубликовано (прием ценовых предложений)444Ожидание камерального контроля
250Рассмотрение заявок445Ожидание проведения контроля качества
260Рассмотрение дополнений заявок450Отправлено на контроль качества
270Заполнение условных скидок460Пройдено контроль качества
280Опубликовано (ожидание проведения аукциона)510Пересмотр итогов
310Формирование протокола преддопуска540Принятие решение об исполнении уведомления
320Формирование протокола допуска550Принятие решение о пересмотре итогов
325Формирование протокола промежуточных итогов350Завершено
330Формирование протокола итогов

For tenders still open for bids use Опубликовано, Опубликовано (прием заявок) and Опубликовано (прием ценовых предложений); for finished purchases, Завершено.

Lot statuses

Used in lots mode — the lot registry keeps its own, shorter list, so Завершено is not a lot status.

IdStatusIdStatus
190Изменена документация370Закупка не состоялась
210Опубликован410Отказ от лота
220Опубликован (прием заявок)420Приостановлен
230Опубликован (дополнение заявок)430Отменен
240Опубликован (прием ценовых предложений)440На обжаловании
250Рассмотрение заявок444Ожидание камерального контроля
260Рассмотрение дополнений заявок445Ожидание проведения контроля качества
270Заполнение условных скидок460Пройдено контроль качества
280Опубликовано (ожидание проведения аукциона)510Пересмотр итогов
310Формирование протокола преддопуска540Принятие решение об исполнении уведомления
320Формирование протокола допуска550Принятие решение о пересмотре итогов
325Формирование протокола промежуточных итогов360Закупка состоялась
330Формирование протокола итогов

Financial years

2015–2030 are accepted; the portal's own list offers 2016–2027 today. A purchase planned for next year appears late in the current one, so the budget year is not always the year of publication.

Examples

What is the Kazakh state buying right now?

{ "mode": "announcements", "maxItems": 40 }

Repair and construction work for a contractor

{ "mode": "announcements", "query": "ремонт", "maxItems": 30 }

Open competitions of this budget year, for a bid writer

{ "mode": "announcements", "method": ["Открытый конкурс"], "financialYear": 2026, "maxItems": 25 }

Purchases of half a billion tenge and more

{ "mode": "announcements", "amountFrom": 500000000, "financialYear": 2026, "maxItems": 25 }

Lots a computer supplier can bid on

{ "mode": "lots", "query": "компьютер", "maxItems": 30 }

Tenders of one buyer, with its BIN and address

{ "mode": "announcements", "customer": "школа", "includeCustomer": true, "maxItems": 15 }

A daily watch list: only what appeared since the last run

{ "mode": "announcements", "query": "медикаменты", "sinceDays": 2, "onlyNew": true, "maxItems": 100 }

One announcement by its number

{ "announcementNumber": "17911453-1" }

Output

A real row from the cloud run jBNBLaUICVTwIjDRO (customer: школа, includeCustomer: true, 2026-11-04):

{
"mode": "announcements",
"announcementNumber": "17911453-1",
"announcementId": 17911453,
"announcementName": "Услуги по страхованию гражданско-правовой ответственности владельцев автомобильного транспорта",
"method": "Запрос ценовых предложений",
"status": "Опубликовано",
"amountTenge": 51724.13,
"currency": "KZT",
"applicationStartDate": "2026-11-05",
"applicationEndDate": "2026-11-09",
"financialYear": null,
"url": "https://old.goszakup.gov.kz/ru/announce/index/17911453",
"announcementUrl": "https://old.goszakup.gov.kz/ru/announce/index/17911453",
"fetchedAt": "2026-11-04T22:46:01.908Z",
"customerName": "Коммунальное государственное учреждение \"Средняя школа №131 имени Талгат Козыбаева\" отдела образования по Сырдарьинскому району Управления образования Кызылординской области\"",
"customerBin": "981140001988",
"customerAddress": "434830100, 120600, Казахстан, г. Теренозек, ул. КАСЫМ БОДЕЕВ, д. 9, оф.",
"subjectType": "Услуга",
"purchaseType": "Первая закупка",
"lotCount": 1
}

And one lot row, from run SVPvEa4gVRHU20JR1 (mode: lots, query: компьютер):

{
"mode": "lots",
"announcementNumber": "17910893-1",
"announcementId": 17910893,
"announcementName": "Приобретение компьютера (моноблок)",
"method": "Запрос ценовых предложений",
"status": "Опубликован",
"amountTenge": 775862.07,
"currency": "KZT",
"financialYear": null,
"lotNumber": "88037772-ЗЦП3",
"lotId": 43814783,
"lotName": "Компьютер",
"lotDescription": null,
"quantity": 1,
"url": "https://old.goszakup.gov.kz/ru/subpriceoffer/index/17910893/43814783",
"announcementUrl": "https://old.goszakup.gov.kz/ru/announce/index/17910893",
"fetchedAt": "2026-11-04T22:46:01.461Z"
}
FieldTypeMeaning
modestringannouncements or lots — which list the row came from. Always written.
announcementNumberstringAnnouncement number as the portal prints it, e.g. 17911454-1. Always written.
announcementIdnumberNumeric part of that number, the id used in the portal URLs.
announcementNamestringName of the announcement, in the language it was filed in. Always written.
methodstringProcurement method, e.g. Открытый конкурс.
statusstringStatus text of the announcement, or of the lot in lots mode. Always written.
amountTengenumberPublished amount in tenge: the announcement total, or the lot amount in lots mode. Always written.
currencystringAlways KZT.
applicationStartDatestringYYYY-MM-DD, first day applications are accepted. announcements mode.
applicationEndDatestringYYYY-MM-DD, last day applications are accepted. announcements mode.
financialYearnumberThe budget year — filled when you pinned one with financialYear, otherwise null (the search pages do not print it).
lotNumberstringLot number, e.g. 88037772-ЗЦП3. lots mode.
lotIdnumberNumeric lot id used in the portal URL. lots mode.
lotNamestringWhat the lot buys, e.g. Компьютер. lots mode.
lotDescriptionstringLonger lot description where the buyer filled one in, else null. lots mode.
quantitynumberQuantity of the lot. lots mode.
customerNamestringRegistered name of the buying body. Only with includeCustomer.
customerBinstringIts BIN (12-digit business identification number). Only with includeCustomer.
customerAddressstringIts registered address as the portal prints it. Only with includeCustomer.
subjectTypestringТовар, Услуга or Работа — goods, a service or work. Only with includeCustomer.
purchaseTypestringПервая закупка or Повторная закупка. Only with includeCustomer.
lotCountnumberHow many lots the announcement has. Only with includeCustomer.
urlstringPortal page of the row: the lot page in lots mode, the announcement page otherwise. Always written.
announcementUrlstringPortal page of the announcement, in both modes.
fetchedAtstringWhen the row was read, ISO 8601 UTC. Always written.

Dataset views: Announcements, Lots, Customers.

Every run also writes a SUMMARY record into the run's key-value store: mode, pages read, how many matches the portal reported, rows dropped as already delivered or outside the date window, and the final status line.

Use it from code / agents

curl -X POST "https://api.apify.com/v2/acts/yadroo~goszakup-kz-tenders/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"announcements","query":"ремонт","maxItems":30}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/goszakup-kz-tenders').call({ mode: 'announcements', query: 'ремонт', maxItems: 30 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/goszakup-kz-tenders").call(run_input={"mode": "announcements", "query": "ремонт", "maxItems": 30})
items = client.dataset(run["defaultDatasetId"]).list_items().items

MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/goszakup-kz-tenders tool with the same JSON input.

Two things worth knowing when you automate it: fields decides the column order of every row, and onlyNew makes a schedule cheap — the memory is kept per filter set, so one task per customer or keyword each keep their own history.

Pricing

Pay per event: $0.001 per run start + $0.003 per dataset row. The start event is charged on every run, including a run that finds nothing. Rows are charged as they are written, so you only pay for what the run actually delivered. Tier discounts apply to the row event (Bronze −10 %, Silver −20 %, Gold and above −30 %, i.e. $0.0021 per row); the start event is flat.

RunRowsCost
Default run: newest announcements for a keyword50$0.001 + 50 × $0.003 = $0.151
One buyer with customer details15$0.001 + 15 × $0.003 = $0.046
A supplier's lot sweep300$0.001 + 300 × $0.003 = $0.901
One announcement by number1$0.001 + 1 × $0.003 = $0.004

A search that matches nothing writes no rows at all — no "not found" marker rows are produced — so such a run costs only the $0.001 start event and says in its status which filters matched nothing.

The run also respects the Maximum cost per run you set in the run options: when the budget is used up, the actor stops, keeps every row you paid for and ends with "Stopped at your spending limit: N rows delivered".

Limits & FAQ

How fast is it? Measured in the Apify cloud on 2026-11-04 at 256 MB: a search without customer details is one request per page of up to 100 rows — 50 rows in 5 s, 40 rows in 5 s, and the largest allowed run of 1000 rows needs 10 requests, about a minute. With includeCustomer: true every row costs one extra page: 15 rows in 108 s, roughly 8 rows per minute. Within the default 900-second run timeout that means the whole 1000-row cap for a plain search, but only about 150 rows with the customer details on.

What pace does it keep? The portal's robots.txt asks every crawler for five seconds between requests, and the actor keeps to exactly that — one request per 5 s, retries included, about 12 requests per minute. We never go faster to beat a deadline. No throttling, 429 or block was seen from Apify servers in these runs; if the portal ever starts refusing the server, the run ends with a message saying so instead of hammering it.

What happens on a run that is too big? It stops before the run timeout, keeps everything read so far and ends successfully with "Stopped before the run timeout: N rows saved; raise the timeout or split the job" — verified in the cloud (run 794lgeEtNwK78UyW8: a 1000-row request with customer details saved 6 rows inside a 60-second timeout and said so). Same for the spending limit. Rows are written page by page, never in one push at the end.

How deep can one search go? The portal shows at most 10,000 results per search, however many it reports. To reach further back, narrow the search — a keyword, a customer, an amount band or a financial year — and run it once per slice.

Why is the text Russian or Kazakh? Because that is how the purchases are filed. Names, methods and statuses are passed through untranslated; nothing is machine-translated. The keyword is sent to the portal as typed, so a Latin transliteration will not match — use the Russian or Kazakh word.

Are the amounts with VAT? They are the figures the portal publishes, which for most announcements are stated without VAT. The actor does not recalculate them.

Is financialYear always filled? Only when you pin a year in the input. The search pages do not print the budget year of a row, and the actor never invents one.

Why is there no contact person in the output? The announcement page also prints a contact person's name, position and e-mail address. Those are deliberately never read or written: the job — what is bought, by whom, for how much — does not need a person.

Which pages are read? Only the public search and announcement pages of the portal (/ru/search/announce, /ru/search/lots, /ru/announce/index/<id>), which robots.txt allows. The portal's machine interface needs a registered token, so it is not used; no login, no captcha, no proxy and no browser are involved.

Wrong filter value? method and status take free text: the Russian name, the Kazakh name of a method, another case or spacing, or the numeric id. Anything else stops the run with "did you mean …" and the closest names — the actor never silently substitutes a different method. mode is a fixed list, so the platform itself refuses a value other than announcements or lots before the run starts. A column name in fields that does not exist is reported in the run status.

Empty result? When nothing on the portal matches, the run succeeds with zero rows and a status naming the filters that matched nothing. If the portal's page layout ever changes so the results table cannot be read, the run fails loudly instead of reporting an empty success.

Questions or problems: open an issue on the Issues tab of this actor.


Made by Yadroo. Sibling actors: hh-kz-vacancies, krisha-kz, kolesa-kz, kaspi-kz-products, world-bank-procurement.