For developers

Korean official statistics, in English, as JSON

The same data that goes into our reporting, available directly. No XML, no Korean-only field names, no scraping.

Why this data

Korea publishes monthly trade figures the day after the month ends, and provisional figures three times a month. Almost no country moves that fast: UN Comtrade runs up to a month behind, and further for many reporters. Bloomberg counts Korean trade among its twelve key global economic indicators for exactly this reason — Korea imports raw materials, processes them and re-exports, so a shift in world demand shows up here first.

That much is well known. What does not exist is the detail in a usable form. The headline number gets reported; the product-level series does not. Korean official feeds return XML, with product and country names in Korean, and no English classification attached. This API is that missing layer.

Available now

These endpoints are live and need no key. They resolve the classification itself, which is the part that normally costs a translator.

EndpointWhat it doesTry it
/v1/hs/{code}Resolve any HS code — 2, 4, 6 or 10 digits — to its English description.run
/v1/hs?q={keyword}Search the classification in English when you do not know the code.run
/v1/countriesPartner country codes with English names.run
/v1/metaCoverage, dictionary size, and exactly what has been collected so far.run

A request and its response:

curl https://seoulmarkets.com/v1/hs/8542
{
  "code": "8542",
  "digits": 4,
  "chapter": {
    "code": "85",
    "name": "Electrical machinery and equipment and parts thereof"
  },
  "heading": {
    "code": "8542",
    "name": "Electronic integrated circuits"
  },
  "label": "Electronic integrated circuits",
  "resolved": true,
  "source": {
    "agency": "World Customs Organization",
    "system": "Harmonized System"
  }
}

Opening next

These return 503 today with a machine-readable reason. They open as soon as collection starts — we would rather say so than hand you an empty array that looks like a real answer.

EndpointWhat it will return
/v1/trade/flashKorea's 10-day provisional trade figures, by product. Released 1st, 11th and 21st at 09:00 KST.
/v1/trade/exportsExports and imports by HS code and partner country, monthly, back to the start of our archive.

Clients

Two thin clients, single files, in this site's repository underclients/. They are not on npm or PyPI yet — copy the file rather than installing a package. We would rather say that than publish an install command that fails.

// clients/js/seoulmarkets.mjs — copy the file, no install needed
import { Client } from './seoulmarkets.mjs';

const sm = new Client();
const chip = await sm.hs('8542');
console.log(chip.label);        // Electronic integrated circuits
console.log(chip.resolved);     // true

await sm.search('battery');     // 8506, 8507
# clients/python/seoulmarkets.py — pip install requests, then copy the file
from seoulmarkets import Client

sm = Client()
print(sm.hs("8542").label)      # Electronic integrated circuits
print(sm.search("battery"))     # [8506, 8507]

The JavaScript client has no dependencies at all — it uses the built-infetch, so it runs unchanged on Node 18+, Deno, Bun, Cloudflare Workers and in the browser. The Python client needs only requests.

Both surface the resolved flag rather than hiding it, and both raise a typed error carrying the server's own reason code — so your code can tellnot collected yet apart from no trade occurred. That distinction is the whole reason these clients read the error envelope instead of the status line.

The same question always gets the same answer

This sounds obvious until you try to build on a source that does not guarantee it. Korean agencies revise: a 10-day provisional figure is superseded by the monthly final, and the monthly final is itself revised around the 15th of the following month.

We keep the revisions alongside the originals rather than overwriting them.If you pulled a number in March and pull it again in September, you can retrieve exactly what March returned, and see what changed since. Backtests that silently rewrite their own history are not backtests.

Field names are part of the contract, not an implementation detail. Within v1we may add fields; we do not remove or rename them. A breaking change ships as/v2 with both running. The policy is published at /v1/meta so you do not have to take our word for it.

How we handle what we do not know

Our heading dictionary covers the products that dominate Korean trade. A code outside that set resolves to its chapter and returns null for the heading, with a note saying so. We do not generate a plausible description to fill the gap.A data product that guesses is worse than one with holes, because you cannot tell which is which.

Every response names its source. Where a figure is provisional, it is labelled provisional, and the revision is kept alongside rather than overwriting it.

Licence

The underlying statistics are published by Korean government agencies under an unrestricted-use licence, which permits redistribution including for commercial purposes. We do not redistribute exchange feeds or licensed vendor data, and we do not scrape.

Pricing

The classification endpoints above are free and will stay free. Trade series will have a free tier generous enough to build against, with paid tiers for production volume and bulk history. Institutional licences — full archive, custom aggregations, delivery to your warehouse — are contracted directly.

Tell us what you need and we will tell you plainly whether we have it: sibcheongan@gmail.com.

Who we are

SeoulMarkets is published by Yeopkeopon Sejong Co., Ltd., registered in Korea. The API and the newsroom run on the same pipeline — every figure in an article comes from the endpoints above, which is why both stay honest. More in About.

← Back to the front page