<?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: MOON</title>
    <description>The latest articles on DEV Community by MOON (@cocomoon).</description>
    <link>https://dev.to/cocomoon</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%2F4117091%2F6984bc49-c6fb-455e-a3b3-9657b0bd5899.png</url>
      <title>DEV Community: MOON</title>
      <link>https://dev.to/cocomoon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cocomoon"/>
    <language>en</language>
    <item>
      <title>I shipped a paid SaaS in 3 days with no user accounts: the billing setup and 3 bugs that bit me</title>
      <dc:creator>MOON</dc:creator>
      <pubDate>Thu, 17 Sep 2026 09:17:45 +0000</pubDate>
      <link>https://dev.to/cocomoon/i-shipped-a-paid-saas-in-3-days-with-no-user-accounts-the-billing-setup-and-3-bugs-that-bit-me-4n54</link>
      <guid>https://dev.to/cocomoon/i-shipped-a-paid-saas-in-3-days-with-no-user-accounts-the-billing-setup-and-3-bugs-that-bit-me-4n54</guid>
      <description>&lt;p&gt;I write a small blog on the side. Every time I picked a topic I hit the same wall: Ahrefs and Semrush are $130+ a month, and even when I had the numbers, "volume 590, difficulty 17" didn't tell me whether to write the post or skip it.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://keyword-brief.vercel.app" rel="noopener noreferrer"&gt;Keyword Brief&lt;/a&gt;. You type a keyword and get a plain-language &lt;strong&gt;GO / MAYBE / SKIP&lt;/strong&gt;, real Google volume and difficulty, a read of what the top 10 pages actually cover, and an outline with the gaps they left open. It deliberately does not write the article for you.&lt;/p&gt;

&lt;p&gt;This post is about how it's built, because the part I'm happiest with is the part users never see: &lt;strong&gt;there are no accounts&lt;/strong&gt;. No signup, no password reset, no user table, and it still takes payments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; on Vercel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DataForSEO&lt;/strong&gt; for search volume, difficulty, and the live top 10&lt;/li&gt;
&lt;li&gt;A plain &lt;code&gt;fetch&lt;/code&gt; + cheerio pass to read the H2/H3 headings off each ranking page (free, and more honest than a "content score")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; to turn those headings and the People Also Ask questions into an outline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lemon Squeezy&lt;/strong&gt; for subscriptions and license keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One check costs me roughly $0.10. Pro is $19.90 a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Billing without accounts
&lt;/h2&gt;

&lt;p&gt;Here's the whole model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Free tier:&lt;/strong&gt; 3 checks per browser, counted in an HMAC-signed cookie. You can't edit the number, and I don't need a database row to remember you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid:&lt;/strong&gt; a Lemon Squeezy subscription with "Generate license keys" turned on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click activation:&lt;/strong&gt; Lemon Squeezy lets you put variables in the confirmation button link. Mine is:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://keyword-brief.vercel.app/activate?key=[license_key]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After checkout the customer clicks one button, lands on &lt;code&gt;/activate&lt;/code&gt;, and the page activates the key for that browser and strips it from the URL. No copy and paste. The same link is on the receipt email as a fallback.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Staying honest:&lt;/strong&gt; the server re-validates the stored key at most once an hour. Cancel or refund, and Pro switches off on its own.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// First time a key is seen in this browser: register the browser as one "instance" of the key.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&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;lsPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;activate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;license_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;instance_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`web-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&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;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ok&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="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// cookie = sign(`${key}|${json.instance.id}`)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expensive call (the Claude outline) is a second request, so it's gated too: the first request issues a short-lived, keyword-bound token, and the outline endpoint refuses to run without it. Otherwise anyone could skip the free counter by calling that endpoint directly.&lt;/p&gt;

&lt;p&gt;Yes, someone can clear cookies to get 3 more free checks. For a $19.90 tool that's a trade I'll take in exchange for zero signup friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 1: every new customer was "inactive"
&lt;/h2&gt;

&lt;p&gt;My first test purchase failed with &lt;em&gt;"This key is inactive."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A fresh Lemon Squeezy key has status &lt;code&gt;inactive&lt;/code&gt;. That doesn't mean invalid. It means "not activated on any device yet" (0/5). I was calling &lt;code&gt;/validate&lt;/code&gt; and rejecting anything that wasn't &lt;code&gt;active&lt;/code&gt;, which means I was rejecting every brand-new paying customer.&lt;/p&gt;

