# Korean Public Procurement Tenders (KONEPS) — English (`elpalaiso/koneps-korea-tenders`) Actor

Korean government tenders from KONEPS (나라장터): bid notices with deadlines and prices, award winners, and bid-opening results, filtered by keyword, agency, region or price, as English-labeled JSON. Bring your free data.go.kr key; pay per record.

- **URL**: https://apify.com/elpalaiso/koneps-korea-tenders.md
- **Developed by:** [Stepzu](https://apify.com/elpalaiso) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 bid notice records

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Korean Public Procurement Tenders (KONEPS / 나라장터) — English

South Korea buys well over 200 trillion won of goods, construction and services a year through KONEPS (나라장터), the national e-procurement system run by the Public Procurement Service. Every tender is published there — and only in Korean, behind field names like `bidNtceNo` and `presmptPrce`, spread across two APIs with 48 operations that each cover one procurement category.

This Actor turns that into clean JSON that a supplier, a bid-intelligence platform or an AI agent can use directly: English-labeled fields, ISO timestamps in Korean time, amounts as numbers, attached documents as `{name, url}` pairs, and a rule-based English gloss of every title alongside the Korean original. No API key is needed; pay only for the records you receive.

#### What you can pull

- **Bid notices** — title, announcing and end-user agency, contract method, estimated price and budget, qualification / bid / opening deadlines, region and industry restrictions, product classification, quantities, delivery terms, attached specification documents, contact person, and a link to the notice. Category-specific fields include construction site / PQ / main-work details, service classifications, and foreign-procurement product sequence numbers.
- **Awards** — winning company (name, business number, address, phone), award amount and rate, number of bidders, opening date.
- **Bid-opening results** — the first-ranked bidder (name, business number, bid amount, bid rate), number of participants, progress status and reserve-price availability.

All three cover the four procurement categories: goods (물품), construction works (공사), services (용역) and foreign procurement (외자).

#### No API key needed

Leave **data.go.kr service key** empty to fetch live data with the Actor's built-in shared key. Fair use is capped at 200 API requests per run; add your own key only when you need a larger run. If no dates or notice numbers are supplied, the Actor fetches the latest seven KST calendar days. Set `useSampleData: true` to return bundled, contact-free sample records without an API call or record charge.

#### Why a Korean proxy

data.go.kr rejects connections from outside South Korea, so live Apify runs default to an Apify Residential proxy in Korea while local runs remain direct. The service key stays inside the end-to-end TLS connection to apis.data.go.kr, so the proxy cannot read it.

### Tutorial

1. Choose **What to fetch** and the **categories**. Leave the dates empty for the latest seven days, or set a date range (split into windows of at most 31 days automatically).
2. Add filters — a Korean keyword such as `드론` or `CCTV`, an agency name, a region, a price band, or `international` for tenders open to foreign bidders.
3. Or skip the date range and list **specific notice numbers** to look up known tenders.
4. Run. Results land in the dataset with `notices`, `awards`, and `opening_results` table views; download as JSON, CSV or Excel, or call the Actor from an AI agent through the Apify MCP server.

A cheap first test: mode `bid_notices`, categories `goods`, last seven days, keyword `소프트웨어`, max results `20`, and API request budget `1`. That is at most one request from your quota.

#### Optional: use your own key (Korean residents)

data.go.kr account registration requires Korean identity verification. Eligible users can apply for **조달청\_나라장터 입찰공고정보서비스** and **조달청\_나라장터 낙찰정보서비스**, then paste either the Encoding or Decoding key into `serviceKey`. An input key takes priority over the built-in shared key and removes the 200-request per-run fair-use cap; the upstream daily quota still applies.

### Use from Claude, ChatGPT or any MCP agent

Add this Actor to an AI agent through the Apify MCP server — no code needed:

```
https://mcp.apify.com?tools=elpalaiso/koneps-korea-tenders
```

In Claude Desktop: Settings → Connectors → Add custom connector → paste the URL and approve the Apify login. Then ask, for example:

- "Find Korean government tenders for drones (드론) posted this month that are still open, with deadlines and estimated prices."
- "Who won public CCTV tenders in Korea in August, and at what award rate?"
- "List service tenders over 500 million KRW from Seoul city agencies opening next week."

No API key is needed: the agent uses the built-in shared key for live data, subject to the 200-request per-run fair-use cap. Korean residents may optionally provide `serviceKey`; it is stored encrypted in the run input and only sent to apis.data.go.kr. To inspect the output shape without a live API call or record charge, set `useSampleData: true`.

### Pricing

You pay per record delivered:

- **Bid notice** (`bid-notice`)
- **Award** (`award`)
- **Bid-opening result** (`opening-result`)

Empty windows cost nothing. Set a maximum total charge on the run to cap spend; the Actor stops cleanly when it is reached and reports how many records were saved. Each page of up to 999 rows is one request against the data.go.kr quota. Set `requestBudget` to cap all HTTP attempts, including retries. With your own key, `0` means unlimited; with the built-in shared key, `0` applies the 200-request fair-use cap. When the budget is reached, the Actor exits normally and keeps partial results.

### Input and output examples

Input for international-open goods and service tenders posted in July 2025:

```json
{
  "mode": "bid_notices",
  "categories": ["goods", "service"],
  "startDate": "2025-07-01",
  "endDate": "2025-07-31",
  "international": "international"
}
```

`includeContacts` defaults to `true`. Set it to `false` to omit notice contact names, phones and emails, plus award-winner CEO names and phones. `pageSize` is capped at 999 because the upstream API silently resets larger values to 10; `maxWindowDays` is capped at 31 because longer API windows are rejected. `requestBudget` is a non-negative integer: a positive value stops before the next request once that many API attempts have been made. `0` is unlimited only with your own key; it becomes 200 with the shared key.

One output record (abridged):

```json
{
  "record_type": "bid_notice",
  "category": "goods",
  "notice_id": "R25BK00940072-000",
  "title_ko": "스키장 고객용 전자 물품보관함 구매",
  "title_en_gloss": "ski resort for customers electronic locker purchase",
  "title_en_quality": "full",
  "agency_ko": "조달청 강원지방조달청",
  "demand_agency_ko": "(주)강원랜드",
  "contract_method_ko": "제한경쟁",
  "posted_at": "2025-07-04T11:12:46+09:00",
  "bid_close_at": "2025-07-15T14:00:00+09:00",
  "opening_at": "2025-07-15T15:00:00+09:00",
  "estimated_price_krw": 205550000,
  "budget_krw": 227930550,
  "is_international": false,
  "documents": [{ "name": "사양서 등.zip", "url": "https://www.g2b.go.kr/pn/pnp/pnpe/UntyAtchFile/downloadFile.do?..." }],
  "notice_url": "https://www.g2b.go.kr/link/PNPE027_01/simple?bidPbancNo=R25BK00940072&bidPbancOrd=000"
}
```

Award records carry `winner_name_ko`, `winner_business_no`, `award_amount_krw`, `award_rate_pct`, `participants_count` and `opened_at`. Opening-result records carry a `bidders` array of `{ name_ko, business_no, ceo_ko, bid_amount_krw, bid_rate_pct }` — the live API returns only the first-ranked bidder in `opengCorpInfo`, so the array has at most one entry; `participants_count` gives the total number of bidders.

Construction notices add `construction_site_region_ko`, `pq_evaluation_required`, `main_construction_type_ko` and `main_construction_estimated_price_krw`; service notices add `service_division_ko` and public-procurement classification fields; foreign notices add `product_sequence_no`.

### Recommendations

- `title_en_gloss` is a vocabulary gloss, not a translation. Use it to triage and route; use `title_ko` (and the attached documents) for anything you act on. `title_en_quality` reports how much of the Korean title was glossed: `full` means at least 70% of Hangul characters were mapped (what remains is typically a proper name — school, agency, place), `partial` means 40–69%, and `none` means less than 40% (no gloss text is emitted).
- Search filters (keyword, agency, region, price band, international) use the KONEPS search operations, whose date range is the posting date or the opening date. `registered` and `changed` date types use the basic operations and cannot be combined with filters.
- Keep windows to what you need. A busy month has tens of thousands of goods notices; filter by keyword or agency, or set `maxItems` while exploring.
- The shared and user-supplied keys have upstream daily quotas. If the gateway reports code 22, the run status identifies which key source and service reached its quota and reports how many records were already saved. The shared quota resets at 00:00 KST. Transient HTTP 429 responses are retried after the server's `Retry-After` delay.
- Times are Korea Standard Time (`+09:00`). Deadlines matter: `bid_close_at` is when bids stop being accepted, `opening_at` when they are opened.
- Winner and contact details are the same public data shown on the KONEPS website; handle them under your own data-protection obligations, or set `includeContacts: false` to omit the contact fields described above.

### FAQ

**Is this legal?** Yes. The data comes from official data.go.kr APIs published by the Public Procurement Service with an unrestricted licence (이용허락범위: 제한 없음). The Actor uses its protected shared key or your optional key only to access those official APIs.

**Why do I get "No data" for a window?** Nothing matched — common for `foreign` in short windows or narrow keywords. Widen the range or drop a filter.

**Why does my key fail with gateway error 30?** The key is wrong, or it was pasted in a form the portal does not accept. Paste the Decoding key from your data.go.kr application page; the Actor also accepts the Encoding form.

**Can I get the full tender documents?** The Actor returns the attachment names and download URLs (`documents`), which you can fetch directly. Change histories, licence limits, and price-formula details are available from further KONEPS operations and can be added on request.

**Can an AI agent use this?** Yes. Add the Actor to the Apify MCP server and Claude, Cursor or any MCP client can query Korean tenders in plain language.

# Actor input Schema

## `serviceKey` (type: `string`):

Optional. Leave empty to use the Actor's built-in shared key (fair-use cap of 200 requests per run). data.go.kr accounts require Korean identity verification, so most users should simply leave this empty.

## `useSampleData` (type: `boolean`):

Return bundled sample records without an API call or record charge, even when a service key is available.

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

Live Apify runs need a South Korean residential IP because data.go.kr rejects connections from outside Korea. Keep the default unless you provide an equivalent Korean proxy; local runs stay direct when this input is absent.

## `mode` (type: `string`):

bid\_notices: open and past tender notices with deadlines, prices, documents and contacts. awards: final winners with amounts and rates. opening\_results: bid-opening results with the first-ranked bidder and bid rate.

## `categories` (type: `array`):

goods (물품), construction (공사), service (용역), foreign (외자 — international procurement). Default: all four.

## `startDate` (type: `string`):

Start of the date range (Korea Standard Time). Ranges longer than 31 days are split into monthly windows automatically.

## `endDate` (type: `string`):

End of the date range (inclusive).

## `dateType` (type: `string`):

posted: notice publication date (default). opening: bid-opening date. registered / changed: when the record was registered or last changed in KONEPS (basic operations, no search filters).

## `noticeNumbers` (type: `array`):

Look up specific tenders by notice number (e.g. R25BK00940072). When set, the date range is ignored.

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

Korean keyword to match in the notice title (partial match), e.g. 드론, CCTV, 의료기기, 소프트웨어.

## `agencyName` (type: `string`):

Partial match on the announcing agency name (공고기관명), e.g. 조달청, 한국전력.

## `demandAgencyName` (type: `string`):

Partial match on the end-user agency (수요기관명), e.g. 서울특별시, 국방부.

## `regionCode` (type: `string`):

Participation-limit region code: 11 Seoul, 26 Busan, 27 Daegu, 28 Incheon, 29 Gwangju, 30 Daejeon, 31 Ulsan, 36 Sejong, 41 Gyeonggi, 42/51 Gangwon, 43 Chungbuk, 44 Chungnam, 45 Jeonbuk, 46 Jeonnam, 47 Gyeongbuk, 48 Gyeongnam, 50 Jeju. Leave empty for all.

## `industryCode` (type: `string`):

KONEPS industry/licence code (업종코드), e.g. 0003.

## `minEstimatedPrice` (type: `integer`):

Only tenders with an estimated price at or above this amount in KRW.

## `maxEstimatedPrice` (type: `integer`):

Only tenders with an estimated price at or below this amount in KRW.

## `international` (type: `string`):

Filter notices open to international bidders (국제입찰). 'any' returns both.

## `excludeClosed` (type: `boolean`):

bid\_notices only: skip notices whose bid deadline has passed.

## `winnerBusinessNo` (type: `string`):

awards only: filter by the winning company's 사업자등록번호 (10 digits).

## `includeKorean` (type: `boolean`):

Keep \*\_ko fields (agency names, methods, specs) next to English fields. title\_ko is always kept.

## `includeContacts` (type: `boolean`):

Keep notice contact name, phone and email, plus award-winner CEO name and phone. Disable to omit these fields.

## `pageSize` (type: `integer`):

Rows per API request (1–999). The API silently resets values above 999 to 10; this Actor caps them at 999.

## `maxWindowDays` (type: `integer`):

Split the requested date range into windows of this many days. The API rejects windows longer than 31 days, so this Actor caps the value at 31.

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

Stop after this many records (0 = no limit). Useful for a cheap first test.

## `requestBudget` (type: `integer`):

Stop cleanly after this many data.go.kr HTTP requests, including retries, and keep records already saved. With your own key, 0 means unlimited; with the built-in shared key, 0 applies the fair-use cap of 200 requests per run.

## Actor input object example

```json
{
  "useSampleData": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  },
  "mode": "bid_notices",
  "categories": [
    "goods",
    "construction",
    "service",
    "foreign"
  ],
  "dateType": "posted",
  "international": "any",
  "excludeClosed": false,
  "includeKorean": true,
  "includeContacts": true,
  "pageSize": 100,
  "maxWindowDays": 31,
  "maxItems": 100,
  "requestBudget": 0
}
```

# Actor output Schema

## `records` (type: `string`):

Every record produced by the run, in the mode you selected, as a JSON array.

## `notices` (type: `string`):

Bid notices with title, agency, prices, deadlines, documents and contact fields.

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

Award records with the winning bidder, award amount and rate.

## `opening_results` (type: `string`):

Bid-opening results with participant count and the first-ranked bidder.

## `csv` (type: `string`):

The same records exported as CSV for spreadsheets.

# 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": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("elpalaiso/koneps-korea-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 = { "maxItems": 100 }

# Run the Actor and wait for it to finish
run = client.actor("elpalaiso/koneps-korea-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 '{
  "maxItems": 100
}' |
apify call elpalaiso/koneps-korea-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,elpalaiso/koneps-korea-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/EdHXiFd7M2wXwlY4T/builds/jN8PARdFNzKpmyZEH/openapi.json
