KONEPS Live Tender Matcher avatar

KONEPS Live Tender Matcher

Pricing

from $1.00 / 1,000 koneps tender results

Go to Apify Store
KONEPS Live Tender Matcher

KONEPS Live Tender Matcher

Unofficial, unaffiliated tool that fetches, filters, and normalizes live Korean public procurement notices from the official PPS KONEPS Open API.

Pricing

from $1.00 / 1,000 koneps tender results

Rating

0.0

(0)

Developer

Byungwoong Yoo

Byungwoong Yoo

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

KONEPS Live Tender Matcher — Apify Actor

Fetch Korean public procurement notices from the official Public Procurement Service (PPS) KONEPS API, filter them for a buyer's use case, and return flat JSON records that export cleanly to CSV.

This is an independent, unofficial product. It is not affiliated with, endorsed by, or operated by PPS, KONEPS, or the Korean government. The original KONEPS notice is always authoritative.

The Actor does not use a paid external API. Each user supplies their own free data.go.kr service key.

Current Store price: $1.00 per 1,000 successfully returned tender records, plus the standard $0.00005 Actor-start event. Apify platform usage is included. Filtered-out notices and failed output writes do not trigger the tender-result event.

30-second fit check

Use this Actor when you need a spreadsheet-ready shortlist of public Korean tenders and want to answer three questions quickly:

  1. Which notices match my keywords or region?
  2. What changed, and when is each bid due?
  3. Where is the authoritative original notice?

Start from the configured public example: 나라장터 AI·자동화 용역 찾기. Replace the secret placeholder with your own free data.go.kr key, review the date range, and run it on Apify. The example returns at most 10 records and sets maxSpendUsd to $0.01. It will not submit a bid or decide whether you are eligible.

Each returned record has a flat shape like the following. This is an illustrative field shape, not a live procurement notice:

{
"bidNoticeNo": "<official notice number>",
"title": "<official notice title>",
"noticeAgency": "<issuing agency>",
"budgetKrw": 0,
"deadlineAt": "<official timestamp>",
"status": "<normalized notice state>",
"sourceUrl": "<original KONEPS notice URL>"
}

Cost boundary: returned records cost $0.001 each, the start event costs $0.00005, and Apify platform usage is included. The example's finite $0.01 cap is enforced before output; a smaller platform run cap wins if you set one.

한국어 빠른 안내

나라장터 입찰 공고 API를 CSV로 받을 수 있나요?

네. 이 Actor는 조달청 나라장터 입찰 공고 Open API의 서비스·물품·공사·외자·기타 공고를 조회하고, 공고 번호·기관·예산·마감일·변경 상태·원문 URL을 평면 JSON으로 정규화합니다. 결과는 Apify에서 CSV, Excel, JSON으로 내보낼 수 있습니다.

한국 공공조달 공고 데이터를 어떻게 필터링하나요?

공고 등록일 또는 변경일 범위를 지정하고, 선택적으로 키워드와 지역을 입력합니다. 같은 공고는 공식 bidNtceNo + bidNtceOrd를 기준으로 중복 제거합니다. 누락된 값은 추측하지 않고 null로 반환하며, 입찰 전에는 반드시 원문 공고를 확인해야 합니다.

What it does

  • Queries a Korean date range by notice registration time or change time.
  • Uses the matching official operation for services, goods, construction, foreign procurement, and other notices.
  • Applies optional keyword and region filters.
  • Normalizes notice number, title, agencies, budget, bid deadline, change state, and original KONEPS URL.
  • Deduplicates by bidNtceNo + bidNtceOrd (with a deterministic fallback only when the official ID is absent).
  • Pushes one flat dataset item per unique result for JSON, CSV, Excel, API, Make, or Zapier use.
  • Can charge exactly one tender-result event for each successfully pushed result under Apify pay-per-event pricing.

Official source and verified fields

Source: PPS KONEPS Bid Public Notice API, data.go.kr dataset 15129394.

The official API is free, real-time, JSON/XML, automatically approved for development and production, and has a 1,000-call development allowance at the time of implementation. Check the source page for the current allowance and terms.

The implementation uses these official list operations:

Input typeOfficial operation
servicegetBidPblancListInfoServc
goodsgetBidPblancListInfoThng
constructiongetBidPblancListInfoCnstwk
foreigngetBidPblancListInfoFrgcpt
othergetBidPblancListInfoEtc

The official reference document defines inqryDiv=1 as registration-time lookup and inqryDiv=3 as change-time lookup. Both use inqryBgnDt and inqryEndDt in YYYYMMDDHHMM format.

