<?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: Alireza Safaei</title>
    <description>The latest articles on DEV Community by Alireza Safaei (@alirezasafaeidev).</description>
    <link>https://dev.to/alirezasafaeidev</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%2F4033592%2F37f0a3fc-3440-453e-823f-8570afe484ad.jpg</url>
      <title>DEV Community: Alireza Safaei</title>
      <link>https://dev.to/alirezasafaeidev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alirezasafaeidev"/>
    <language>en</language>
    <item>
      <title>How we built a machine-readable catalog of free LLM APIs</title>
      <dc:creator>Alireza Safaei</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:57:33 +0000</pubDate>
      <link>https://dev.to/alirezasafaeidev/how-we-built-a-machine-readable-catalog-of-free-llm-apis-34im</link>
      <guid>https://dev.to/alirezasafaeidev/how-we-built-a-machine-readable-catalog-of-free-llm-apis-34im</guid>
      <description>&lt;h1&gt;
  
  
  How we built a machine-readable catalog of free LLM APIs
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Why "free" is not one data type
&lt;/h2&gt;

&lt;p&gt;When we started evaluating "free" LLM APIs for developers in Iran, we quickly realized that the word "free" means different things to different providers. Some offer a permanent free tier that renews monthly. Others provide a limited-time trial. Many give one-time credits that expire after a certain amount of usage. And some label their service as "free" but require a credit card just to sign up.&lt;/p&gt;

&lt;p&gt;Treating all of these as equivalent creates misleading comparisons. A provider offering 100 requests per day indefinitely is fundamentally different from one offering a $5 credit that runs out after a week. We needed a data model that captures these differences explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the provider schema
&lt;/h2&gt;

&lt;p&gt;Each provider in our catalog is represented by a structured JSON record with clearly separated fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;freeTier type&lt;/strong&gt; — permanent, trial, credit, or free model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quotas&lt;/strong&gt; — RPM, RPD, TPM as documented by the provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;payment required&lt;/strong&gt; — whether a credit card is needed for signup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI compatibility&lt;/strong&gt; — protocol/endpoint compatibility and base URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;regional access&lt;/strong&gt; — separate fields for direct access, VPN access, and official policy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;evidence&lt;/strong&gt; — dated source URLs and test results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure makes it possible to query, filter, and compare providers programmatically rather than relying on prose descriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regional-access evidence without overclaiming
&lt;/h2&gt;

&lt;p&gt;Regional availability is one of the most important yet most misrepresented fields in free API lists. We track three independent evidence categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Official documentation&lt;/strong&gt; — what the provider states in their ToS or documentation about regional restrictions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct observation&lt;/strong&gt; — a sanitized, dated test result from an Iranian IP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPN observation&lt;/strong&gt; — a dated test result from an authorized VPN connection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These categories are never merged. A VPN result is not treated as direct Iran access. "Unknown" means insufficient evidence exists, not that the service works. This discipline prevents misleading claims that could affect developers' decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventing stale data
&lt;/h2&gt;

&lt;p&gt;Free-tier policies change frequently. A provider that is free today may reduce quotas tomorrow or introduce payment requirements next month. We address this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dated evidence&lt;/strong&gt; — every record includes a last-checked date&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation scripts&lt;/strong&gt; — CI runs schema checks, freshness warnings, and contract tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale-data warnings&lt;/strong&gt; — providers without recent checks are flagged in the output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The validation pipeline includes 24+ test suites covering provider schemas, privacy, launch links, benchmarks, and deployment contracts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating pages and machine-readable outputs
&lt;/h2&gt;

&lt;p&gt;The same validated dataset powers multiple outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provider pages&lt;/strong&gt; — dedicated HTML pages for each of 22 providers with full details&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical guides&lt;/strong&gt; — 6 educational guides for developers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON catalog&lt;/strong&gt; — machine-readable catalog.json for programmatic access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;data.json&lt;/strong&gt; — normalized projection for external consumers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sitemap and llms.txt&lt;/strong&gt; — for search engine and LLM discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iran mirror&lt;/strong&gt; — an alternative deployment for users in Iran&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All outputs are generated deterministically from the source data using Node.js scripts. No hand-editing of generated sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI contracts and privacy checks
&lt;/h2&gt;

&lt;p&gt;Every change runs through validation gates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provider JSON schema validation&lt;/li&gt;
&lt;li&gt;Publication privacy checks (no credentials, tokens, or internal URLs)&lt;/li&gt;
&lt;li&gt;Launch link contract (28 UTM links across 14 sources)&lt;/li&gt;
&lt;li&gt;Launch log contract (17 publication rows)&lt;/li&gt;
&lt;li&gt;Benchmark and advisor scoring validation&lt;/li&gt;
&lt;li&gt;Deployment and rollback integration tests&lt;/li&gt;
&lt;li&gt;VPN verification configuration validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These contracts catch data inconsistencies, privacy leaks, and stale output before any change reaches production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribution workflow
&lt;/h2&gt;

&lt;p&gt;The project is open source and contributions follow a structured workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Research provider documentation and run verification tests&lt;/li&gt;
&lt;li&gt;Edit the provider JSON file with dated evidence&lt;/li&gt;
&lt;li&gt;Run generators and tests locally&lt;/li&gt;
&lt;li&gt;Open a draft pull request with source URLs, evidence class, and limitations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We welcome new providers, updated evidence, and corrections to stale data. The key requirement is that every factual claim must have a dated, verifiable source — not a guess or third-hand report.&lt;/p&gt;




&lt;p&gt;The complete catalog, provider pages, and guides are available at:&lt;br&gt;
&lt;a href="https://llm.persiantoolbox.ir/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=international_launch" rel="noopener noreferrer"&gt;https://llm.persiantoolbox.ir/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=international_launch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code and contribution guide:&lt;br&gt;
&lt;a href="https://github.com/alirezasafaei-dev/awesome-free-llm-apis-ir" rel="noopener noreferrer"&gt;https://github.com/alirezasafaei-dev/awesome-free-llm-apis-ir&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>freelance</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
