<?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: Foodashi API</title>
    <description>The latest articles on DEV Community by Foodashi API (@foodashi).</description>
    <link>https://dev.to/foodashi</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%2F3990820%2F959fdf01-fc7a-41fa-9e0c-ef08c37e9348.png</url>
      <title>DEV Community: Foodashi API</title>
      <link>https://dev.to/foodashi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/foodashi"/>
    <language>en</language>
    <item>
      <title>I built a recipe API because the existing ones were too expensive and too inconsistent</title>
      <dc:creator>Foodashi API</dc:creator>
      <pubDate>Thu, 18 Jun 2026 12:01:44 +0000</pubDate>
      <link>https://dev.to/foodashi/i-built-a-recipe-api-because-the-existing-ones-were-too-expensive-and-too-inconsistent-4d3</link>
      <guid>https://dev.to/foodashi/i-built-a-recipe-api-because-the-existing-ones-were-too-expensive-and-too-inconsistent-4d3</guid>
      <description>&lt;p&gt;A while ago I was building a food app on the side and needed a recipe API. I figured this was a solved problem. It turned out not to be, at least not for me.&lt;/p&gt;

&lt;p&gt;The well-known APIs were priced for funded companies, not someone hacking on a side project after work. The cheaper ones were affordable but inconsistent in a way that made them genuinely annoying to build on. One recipe had a photo, the next had none. One had a description, the next had an empty string. Nutrition existed for some dishes and not others. I spent more time writing defensive code for missing fields than building my actual app.&lt;/p&gt;

&lt;p&gt;So I did the unreasonable thing and built the data layer myself. That became Foodashi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one idea: consistency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The thing I cared about most was that every recipe has the same shape. If a field exists on one recipe, it exists on all of them. Every recipe ships with a food photo, a description, resolved ingredients, steps, nutrition, allergens, dietary tags, a taste profile, and beverage pairings. No special casing, no "is this field here this time" checks.&lt;/p&gt;

&lt;p&gt;Right now that is thousands of recipes across 78 world cuisines, behind 70+ REST endpoints. Nutrition comes both per serving and per 100g. Allergens follow EU 1169/2011 (all 14). There is a health score I call NutriMetric. On the Pro tier there are a few AI endpoints too: meal planning, food photo recognition, and pulling a structured recipe out of raw text or a URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a call looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.foodashi.com/api/recipes/search?query=ramen"&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;"X-Api-Key: YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A trimmed response:&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Shoyu Ramen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cuisine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Japan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image_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://.../shoyu-ramen.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nutrition"&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;"per_serving"&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;"energy_kcal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"protein"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"carbohydrate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total_fat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sodium"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1300&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;"allergens"&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;"contains"&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="s2"&gt;"Gluten"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Soybeans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Eggs"&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;"diet_tags"&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="s2"&gt;"high-protein"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"taste_profile"&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;"umami"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"salty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&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;"nutri_metric"&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;"grade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&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;The same fields come back whether you ask for ramen or a Peruvian stew.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I am honest with you
&lt;/h2&gt;

&lt;p&gt;Nutrition is the place a lot of food data quietly cuts corners, so I want to be clear about how mine works. The numbers are computed from 11 official government food composition databases (USDA SR Legacy, USDA Foundation Foods, CIQUAL in France, MEXT in Japan, CNF in Canada, and more). When an ingredient genuinely is not in any of those, the value is AI estimated and flagged at a lower confidence, so you can tell measured numbers from estimates. I would rather show the seams than pretend everything is lab measured.&lt;/p&gt;

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

&lt;p&gt;There is a free Hobby tier with 10,000 calls a month, no card required. That tier exists because it is the one I wish I had when I started.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://foodashi.com/api-recipe-documentation/" rel="noopener noreferrer"&gt;https://foodashi.com/api-recipe-documentation/&lt;/a&gt;&lt;br&gt;
OpenAPI spec: &lt;a href="https://foodashi.com/openapi.json" rel="noopener noreferrer"&gt;https://foodashi.com/openapi.json&lt;/a&gt;&lt;br&gt;
Base URL: &lt;a href="https://api.foodashi.com" rel="noopener noreferrer"&gt;https://api.foodashi.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a solo build (one person, Cloudflare Workers and Supabase, in Budapest), so if you pull the free tier and something is wrong or awkward, I would really like to hear it. Tell me where the data falls short. That is the most useful thing right now.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>recipe</category>
      <category>android</category>
    </item>
  </channel>
</rss>
