Editor's Column
Filling Opening Hours from Google — Where KTO Data Ends and What to Do About It
Working through the Place pages one afternoon, I found that most landmarks had no opening hours. Not obscure spots — Gyeongbokgung, the War Memorial, national museums. Here is what the gap in the tourism feed actually looks like, and how I decided to fill it.
Working through the Place pages one afternoon, I found that most landmarks had no opening hours. Not obscure spots — Gyeongbokgung, the War Memorial, the National Museum of Korea. The Korea Tourism Organization's English feed returned hours for three out of two hundred top attractions. Filling that gap took a week and forced a decision about what "official" actually means for a directory site.
What the KTO feed actually gives us
KTO publishes a set of endpoints for third-party sites — the two most useful for us are detailCommon2 (basic info) and detailIntro2 (hours, fees, contact). The Korean version of detailIntro2 is reasonably filled. The English version is not. In our sample of 200 whitelist landmarks, EN hours returned three rows. EN contact returned about seven hundred. Fee data was almost nonexistent in either language.
The reason is structural, not accidental. The KTO feed is optimized to power visitkorea.or.kr, which curates its own top pages by hand. Third-party sites like this one are supposed to consume the data and fill the rest ourselves. Nobody says this out loud in the documentation, but the shape of the data makes it clear.
The gap between "not published" and "no hours"
The first mistake I made was treating an empty hours field as if it always meant the same thing. It does not. Insadong has no hours because Insadong is a district — no hours apply. The War Memorial has no hours in the KTO feed because KTO did not publish them, but the hours definitely exist. Same empty state, opposite meanings.
On a place page, this matters. A visitor reading "not published" on a district understands. Reading the same message on a museum with obvious opening hours feels like the site is broken. The fix was to separate the two — for places where hours structurally apply but KTO did not publish them, source the hours from a verifiable second party and label the source.
Why Google Places over the alternatives
The obvious candidates were Wikipedia, TripAdvisor, and hand-curation. Wikipedia was incomplete for anything below tier-one and required CC BY-SA attribution that was hard to fit into a Place card. TripAdvisor is review-based, not authoritative, and its API terms did not fit. Hand-curation for a hundred landmarks was possible but would rot the moment hours changed.
Google Places (the New API) turned out to be the right shape. It returns official business hours in seven-day breakdown, a normalized international phone number, and the official website URL — all of which a visitor can verify by clicking through to the Google Maps entry. Every filled row on the site ends with "Source: Google Maps (verified 2026-07-12)" — visible attribution, not scraped-and-repackaged.
What we would not fill
Rows where the field genuinely does not apply — districts, national parks, natural landmarks like waterfalls — stay empty. The page still says "not published; verify with the official channel" but on those rows the message is accurate. Fabricating hours for a waterfall would be exactly the kind of scaled-content-abuse pattern that Google's own publisher policies flag. The site is more useful when it admits what it does not know than when it invents.
What this looked like at the end
Whitelist of 88 top landmarks, plus 358 rich attractions that matched a Google entry, filled at least one field. Total EN hours went from 3 to 391. EN contacts from about 785 to 1,101. Empty rows still fall back to the honest note. No KTO or editor-curated field was overwritten — the enrichment script only writes into null cells.
This is the kind of decision that does not show up on a features list but changes the trust texture of the entire site. A visitor reading a museum page now sees a seven-day breakdown with a source line, not a placeholder. That difference is the whole reason I built this.