<?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: Gowtham D</title>
    <description>The latest articles on DEV Community by Gowtham D (@gowtham_d).</description>
    <link>https://dev.to/gowtham_d</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%2F4175499%2F13b9a19f-7704-421c-8660-7ddb37ea43fe.png</url>
      <title>DEV Community: Gowtham D</title>
      <link>https://dev.to/gowtham_d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gowtham_d"/>
    <language>en</language>
    <item>
      <title>How to query 65,000 rows of NYC nutrition data without downloading a CSV</title>
      <dc:creator>Gowtham D</dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:37:03 +0000</pubDate>
      <link>https://dev.to/gowtham_d/how-to-query-65000-rows-of-nyc-nutrition-data-without-downloading-a-csv-2jk</link>
      <guid>https://dev.to/gowtham_d/how-to-query-65000-rows-of-nyc-nutrition-data-without-downloading-a-csv-2jk</guid>
      <description>&lt;p&gt;You want to answer a small question  say, &lt;em&gt;which chain restaurant items have the most calories?&lt;/em&gt;  and the data exists. NYC Open Data publishes &lt;a href="https://data.cityofnewyork.us/d/qgc5-ecnb" rel="noopener noreferrer"&gt;MenuStat&lt;/a&gt;: 65,219 menu items from 96 US chains, with calories, sodium, serving sizes.&lt;/p&gt;

&lt;p&gt;The usual path: download the CSV, write a loader, discover every number is a string, discover &lt;code&gt;calories&lt;/code&gt; is sometimes &lt;code&gt;null&lt;/code&gt; and sometimes the literal text &lt;code&gt;"110-550"&lt;/code&gt;, build a little Flask thing so your frontend can query it, deploy the little Flask thing, and three days later you have infrastructure instead of an answer.&lt;/p&gt;

&lt;p&gt;This tutorial takes the other path: the dataset is already hosted as a typed REST API on &lt;a href="https://littlebitlabs.com/products/api-bay" rel="noopener noreferrer"&gt;API Bay&lt;/a&gt;. We'll query it with nothing but &lt;code&gt;curl&lt;/code&gt;, page through it correctly, and  because this is the part most tutorials skip  go through the gotchas that cost real (if tiny) money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The approach
&lt;/h2&gt;

&lt;p&gt;Every dataset in the API Bay catalog answers the same query model: one key, one URL shape, the same parameters and filter operators everywhere. Learn it once on this dataset and it's the same on the next one. There's also a sandbox host where calls are free (100/day), so you can follow along without spending anything  create a &lt;em&gt;test&lt;/em&gt; key and swap the host.&lt;/p&gt;

&lt;p&gt;Setup, once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# paste your key when prompted, so it never lands in shell history&lt;/span&gt;
&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-rs&lt;/span&gt; KEY
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'LB-Access-Token: %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.apibay-key &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.apibay-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Your first call
&lt;/h2&gt;

&lt;p&gt;The dataset is &lt;code&gt;nyc_food_cart_menu_statistics&lt;/code&gt;. Ask for two rows, four columns:&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;-H&lt;/span&gt; @&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.apibay-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.selectstar.wtf/v1/apibay/nyc_food_cart_menu_statistics?ps=2&amp;amp;pg=0&amp;amp;fc=menu_item_id,restaurant,item_name,calories"&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="w"&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;"calories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item_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;"Broccoli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"menu_item_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14850&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Denny's"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"calories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item_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;"Mushroom Chicken, Kids"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"menu_item_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;62672&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Panda Express"&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;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;Three parameters did the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ps&lt;/code&gt;  page size (rows per call, max 100)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pg&lt;/code&gt;  page number, counting from 0&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fc&lt;/code&gt;  the columns you want; omit it and you get all 49&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note &lt;code&gt;calories: 25&lt;/code&gt; is a &lt;strong&gt;number&lt;/strong&gt;. The schema is typed (&lt;code&gt;Int32&lt;/code&gt;, &lt;code&gt;Float64&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Nullable&lt;/code&gt;)  if you've ever pulled this dataset raw from the Socrata API, where every value arrives as a string, this alone saves you a parsing layer.&lt;/p&gt;