Core output mappings are defensive:

  • ID/title: bidNtceNo, bidNtceOrd, bidNtceNm, refNo
  • parties: ntceInsttNm, dminsttNm
  • dates: bidNtceDt, bidBeginDt, bidClseDt, opengDt
  • budget: asignBdgtAmt, then bdgtAmt, then presmptPrce
  • change status: chgDt, chgNtceRsn, ntceKindNm, reNtceYn
  • links: bidNtceDtlUrl, bidNtceUrl, stdNtceDocUrl

If PPS omits or changes a non-required field, the Actor returns null rather than inventing a value. Always read the original notice before bidding.

Service key setup

  1. Create or sign in to a data.go.kr account.
  2. Apply for API 15129394.
  3. Paste either the encoded or decoding service key into serviceKey in the Actor input.

serviceKey is marked isSecret: true. Apify encrypts it at rest in saved Actor inputs and decrypts it only for the run. The Actor never logs, returns, or writes the key to output. Do not commit a real key to Git, examples, .env, or local storage.

Input example

See ./examples/sample_input.json. Replace the placeholder with your own key and choose a current date range. The inclusive date range is limited to 31 days and page/result caps are validated before any API request.

Output

Every dataset record is deliberately flat. Important fields include:

  • bidNoticeNo, bidNoticeOrder, title, businessTypeKo
  • noticeAgency, demandAgency
  • budgetKrw, budgetField, and the three source budget fields
  • deadlineAt, status, isChanged, changeAt, changeReason
  • region, matchedKeywords, sourceUrl, documentUrl

An OUTPUT key-value-store record summarizes fetched, matched, deduplicated, and pushed counts without storing credentials.

Pay-per-event pricing and spend controls

The live Store configuration is:

  • tender-result: $0.001 per successfully returned record (shown as $1.00 / 1,000)
  • apify-actor-start: $0.00005
  • primary event: tender-result
  • platform usage: included (Pay per event + usage is off)
  • minimum selectable max cost per run: $0.01

Code and Console configuration must remain aligned:

  1. Deploy the Actor.
  2. In Apify Console → Monetization, select Pay per event.
  3. Define a custom event named exactly tender-result at the disclosed per-result price.
  4. Remove the synthetic apify-default-dataset-item event before saving the pricing setup. Leaving it enabled would charge each pushed record twice: once for that synthetic event and once for tender-result.
  5. Keep the synthetic apify-actor-start event at its recommended default price. Do not charge it manually in code.
  6. Enable Pay per event + usage only if the intended commercial setup is that Actor users, rather than the developer margin, cover compute/storage/network usage. This lowers pricing transparency and makes the Actor ineligible for agentic payments, so leave it off for the normal Store configuration after validating unit economics.
  7. Set a sensible minimum maximum cost in the monetization configuration.
  8. Recommend that API callers also pass the run option maxTotalChargeUsd. The Actor requires the finite input maxSpendUsd; when both caps are present, the lower one wins.

Billing is fail-closed:

  • Under active PPE pricing, the Actor refuses to run if tender-result has no positive configured event price.
  • It also refuses to run if apify-default-dataset-item is still configured, preventing accidental double charging before any result is fetched or written.
  • The input cap is converted to a maximum number of result events before output starts.
  • If maxTotalChargeUsd is supplied as a run option, the lower of that platform cap and maxSpendUsd wins; otherwise the finite input cap applies.
  • Results use Actor.pushData(record, 'tender-result'); the Actor increments its output count only when chargedCount === 1.
  • It stops immediately when Apify reports the event charge limit has been reached.
  • In a free/local build, records are pushed without a billable event.

Apify's current monetization documentation: Pay-per-event and SDK charging limits.

Local checks

npm install
npm test
npm run check

For a local Actor run, place a private input at storage/key_value_stores/default/INPUT.json (never commit it), then:

$npm start

To emulate PPE locally, Apify documents ACTOR_TEST_PAY_PER_EVENT=true. Because this Actor also verifies that tender-result is present in the pricing configuration, complete the definitive PPE smoke test on a beta build after defining the event in Apify Console.

Deployment

With the Apify CLI installed and authenticated:

$apify push

Release checks:

  • Validate .actor/input_schema.json and .actor/dataset_schema.json in Apify Console/CLI.
  • Confirm serviceKey renders as a secret field.
  • Confirm the Console still uses the disclosed tender-result price and has no default-dataset event.
  • Run one low-limit paid test only with a legitimate user-supplied data.go.kr key.
  • Confirm the Store README clearly states that users bring their own free public-data key and may pay Apify platform/event charges.
  • Export the dataset as both JSON and CSV and inspect nulls, amounts, timestamps, and original links.

Limitations

  • This Actor discovers public notices; it does not decide eligibility, prepare a bid, sign declarations, or submit to KONEPS.
  • Region is a client-side match over public region and agency fields because fields vary by work category.
  • A missing deadline is excluded when onlyOpen=true.
  • API limits, schemas, and procurement rules can change. The original notice is authoritative.