# Uzbekistan UzEx Tenders & Contract Deals (etender.uzex.uz) (`a-g-d/uz-uzex`) Actor

Open tenders, selections and completed contract deals from Uzbekistan's UzEx e-procurement platform (etender.uzex.uz) as English-keyed JSON: lot number, title, customer, winning supplier, start and deal cost, participants, deadlines and deal times in Tashkent time, and links to the lot pages.

- **URL**: https://apify.com/a-g-d/uz-uzex.md
- **Developed by:** [Aloever Dulay](https://apify.com/a-g-d) (community)
- **Categories:** Lead generation, Other
- **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 or selections

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

## Uzbekistan UzEx Tenders, Selections & Contract Deals (etender.uzex.uz)

Open tenders, open selections and completed contract deals from Uzbekistan's state
e-procurement platform run by the Uzbek Republican Commodity Exchange (UzEx),
[etender.uzex.uz](https://etender.uzex.uz), as clean, English-keyed JSON.

- **Open tenders** (`recordType: "tenders"`, the default): every tender currently accepting
  offers, soonest deadline first, with the lot number, title, customer and its taxpayer
  number, estimated cost and currency, publication time and deadline, region, district and
  a link to the lot page.
- **Open selections** (`recordType: "selections"`): every selection of the best offers
  (the competitive procedure for purchases below the tender threshold) currently accepting
  offers, with the same fields.
- **Completed deals** (`recordType: "awards"`): contracts awarded on the platform, newest
  first, with the customer, the winning supplier, the start price, the deal price and the
  savings, the number of participants, the deal time, and the deal, contract and Treasury
  status. The platform holds over 160,000 of them.

### Who needs this

- **Suppliers and contractors** selling to Uzbek state bodies and state-owned companies who
  want every new tender and selection in their field each morning.
- **Tender-alert services and bid consultants** building feeds, e-mail digests or
  Telegram alerts for the Uzbek market.
- **Market-entry and trade teams** sizing public demand in Uzbekistan by customer, region
  and product.
- **Competitive-intelligence and sales teams** tracking who wins which contracts, at what
  price and against how many competitors.
- **Analysts, journalists and researchers** studying public procurement: prices against
  start prices, competition levels, cancelled and rejected deals.
- **AI agents and automations** that need a stable schema instead of an Angular web app.

### Input

| Field                | Type    | Default     | Description                                                                                                                                                                                                                          |
| -------------------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `recordType`         | string  | `"tenders"` | `tenders` for open tenders, `selections` for open selections, `awards` for completed deals. One run returns one record type.                                                                                                         |
| `keyword`            | string  | `""`        | Matched by the platform against the lot name, case-insensitively, e.g. `kompyuter` or `мебель`.                                                                                                                                      |
| `customer`           | string  | `""`        | Only records of this customer: part of its name as published (e.g. `universiteti`) or its 9-digit taxpayer number (STIR/INN).                                                                                                        |
| `provider`           | string  | `""`        | **Deals only**: the winning supplier, by part of its name or its 9-digit taxpayer number.                                                                                                                                            |
| `region`             | string  | all         | Only customers in one of the 14 regions: `andijon`, `buxoro`, `fargona`, `jizzax`, `namangan`, `navoiy`, `qashqadaryo`, `qoraqalpogiston`, `samarqand`, `sirdaryo`, `surxondaryo`, `toshkent-shahri`, `toshkent-viloyati`, `xorazm`. |
| `publishedSince`     | string  | `""`        | **Tenders and selections only**: lots published after this point. A relative span (`24 hours`, `7 days`, `2 weeks`), a date (`2026-09-20`, midnight Tashkent time) or an ISO-8601 timestamp.                                         |
| `dealSince`          | string  | `""`        | **Deals only**: deals concluded after this point. Same formats as `publishedSince`.                                                                                                                                                  |
| `maxItems`           | integer | `100`       | Stop after this many records (1-50,000).                                                                                                                                                                                             |
| `proxyConfiguration` | object  | no proxy    | Optional Apify Proxy. Not needed normally; use it only if runs fail with connection errors.                                                                                                                                          |

A filter that does not apply to the chosen record type is ignored, and the run log says
so. Names are published in Uzbek (Latin or Cyrillic script) or Russian, so search with the
spelling the customer or supplier uses. Examples:

```json
{ "recordType": "selections", "region": "samarqand", "publishedSince": "24 hours" }
```

```json
{ "recordType": "awards", "keyword": "kompyuter", "dealSince": "30 days", "maxItems": 1000 }
```

```json
{ "recordType": "awards", "provider": "307648761" }
```

Every open tender or selection: leave the filters empty and set `maxItems` to 1,000 (the
platform listed 68 open tenders and 630 open selections on 26 September 2026).

### Output

One dataset item per tender, selection or deal. Every item has a `recordType` field,
`tender`, `selection` or `award`; a run stores one record type only, so a run's dataset is
homogeneous. Keys are English; text is kept as the platform publishes it (Uzbek or
Russian), with HTML entities decoded and whitespace tidied. Times are ISO-8601 in Tashkent
time (`+05:00`), contract dates are calendar days (`YYYY-MM-DD`), and `fetchedAt` is UTC.
The Output tab on this page documents every field. The dataset has three table views:
"Tenders", "Selections" and "Awards".

A real open tender (captured 2026-09-26):

```json
{
  "recordType": "tender",
  "id": 510591,
  "displayNo": "26111006510591",
  "title": "Maxsus uskunalar bilan jihozlangan xizmat mototsikllarini yetkazib berish",
  "customerName": "ГУВД г.Ташкента",
  "customerTin": "201757285",
  "estimatedCost": 6860000000,
  "currency": "UZS",
  "startAt": "2026-09-10T10:38:42+05:00",
  "endAt": "2026-09-28T10:38:42+05:00",
  "status": "open",
  "region": null,
  "district": "Миробод тумани",
  "detailUrl": "https://etender.uzex.uz/lot/510591",
  "sourceUrl": "https://apietender.uzex.uz/api/common/TradeList",
  "fetchedAt": "2026-09-26T15:41:31.181Z"
}
```

A real open selection (captured 2026-09-26):

```json
{
  "recordType": "selection",
  "id": 512029,
  "displayNo": "26110012512029",
  "title": "Umumiy fanlar yo'nalishi bo'yicha xorijiy o'quv adabiyotlari",
  "customerName": "Toshtech texnika universiteti",
  "customerTin": "312438150",
  "estimatedCost": 1735847500,
  "currency": "UZS",
  "startAt": "2026-09-21T10:28:36+05:00",
  "endAt": "2026-09-28T10:28:36+05:00",
  "status": "open",
  "region": null,
  "district": "Олмазор тумани",
  "detailUrl": "https://etender.uzex.uz/lot/512029",
  "sourceUrl": "https://apietender.uzex.uz/api/common/TradeList",
  "fetchedAt": "2026-09-26T15:41:44.461Z"
}
```

A real completed deal (captured 2026-09-26):

```json
{
  "recordType": "award",
  "id": 175825,
  "tradeId": 511939,
  "displayNo": "26120012511939",
  "title": "Graduation coffee break",
  "customerName": "`YANGI O`ZBEKISTON` UNIVERSITETI",
  "customerTin": "308709154",
  "customerType": "Korporativ buyurtmachi",
  "providerName": "\"ILXOM OBID GOLD\" MCHJ",
  "providerTin": "307648761",
  "startCost": 250000000,
  "dealCost": 137999680,
  "savings": 112000320,
  "currency": "UZS",
  "participantsCount": 3,
  "dealAt": "2026-09-26T16:34:06+05:00",
  "dealStatus": "Баённома шакллантирилган",
  "contractStatus": "Бириктирилмаган",
  "contractDate": null,
  "treasuryStatus": "Юборилмади",
  "detailUrl": "https://etender.uzex.uz/lot/511939",
  "sourceUrl": "https://apietender.uzex.uz/api/common/DealsList",
  "fetchedAt": "2026-09-26T15:42:02.407Z"
}
```

#### About amounts and currencies

Amounts are in the lot's currency, given as an ISO 4217 code in `currency`: mostly `UZS`
(Uzbek sum), also `USD`, `EUR`, `RUB`, `CNY` and `GBP` for import purchases. `savings` is
`startCost` minus `dealCost`; in rare cases the platform records a deal price above the
start price and `savings` is then negative. The actor does not convert currencies.

#### About statuses

Deal statuses are published in Uzbek Cyrillic and kept as published; the common ones are
"Баённома шакллантирилган" (protocol formed), "Ғолиб томонидан қабул қилинган (Амалга
ошган)" (accepted by the winner, completed), "Бажарилган" (fulfilled), "Шартнома бекор
қилинган" (contract cancelled), "Буюртмачи томонидан рад етилган" (rejected by the
customer) and "Етказиб берувчи томонидан рад етилган" (rejected by the supplier).
`contractStatus` says whether the signed contract is attached ("Принятый" accepted,
"Бириктирилмаган" not attached yet), and `treasuryStatus` whether the Treasury registered
it.

### Pricing

Pay per event, charged only for records actually stored in your dataset:

- **`tender-notice`**: one per open tender or open selection stored.
- **`award-result`**: one per completed deal stored.

A run charges one of the two, depending on `recordType`; the actor defines no start event
of its own. It stores each page before it is charged and stops cleanly when your spending
limit is reached, so you never pay for data you cannot see.

### Data source and politeness

The data comes from the public, login-free lists of the UzEx e-procurement platform: the
tender and selection lists and the completed-deals list behind etender.uzex.uz. The actor:

- sends **one request at a time with at least 1 second between requests**, with an honest
  User-Agent that names the actor;
- reads large pages (up to 500 lots or 1,000 deals) so a typical run needs only a few
  requests;
- retries connection resets, timeouts and server errors with exponential backoff inside a
  fixed budget, and stops with a clear error if the platform keeps refusing;
- stops shortly before the run's timeout and keeps what it has stored;
- never logs in and never downloads contracts, protocols or other documents.

The site's robots.txt allows automated access, and the platform shows no terms of use. The
actor publishes list metadata and links only; follow `detailUrl` for the official lot page
and its documents.

### Data and privacy

The output is procurement metadata as the platform publishes it. Some suppliers are
individual entrepreneurs (yakka tartibdagi tadbirkor, often shown as "YTT" or "ЯТТ"), whose
name is a person's name. The actor keeps the name as published, but it **never outputs the
tax or personal identification number of an individual**: `customerTin` and `providerTin`
carry only the 9-digit taxpayer numbers of Uzbek legal entities, and are `null` for
individuals, individual entrepreneurs and foreign suppliers. The beneficial-owner and
founder fields present in the platform's deal data are dropped, as are contract file paths.
The actor does not enrich, profile or combine records with other sources. If you process
names of individuals, you are responsible for doing so lawfully.

### Limitations

- **Tenders and selections are open lots only**: those accepting offers now. Closed,
  cancelled and archived lots are not listed; their outcome appears as a deal once
  concluded.
- **Deals cover both tenders and selections**; the deal list does not say which procedure a
  deal came from.
- **Region is often empty**: the platform leaves `region` empty for customers in Tashkent
  city (`district` is still set), and the `region` filter `toshkent-shahri` still finds
  them. Deals carry no region field at all, though the `region` filter works for them.
- **Customer names for tenders and selections are matched by the actor**, which then reads
  the whole list (under a thousand open lots); a taxpayer number is matched by the platform.
- **`publishedSince` is applied by the actor** to the open lots; `dealSince` is applied by
  the platform by calendar day and refined to the exact time by the actor.
- **Foreign suppliers have no `providerTin`**: their home registry numbers are not
  published by the actor.
- **Repeated deals**: the platform's deal list occasionally repeats a deal; the actor stores
  it once.
- **Direct purchases** (the xarid shop and direct contracts) are not included.

# Changelog

This Actor's version history is a separate document: https://apify.com/a-g-d/uz-uzex/changelog.md

# Actor input Schema

## `recordType` (type: `string`):

Open tenders (the default): every tender currently accepting offers. Open selections: every selection of the best offers currently accepting offers. Completed deals: contracts awarded on the platform, newest first. One run returns one record type.

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

Matched by the platform against the lot name, case-insensitively, e.g. "kompyuter" or "мебель". Names are in Uzbek (Latin or Cyrillic) or Russian, so try the spelling the customer would use. Leave empty for all records.

## `customer` (type: `string`):

Only records of this customer (buyer): part of its name as published, e.g. "universiteti", or its 9-digit taxpayer number (STIR/INN). Case-insensitive. Leave empty for all customers.

## `provider` (type: `string`):

Completed deals only: the winning supplier, by part of its name as published or its 9-digit taxpayer number (STIR/INN). Case-insensitive. Ignored for tenders and selections.

## `region` (type: `string`):

Only records of customers in this region. Leave empty for the whole country.

## `publishedSince` (type: `string`):

Tenders and selections only: keep lots published after this point. A relative span like "24 hours" or "7 days", a date like "2026-09-20" (midnight Tashkent time) or an ISO-8601 timestamp. Leave empty for every open lot.

## `dealSince` (type: `string`):

Completed deals only: keep deals concluded after this point. A relative span like "7 days", a date like "2026-09-01" (midnight Tashkent time) or an ISO-8601 timestamp. Leave empty to start from the newest deal with no lower bound.

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

Stop after storing this many tenders, selections or deals.

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

Optional. The actor talks to the UzEx API directly; use Apify Proxy only if runs fail with connection errors.

## Actor input object example

```json
{
  "recordType": "tenders",
  "keyword": "",
  "customer": "",
  "provider": "",
  "publishedSince": "",
  "dealSince": "",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `tenders` (type: `string`):

Filled by runs with recordType "tenders" (the default): one item per open tender matching the input filters, soonest deadline first: trade ID and lot number, title, customer and its taxpayer number, estimated cost and currency, publication time and deadline in Tashkent time (+05:00), status, region, district and a link to the lot page.

## `selections` (type: `string`):

Filled by runs with recordType "selections": one item per open selection of the best offers, with the same fields as tenders.

## `awards` (type: `string`):

Filled by runs with recordType "awards": one item per completed deal, newest first: deal and trade IDs, lot number, title, customer and customer type, the winning supplier, start cost, deal cost and savings with currency, participant count, deal time in Tashkent time (+05:00), deal, contract and treasury status, contract date and a link to the lot page.

# 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 = {
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("a-g-d/uz-uzex").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 = {
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("a-g-d/uz-uzex").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 '{
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call a-g-d/uz-uzex --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,a-g-d/uz-uzex"
        }
    }
}
```

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/APQeg5N7WO7zqqrnb/builds/j2AwHZVSFY6D7Sap3/openapi.json