&lt;p&gt;The response headers are half the product, so read them once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-cost-per-1k: USD 1.70          ← this dataset's price per 1,000 calls
x-wallet-remaining: USD 99.99    ← your prepaid balance after this call
x-ratelimit-remaining: 143994    ← calls left in the 24h window
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every metered response prices itself. A program that spends money should read &lt;code&gt;x-wallet-remaining-requests&lt;/code&gt; and &lt;code&gt;x-ratelimit-remaining&lt;/code&gt; on every response  more on why below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtering, ordering, paging
&lt;/h2&gt;

&lt;p&gt;A filter is &lt;code&gt;column=operator.value&lt;/code&gt;. Answer the opening question  highest-calorie items at or above 9,000 kcal:&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;-H&lt;/span&gt; @&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.apibay-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.selectstar.wtf/v1/apibay/nyc_food_cart_menu_statistics?ps=3&amp;amp;pg=0&amp;amp;fc=restaurant,item_name,calories&amp;amp;calories=ge.9000&amp;amp;oy=calories.ds"&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="w"&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;"calories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13960&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item_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;"Crave Crate w/ Any 100 Sliders in a Crate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"White Castle"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"calories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10205&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item_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;"Prime Rib"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dickey's Barbeque Pit"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"calories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item_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;"Rib Tips Til Payday, Dinner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Famous Dave's"&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;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;(Yes, White Castle sells a 13,960-calorie crate of 100 sliders. Open data delivers.)&lt;/p&gt;

&lt;p&gt;There are 19 operators  &lt;code&gt;eq&lt;/code&gt;, &lt;code&gt;ne&lt;/code&gt;, &lt;code&gt;gt/ge/lt/le&lt;/code&gt;, &lt;code&gt;bw&lt;/code&gt; (between), &lt;code&gt;in&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt; (contains), &lt;code&gt;il&lt;/code&gt; (contains, case-insensitive), &lt;code&gt;mt&lt;/code&gt; (regex), &lt;code&gt;is.NULL&lt;/code&gt;, and friends. Filters on different columns AND together; &lt;code&gt;or=(...)&lt;/code&gt; groups alternatives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# McDonald's or Subway, at least 1,000 kcal&lt;/span&gt;
...&amp;amp;or&lt;span class="o"&gt;=(&lt;/span&gt;restaurant.eq.McDonald%27s,restaurant.eq.Subway&lt;span class="o"&gt;)&lt;/span&gt;&amp;amp;calories&lt;span class="o"&gt;=&lt;/span&gt;ge.1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Page like you mean it.&lt;/strong&gt; Every call must carry &lt;code&gt;ps&lt;/code&gt; and &lt;code&gt;pg&lt;/code&gt;  leave one out and you get a &lt;code&gt;406&lt;/code&gt;. That's a guardrail: no call can accidentally return the whole table. But correct paging is still on you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# WRONG-ish: ties in `calories` have no defined order between pages&lt;/span&gt;
&lt;span class="nv"&gt;oy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;calories.ds

&lt;span class="c"&gt;# RIGHT: add tie-breakers until no two rows compare equal&lt;/span&gt;
&lt;span class="nv"&gt;oy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;calories.ds,menu_item_id.as,item_name.as
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dataset is full of ties (and &lt;code&gt;menu_item_id&lt;/code&gt; itself repeats across collection years  the real key is id + year). Page on an ambiguous order and a row can show up on two pages, or on none. This is true of every paginated API you'll ever use; it just usually bites silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gotchas nobody documents
&lt;/h2&gt;