&lt;p&gt;The fix is to call &lt;code&gt;/activate&lt;/code&gt; the first time you see a key (that's what flips it to &lt;code&gt;active&lt;/code&gt; and enforces the device limit), then &lt;code&gt;/validate&lt;/code&gt; with the &lt;code&gt;instance_id&lt;/code&gt; afterwards, and &lt;code&gt;/deactivate&lt;/code&gt; when the user removes the key so the slot is freed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 2: structured outputs ignored my array limits
&lt;/h2&gt;

&lt;p&gt;I defined the outline schema with zod, including things like "at most 4 points per section":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;points&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About one request in three blew up with a validation error. Structured outputs guarantee the &lt;em&gt;shape&lt;/em&gt;, but array length constraints aren't enforced during generation. The model wrote 5 good points, and my own validator threw the whole response away.&lt;/p&gt;

&lt;p&gt;Now the schema has no length limits. The lengths live in the prompt, and I trim in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;points&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;points&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;h2&gt;
  
  
  Bug 3: "top 10" returned 6 results
&lt;/h2&gt;

&lt;p&gt;DataForSEO's SERP &lt;code&gt;depth: 10&lt;/code&gt; doesn't mean 10 organic results. It counts every element on the page: videos, People Also Ask, image packs. I was getting 6 organic links and confidently telling users "the top 10 has plenty of small sites."&lt;/p&gt;

&lt;p&gt;Ask for &lt;code&gt;depth: 30&lt;/code&gt;, filter to &lt;code&gt;type === "organic"&lt;/code&gt;, take the first 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  A feature I didn't plan
&lt;/h2&gt;

&lt;p&gt;I'm not a native English speaker, and while testing I typed &lt;em&gt;"how to fishing well"&lt;/em&gt;. No data at all, because nobody searches that.&lt;/p&gt;

&lt;p&gt;Returning "no demand" would have been wrong and a bit insulting. Now, when a phrase has no data, Claude rewrites it into 4 to 6 natural queries, I verify those against DataForSEO in one batch call, and the page shows what people actually search, with volumes: &lt;em&gt;fishing tips (1,600), fishing tips for beginners (320), how to catch more fish (140)&lt;/em&gt;. Those "no data" lookups don't count against the free checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perceived speed
&lt;/h2&gt;

&lt;p&gt;A full check took about 36 seconds, nearly all of it the outline. I split it in two: the verdict, numbers, and page-one analysis render in about 7 seconds, and the brief fills in underneath while you're reading. Same total time, completely different feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://keyword-brief.vercel.app" rel="noopener noreferrer"&gt;keyword-brief.vercel.app&lt;/a&gt; has 3 free checks with no signup. Pro checkout opens this week.&lt;/p&gt;

&lt;p&gt;The thing I most want to hear: &lt;strong&gt;try a keyword you know well and tell me if the verdict is wrong.&lt;/strong&gt; The GO / MAYBE / SKIP rules are simple and transparent on purpose, and real counterexamples are how they get better.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>saas</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I pulled the real sales numbers from Daiso Korea's website. Here are the 48 products Koreans actually buy.</title>
      <dc:creator>MOON</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:01:57 +0000</pubDate>
      <link>https://dev.to/cocomoon/i-pulled-the-real-sales-numbers-from-daiso-koreas-website-here-are-the-48-products-koreans-1ahm</link>
      <guid>https://dev.to/cocomoon/i-pulled-the-real-sales-numbers-from-daiso-koreas-website-here-are-the-48-products-koreans-1ahm</guid>
      <description>&lt;p&gt;Every "Korean Daiso haul" video tells you what one person bought. I wanted to know what &lt;strong&gt;everyone&lt;/strong&gt; buys.&lt;/p&gt;

&lt;p&gt;It turns out Daiso Korea's online mall (daisomall.co.kr) exposes a number most retailers hide: the &lt;strong&gt;cumulative units ordered&lt;/strong&gt; for every product. So I collected 2,349 unique products across 15 categories — beauty, skincare, kitchen, cleaning, storage, stationery, pets, snacks — and ranked them by real sales volume. Together these 2,349 products have sold &lt;strong&gt;24.8 million units&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is what the data says. (Prices in Korean won; ₩1,000 ≈ US$0.74.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;33 of the 48 best-sellers are beauty or personal care.&lt;/strong&gt; Daiso Korea is, by volume, a beauty store that also sells kitchen towels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;23 of the 48 cost ₩1,000 (~$0.74) or less.&lt;/strong&gt; Nothing costs more than ₩5,000 ($3.70) — 13 sit right at that ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average rating of the 48: 4.80 / 5.&lt;/strong&gt; Not one of them is sold out — Daiso keeps its winners in stock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The single best-selling item is a pack of wet wipes: 994,677 units.&lt;/strong&gt; Not glamorous, but that's a million packs of one SKU from one online channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where the volume is (by category, whole sample)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Products sampled&lt;/th&gt;
&lt;th&gt;Units sold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Beauty &amp;amp; hygiene&lt;/td&gt;
&lt;td&gt;906&lt;/td&gt;
&lt;td&gt;13.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cleaning &amp;amp; bathroom&lt;/td&gt;
&lt;td&gt;325&lt;/td&gt;
&lt;td&gt;4.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage &amp;amp; organization&lt;/td&gt;
&lt;td&gt;175&lt;/td&gt;
&lt;td&gt;1.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kitchen&lt;/td&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;td&gt;1.5M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Food &amp;amp; snacks&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;1.0M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stationery&lt;/td&gt;
&lt;td&gt;187&lt;/td&gt;
&lt;td&gt;0.9M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sports &amp;amp; hobby&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pet supplies&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;0.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Beauty alone is 55% of all units in the sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 50 best-selling products at Daiso Korea (by cumulative units)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Daiso lists many products twice (single unit and bulk box) sharing the same sales counter; duplicates were merged, so 50 listings = 48 unique products.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Units sold&lt;/th&gt;
&lt;th&gt;Rating (reviews)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Eclat clean wet wipes, cap-type, 150 sheets&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;994,677&lt;/td&gt;
&lt;td&gt;4.8 (25,764)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Living pull-out kitchen towels, 150 sheets&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;770,852&lt;/td&gt;
&lt;td&gt;4.9 (20,361)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Tempo toilet paper roll, 24 m&lt;/td&gt;
&lt;td&gt;₩500&lt;/td&gt;
&lt;td&gt;590,389&lt;/td&gt;
&lt;td&gt;4.9 (4,923)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;VT PDRN Glow sheet mask&lt;/strong&gt; (1 sheet)&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;499,272&lt;/td&gt;
&lt;td&gt;4.9 (7,781)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Mommy Care sea grape skin pads, 80 pads&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;342,377&lt;/td&gt;
&lt;td&gt;4.9 (18,304)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Limescale &amp;amp; urine-stone remover, 500 ml&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;288,291&lt;/td&gt;
&lt;td&gt;4.7 (15,913)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Egg capsule wash-off pack&lt;/td&gt;
&lt;td&gt;₩500&lt;/td&gt;
&lt;td&gt;276,379&lt;/td&gt;
&lt;td&gt;4.8 (6,926)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Boncep Vita C freeze-dried double-shot ampoule kit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;267,685&lt;/td&gt;
&lt;td&gt;4.8 (14,596)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Celderma Daily azulene calming sheet mask&lt;/td&gt;
&lt;td&gt;₩2,000&lt;/td&gt;
&lt;td&gt;257,712&lt;/td&gt;
&lt;td&gt;4.8 (6,562)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Puppy moist cushion puff&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;228,709&lt;/td&gt;
&lt;td&gt;4.8 (6,796)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;"Personal info eraser" (ink to hide your address on parcel labels), lavender&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;218,965&lt;/td&gt;
&lt;td&gt;4.8 (12,019)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VT PDRN Glow toner, 200 ml&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;212,668&lt;/td&gt;
&lt;td&gt;4.8 (13,854)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Baking-soda cleaning wipes, 100 sheets&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;204,761&lt;/td&gt;
&lt;td&gt;4.8 (10,611)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Madeca 21 Teca Solution soothing mist toner, 200 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;201,463&lt;/td&gt;
&lt;td&gt;4.9 (15,615)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Air cushion puff, 2-pack&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;199,857&lt;/td&gt;
&lt;td&gt;4.8 (9,436)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Puppy glow cushion water puff&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;174,653&lt;/td&gt;
&lt;td&gt;4.8 (5,372)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;2-in-1 fruit fly trap set&lt;/td&gt;
&lt;td&gt;₩2,000&lt;/td&gt;
&lt;td&gt;166,858&lt;/td&gt;
&lt;td&gt;4.8 (9,520)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Pack Me In hydrogel V-line mask&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;157,695&lt;/td&gt;
&lt;td&gt;4.7 (5,190)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Bathroom cleaning sponges, 10-pack&lt;/td&gt;
&lt;td&gt;₩2,000&lt;/td&gt;
&lt;td&gt;153,081&lt;/td&gt;
&lt;td&gt;4.8 (7,839)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Pull-out kitchen towels, 150 sheets (2nd listing)&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;150,732&lt;/td&gt;
&lt;td&gt;4.9 (4,520)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Rectangular storage box, 26×10×9 cm&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;150,133&lt;/td&gt;
&lt;td&gt;4.9 (4,813)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VT Reedle Shot 100 first ampoule, 2 ml × 6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;149,840&lt;/td&gt;
&lt;td&gt;4.8 (16,760)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VT Reedle Shot 300 first ampoule, 2 ml × 6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;142,578&lt;/td&gt;
&lt;td&gt;4.9 (16,154)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Foam-type "magic cleaner", 550 ml&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;140,933&lt;/td&gt;
&lt;td&gt;4.7 (5,442)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Fine-mist cosmetic spray bottle, 120 ml&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;137,129&lt;/td&gt;
&lt;td&gt;4.8 (9,696)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Boncep Retinol 2500 IU wrinkle-shot perfector, 15 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;136,202&lt;/td&gt;
&lt;td&gt;4.8 (10,462)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;Dong-A laundry stain stick&lt;/td&gt;
&lt;td&gt;₩1,500&lt;/td&gt;
&lt;td&gt;120,619&lt;/td&gt;
&lt;td&gt;4.7 (8,355)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;The Lab by Blanc Doux hyaluronic glow booster ampoule, 30 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;117,256&lt;/td&gt;
&lt;td&gt;4.8 (7,287)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;Homestar 3X foam bleach cleaner (floral)&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;107,982&lt;/td&gt;
&lt;td&gt;4.9 (5,629)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Puppy fitting cushion puff&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;106,729&lt;/td&gt;
&lt;td&gt;4.8 (3,193)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;VT PDRN Glow cream, 50 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;104,014&lt;/td&gt;
&lt;td&gt;4.8 (5,514)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;The Lab by Blanc Doux hyaluronic glow cream, 50 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;101,822&lt;/td&gt;
&lt;td&gt;4.8 (6,992)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;Medi-Peel Melanon X dark-spot cream, 30 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;100,437&lt;/td&gt;
&lt;td&gt;4.7 (4,457)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;Steambase daily eye warmer, cypress scent&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;98,611&lt;/td&gt;
&lt;td&gt;4.8 (3,022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;Portable lens cleaner wipes, 24-pack&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;96,052&lt;/td&gt;
&lt;td&gt;4.8 (6,259)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;Vaseline intensive moisture sheet mask&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;95,926&lt;/td&gt;
&lt;td&gt;4.8 (3,631)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;Induction-cooktop grease wipes, 60 sheets&lt;/td&gt;
&lt;td&gt;₩2,000&lt;/td&gt;
&lt;td&gt;95,671&lt;/td&gt;
&lt;td&gt;4.8 (5,327)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;Madeca 21 Teca Solution soothing cream, 50 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;93,664&lt;/td&gt;
&lt;td&gt;4.8 (8,528)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;Glass &amp;amp; mirror cleaning wipes, 25 sheets&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;93,106&lt;/td&gt;
&lt;td&gt;4.6 (4,969)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Boncep retinol serum sheet mask&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;86,650&lt;/td&gt;
&lt;td&gt;4.8 (2,884)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;Boncep Retinol 500 IU serum, 30 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;86,072&lt;/td&gt;
&lt;td&gt;4.8 (7,323)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;Celderma Daily collagen essence gel mask&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;85,652&lt;/td&gt;
&lt;td&gt;4.7 (2,326)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;Real Barrier Cera Base calming moisturizing cream, 50 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;85,421&lt;/td&gt;
&lt;td&gt;4.8 (6,397)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;VT PDRN Glow lifting mask + essence&lt;/td&gt;
&lt;td&gt;₩2,000&lt;/td&gt;
&lt;td&gt;83,381&lt;/td&gt;
&lt;td&gt;4.8 (2,043)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;Mini powder puff, 2-pack&lt;/td&gt;
&lt;td&gt;₩1,000&lt;/td&gt;
&lt;td&gt;81,183&lt;/td&gt;
&lt;td&gt;4.9 (5,539)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;3-tier stacking drawer&lt;/td&gt;
&lt;td&gt;₩3,000&lt;/td&gt;
&lt;td&gt;79,704&lt;/td&gt;
&lt;td&gt;4.8 (4,721)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;Pation Noscarnine first-step scar ampoule, 30 ml&lt;/td&gt;
&lt;td&gt;₩5,000&lt;/td&gt;
&lt;td&gt;79,630&lt;/td&gt;
&lt;td&gt;4.8 (4,628)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;Potato capsule wash-off pack&lt;/td&gt;
&lt;td&gt;₩500&lt;/td&gt;
&lt;td&gt;78,964&lt;/td&gt;
&lt;td&gt;4.8 (3,052)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Five things the numbers say
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. VT is the brand that owns Daiso Korea.&lt;/strong&gt; The Reedle Shot ampoules (the ones that went viral on TikTok in 2024–25) sit at #22 and #23 with ~145k units &lt;em&gt;each&lt;/em&gt;, but VT's PDRN "Glow" line is now bigger: the PDRN sheet mask alone has sold 499k units at ₩1,000, and the PDRN toner, cream and lifting mask are all in the top 50. Six VT products in the top 48. If you're sourcing K-beauty, VT-at-Daiso is the story of the year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. "Dermocosmetic actives at dollar-store prices" is the winning formula.&lt;/strong&gt; Freeze-dried vitamin C (Boncep, #8), retinol 2500 IU (#26) and 500 IU (#41), PDRN (VT), madecassoside (Madeca 21, #14/#38), noscarnine scar ampoule (#47), a dark-spot cream (#33). Koreans are buying &lt;em&gt;actives&lt;/em&gt;, not just sheet masks — at ₩3,000–5,000 ($2.20–3.70).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Sheet masks are still the volume engine.&lt;/strong&gt; Nine sheet/capsule masks in the top 48, all ₩500–2,000. The ₩500 egg capsule pack (#7) and potato capsule pack (#48) are Daiso originals that don't exist anywhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Makeup sponges are a quiet monster.&lt;/strong&gt; Five cushion puffs in the top 48 (#10, #15, #16, #30, #45) — around 790k units combined. Nobody talks about them; everybody buys them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Cleaning products are the sleeper category.&lt;/strong&gt; A limescale remover with 288k units and 15,913 reviews (#6). Baking-soda wipes, induction wipes, glass wipes, a fruit-fly trap with 167k units. If you sell home goods, Korea's cleaning aisle is a product-development goldmine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;Data was collected on 2026-09-07 from daisomall.co.kr search results for 15 category keywords (cosmetics, skincare, sheet masks, lip, sunscreen, cleansing, shampoo, storage, kitchen, cleaning, bathroom, stationery, pets, camping, snacks), 3,072 listings → 2,349 unique products. The &lt;code&gt;totalSold&lt;/code&gt; field is Daiso's own cumulative order count per listing. This is a category sample, not the full catalogue — there may be best-sellers in categories I didn't search.&lt;/p&gt;

&lt;p&gt;I collected it with a scraper I built and published on Apify (&lt;a href="https://apify.com/cocomoon/daiso-scraper" rel="noopener noreferrer"&gt;Daiso Korea Scraper&lt;/a&gt; — it returns price, rating, review count and units sold per product, and can also pull the reviews). If you want to run it yourself, I wrote a &lt;a href="https://dev.to/cocomoon/how-to-get-olive-young-and-daiso-korea-product-data-as-json-no-code-no-korean-ip-59nf"&gt;step-by-step walkthrough&lt;/a&gt; — no code needed. Happy to answer questions about the data or the method in the comments.&lt;/p&gt;

</description>
      <category>data</category>
      <category>webscraping</category>
      <category>ecommerce</category>
      <category>datascience</category>
    </item>
    <item>
      <title>How to get Olive Young and Daiso Korea product data as JSON — no code, no Korean IP</title>
      <dc:creator>MOON</dc:creator>
      <pubDate>Wed, 09 Sep 2026 08:28:58 +0000</pubDate>
      <link>https://dev.to/cocomoon/how-to-get-olive-young-and-daiso-korea-product-data-as-json-no-code-no-korean-ip-59nf</link>
      <guid>https://dev.to/cocomoon/how-to-get-olive-young-and-daiso-korea-product-data-as-json-no-code-no-korean-ip-59nf</guid>
      <description>&lt;p&gt;If you sell, source, or research K-beauty, the two Korean retailers you actually want data from are &lt;strong&gt;Olive Young&lt;/strong&gt; (Korea's #1 beauty retailer, ~1,300 stores) and &lt;strong&gt;Daiso Korea&lt;/strong&gt; (the ₩1,000 store where VT Reedle Shot went viral). Both have Korean-only websites, both block most scrapers, and neither has a public API.&lt;/p&gt;

&lt;p&gt;This is a 5-minute walkthrough for getting their data as clean JSON or CSV using three small scrapers I published on Apify. No coding required; there's an API/Python section at the end if you want to automate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can get
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;What it returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Olive Young search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Products for any keyword (Korean or English), ordered by Olive Young's popularity ranking: price, sale price, discount %, rating, review count, brand (Korean + English), category, sold-out / coupon / today's-special flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Olive Young reviews&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reviews for any product: text, star rating, date, photos, verified repurchase flag, one-month-use flag, helpful votes, reviewer skin type / tone / concerns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Daiso Korea&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Products for any keyword with price, rating, review count and &lt;strong&gt;cumulative units sold&lt;/strong&gt; — plus reviews with repurchase flag, attribute ratings and photos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 1 — Create a free Apify account
&lt;/h2&gt;

&lt;p&gt;Go to &lt;a href="https://apify.com" rel="noopener noreferrer"&gt;apify.com&lt;/a&gt; and sign up (Google login works). The free plan includes $5 of platform credit every month, which is enough for a few thousand results — no card needed to try this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Open the Actor and enter a keyword
&lt;/h2&gt;

&lt;p&gt;Apify calls each scraper an "Actor". Open one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/cocomoon/oliveyoung-scraper" rel="noopener noreferrer"&gt;Oliveyoung Scraper — K-Beauty Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/cocomoon/oliveyoung-review-scraper" rel="noopener noreferrer"&gt;Oliveyoung Review Scraper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/cocomoon/daiso-scraper" rel="noopener noreferrer"&gt;Daiso Korea Scraper — Real Units Sold + Reviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Try for free&lt;/strong&gt;. You'll land on an input form. For the Olive Young search scraper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keywords&lt;/strong&gt;: one per line. Korean gives the best results (&lt;code&gt;선크림&lt;/code&gt; = sunscreen, &lt;code&gt;토너&lt;/code&gt; = toner, &lt;code&gt;앰플&lt;/code&gt; = ampoule), but English brand names work too (&lt;code&gt;anua&lt;/code&gt;, &lt;code&gt;mediheal&lt;/code&gt;, &lt;code&gt;cosrx&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max items&lt;/strong&gt;: how many products to collect in total. Start with 100.&lt;/li&gt;
&lt;li&gt;Leave proxy settings on the default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. A typical run takes 10–30 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Look at the results and export
&lt;/h2&gt;

&lt;p&gt;When the run finishes, open the &lt;strong&gt;Output&lt;/strong&gt; tab. You'll see a table with an image, name, prices, rating and review count per product. Click &lt;strong&gt;Export&lt;/strong&gt; to download it as &lt;strong&gt;JSON, CSV, Excel, or XML&lt;/strong&gt;, or copy the dataset URL to load it directly into Google Sheets.&lt;/p&gt;

&lt;p&gt;A single Olive Young product row looks like this:&lt;br&gt;
&lt;/p&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"선크림"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;614&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"goodsNo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A000000232672"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[미니어처 단독기획] 메디힐 마데카소사이드 수분 선세럼 흔적 리페어 50+50+15g 기획"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"메디힐"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brandEn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mediheal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"originalPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;34900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salePrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discountRate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"KRW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16595&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isRepurchase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasCoupon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isTodaySpecial"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isSoldOut"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"categoryMid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"선케어"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.oliveyoung.co.kr/store/goods/getGoodsDetail.do?goodsNo=A000000232672"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Get the reviews for a product
&lt;/h2&gt;

&lt;p&gt;Copy the &lt;code&gt;goodsNo&lt;/code&gt; value from the search results (e.g. &lt;code&gt;A000000232672&lt;/code&gt;) and paste it into the &lt;strong&gt;Products&lt;/strong&gt; field of the &lt;a href="https://apify.com/cocomoon/oliveyoung-review-scraper" rel="noopener noreferrer"&gt;Oliveyoung Review Scraper&lt;/a&gt;. You can paste product URLs instead of IDs.&lt;/p&gt;

&lt;p&gt;Useful options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sort by&lt;/strong&gt;: newest first (default), most helpful, highest / lowest rating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review type&lt;/strong&gt;: all, photo reviews only, one-month-use reviews, or repurchase reviews only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max reviews per product&lt;/strong&gt;: 100 by default; a hit product has 10,000+.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each review comes back with &lt;code&gt;rating&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;isRepurchase&lt;/code&gt;, &lt;code&gt;isOneMonthUse&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;helpfulCount&lt;/code&gt;, and a &lt;code&gt;reviewer&lt;/code&gt; object with &lt;code&gt;skinType&lt;/code&gt;, &lt;code&gt;skinTone&lt;/code&gt; and &lt;code&gt;skinConcerns&lt;/code&gt; in English (Olive Young stores these as codes; the Actor translates them).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 — Daiso Korea: products with real sales volume
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/cocomoon/daiso-scraper" rel="noopener noreferrer"&gt;Daiso Korea Scraper&lt;/a&gt; works the same way. Enter keywords (&lt;code&gt;화장품&lt;/code&gt; cosmetics, &lt;code&gt;마스크팩&lt;/code&gt; sheet mask, &lt;code&gt;주방&lt;/code&gt; kitchen, &lt;code&gt;수납&lt;/code&gt; storage…) and you get every matching product with a field most retailers never expose:&lt;br&gt;
&lt;/p&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[수분충전]VT PDRN 광채 시트 마스크 1매 25 g"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7781&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalSold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;499272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"categorySmall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"시트팩"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isSoldOut"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;totalSold&lt;/code&gt; is Daiso's cumulative order count for the listing. Sort your export by that column and you have Daiso Korea's real best-seller list for any category.&lt;/p&gt;

&lt;p&gt;Switch the Actor's &lt;strong&gt;Mode&lt;/strong&gt; to &lt;em&gt;reviews&lt;/em&gt; and paste &lt;code&gt;productNo&lt;/code&gt; values to get review text, star rating, repurchase flag and Daiso's structured attribute ratings ("thickness: thicker than it looks", "durability: sturdy").&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Schedule it (price / trend monitoring)
&lt;/h2&gt;

&lt;p&gt;On any finished run, click &lt;strong&gt;Save as a task&lt;/strong&gt;, then &lt;strong&gt;Schedule&lt;/strong&gt; the task (daily, weekly, cron). Each run writes a fresh dataset; you can push it to Google Sheets, S3, a webhook, or Slack from the &lt;strong&gt;Integrations&lt;/strong&gt; tab. That's a K-beauty price/rating monitor for a few cents a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional — Run it from code
&lt;/h2&gt;

&lt;p&gt;Every Actor has a REST API. With the Apify Python client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cocomoon/oliveyoung-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;선크림&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brandEn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;salePrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/cocomoon~oliveyoung-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"keywords": ["선크림"], "maxItems": 50}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actors also work as tools for AI agents through Apify's MCP server, so Claude, Cursor or a custom agent can query Olive Young or Daiso directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing and limits
&lt;/h2&gt;

&lt;p&gt;All three are pay-per-result: $3–4 per 1,000 results plus a fraction of a cent per run, with platform usage included. The $5 monthly free credit covers roughly 1,000+ results, so you can evaluate the data before paying anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need a Korean IP?&lt;/strong&gt; No. The Actors handle proxies; the review scraper uses Korean residential proxies by default because Olive Young's review API blocks datacenter IPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Korean or English keywords?&lt;/strong&gt; Both work on Olive Young. Korean returns more results; English works for brand names. Daiso is Korean-only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it legal?&lt;/strong&gt; The Actors read publicly listed product and review data — no login, no personal data (reviewer names on Daiso are masked by the platform; Olive Young exposes only nicknames). You're responsible for how you use the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something broke?&lt;/strong&gt; Open an issue on the Actor page — retailers change their sites and I maintain these.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a marketer in Seoul who works with Korean retail data daily; I built these because every foreign brand and seller I talked to was copying Olive Young rankings by hand. If there's a Korean platform you need data from, tell me in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>tutorial</category>
      <category>data</category>
    </item>
  </channel>
</rss>
