<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 이창은</title>
    <description>The latest articles on DEV Community by 이창은 (@paul-lee).</description>
    <link>https://dev.to/paul-lee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4236501%2F4150fec6-264a-4ca9-b7d9-e6ae2b13f4e5.png</url>
      <title>DEV Community: 이창은</title>
      <link>https://dev.to/paul-lee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paul-lee"/>
    <language>en</language>
    <item>
      <title>Your agent doesn't know Korea's 2026 holidays. Here's a $0.003 fix over x402</title>
      <dc:creator>이창은</dc:creator>
      <pubDate>Tue, 10 Nov 2026 07:34:29 +0000</pubDate>
      <link>https://dev.to/paul-lee/your-agent-doesnt-know-koreas-2026-holidays-heres-a-0003-fix-over-x402-3c57</link>
      <guid>https://dev.to/paul-lee/your-agent-doesnt-know-koreas-2026-holidays-heres-a-0003-fix-over-x402-3c57</guid>
      <description>&lt;p&gt;In April 2026 South Korea made two more days public holidays: &lt;strong&gt;Labor Day (노동절, May 1)&lt;/strong&gt; and &lt;strong&gt;Constitution Day (제헌절, July 17)&lt;/strong&gt;. A model trained before that will tell you May 1 is a normal working day in Korea. It isn't anymore.&lt;/p&gt;

&lt;p&gt;That matters the moment an agent does anything with dates: payment due dates, delivery estimates, contract deadlines, "3 business days after signing". Korea also has substitute holidays (대체공휴일) whose rules differ by holiday, plus lunar holidays (설날, 추석) that move every year. Getting this right from memory is unreliable.&lt;/p&gt;

&lt;p&gt;So we built &lt;strong&gt;KoreaKit&lt;/strong&gt;: a small API that answers these questions deterministically, with the legal basis and a data date in every response. Agents pay per call with &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; (USDC on Base). No signup, no API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it answers
&lt;/h2&gt;

&lt;p&gt;Is May 1, 2026 a business day in Korea?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="na"&gt;GET https://koreakit.celee.workers.dev/v1/holidays/check?date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2026-05-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"weekday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Fri"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"is_holiday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"is_business_day"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"holidays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2026-05-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"노동절"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"name_en"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Labor Day"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"as_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2026-10-28"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"공휴일에 관한 법률 · 관공서의 공휴일에 관한 규정 …"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three business days after Wednesday, Sep 23, 2026? Chuseok (Sep 24–26) and the weekend get skipped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="na"&gt;GET /v1/business-days/add?date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;   →   &lt;span class="s2"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2026-09-30"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Business days between Sep 21 and Oct 9, 2026 (both inclusive)? 15 weekdays, minus two Chuseok days, the substitute holiday for National Foundation Day (Oct 5), and Hangul Day (Oct 9):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="na"&gt;GET /v1/business-days/count?from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;   →   &lt;span class="s2"&gt;"business_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other endpoints:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/holidays?year=2026&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All holidays of a year (2015–2050), Korean and English names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/v1/lunar/to-solar&lt;/code&gt;, &lt;code&gt;/v1/lunar/from-solar&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Korean lunar ↔ Gregorian, with 간지 names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/text/amount?n=1234500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Amount in words for invoices: &lt;code&gt;금 일백이십삼만사천오백원정&lt;/code&gt;, &lt;code&gt;壹佰貳拾參萬肆仟伍佰&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/text/romanize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Revised Romanization incl. sound changes (종로 → jongno)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/validate/brn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Business registration number (사업자등록번호) checksum&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How payment works
&lt;/h2&gt;

&lt;p&gt;Every endpoint is a plain GET. Without payment you get &lt;code&gt;402 Payment Required&lt;/code&gt; with a &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header (x402 v2). Any x402 client pays and retries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'@x402/fetch'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;ExactEvmScheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'@x402/evm'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'eip155:8453'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExactEvmScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://koreakit.celee.workers.dev/v1/holidays/check?date=2026-05-01'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; 0.003 USDC per call on Base mainnet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad input is free.&lt;/strong&gt; Parameters are validated before any payment is verified or settled, so a malformed request returns a free &lt;code&gt;400&lt;/code&gt; with an error message and is never charged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discoverable:&lt;/strong&gt; listed in the Coinbase x402 Bazaar and on &lt;a href="https://agentic.market" rel="noopener noreferrer"&gt;Agentic.Market&lt;/a&gt;, with OpenAPI at &lt;a href="https://koreakit.celee.workers.dev/openapi.json" rel="noopener noreferrer"&gt;&lt;code&gt;/openapi.json&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://koreakit.celee.workers.dev/llms.txt" rel="noopener noreferrer"&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For humans: free calculators
&lt;/h2&gt;

&lt;p&gt;The same engine powers two free pages (Korean UI):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://koreakit.celee.workers.dev/tools/business-days" rel="noopener noreferrer"&gt;Business-day calculator&lt;/a&gt;: N business days later, and business days in a range, showing which weekday holidays were skipped&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://koreakit.celee.workers.dev/tools/amount" rel="noopener noreferrer"&gt;Amount in words&lt;/a&gt;: how to read a number, the contract form &lt;code&gt;금○○원정&lt;/code&gt;, and 갖은자 hanja&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits, stated plainly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Temporary holidays (임시공휴일) are designated ad hoc by the government. We add them when announced; nobody can predict them in advance. Every response carries &lt;code&gt;as_of&lt;/code&gt; so you know how fresh the data is.&lt;/li&gt;
&lt;li&gt;Lunar conversion follows KASI data for 1000–2050.&lt;/li&gt;
&lt;li&gt;No personal data is processed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KoreaKit is operated by WiseLake Inc. Questions or a holiday we missed: &lt;a href="mailto:wiselake@wiselake.ai"&gt;wiselake@wiselake.ai&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>api</category>
      <category>x402</category>
    </item>
  </channel>
</rss>
