The Problem
If you've ever tried to check whether a chemical substance is regulated in South Korea, you know the pain:
- Government databases are Korean-only
- Data is scattered across multiple agencies and PDF notices
- No public API exists — just manual searches on clunky portals
- GHS hazard classifications are in a completely separate system
- Authentication on Korean government portals requires Korean phone numbers
For global EHS platforms, customs brokers, and regulatory consultants, getting Korean chemical compliance data means hiring Korean-speaking staff or paying expensive consulting fees.
I decided to fix this.
What I Built
K-REACH Chemical Substance API — a REST API that provides:
- 🔍 Substance lookup by CAS number, KE number, or keyword search
- 🛡️ 9 regulatory classifications: toxic, restricted, prohibited, CMR, accident preparedness, and more
- ☢️ GHS hazard data: signal words, pictograms, H-codes, P-codes, UN numbers
- 📋 Regulation details: notice dates, conditions, exceptions
- 📊 Daily verification against official Korean government sources
All structured as clean JSON. No Korean language skills required.
Where the Data Comes From
Everything comes from official Korean government sources through legal channels:
- Korea Environment Corporation (KECO) — the official custodian of K-REACH data
- data.go.kr — Korea's Public Data Portal, under the Public Data Act
No scraping. No gray areas. The data is collected through officially approved API endpoints with proper authorization.
How It Works
Quick Example — Look Up Benzene
import requests
headers = {
"X-RapidAPI-Key": "YOUR_API_KEY",
"X-RapidAPI-Host": "k-reach-chemical-substance-api.p.rapidapi.com"
}
response = requests.get(
"https://k-reach-chemical-substance-api.p.rapidapi.com/v1/substance/cas/71-43-2",
headers=headers
)
data = response.json()
print(f"Name: {data['substance']['name_eng']}") # Benzene
print(f"Toxic: {data['substance']['flags']['is_toxic']}") # True
print(f"GHS Signal: {data['ghs']['signal_word']}") # 위험 (Danger)
print(f"Regulations: {len(data['regulations'])}") # 5
Response Structure
Every substance comes with:
{
"substance": {
"cas_no": "71-43-2",
"name_eng": "Benzene",
"name_kor": "벤젠",
"formula": "C6H6",
"flags": {
"is_toxic": true,
"is_restricted": false,
"is_prohibited": false,
"is_priority": true,
"is_cmr": false,
"is_accident_prep": true,
"is_persistent": false,
"is_registration_req": true,
"is_rotterdam": false
}
},
"regulations": [...],
"ghs": {
"signal_word": "위험",
"pictograms": ["GHS02", "GHS07", "GHS08"],
"hazards": [...]
}
}
The flags object gives you instant boolean screening across all 9 regulatory categories — no need to parse Korean regulation text to figure out if something is toxic or restricted.
Search and Filter
# Search by keyword
GET /v1/substance/search?q=chromium
# List all restricted substances
GET /v1/regulations/list?type=restricted
# Get GHS data
GET /v1/ghs/71-43-2
# Search by GHS hazard code
GET /v1/ghs/hazard/H350
Design Pattern: Thin List, Fat Detail
Search results use a slim format (name + boolean flags only), while detail endpoints return full regulatory and GHS data. This keeps list responses fast and lightweight, while ensuring complete data is always one CAS lookup away.
Who Is This For?
This isn't a consumer product. It's B2B infrastructure:
- EHS SaaS platforms adding Korean regulatory data to their multi-country compliance systems
- Customs & trade platforms screening Korea-bound chemical shipments
- Regulatory consultants running K-REACH compliance audits
- Chemical manufacturers verifying products before Korean market entry
- Cosmetic/food companies screening ingredient regulatory status
Why Not Just Use the Government API Directly?
You could use data.go.kr directly. But:
- All 6 parameters are mandatory — miss one and you get a cryptic error code
- Responses are unstructured — regulatory classifications are nested in inconsistent formats
- GHS is a separate API — you need to cross-reference two different data sources
- No boolean flags — you have to parse Korean text to determine if something is "toxic"
- No search optimization — substring matching returns massive overlapping result sets
- Daily quota management — 10,000 calls/day with no built-in deduplication
I've done all this work so you don't have to.
Data Integrity
The database is verified daily against the official source. Here's what runs every day at a fixed schedule:
- Total count check — all 36 alphanumeric characters verified across both APIs (chemical + GHS)
- Sample verification — 500 randomly sampled substances per data source compared against official records, weighted toward regulatory-active substances
- Change detection — new or modified substances identified via set-difference algorithm
- Auto-update — powered by FastAPI and SQLite with a Zero-Downtime deployment pipeline (Gunicorn Graceful Reload) ensuring the API never drops a request, even during daily database synchronization. Integrity checks include FK validation, flag consistency, and sandbox substance verification. Automatic rollback on any check failure.
Response headers include X-Data-Version and X-Data-Last-Checked so you always know how fresh the data is.
The /v1/changelog endpoint provides a complete update history — when the database was last checked, when it was last updated, and what changed.
Pricing
| Plan | Price | Requests/mo | Unique Substances/mo | Best For |
|---|---|---|---|---|
| BASIC | Free | 200 | 200 | Testing & evaluation |
| PRO | $99/mo | 3,000 | 1,500 | Consultants, small teams |
| ULTRA | $299/mo | 25,000 | 5,000 | Trade compliance platforms |
| MEGA | $899/mo | 100,000 | 10,000 | Enterprise EHS SaaS |
Why "Unique Substances" matters: API call limits alone don't tell the full story. MEGA tier lets you access up to 10,000 distinct chemical substances per month — purpose-built for EHS platforms managing large chemical inventories. Previously accessed substances remain available even after hitting the monthly cap.
Free tier includes 3 sandbox substances (Benzene, Ethanol, Formaldehyde) with full response data for integration testing.
Try It
- RapidAPI: K-REACH Chemical Substance API
- GitHub (examples): Korean-chemical-substance-api
Free Test — No Credit Card
Subscribe to BASIC (free), then try:
curl "https://k-reach-chemical-substance-api.p.rapidapi.com/v1/substance/cas/71-43-2" \
-H "X-RapidAPI-Key: YOUR_KEY" \
-H "X-RapidAPI-Host: k-reach-chemical-substance-api.p.rapidapi.com"
What's Next
- Enterprise bulk access plans
- Python/JS SDK packages (pip, npm)
- Pairing with my K-Beauty Cosmetic Ingredients API for complete Korean compliance coverage
If you're building anything that touches Korean chemical regulations, I'd love to hear your use case. Drop a comment or reach out on RapidAPI.
This is my second API product on RapidAPI. The first — K-Beauty Cosmetic Ingredients API — covers Korean cosmetic ingredient regulations across 10 countries.
Top comments (0)