{"id":42111,"date":"2026-08-19T17:27:20","date_gmt":"2026-08-19T15:27:20","guid":{"rendered":"https:\/\/www.graviton.at\/letterswaplibrary\/self-promotion-koreas-official-real-estate-transaction-register-molit-open-api-every-apartment-sale-and-jeonse-wolse-lease-free-no-usage-restrictions-plus-the-contract-type-gotcha-t\/"},"modified":"2026-08-19T17:27:20","modified_gmt":"2026-08-19T15:27:20","slug":"self-promotion-koreas-official-real-estate-transaction-register-molit-open-api-every-apartment-sale-and-jeonse-wolse-lease-free-no-usage-restrictions-plus-the-contract-type-gotcha-t","status":"publish","type":"post","link":"https:\/\/www.graviton.at\/letterswaplibrary\/self-promotion-koreas-official-real-estate-transaction-register-molit-open-api-every-apartment-sale-and-jeonse-wolse-lease-free-no-usage-restrictions-plus-the-contract-type-gotcha-t\/","title":{"rendered":"[self-promotion] Korea&#8217;s Official Real-estate Transaction Register (MOLIT Open API): Every Apartment Sale And Jeonse\/wolse Lease, Free, No Usage Restrictions \u2014 Plus The Contract-type Gotcha That Makes Most People Misread It"},"content":{"rendered":"<p><!-- SC_OFF --><\/p>\n<div class=\"md\">\n<p>**Source (original):** Ministry of Land, Infrastructure and Transport (MOLIT), published through Korea&#8217;s open data portal data.go.kr. Free, &#8220;\uc774\uc6a9\ud5c8\ub77d\ubc94\uc704 \uc81c\ud55c \uc5c6\uc74c&#8221; (no restriction on use, commercial included), auto-approved API key, 10,000 calls\/day on a dev account.<\/p>\n<p>&#8211; Apartment sales: <a href=\"https:\/\/www.data.go.kr\/data\/15126469\/openapi.do\">https:\/\/www.data.go.kr\/data\/15126469\/openapi.do<\/a><\/p>\n<p>&#8211; Apartment rent (jeonse\/wolse): <a href=\"https:\/\/www.data.go.kr\/data\/15126474\/openapi.do\">https:\/\/www.data.go.kr\/data\/15126474\/openapi.do<\/a><\/p>\n<p>&#8211; Officetel, commercial\/office buildings, row houses, land etc. are separate endpoints under the same publisher.<\/p>\n<p>**What&#8217;s in it.** Every registered transaction, by district (5-digit LAWD_CD) and month. Sales give price, exclusive area, floor, build year, road address, and a cancellation flag. Leases give deposit, monthly rent, previous deposit\/rent, contract term, whether the renewal right was exercised. Unit\/door numbers are withheld for privacy, so there&#8217;s no PII in it. History goes back years; my checks were on 2026.<\/p>\n<p>**Gotchas** (all of these cost me time):<\/p>\n<ol>\n<li>\n<p>XML only, no JSON.<\/p>\n<\/li>\n<li>\n<p>Two generations of endpoints coexist. Legacy ones return Korean tag names (`\uac70\ub798\uae08\uc561`, `\uc804\uc6a9\uba74\uc801`), the `*Dev` ones return English (`dealAmount`, `excluUseAr`). Same data, different keys.<\/p>\n<\/li>\n<li>\n<p>Tag casing is inconsistent *between* endpoints: sales give `roadNm` \/ `roadNmBonbun`, rent gives `roadnm` \/ `roadnmbonbun`. Bit me directly. (Sales is also internally inconsistent: `roadNmCd` but `roadNmbCd`.)<\/p>\n<\/li>\n<li>\n<p>Amounts are in \ub9cc\uc6d0 (10,000 KRW) as comma-formatted strings, sometimes padded \u2014 `&#8217;38,670&#8217;` means 386,700,000 KRW. Parse, don&#8217;t cast.<\/p>\n<\/li>\n<li>\n<p>The commercial-property endpoint has no exclusive-area field at all, only building area. Don&#8217;t assume the schema generalizes.<\/p>\n<\/li>\n<li>\n<p>Service keys come in encoded and decoded flavors; double-encoding the encoded one silently returns `SERVICE_KEY_IS_NOT_REGISTERED_ERROR`, which reads like an auth problem but isn&#8217;t.<\/p>\n<\/li>\n<li>\n<p>You must file a separate usage application per API, not once per account.<\/p>\n<\/li>\n<\/ol>\n<p>**The gotcha worth the post: don&#8217;t pool \uc2e0\uaddc (new) and \uac31\uc2e0 (renewal) lease contracts.**<\/p>\n<p>Renewals are capped at +5% by Korea&#8217;s lease cap law, so they sit below market. The API labels them in `contractType`, and if you ignore that label, you&#8217;re publishing a number that&#8217;s a blend of market prices and legally-capped ones.<\/p>\n<p>Seoul, all 25 districts, July 2026, apartment leases (n = 16,520; 8,310 new \/ 7,896 renewal \/ 314 unlabeled):<\/p>\n<p>| | all contracts | new only |<\/p>\n<p>|&#8212;|&#8212;|&#8212;|<\/p>\n<p>| jeonse share | 50.2% | **43.9%** |<\/p>\n<p>| median jeonse deposit | 570M KRW | **598M KRW** |<\/p>\n<p>| median monthly rent (wolse) | 730k KRW | **800k KRW** |<\/p>\n<p>So &#8220;Seoul is half jeonse&#8221; is an artifact of pooling \u2014 renewals skew jeonse-heavy because that&#8217;s who exercises the renewal right. New-contract share is 44% and falling.<\/p>\n<p>New contracts only, by district, July 2026:<\/p>\n<p>| District | n | jeonse % | median jeonse deposit | median wolse rent | median wolse deposit |<\/p>\n<p>|&#8212;|&#8212;|&#8212;|&#8212;|&#8212;|&#8212;|<\/p>\n<p>| Gangnam | 575 | 41% | 900M | 1.60M | 200M |<\/p>\n<p>| Seocho | 521 | 47% | 850M | 1.71M | 281M |<\/p>\n<p>| Gwangjin | 153 | 38% | 775M | 0.77M | 138M |<\/p>\n<p>| Songpa | 649 | 53% | 770M | 1.50M | 240M |<\/p>\n<p>| Yongsan | 198 | 36% | 750M | 1.55M | 173M |<\/p>\n<p>| Dongjak | 254 | 47% | 750M | 1.42M | 200M |<\/p>\n<p>| Seongdong | 285 | 52% | 710M | 1.95M | 150M |<\/p>\n<p>| Jung | 145 | 37% | 700M | 1.10M | 50M |<\/p>\n<p>| Mapo | 385 | 46% | 690M | 1.60M | 100M |<\/p>\n<p>| Seongbuk | 265 | 45% | 650M | 0.80M | 112M |<\/p>\n<p>| Seodaemun | 246 | 48% | 650M | 0.90M | 100M |<\/p>\n<p>| Yeongdeungpo | 395 | 41% | 630M | 0.70M | 129M |<\/p>\n<p>| Jongno | 94 | 29% | 600M | 0.60M | 50M |<\/p>\n<p>| Gangdong | 523 | 38% | 600M | 0.60M | 101M |<\/p>\n<p>| Yangcheon | 387 | 56% | 550M | 0.60M | 99M |<\/p>\n<p>| Gwanak | 292 | 32% | 545M | 0.70M | 71M |<\/p>\n<p>| Gangseo | 414 | 50% | 480M | 0.70M | 100M |<\/p>\n<p>| Jungnang | 365 | 20% | 460M | 0.44M | 94M |<\/p>\n<p>| Eunpyeong | 395 | 50% | 450M | 0.50M | 102M |<\/p>\n<p>| Dongdaemun | 457 | 36% | 450M | 0.54M | 88M |<\/p>\n<p>| Guro | 297 | 43% | 438M | 0.60M | 58M |<\/p>\n<p>| Geumcheon | 129 | 35% | 380M | 0.55M | 60M |<\/p>\n<p>| Dobong | 197 | 55% | 370M | 0.75M | 50M |<\/p>\n<p>| Nowon | 579 | 49% | 340M | 0.80M | 40M |<\/p>\n<p>| Gangbuk | 110 | 46% | 314M | 0.76M | 30M |<\/p>\n<p>| **Seoul** | **8,310** | **44%** | **598M** | **0.80M** | **100M** |<\/p>\n<p>All figures are medians in KRW, straight from the API, no adjustment. Jeonse is a deposit-only lease (no monthly rent); wolse is deposit + monthly rent, so the two deposit columns aren&#8217;t comparable.<\/p>\n<p>**Disclosure \u2014 I built a free wrapper.** Getting from the raw XML to the table above is annoying enough that I published four Apify actors that normalize it: English field names, integer KRW instead of \ub9cc\uc6d0 strings, per-m\u00b2\/per-pyeong unit price, ISO dates, an `isJeonse` flag, unknown tags passed through rather than dropped. They&#8217;re free and need no API key of your own.<\/p>\n<p>&#8211; <a href=\"https:\/\/apify.com\/ootssu\/korea-apartment-transaction-prices\">https:\/\/apify.com\/ootssu\/korea-apartment-transaction-prices<\/a><\/p>\n<p>&#8211; <a href=\"https:\/\/apify.com\/ootssu\/korea-apartment-rent-prices\">https:\/\/apify.com\/ootssu\/korea-apartment-rent-prices<\/a><\/p>\n<p>&#8211; <a href=\"https:\/\/apify.com\/ootssu\/korea-officetel-prices\">https:\/\/apify.com\/ootssu\/korea-officetel-prices<\/a><\/p>\n<p>&#8211; <a href=\"https:\/\/apify.com\/ootssu\/korea-commercial-property-prices\">https:\/\/apify.com\/ootssu\/korea-commercial-property-prices<\/a><\/p>\n<p>The source of truth is MOLIT, not me \u2014 if you&#8217;d rather hit <a href=\"http:\/\/data.go.kr\/\">data.go.kr<\/a> yourself, the links up top are all you need, and the gotcha list should save you the afternoon it cost me.<\/p>\n<\/div>\n<p><!-- SC_ON -->   submitted by   <a href=\"https:\/\/www.reddit.com\/user\/porche911_kr\"> \/u\/porche911_kr <\/a> <br \/> <span><a href=\"https:\/\/www.reddit.com\/r\/datasets\/comments\/1vspcby\/selfpromotion_koreas_official_realestate\/\">[link]<\/a><\/span>   <span><a href=\"https:\/\/www.reddit.com\/r\/datasets\/comments\/1vspcby\/selfpromotion_koreas_official_realestate\/\">[comments]<\/a><\/span><\/p><div class='watch-action'><div class='watch-position align-right'><div class='action-like'><a class='lbg-style1 like-42111 jlk' href='javascript:void(0)' data-task='like' data-post_id='42111' data-nonce='9de69db8d5' rel='nofollow'><img class='wti-pixel' src='https:\/\/www.graviton.at\/letterswaplibrary\/wp-content\/plugins\/wti-like-post\/images\/pixel.gif' title='Like' \/><span class='lc-42111 lc'>0<\/span><\/a><\/div><\/div> <div class='status-42111 status align-right'><\/div><\/div><div class='wti-clear'><\/div>","protected":false},"excerpt":{"rendered":"<p>**Source (original):** Ministry of Land, Infrastructure and Transport (MOLIT), published through Korea&#8217;s open data portal data.go.kr. Free,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[85],"tags":[],"class_list":["post-42111","post","type-post","status-publish","format-standard","hentry","category-datatards","wpcat-85-id"],"_links":{"self":[{"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/posts\/42111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/comments?post=42111"}],"version-history":[{"count":0,"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/posts\/42111\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/media?parent=42111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/categories?post=42111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.graviton.at\/letterswaplibrary\/wp-json\/wp\/v2\/tags?post=42111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}