&lt;p&gt;This is a metered API  calls cost money ($1.70 per 1,000 on this dataset, i.e. $0.0017 each). That changes the failure modes in ways worth knowing before you write a loop:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Mistakes that reach the dataset are billed.&lt;/strong&gt; An unknown column, a missing &lt;code&gt;pg&lt;/code&gt;, a filter value with a bare SQL keyword  these come back as &lt;code&gt;417&lt;/code&gt;/&lt;code&gt;406&lt;/code&gt;/&lt;code&gt;400&lt;/code&gt; &lt;em&gt;with&lt;/em&gt; the metering headers, logged and charged like a success. Validate the URL before you send it; resending a broken request just repeats the charge. (Refusals at the door  no key, &lt;code&gt;POST&lt;/code&gt; to a read-only API, &lt;code&gt;ps&lt;/code&gt; over 100  cost nothing.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Only two errors are worth retrying.&lt;/strong&gt; &lt;code&gt;429&lt;/code&gt; means rate limit: wait &lt;code&gt;Retry-After&lt;/code&gt; seconds, send the same request. &lt;code&gt;402&lt;/code&gt; means your wallet or a spend cap is done: no amount of retrying helps. Everything else repeats until you change the request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cache hits are billed too.&lt;/strong&gt; Repeat an identical request within moments and &lt;code&gt;apisix-cache-status: HIT&lt;/code&gt; tells you it came from cache  at full price. Same for a &lt;code&gt;~rand&lt;/code&gt; order returning the same rows. If you need fresh rows, change the request, don't re-send it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A call costs the same for 1 row or 100.&lt;/strong&gt; So &lt;code&gt;ps=100&lt;/code&gt; always, and ask for only the columns you need with &lt;code&gt;fc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The platform types the data; it doesn't interpret it.&lt;/strong&gt; &lt;code&gt;calories&lt;/code&gt; being &lt;code&gt;null&lt;/code&gt; in ~9,900 rows, a &lt;code&gt;calories_text&lt;/code&gt; column holding ranges like &lt;code&gt;"110-550"&lt;/code&gt;, a recorded &lt;code&gt;0&lt;/code&gt; meaning something different from both  that's the source dataset, served faithfully. The serving layer has no business silently "fixing" public data, so those decisions ship in &lt;em&gt;your&lt;/em&gt; client code.&lt;/p&gt;

&lt;p&gt;The worst case is bounded, though: the wallet is prepaid and spending stops at its balance. A runaway loop ends when the wallet does, not when the invoice arrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;From zero to answering real questions against 65,219 rows: one key, four or five &lt;code&gt;curl&lt;/code&gt; commands, no download, no loader, no deploy. The question from the top  most caloric chain-restaurant items  took one request.&lt;/p&gt;

&lt;p&gt;Honest limitations, so you can decide if this fits your use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only.&lt;/strong&gt; &lt;code&gt;GET&lt;/code&gt; only; anything else is refused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No aggregates.&lt;/strong&gt; There's no &lt;code&gt;count(*)&lt;/code&gt; or &lt;code&gt;sum()&lt;/code&gt;  grouping answers "which groups exist", not "how many in each". If you need analytics, pull the rows (at 100/page) and aggregate client-side, or this isn't your tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100 rows per page, 512 KB per response.&lt;/strong&gt; Bulk export is not the use case; the CSV download still wins there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's in beta.&lt;/strong&gt; Screens and details may shift.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the free route instead: the raw dataset is on &lt;a href="https://data.cityofnewyork.us/d/qgc5-ecnb" rel="noopener noreferrer"&gt;NYC Open Data&lt;/a&gt; with a Socrata API  you'll just be doing your own typing, hosting and semantics. I wrote up what that actually involves (the null-vs-text calories, the duplicate IDs, one genuine two-chains-one-ID bug) in a longer companion piece.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I'm the co-founder/CTO of Littlebit Labs  API Bay is our product. The &lt;a href="https://littlebitlabs.com/docs/api-bay-bible" rel="noopener noreferrer"&gt;API Bay Bible&lt;/a&gt; documents the full query model, every refusal, and the publisher side (uploading your own table and pricing it), if you want to go deeper.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What's your default move when a side project needs public data  download and load, or find an API? Curious what the split looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://littlebitlabs.com" rel="noopener noreferrer"&gt;https://littlebitlabs.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://selectstar.wtf" rel="noopener noreferrer"&gt;https://selectstar.wtf&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>opendata</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
