# Korea Public Tenders Scraper - KONEPS 나라장터 Bids & Awards (`elabstudio/korea-public-tenders`) Actor

South Korea government tenders from the official KONEPS (나라장터) open API: bid notices for goods, services and construction with agency, estimated price, deadlines, region limits and attachments, plus award winners. English fields.

- **URL**: https://apify.com/elabstudio/korea-public-tenders.md
- **Developed by:** [E:LAB STUDIO](https://apify.com/elabstudio) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tenders

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

## Korea Public Tenders Scraper: KONEPS 나라장터 Bids & Awards

Get **South Korean government tenders** as clean JSON / CSV / Excel with English field names. Every row comes from the **official open API of KONEPS (Nara Jangteo, 나라장터)**, the national e-procurement system run by the Public Procurement Service (조달청), where central government, local governments, schools, hospitals and public companies post their bids.

Pick categories (goods, services, construction, foreign procurement), optionally add title keywords, an agency or a price range, and get every matching bid notice with agency, estimated price, deadlines, region restrictions and document links. Turn on **award results** to also see who won, at what price and against how many bidders. No scraping of web pages and no login: the data comes from the government's public API.

### What you can use it for

- **Find bids to win**: daily list of new Korean tenders in your field (software, cloud, AI, consulting, medical equipment, cleaning, construction...) with deadlines and documents.
- **Tender alerts**: schedule the Actor every morning with `daysBack: 1` and send new notices to Slack, email or your CRM.
- **Competitor and market intelligence**: with award results, see which companies win which agencies' contracts and at what winning rate.
- **Market entry research for foreign companies**: size the Korean public market for your product by category, agency and budget.
- **Sales pipelines for local partners and consultants** working with Korean public buyers.

### Input

| Field | Example | Notes |
|---|---|---|
| `categories` | `["services", "goods"]` | `goods` (물품), `services` (용역), `construction` (공사), `foreign` (외자). Empty = all four. |
| `keywords` | `["소프트웨어", "cloud"]` | Optional title keywords. Titles are Korean; common English words (software, cloud, AI, security, cleaning, consulting, construction, medical, ...) are translated automatically. Each keyword is a separate search. |
| `daysBack` | `7` | Posting date window when `dateFrom` is empty (Korea time, including today). |
| `dateFrom` / `dateTo` | `2026-10-01` / `2026-10-31` | Optional posting date range. Long ranges are split into ~4-week windows. |
| `agencyName` | `서울특별시` | Optional ordering agency (공고기관) filter, Korean. |
| `demandAgencyName` | `교육청` | Optional demand agency (수요기관) filter, Korean. |
| `minEstimatedPriceKrw` / `maxEstimatedPriceKrw` | `100000000` | Optional estimated price range in won. |
| `openBidsOnly` | `true` | Skip notices whose deadline has passed. |
| `includeRegionRestrictions` | `true` | Adds the regions where bidders must be located. |
| `includeAwards` | `true` | Adds award results (separate rows, `record_type: "award"`). |
| `krwPerUsd` | `1400` | Optional: adds approximate USD amounts. |
| `maxItems` | `500` | Stop after N rows. `0` = no limit. |

Example: software and IT service bids posted in the last 7 days, still open

```json
{ "categories": ["services"], "keywords": ["소프트웨어", "정보시스템", "cloud"], "daysBack": 7, "openBidsOnly": true }
```

Example: construction tenders above 1 billion won in Seoul, with award results

```json
{ "categories": ["construction"], "agencyName": "서울특별시", "minEstimatedPriceKrw": 1000000000, "includeAwards": true, "daysBack": 30 }
```

### Output example

Bid notice:

```json
{
  "record_type": "notice",
  "notice_no": "R26BK01807116",
  "notice_revision": "000",
  "title_ko": "전산장비 및 소프트웨어 통합유지관리 용역",
  "category": "Services",
  "category_ko": "용역",
  "notice_kind_ko": "재공고",
  "is_renotice": true,
  "is_international": false,
  "ordering_agency_ko": "조달청 서울지방조달청",
  "demand_agency_ko": "한국원자력의학원",
  "contract_method_ko": "제한경쟁",
  "bid_method_ko": "전자입찰",
  "award_method_ko": "협상에의한계약-협상에 의한 낙찰자 결정(SW사업)",
  "estimated_price_krw": 1728000000,
  "vat_krw": 172800000,
  "budget_krw": 1913033840,
  "estimated_price_usd": 1234286,
  "posted_at": "2026-11-03T15:28:30+09:00",
  "bid_start_at": "2026-11-13T10:00:00+09:00",
  "bid_deadline_at": "2026-11-17T10:00:00+09:00",
  "opening_at": "2026-11-17T11:00:00+09:00",
  "industry_restricted": true,
  "region_restrictions_ko": [],
  "procurement_class_ko": "ICT 서비스 > 운영 및 유지관리 > 정보시스템유지관리서비스",
  "tech_score_weight_pct": 90,
  "price_score_weight_pct": 10,
  "notice_url": "https://www.g2b.go.kr/link/PNPE027_01/single/?bidPbancNo=R26BK01807116&bidPbancOrd=000",
  "attachments": [{ "name": "입찰(재)공고서 ... .hwpx", "url": "https://www.g2b.go.kr/pn/pnp/pnpe/UntyAtchFile/downloadFile.do?..." }],
  "source": "Public Procurement Service (PPS) KONEPS / Nara Jangteo open API, via data.go.kr"
}
```

Award result (`includeAwards: true`):

```json
{
  "record_type": "award",
  "notice_no": "R26BK01805439",
  "title_ko": "영주원도심자율상권 상인역량 강화교육 및 컨설팅 운영 용역",
  "category": "Services",
  "demand_agency_ko": "영주원도심자율상권조합",
  "winner_company_ko": "더블유앤알솔루션",
  "winner_business_no": "4990403068",
  "winning_bid_krw": 24000000,
  "winning_rate_pct": 100,
  "participants": 3,
  "opened_at": "2026-11-05T16:24:52+09:00",
  "awarded_on": "2026-11-05",
  "notice_url": "https://www.g2b.go.kr/link/PNPE027_01/single/?bidPbancNo=R26BK01805439&bidPbancOrd=000"
}
```

Not all fields are filled for every category (for example product quantity only exists for goods, construction site only for construction). Empty values are `null`.

### Pricing

Pay per result: **$3 per 1,000 rows** (notices or award results). Region restrictions and USD amounts cost nothing extra. A typical daily run of all new notices in one field costs a few cents.

### Good to know

- **Titles, agencies and methods are in Korean**, exactly as published, so you can search and match on the original text. Field names, categories, dates (ISO 8601, Korea time) and numbers are normalized.
- **Revisions**: a notice that is changed or re-posted appears with a new `notice_revision`; each revision is a separate row.
- **Keyword search is a title substring match** done by the official API. Short words can match more than you expect (청소 also matches 청소년), so prefer specific words.
- **Daily API quota**: the official API has a daily request limit. Normal runs use a handful of requests (up to 999 notices per request), but pulling many months across all categories at once may hit it; the run then stops with a clear warning and keeps what it already saved.
- **Award results** are selected by the date the award was registered, using the same date range, not by the original notice date.
- **Personal data is left out**: the Actor does not return the names, phone numbers or emails of procurement officers or company CEOs.

### FAQ

**Is there an English API for Korean government tenders?**
Yes, this Actor. It wraps the official KONEPS open API and returns English field names, ISO dates and numeric prices, so you do not need a data.go.kr account or to read the Korean API documentation.

**How do I get daily alerts for new Korean tenders?**
Create a task with your categories and keywords, set `daysBack` to `1` and schedule it every morning (Korea time). Connect the dataset to Slack, email, Google Sheets or a webhook with Apify integrations.

**Can foreign companies bid on these tenders?**
Most notices require registration on KONEPS and often a Korean business presence; `is_international` marks international bids, and the `foreign` category covers foreign procurement handled by PPS. Read the attached notice document for each bid's eligibility rules.

**Can I see who won past tenders?**
Yes. Turn on `includeAwards` and use a date range. You get the winning company, its business registration number, the winning amount, the winning rate and the number of bidders.

**What is the difference between ordering agency and demand agency?**
The ordering agency (공고기관) posts and runs the bid, often the Public Procurement Service itself; the demand agency (수요기관) is the organization that actually needs the goods or service.

### Source and license

Data: Public Procurement Service (조달청), Republic of Korea, 나라장터 입찰공고정보서비스 and 나라장터 낙찰정보서비스 open APIs, published on the Public Data Portal (공공데이터포털, data.go.kr) under a license with **no usage restrictions (이용허락범위 제한 없음)**, commercial use allowed. This Actor is an independent tool by E:LAB STUDIO and is not affiliated with or endorsed by the Public Procurement Service.

Questions or a missing field? Open an issue on the Actor page.

# Actor input Schema

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

Which KONEPS business types to search: goods, services, construction, foreign (foreign procurement). Empty means all four.

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

Optional. Words that must appear in the notice title. Titles are Korean, so Korean works best (e.g. "소프트웨어", "인공지능", "청소"). Common English words such as software, cloud, AI, security, cleaning, construction, consulting are translated automatically. Each keyword is a separate search; results are merged.

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

Used when dateFrom is empty. Counted in Korea time, including today.

## `dateFrom` (type: `string`):

Optional start of the posting date range (Korea time). Long ranges are split into ~4-week windows automatically.

## `dateTo` (type: `string`):

Optional end of the posting date range. Default today.

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

Optional, Korean agency name or part of it, e.g. "조달청", "서울특별시", "한국전력".

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

Optional, the agency that needs the goods or service (수요기관), e.g. "국방", "교육청".

## `minEstimatedPriceKrw` (type: `integer`):

Optional, e.g. 100000000 for 100 million won.

## `maxEstimatedPriceKrw` (type: `integer`):

Optional.

## `openBidsOnly` (type: `boolean`):

Skip notices whose bid deadline has passed.

## `includeRegionRestrictions` (type: `boolean`):

Adds the regions a bidder must be located in (참가가능지역), when the notice has any. Costs a few extra API calls, no extra charge.

## `includeAwards` (type: `boolean`):

Also return award results (낙찰) for the same categories, keywords and dates: winning company, business number, winning bid, rate and number of bidders. Award rows are separate items with record_type = award.

## `krwPerUsd` (type: `integer`):

If set (e.g. 1400), adds approximate USD amounts next to KRW prices.

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

Stop after this many rows (notices plus awards). 0 = no limit.

## Actor input object example

```json
{
  "categories": [
    "goods",
    "services",
    "construction"
  ],
  "daysBack": 3,
  "openBidsOnly": false,
  "includeRegionRestrictions": true,
  "includeAwards": false,
  "maxItems": 100
}
```

# Actor output Schema

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

One item per bid notice revision or award result.

## `summary` (type: `string`):

Counts, date range and API calls used.

# 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 = {
    "categories": [
        "goods",
        "services",
        "construction"
    ],
    "daysBack": 3,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("elabstudio/korea-public-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 = {
    "categories": [
        "goods",
        "services",
        "construction",
    ],
    "daysBack": 3,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("elabstudio/korea-public-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 '{
  "categories": [
    "goods",
    "services",
    "construction"
  ],
  "daysBack": 3,
  "maxItems": 100
}' |
apify call elabstudio/korea-public-tenders --silent --output-dataset

```

## MCP server setup

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