<?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: FreeTier</title>
    <description>The latest articles on DEV Community by FreeTier (@freetierkits).</description>
    <link>https://dev.to/freetierkits</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%2F4189476%2F70d53af1-2748-4354-b34e-be38e759e011.png</url>
      <title>DEV Community: FreeTier</title>
      <link>https://dev.to/freetierkits</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/freetierkits"/>
    <language>en</language>
    <item>
      <title>Give your AI agent paid tools with x402 and MCP: a working example</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Mon, 26 Oct 2026 05:50:01 +0000</pubDate>
      <link>https://dev.to/freetierkits/give-your-ai-agent-paid-tools-with-x402-and-mcp-a-working-example-1b05</link>
      <guid>https://dev.to/freetierkits/give-your-ai-agent-paid-tools-with-x402-and-mcp-a-working-example-1b05</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I run the API used in this example (FreeTier Agent API), so treat this as a vendor tutorial. The article was drafted with AI assistance and checked by hand. Every output below was captured from the live service on 2026-10-25; nothing is made up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this shows
&lt;/h2&gt;

&lt;p&gt;Many agent tools are small lookups: "does this domain have DMARC?", "when does this cert expire?", "what are the coordinates of this address?". Building and hosting each one yourself is overkill; paying a monthly SaaS plan for 20 calls is too. &lt;strong&gt;x402&lt;/strong&gt; is an HTTP-native way to pay per call, and &lt;strong&gt;MCP&lt;/strong&gt; is how assistants like Claude and Cursor discover tools. This post connects the two with a real endpoint you can try for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  x402 in one paragraph
&lt;/h2&gt;

&lt;p&gt;The server answers an unpaid request with &lt;strong&gt;HTTP 402 Payment Required&lt;/strong&gt; plus machine-readable payment terms. An x402 client signs a USDC transfer authorization on Base (no gas needed by the payer; a facilitator settles it) and repeats the request with a &lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt; header. The server verifies, does the work, settles, and returns the result.&lt;/p&gt;

&lt;p&gt;Here is the real 402 challenge for an SSL-certificate lookup (decoded from the &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header, trimmed):&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;-si&lt;/span&gt; &lt;span class="s2"&gt;"https://freetier-agent-api.pages.dev/api/ssl-cert?domain=dev.to&amp;amp;nofree=1"&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="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eip155:8453"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"payTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x165Eb3dC3E98403ecB1141e90400F5e71806554B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"maxTimeoutSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&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;amount&lt;/code&gt; is in USDC base units (6 decimals), so 5000 = $0.005. &lt;code&gt;nofree=1&lt;/code&gt; skips the free trial so you can see the challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect the MCP server
&lt;/h2&gt;

&lt;p&gt;The same routes are exposed as MCP tools at &lt;code&gt;https://freetier-agent-api.pages.dev/mcp&lt;/code&gt; (Streamable HTTP).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http freetier https://freetier-agent-api.pages.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;)&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;"mcpServers"&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;"freetier"&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;"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://freetier-agent-api.pages.dev/mcp"&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="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;strong&gt;Claude Desktop&lt;/strong&gt; (&lt;code&gt;claude_desktop_config.json&lt;/code&gt;, via the &lt;code&gt;mcp-remote&lt;/code&gt; bridge)&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;"mcpServers"&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;"freetier"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&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://freetier-agent-api.pages.dev/mcp"&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="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;Full copy-paste recipes, including how to add a paid key: &lt;a href="https://freetier-agent-api.pages.dev/recipes" rel="noopener noreferrer"&gt;https://freetier-agent-api.pages.dev/recipes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then ask, for example: &lt;em&gt;"Check the DNS, SPF and DMARC records for dev.to and tell me whether its mail setup has any warnings."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A working Node example (no SDK)
&lt;/h2&gt;

&lt;p&gt;MCP over HTTP is JSON-RPC, so plain &lt;code&gt;fetch&lt;/code&gt; works (Node 18+):&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="c1"&gt;// mcp_call.mjs&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MCP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://freetier-agent-api.pages.dev/mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MCP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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;rpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tools/call&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dns&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dev.to&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment required:&lt;/span&gt;&lt;span class="dl"&gt;"&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;structuredContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accepts&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="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real output of &lt;code&gt;node mcp_call.mjs&lt;/code&gt; (this was the free call; TXT records trimmed):&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;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev.to"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NOERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"exists"&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;"dnssec_validated"&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;"records"&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;"A"&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;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"151.101.66.217"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ttl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;160&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="s2"&gt;"... 3 more"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"MX"&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;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 smtp.google.com."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ttl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"priority"&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;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smtp.google.com"&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;"NS"&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;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jill.ns.cloudflare.com."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ttl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;86400&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;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"josh.ns.cloudflare.com."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ttl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;86400&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;"mail"&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;"accepts_mail"&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;"mx_hosts"&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;"smtp.google.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v=spf1 a mx include:_spf.google.com include:sendgrid.net include:servers.mcsv.net include:shops.shopify.com ~all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spf_all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spf_multiple"&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;"dmarc_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dmarc_pct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"warnings"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"resolver"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cloudflare"&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 second call from the same caller gets the payment branch instead: &lt;code&gt;isError: true&lt;/code&gt; with the x402 &lt;code&gt;PaymentRequired&lt;/code&gt; object in &lt;code&gt;structuredContent&lt;/code&gt;. An x402-aware MCP client signs it and repeats the call with &lt;code&gt;params._meta["x402/payment"]&lt;/code&gt;; the receipt comes back in &lt;code&gt;result._meta["x402/payment-response"]&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying over plain HTTP
&lt;/h2&gt;

&lt;p&gt;With a dedicated, low-balance Base wallet holding a little USDC:&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="c1"&gt;// npm i @x402/fetch @x402/evm viem&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/evm&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EVM_PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchWithPayment&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="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:8453&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&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="nx"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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;fetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://freetier-agent-api.pages.dev/api/dns?domain=dev.to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&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="nx"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I am not pasting a paid response here because it is the same JSON as above plus a payment receipt header; I did not want to show anything I had not run for this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits (read these)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 free call per route per caller.&lt;/strong&gt; Callers are identified by a hash of IP + user agent, so it is a trial, not a quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costs:&lt;/strong&gt; dns $0.0025, domain-whois $0.005, ssl-cert $0.005, geocode $0.0015 per call. Failed calls (400/502) are not charged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data sources:&lt;/strong&gt; DNS via Cloudflare/Google DNS-over-HTTPS; WHOIS via official RDAP servers (some ccTLDs such as .de and .dk have no public RDAP and return a clear error); SSL from Certificate Transparency logs (shows issued certs, not what a server is serving right now); geocoding from OpenStreetMap Nominatim (rate-limited to 1 req/s, cached, ODbL attribution in every response).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop chat apps do not sign x402 payments.&lt;/strong&gt; In Claude Desktop/Cursor you either stay on free calls or use a prepaid card key (&lt;code&gt;X-License-Key&lt;/code&gt; header); wallet payments need an x402 client like the one above.&lt;/li&gt;
&lt;li&gt;Use a separate wallet with a small balance for any agent that can spend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;x402 protocol: &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;https://x402.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Model Context Protocol: &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;https://modelcontextprotocol.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Setup recipes used above: &lt;a href="https://freetier-agent-api.pages.dev/recipes" rel="noopener noreferrer"&gt;https://freetier-agent-api.pages.dev/recipes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAPI spec of the example API: &lt;a href="https://freetier-agent-api.pages.dev/openapi.json" rel="noopener noreferrer"&gt;https://freetier-agent-api.pages.dev/openapi.json&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>x402</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Invoice PDF to JSON for AI agents: $0.003 per page with x402, or by card</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 24 Oct 2026 20:53:42 +0000</pubDate>
      <link>https://dev.to/freetierkits/invoice-pdf-to-json-for-ai-agents-0003-per-page-with-x402-or-by-card-3npg</link>
      <guid>https://dev.to/freetierkits/invoice-pdf-to-json-for-ai-agents-0003-per-page-with-x402-or-by-card-3npg</guid>
      <description>&lt;p&gt;Agents that handle bills, receipts or expense reports keep running into the same problem: the invoice is a PDF, and the agent needs fields it can trust: who sent it, the invoice number, the totals, the line items. This post shows a small HTTP API that does that one job and charges per page, either in USDC over &lt;a href="https://www.x402.org/" rel="noopener noreferrer"&gt;x402&lt;/a&gt; or by card with a prepaid credit pack.&lt;/p&gt;

&lt;p&gt;Full disclosure: I run this API, and this post was drafted with AI assistance and checked by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  One real call
&lt;/h2&gt;

&lt;p&gt;Every caller gets one free call per route, so you can try it with no wallet and no signup. This is the exact request I ran while writing this post, on a public sample invoice from the open-source invoice2data test set:&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;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://freetier-agent-api.pages.dev/api/invoice-json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&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;'{"url":"https://raw.githubusercontent.com/invoice-x/invoice2data/master/tests/compare/AzureInterior.pdf"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can send a &lt;code&gt;url&lt;/code&gt; (PDF, PNG, JPEG or WebP, max 8 MB), plain &lt;code&gt;text&lt;/code&gt;, or &lt;code&gt;file_base64&lt;/code&gt; + &lt;code&gt;mime_type&lt;/code&gt; in a POST body.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came back (trimmed)
&lt;/h2&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;"invoice_number"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INV/2023/03/0008"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invoice INV/2023/03/0008"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&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;"issue_date"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-03-20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invoice Date:03/20/2023"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9&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;"currency"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$ 42.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9&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;"totals"&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;"subtotal"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;262.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;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Subtotal $ 262.90"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.98&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;"vat_total"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;16.94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tax 15% on $ 112.90 $ 16.94"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.98&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;"total"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;279.84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Total $ 279.84"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.98&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;"line_items"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[FURN_7777] Office Chair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&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;"unit_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;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"vat_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[FURN_7777] Office Chair 1.00 Units 70.00 0.00 15.00% $ 70.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.85&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;"checks"&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;"subtotal_plus_vat_equals_total"&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;"line_items_sum_equals_subtotal_or_total"&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;"vat_breakdown_sum_equals_vat_total"&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;"due_date_not_before_issue_date"&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="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;"overall_confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pages"&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;"billed_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.003&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 parts I care most about as an agent builder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every field carries the verbatim quote it came from.&lt;/strong&gt; Your code (or a human) can check a value against the document in one string search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence is mechanical, not vibes.&lt;/strong&gt; It is higher when the quote is found verbatim in the document text and the value matches the quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Totals are checked arithmetically.&lt;/strong&gt; The &lt;code&gt;checks&lt;/code&gt; block tells you whether subtotal + VAT = total and whether the line items add up, so an agent can route anything that fails to a human.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not perfect, and the response says so. On this demo invoice (an Odoo template with two addresses near the top), the vendor and customer roles came out mixed up. The quotes make that easy to spot, but you should still check the fields that matter before you pay anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying per call with x402 (USDC on Base)
&lt;/h2&gt;

&lt;p&gt;After the free call, the route answers &lt;code&gt;402 Payment Required&lt;/code&gt; with the price: &lt;strong&gt;$0.003 per page&lt;/strong&gt; (max 10 pages per call). With &lt;code&gt;@x402/fetch&lt;/code&gt; the payment is handled for you:&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="c1"&gt;// npm i @x402/fetch @x402/evm viem&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/evm&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EVM_PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// wallet with USDC on Base&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchWithPayment&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="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:8453&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&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="nx"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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;fetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://freetier-agent-api.pages.dev/api/invoice-json&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://raw.githubusercontent.com/invoice-x/invoice2data/master/tests/compare/AzureInterior.pdf&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="nx"&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="nx"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Failed calls (a bad URL, a document it cannot read) are not charged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pay by card instead (no wallet)
&lt;/h2&gt;

&lt;p&gt;If you don't want to hold USDC, there is a prepaid credit pack on Gumroad: &lt;strong&gt;&lt;a href="https://freetier.gumroad.com/l/gvyfk" rel="noopener noreferrer"&gt;Agent Extraction API - Call Pack&lt;/a&gt;&lt;/strong&gt; (1,000 credits for $3, 5,000 for $12, 20,000 for $40). You get a license key and send it as a header:&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;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://freetier-agent-api.pages.dev/api/invoice-json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'X-License-Key: YOUR-LICENSE-KEY'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&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;'{"url":"https://raw.githubusercontent.com/invoice-x/invoice2data/master/tests/compare/AzureInterior.pdf"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One credit is $0.001, so an invoice page costs 3 credits. The &lt;code&gt;X-Credits-Remaining&lt;/code&gt; response header shows your balance, and failed calls are not charged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;LLM extraction can misread layouts; check important values (the quotes make that quick).&lt;/li&gt;
&lt;li&gt;Scanned PDFs need image input.&lt;/li&gt;
&lt;li&gt;Documents are processed in memory and not stored. Extraction runs on Cloudflare Workers AI, not a third-party LLM API.&lt;/li&gt;
&lt;li&gt;Max 10 pages per call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other routes on the same API
&lt;/h2&gt;

&lt;p&gt;The same API (and the same card credits) also covers &lt;a href="https://freetier-agent-api.pages.dev/products/token-risk" rel="noopener noreferrer"&gt;token-risk&lt;/a&gt; (ERC-20 risk flags with evidence), &lt;a href="https://freetier-agent-api.pages.dev/products/site-contacts" rel="noopener noreferrer"&gt;site-contacts&lt;/a&gt; (role emails and phones from a company site) and &lt;a href="https://freetier-agent-api.pages.dev/products/page-rag" rel="noopener noreferrer"&gt;page-rag&lt;/a&gt; (web page to Markdown + RAG chunks). There is also an MCP endpoint at &lt;code&gt;/mcp&lt;/code&gt; and an OpenAPI spec at &lt;a href="https://freetier-agent-api.pages.dev/openapi.json" rel="noopener noreferrer"&gt;/openapi.json&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The listing is &lt;a href="https://payapi.market/api/freetier-agent-api" rel="noopener noreferrer"&gt;verified on PayAPI Market&lt;/a&gt;: that means PayAPI Market made one settled $0.001 test payment to one route (&lt;a href="https://basescan.org/tx/0xac7061becf519224a65e72675e3a70e56d8b7b898cb773007578d958e57a7c18" rel="noopener noreferrer"&gt;on-chain receipt&lt;/a&gt;). It is not an audit.&lt;/p&gt;

&lt;p&gt;Docs and the full schema: &lt;a href="https://freetier-agent-api.pages.dev/products/invoice-json" rel="noopener noreferrer"&gt;freetier-agent-api.pages.dev/products/invoice-json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: this article was drafted with AI assistance; I run this API.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cheapest LLM APIs per 1M tokens (Oct 2026): 20 models compared, plus free tiers</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:05:02 +0000</pubDate>
      <link>https://dev.to/freetierkits/cheapest-llm-apis-per-1m-tokens-oct-2026-20-models-compared-plus-free-tiers-4mn9</link>
      <guid>https://dev.to/freetierkits/cheapest-llm-apis-per-1m-tokens-oct-2026-20-models-compared-plus-free-tiers-4mn9</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I wrote this with help from AI tools and checked every number against our own data files, which link each provider page. The PDF, the API and the directory are my own products; the API and the dataset are paid.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All prices below are standard list prices in USD per 1 million tokens. I checked them by hand on each provider's official pricing page on 2026-10-17 (OpenAI, Anthropic, Google, xAI, DeepSeek). Providers change prices often, so confirm on the linked pricing page before you commit real spend.&lt;/p&gt;

&lt;p&gt;To compare models with one number, I use a "1M+1M job": the cost of 1M input tokens plus 1M output tokens. The list is sorted from cheapest to most expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 20 models, cheapest first
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;gpt-5-nano&lt;/strong&gt; (OpenAI): $0.05 in / $0.4 out, 1M+1M job = $0.45&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-2.5-flash-lite&lt;/strong&gt; (Google): $0.1 in / $0.4 out, 1M+1M job = $0.50 (free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-6-luna&lt;/strong&gt; (OpenAI): $0.1 in / $0.5 out, 1M+1M job = $0.60&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Haiku 5.5&lt;/strong&gt; (Anthropic): $0.1 in / $0.5 out, 1M+1M job = $0.60 (prompts up to 100k tokens; $0.50/$2.50 above)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-5.6-luna&lt;/strong&gt; (OpenAI): $0.2 in / $1.2 out, 1M+1M job = $1.40&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;deepseek-flash&lt;/strong&gt; (DeepSeek): $0.3 in / $1.2 out, 1M+1M job = $1.50 (peak price; off-peak is half)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-3.1-flash-lite&lt;/strong&gt; (Google): $0.25 in / $1.5 out, 1M+1M job = $1.75 (text input; free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-4.1-mini&lt;/strong&gt; (OpenAI): $0.4 in / $1.6 out, 1M+1M job = $2.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-3.5-flash-lite&lt;/strong&gt; (Google): $0.3 in / $2.5 out, 1M+1M job = $2.80 (free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-2.5-flash&lt;/strong&gt; (Google): $0.3 in / $2.5 out, 1M+1M job = $2.80 (text input; free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-3.8-flash&lt;/strong&gt; (Google): $0.75 in / $3.75 out, 1M+1M job = $4.50 (until 31 Dec 2026, then $1.50/$7.50; free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-5.4-mini&lt;/strong&gt; (OpenAI): $0.75 in / $4.5 out, 1M+1M job = $5.25&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;deepseek-v4-pro&lt;/strong&gt; (DeepSeek): $1.32 in / $3.96 out, 1M+1M job = $5.28 (peak price; off-peak is half)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Haiku 4.5&lt;/strong&gt; (Anthropic): $1 in / $5 out, 1M+1M job = $6.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;grok-4.7&lt;/strong&gt; (xAI): $2 in / $6 out, 1M+1M job = $8.00 (500k context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-6.1-sol&lt;/strong&gt; (OpenAI): $2 in / $10 out, 1M+1M job = $12.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Sonnet 5.5&lt;/strong&gt; (Anthropic): $2 in / $10 out, 1M+1M job = $12.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gemini-4-argon&lt;/strong&gt; (Google): $2 in / $10 out, 1M+1M job = $12.00 (until 30 Nov 2026, then $4/$20; no free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Opus 5.5&lt;/strong&gt; (Anthropic): $4 in / $20 out, 1M+1M job = $24.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-6-astra&lt;/strong&gt; (OpenAI): $10 in / $50 out, 1M+1M job = $60.00&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the numbers say
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Four models cost $0.60 or less per 1M+1M job: gpt-5-nano ($0.45), gemini-2.5-flash-lite ($0.50), gpt-6-luna ($0.60) and Claude Haiku 5.5 ($0.60, for prompts up to 100k tokens).&lt;/li&gt;
&lt;li&gt;The most expensive model in the list, gpt-6-astra ($60.00), costs about 133 times as much as the cheapest, gpt-5-nano ($0.45).&lt;/li&gt;
&lt;li&gt;Output tokens cost 3 to 8.3 times as much as input tokens. If your app writes long answers, look at the output price first.&lt;/li&gt;
&lt;li&gt;DeepSeek lists peak prices; its off-peak price is half. Two Google prices are introductory: gemini-3.8-flash rises to $1.50/$7.50 after 31 Dec 2026 and gemini-4-argon to $4/$20 after 30 Nov 2026.&lt;/li&gt;
&lt;li&gt;A simple way to save: send classification, extraction and short rewrites to a small model, and keep the large model for the hard steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free tiers worth knowing
&lt;/h2&gt;

&lt;p&gt;Several Google Gemini models in the list above have a free tier on the Gemini API. These AI API free tiers are described on each provider's own page (checked 17 Oct 2026; limits change, so follow the source link):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cerebras - Llama / Qwen models&lt;/strong&gt;: Free tier with rate limits (&lt;a href="https://inference-docs.cerebras.ai/support/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Workers AI - LLMs (Llama, Mistral, etc.)&lt;/strong&gt;: 10,000 Neurons/day free (&lt;a href="https://developers.cloudflare.com/workers-ai/platform/pricing/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Workers AI - Whisper / image models&lt;/strong&gt;: 10,000 Neurons/day free (&lt;a href="https://developers.cloudflare.com/workers-ai/platform/pricing/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohere - Command models&lt;/strong&gt;: Trial key: 1,000 API calls/month; Command A 20 req/min (&lt;a href="https://docs.cohere.com/docs/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohere - Embed / Rerank&lt;/strong&gt;: Trial key: 1,000 API calls/month total (&lt;a href="https://docs.cohere.com/docs/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deepgram - Speech-to-text / TTS&lt;/strong&gt;: $200 free credit, then pay-as-you-go (&lt;a href="https://deepgram.com/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs - Text-to-speech&lt;/strong&gt;: 10k credits/month, 3 Studio projects (no commercial license) (&lt;a href="https://elevenlabs.io/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google AI Studio (Gemini API) - Gemini Flash models&lt;/strong&gt;: Free tier with rate limits (&lt;a href="https://ai.google.dev/gemini-api/docs/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google AI Studio (Gemini API) - Gemini Pro models&lt;/strong&gt;: Free tier availability varies by model (&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq - Llama models&lt;/strong&gt;: Free tier with per-model rate limits (&lt;a href="https://console.groq.com/docs/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq - Whisper (speech-to-text)&lt;/strong&gt;: whisper-large-v3: 20 requests/min, 2K requests/day (&lt;a href="https://console.groq.com/docs/rate-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral AI - Mistral Embed&lt;/strong&gt;: Free experiment tier (&lt;a href="https://mistral.ai/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral AI - Mistral models (La Plateforme)&lt;/strong&gt;: Free experiment tier (&lt;a href="https://mistral.ai/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA NIM (build.nvidia.com) - Hosted model endpoints&lt;/strong&gt;: Free API access for prototyping (developer program) (&lt;a href="https://build.nvidia.com/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter - Models tagged :free&lt;/strong&gt;: Free variants with daily request limits (&lt;a href="https://openrouter.ai/docs/api-reference/limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voyage AI - Embedding models&lt;/strong&gt;: First 200M tokens free per account (voyage-4 family) (&lt;a href="https://docs.voyageai.com/docs/pricing" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get the cheat sheet and the data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://freetierkits.pages.dev/free" rel="noopener noreferrer"&gt;Free PDF cheat sheet&lt;/a&gt;: these 20 prices plus the free tiers on two pages. Free; you leave an email address to get it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://freetier-agent-api.pages.dev" rel="noopener noreferrer"&gt;FreeTier Agent API&lt;/a&gt;: your code or agent can look up prices for about 3,000 models (/api/llm-pricing, $0.02 per call) and estimate the cost of a job (/api/llm-cost, $0.01 per call), paid per call in USDC over x402. No signup or API key. A free sample is at /api/llm-pricing/sample. The API uses the open litellm price table (MIT), which can lag behind the official pages.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://toolsforagents.pages.dev" rel="noopener noreferrer"&gt;Tools for Agents&lt;/a&gt;: a free directory of more than 8,500 tools for AI agents, including AI dev tools with free tiers and a page of model prices.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://freetier-kits-shop.fourthwall.com/products/ai-model-pricing-free-tiers" rel="noopener noreferrer"&gt;AI Model Pricing + Free Tiers dataset&lt;/a&gt; ($5, paid): about 3,000 model prices from the litellm table plus 59 free tiers, as CSV and JSON.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to let your AI agent pay per API call with x402 (about 10 lines of code)</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 24 Oct 2026 09:05:02 +0000</pubDate>
      <link>https://dev.to/freetierkits/how-to-let-your-ai-agent-pay-per-api-call-with-x402-about-10-lines-of-code-1j2m</link>
      <guid>https://dev.to/freetierkits/how-to-let-your-ai-agent-pay-per-api-call-with-x402-about-10-lines-of-code-1j2m</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I wrote this with help from AI tools. The FreeTier Agent API, the directory and the PDF are my own projects; the API is paid per call. The code below uses the open-source x402 client packages, which I do not maintain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;More and more APIs answer an unpaid request with &lt;strong&gt;HTTP 402 Payment Required&lt;/strong&gt; and a machine-readable price. That is the &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; protocol. Your agent reads the price, signs a small USDC payment, sends the request again and gets the data. There is no signup, no API key and no monthly plan. This guide shows the client side: how to let your own script or agent pay per call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens on the wire
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The agent calls the endpoint as usual.&lt;/li&gt;
&lt;li&gt;The server answers 402. The PAYMENT-REQUIRED header (x402 v2) says how much, in which token, on which network and to which address.&lt;/li&gt;
&lt;li&gt;The client signs a USDC transfer authorization (EIP-3009) with its wallet key. Nothing is sent onchain by the client itself.&lt;/li&gt;
&lt;li&gt;The client repeats the request with a PAYMENT-SIGNATURE header.&lt;/li&gt;
&lt;li&gt;The server has a facilitator verify and settle the payment, then returns the data and a PAYMENT-RESPONSE receipt header.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The code (Node 20+, TypeScript or plain ES modules)
&lt;/h2&gt;

&lt;p&gt;Install the official client packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @x402/fetch @x402/evm viem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the whole client is about 10 lines:&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="nx"&gt;x402Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wrapFetchWithPayment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/evm/exact/client&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EVM_PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;x402Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:*&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payFetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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;payFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://freetier-agent-api.pages.dev/api/country?q=DK&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran this code (with a freshly generated key instead of an environment variable) on 18 Oct 2026 (@x402/fetch and @x402/evm 2.28.0) against a live endpoint, using a fresh wallet with no funds. The library read the 402, signed a payment and retried, and the facilitator rejected it with "insufficient balance". That is the expected result for an empty wallet, and it shows the client side (reading the price, signing, retrying) works. With USDC on Base in the wallet, the same call returns the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules I would follow before giving an agent a wallet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use a separate hot wallet with a small balance, for example a few dollars of USDC on Base. Never use your main wallet key.&lt;/li&gt;
&lt;li&gt;Set a spending limit. The x402 client has spend controls (setSpendControls with maxAmountPerPayment in the official examples), so a buggy loop cannot pay more than you allow per call.&lt;/li&gt;
&lt;li&gt;Log every PAYMENT-RESPONSE header. It is your receipt.&lt;/li&gt;
&lt;li&gt;Prefer endpoints with a free sample, so you can test the response format before you pay.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Endpoints you can try it on
&lt;/h2&gt;

&lt;p&gt;Our own &lt;a href="https://freetier-agent-api.pages.dev" rel="noopener noreferrer"&gt;FreeTier Agent API&lt;/a&gt; has 18 pay-per-call endpoints, from $0.002 to $0.05 per call, plus 6 full dataset downloads ($5 to $9). Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/api/country, /api/holidays, /api/currency: country facts, public holidays and ECB exchange rates, $0.002 per call&lt;/li&gt;
&lt;li&gt;/api/email-verify: email syntax, domain MX record and disposable-domain check without sending mail, $0.005&lt;/li&gt;
&lt;li&gt;/api/llm-pricing: prices for about 3,000 AI models, $0.02; /api/llm-cost: cost estimate for a job, $0.01&lt;/li&gt;
&lt;li&gt;/api/mcp-servers: search 4,259 MCP servers, $0.02&lt;/li&gt;
&lt;li&gt;/api/extract-json: messy text plus a JSON Schema in, clean JSON out, $0.015&lt;/li&gt;
&lt;li&gt;Free samples, no payment: /api/llm-pricing/sample and /api/mcp-servers/sample&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The OpenAPI spec is at &lt;a href="https://freetier-agent-api.pages.dev/openapi.json" rel="noopener noreferrer"&gt;/openapi.json&lt;/a&gt;, and agents can discover the endpoints at /.well-known/x402 and /llms.txt.&lt;/p&gt;

&lt;p&gt;To find other x402 APIs, browse the x402 section of &lt;a href="https://toolsforagents.pages.dev/x402-apis/" rel="noopener noreferrer"&gt;Tools for Agents&lt;/a&gt;, a free directory that lists 2,393 x402 APIs from the public Bazaar index. If you want a cheat sheet of AI model prices and free tiers to go with it, the &lt;a href="https://freetierkits.pages.dev/free" rel="noopener noreferrer"&gt;free PDF&lt;/a&gt; has 20 models on two pages.&lt;/p&gt;

&lt;p&gt;If you want to be on the other side and sell an API this way, I also sell an &lt;a href="https://freetier-kits-shop.fourthwall.com/products/x402-pay-per-call-starter" rel="noopener noreferrer"&gt;x402 pay-per-call starter for Cloudflare&lt;/a&gt; ($19, paid). It is the code behind the API above.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>javascript</category>
      <category>web3</category>
    </item>
    <item>
      <title>Pay-per-call endpoints for AI agents: model prices, MCP servers, holidays, page checks (x402, USDC on Base)</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:05:01 +0000</pubDate>
      <link>https://dev.to/freetierkits/pay-per-call-endpoints-for-ai-agents-model-prices-mcp-servers-holidays-page-checks-x402-usdc-47op</link>
      <guid>https://dev.to/freetierkits/pay-per-call-endpoints-for-ai-agents-model-prices-mcp-servers-holidays-page-checks-x402-usdc-47op</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I built this with help from AI tools, and it is my own paid service. Prices and limits below are what the API charges today.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I run a small pay-per-call API for AI agents: &lt;a href="https://freetier-agent-api.pages.dev" rel="noopener noreferrer"&gt;FreeTier Agent API&lt;/a&gt;. There's no signup and no API key. Your agent calls an endpoint, gets &lt;strong&gt;HTTP 402&lt;/strong&gt; with &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; payment requirements, pays a few cents in USDC on Base, and gets JSON. If the request fails on my side, the payment isn't settled.&lt;/p&gt;

&lt;p&gt;This week I added 19 endpoints. Each one is built on data that may legally be reused, and every response has a &lt;code&gt;sources&lt;/code&gt; field so the agent can see where the answer came from.&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;Price&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;code&gt;/api/llm-pricing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;List prices for ~3,000 models (per 1M input/output/cached tokens, context window, vision/tools flags), plus verified free tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/llm-cost&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Cost of one job across up to 15 models; tokens from counts or estimated from text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/mcp-servers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Search 4,259 MCP servers by keyword, category, language, OS, official flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/page-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Status, title, meta, canonical, plus an "agent-friendliness" score (llms.txt, sitemap, JSON-LD, AI-crawler rules in robots.txt)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/link-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Status and redirects for up to 20 URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/page-markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Page → clean Markdown (respects robots.txt)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;ISO codes, currency, languages, time zones, current local time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/holidays&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Public holidays 2026-2027 by country, or "is this date a holiday?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;ECB daily reference rates (~30 currencies), any pair between them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/base-gas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Current Base gas price and block, from public RPCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/email-verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Syntax, MX/DNS, disposable-domain and role-address flags. No SMTP probing, nothing stored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/extract-json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Messy text + JSON Schema in, typed JSON out (small LLM on Workers AI, heuristic fallback)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/api/x402-services&lt;/code&gt;, &lt;code&gt;/api/agent-tools&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;Search ~8,900 x402 APIs and 4,259 MCP servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/dump/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$5-$9&lt;/td&gt;
&lt;td&gt;Full JSON dumps: MCP directory, model pricing, world reference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free, no payment needed: &lt;code&gt;/api/mcp-servers/sample&lt;/code&gt;, &lt;code&gt;/api/llm-pricing/sample&lt;/code&gt;, &lt;code&gt;/api/x402-services/sample&lt;/code&gt;, &lt;code&gt;/openapi.json&lt;/code&gt;, &lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;/.well-known/x402&lt;/code&gt;. There is also a remote MCP server at &lt;code&gt;/mcp&lt;/code&gt; (listed in the official MCP Registry). Its paid tools return the x402 payment details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the data comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Model prices: &lt;a href="https://github.com/BerriAI/litellm" rel="noopener noreferrer"&gt;BerriAI/litellm&lt;/a&gt; price table (MIT). These are list prices, so check the provider's page before you commit real spend.&lt;/li&gt;
&lt;li&gt;MCP servers: &lt;a href="https://github.com/punkpeye/awesome-mcp-servers" rel="noopener noreferrer"&gt;punkpeye/awesome-mcp-servers&lt;/a&gt; (MIT).&lt;/li&gt;
&lt;li&gt;Countries and time zones: &lt;a href="https://www.geonames.org" rel="noopener noreferrer"&gt;GeoNames&lt;/a&gt; (CC BY 4.0).&lt;/li&gt;
&lt;li&gt;Holidays: &lt;a href="https://github.com/vacanza/holidays" rel="noopener noreferrer"&gt;python-holidays&lt;/a&gt; (MIT). Lunar and decree-based dates can move.&lt;/li&gt;
&lt;li&gt;Currency: the European Central Bank daily reference rates.&lt;/li&gt;
&lt;li&gt;x402 service list: &lt;a href="https://api.nohumans.directory" rel="noopener noreferrer"&gt;nohumans.directory&lt;/a&gt; (CC BY 4.0).&lt;/li&gt;
&lt;li&gt;Disposable email domains: &lt;a href="https://github.com/disposable-email-domains/disposable-email-domains" rel="noopener noreferrer"&gt;disposable-email-domains&lt;/a&gt; (CC0).&lt;/li&gt;
&lt;li&gt;The page tools only fetch public URLs and send an identifying User-Agent. &lt;code&gt;/api/page-markdown&lt;/code&gt; also refuses pages that robots.txt disallows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No personal data anywhere.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"https://freetier-agent-api.pages.dev/api/llm-cost?models=gpt-4o-mini,claude-sonnet-4-5&amp;amp;input_tokens=1000&amp;amp;output_tokens=500&amp;amp;calls=1000"&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 402 + PAYMENT-REQUIRED header; pay with any x402 client (@x402/fetch, x402 for Python)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on Cloudflare Pages' free plan, with the data bundled into the worker. Settlement goes through public facilitators, so there are no keys on my side. The endpoints are listed on x402scan, x402dash, 402index and nohumans.directory.&lt;/p&gt;

&lt;p&gt;What would you want an agent to be able to buy for a cent? Tell me in the comments. I only add data I can cite.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want every kit? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; has 147 kits for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I let AI agents pay my API per call in USDC (x402 on Cloudflare's free plan, zero dependencies)</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:07:09 +0000</pubDate>
      <link>https://dev.to/freetierkits/i-let-ai-agents-pay-my-api-per-call-in-usdc-x402-on-cloudflares-free-plan-zero-dependencies-28d2</link>
      <guid>https://dev.to/freetierkits/i-let-ai-agents-pay-my-api-per-call-in-usdc-x402-on-cloudflares-free-plan-zero-dependencies-28d2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing. I sell a starter kit based on this code (link at the end); everything below works without buying it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;HTTP has had a status code for this since 1997: &lt;strong&gt;402 Payment Required&lt;/strong&gt;. With the x402 protocol it finally does something. An AI agent calls your endpoint, gets a 402 with machine-readable payment terms, signs a USDC authorization and retries. Then it gets the data. There's no signup, no API key and no Stripe account.&lt;/p&gt;

&lt;p&gt;I wanted to know how little it takes, so I shipped a real one: &lt;a href="https://freetier-agent-api.pages.dev" rel="noopener noreferrer"&gt;freetier-agent-api.pages.dev&lt;/a&gt;. It's one &lt;code&gt;_worker.js&lt;/code&gt; on Cloudflare Pages (free plan) with &lt;strong&gt;no npm dependencies&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;GET /api/apis/search?q=weather&lt;/code&gt; with no payment returns &lt;strong&gt;402&lt;/strong&gt;. The response carries a base64 &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header (x402 v2) and a JSON body (x402 v1, for older clients). Both say: pay 5000 atomic units of USDC (= $0.005) on Base to this address.&lt;/li&gt;
&lt;li&gt;The client signs an EIP-3009 &lt;code&gt;transferWithAuthorization&lt;/code&gt; and retries with a &lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;The worker POSTs that payload to a &lt;strong&gt;facilitator&lt;/strong&gt; &lt;code&gt;/verify&lt;/code&gt;, runs the handler, then calls &lt;code&gt;/settle&lt;/code&gt;. The facilitator broadcasts the transfer and pays the gas, and the USDC lands in my wallet.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The part that surprised me: you don't need API keys
&lt;/h2&gt;

&lt;p&gt;Coinbase's facilitator needs CDP keys on mainnet. Several public facilitators don't: PayAI (&lt;code&gt;facilitator.payai.network&lt;/code&gt;) and xpay (&lt;code&gt;facilitator.xpay.sh&lt;/code&gt;) both settle Base mainnet USDC without auth. I use PayAI and fall back to xpay:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FACILITATORS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://facilitator.payai.network&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://facilitator.xpay.sh&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&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="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;FACILITATORS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&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;fetch&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="nx"&gt;f&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="nx"&gt;op&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&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="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;isValid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{}&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;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no facilitator&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Charge only after you succeed
&lt;/h2&gt;

&lt;p&gt;Verify, run, settle, in that order. If the handler fails (bad URL, missing parameter), return 400 and &lt;strong&gt;never call settle&lt;/strong&gt;, so the agent pays nothing. This matters, because agents retry a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing without spending money
&lt;/h2&gt;

&lt;p&gt;I generated a brand-new empty wallet with &lt;code&gt;viem&lt;/code&gt;, signed a correct authorization and sent it to the live API. The facilitator answered &lt;code&gt;invalid_exact_evm_insufficient_balance&lt;/code&gt;. So the signature, EIP-712 domain (&lt;code&gt;USD Coin&lt;/code&gt;, version &lt;code&gt;2&lt;/code&gt;, chain 8453), amount and recipient were all accepted, and the only thing missing was money. That's a nice zero-cost end-to-end check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting found by agents
&lt;/h2&gt;

&lt;p&gt;A paid API nobody can find earns nothing. What worked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bazaar metadata&lt;/strong&gt; in the 402 (&lt;code&gt;extensions.bazaar&lt;/code&gt; with input/output JSON schemas)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/openapi.json&lt;/code&gt; with &lt;code&gt;x-payment-info&lt;/code&gt; on each paid operation, plus &lt;code&gt;/.well-known/x402&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402dash&lt;/strong&gt;: one &lt;code&gt;POST https://api.x402dash.com/v1/register {"url": ...}&lt;/code&gt; per endpoint. It probes the 402 live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402scan&lt;/strong&gt;: registration needs a Sign-In-With-X signature from any wallet, which &lt;code&gt;@x402/extensions&lt;/code&gt; handles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the API sells
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/api/apis/search&lt;/code&gt; ($0.001): 2,230 link-checked public and free-tier APIs, with filters like &lt;code&gt;auth=none&amp;amp;alive=yes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/free-tiers&lt;/code&gt; ($0.001): current free-tier limits for dev services and LLM APIs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/robots-check&lt;/code&gt; ($0.001): may user-agent X crawl this URL?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/page-meta&lt;/code&gt; ($0.001): title/OG/headings of a public page (respects robots.txt)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Free: &lt;code&gt;/api/apis/sample&lt;/code&gt;, &lt;code&gt;/openapi.json&lt;/code&gt;, &lt;code&gt;/health&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;x402 runs fine on a free edge runtime. You don't need a server, a database or any keys.&lt;/li&gt;
&lt;li&gt;Return both v1 and v2 challenge formats for now; clients in the wild use both.&lt;/li&gt;
&lt;li&gt;Discovery is the real work. List everywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the cleaned-up code with tests and the listing steps, it's in the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/x402-pay-per-call-starter" rel="noopener noreferrer"&gt;x402 Pay-Per-Call Starter&lt;/a&gt;. Or just read the 402 response from the live API and build your own.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>cloudflare</category>
      <category>api</category>
    </item>
    <item>
      <title>847 free APIs that need no API key (all link-checked in October 2026)</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:02:49 +0000</pubDate>
      <link>https://dev.to/freetierkits/847-free-apis-that-need-no-api-key-all-link-checked-in-october-2026-o60</link>
      <guid>https://dev.to/freetierkits/847-free-apis-that-need-no-api-key-all-link-checked-in-october-2026-o60</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing. The full dataset is a paid download (link at the end); the list below is free.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most "free API" lists are years old, and half the links are dead. I took the open-source &lt;a href="https://github.com/public-apis/public-apis" rel="noopener noreferrer"&gt;public-apis&lt;/a&gt; list (MIT), added developer and AI free tiers, and checked every documentation URL on &lt;strong&gt;17 October 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Out of &lt;strong&gt;2,230&lt;/strong&gt; APIs, &lt;strong&gt;1,944&lt;/strong&gt; answered. &lt;strong&gt;847&lt;/strong&gt; are live, served over HTTPS, and need &lt;strong&gt;no API key at all&lt;/strong&gt;, which makes them perfect for prototypes, hackathons, bots and AI agents.&lt;/p&gt;

&lt;p&gt;Here are 25 well-known ones from that no-key list:&lt;/p&gt;

&lt;h2&gt;
  
  
  Weather, earth &amp;amp; science
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open-meteo.com/" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;: weather forecasts, free for non-commercial use&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://earthquake.usgs.gov/fdsnws/event/1/" rel="noopener noreferrer"&gt;USGS Earthquake Hazards&lt;/a&gt;: real-time earthquake data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sunrise-sunset.org/api" rel="noopener noreferrer"&gt;Sunrise and Sunset&lt;/a&gt;: times for any latitude/longitude&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://carbon-intensity.github.io/api-definitions/" rel="noopener noreferrer"&gt;UK Carbon Intensity&lt;/a&gt;: Great Britain grid carbon intensity&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gbif.org/developer/summary" rel="noopener noreferrer"&gt;GBIF&lt;/a&gt;: global biodiversity records&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://api.inaturalist.org/v1/docs/" rel="noopener noreferrer"&gt;iNaturalist&lt;/a&gt;: citizen-science wildlife observations&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://info.arxiv.org/help/api/user-manual.html" rel="noopener noreferrer"&gt;arXiv&lt;/a&gt;: research paper metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Places &amp;amp; calendars
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://restcountries.com" rel="noopener noreferrer"&gt;REST Countries&lt;/a&gt;: country facts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nominatim.org/release-docs/latest/api/Overview/" rel="noopener noreferrer"&gt;Nominatim&lt;/a&gt;: forward/reverse geocoding (read the usage policy)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://postcodes.io" rel="noopener noreferrer"&gt;Postcodes.io&lt;/a&gt;: UK postcode lookup&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://date.nager.at" rel="noopener noreferrer"&gt;Nager.Date&lt;/a&gt;: public holidays for 90+ countries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Money &amp;amp; data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.frankfurter.app/docs" rel="noopener noreferrer"&gt;Frankfurter&lt;/a&gt;: exchange rates and time series&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datahelpdesk.worldbank.org/knowledgebase/topics/125589" rel="noopener noreferrer"&gt;World Bank&lt;/a&gt;: world development indicators&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://world.openfoodfacts.org/data" rel="noopener noreferrer"&gt;Open Food Facts&lt;/a&gt;: food products database&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Hipo/university-domains-list" rel="noopener noreferrer"&gt;Universities List&lt;/a&gt;: university names and domains&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Words, books &amp;amp; culture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dictionaryapi.dev/" rel="noopener noreferrer"&gt;Free Dictionary&lt;/a&gt;: definitions, phonetics, synonyms&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datamuse.com/api/" rel="noopener noreferrer"&gt;Datamuse&lt;/a&gt;: word-finding engine (rhymes, "means like")&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openlibrary.org/developers/api" rel="noopener noreferrer"&gt;Open Library&lt;/a&gt;: books and covers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CrossRef/rest-api-doc" rel="noopener noreferrer"&gt;Crossref&lt;/a&gt;: article and book metadata&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://api.artic.edu/docs/" rel="noopener noreferrer"&gt;Art Institute of Chicago&lt;/a&gt;: artworks and images&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mediawiki.org/wiki/API:Main_page" rel="noopener noreferrer"&gt;Wikipedia / MediaWiki&lt;/a&gt;: the encyclopedia&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fun &amp;amp; dev testing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pokeapi.co" rel="noopener noreferrer"&gt;PokéAPI&lt;/a&gt;: Pokémon data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opentdb.com/api_config.php" rel="noopener noreferrer"&gt;Open Trivia DB&lt;/a&gt;: trivia questions&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://spaceflightnewsapi.net" rel="noopener noreferrer"&gt;Spaceflight News&lt;/a&gt;: spaceflight news&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jsonplaceholder.typicode.com" rel="noopener noreferrer"&gt;JSONPlaceholder&lt;/a&gt;: fake REST API for testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"No key" doesn't mean "no rules". Read each provider's terms, set a real User-Agent and cache responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I checked them
&lt;/h2&gt;

&lt;p&gt;One GET per URL, a 12-second timeout and an identifying User-Agent, with a second, slower pass for the failures. A 2xx/3xx counts as alive, and so does a 401/403/429, because those mean the server is up but blocks anonymous bots. It's a docs-page check, not an uptime guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the full list
&lt;/h2&gt;

&lt;p&gt;The complete dataset has all 2,230 rows as CSV, JSON and SQLite. That includes the 847-row no-key file, 59 dev and AI free tiers with limits (Groq, Gemini, Mistral, Cloudflare Workers AI, Supabase, Neon and more), and the build script. It's the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/verified-api-directory-2026" rel="noopener noreferrer"&gt;Verified API Directory 2026&lt;/a&gt; for $12.&lt;/p&gt;

&lt;p&gt;AI agents can query it per call instead, over x402 with USDC on Base, at &lt;a href="https://freetier-agent-api.pages.dev" rel="noopener noreferrer"&gt;freetier-agent-api.pages.dev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why You Should Keep a Decision Log (and a Simple Format to Start With)</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:07:15 +0000</pubDate>
      <link>https://dev.to/freetierkits/why-you-should-keep-a-decision-log-and-a-simple-format-to-start-with-467m</link>
      <guid>https://dev.to/freetierkits/why-you-should-keep-a-decision-log-and-a-simple-format-to-start-with-467m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Six months after an important decision, most teams can tell you &lt;em&gt;what&lt;/em&gt; they decided but not &lt;em&gt;why&lt;/em&gt;. The context — the options considered, the constraints at the time, the assumptions — disappears. A decision log is a lightweight way to keep it. It's useful for teams and solo founders alike, and it takes a couple of minutes per decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a decision log gives you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory.&lt;/strong&gt; New team members can understand why things are the way they are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fewer repeated debates.&lt;/strong&gt; When someone asks "why don't we just…?", you can point to the entry, and reopen it only if something has changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better judgement over time.&lt;/strong&gt; Reviewing past decisions against outcomes shows where your reasoning tends to be good or weak. A good decision can still have a bad outcome due to luck; the log helps you tell the difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accountability without blame.&lt;/strong&gt; It's clear who decided and on what basis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Software teams have long done a version of this with Architecture Decision Records (ADRs). The same idea works for product, marketing, hiring and finance decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What deserves an entry
&lt;/h2&gt;

&lt;p&gt;Log decisions that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard to reverse&lt;/strong&gt; (pricing changes, contracts, hiring, technology choices)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expensive&lt;/strong&gt; in money or time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Likely to be questioned later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Made under uncertainty&lt;/strong&gt;, where you want to check your assumptions afterwards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't log everything. If an entry would take longer than the decision itself, skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple format
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;D-014&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-10-14&lt;/span&gt;
&lt;span class="na"&gt;Decision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Move from monthly to annual-only pricing for the Pro plan&lt;/span&gt;
&lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Accepted   (Proposed / Accepted / Superseded by D-0xx / Reversed)&lt;/span&gt;
&lt;span class="na"&gt;Decider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maria (with input from Jon, Priya)&lt;/span&gt;

&lt;span class="na"&gt;Context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Churn on monthly Pro is high; support load from billing issues is growing.&lt;/span&gt;

&lt;span class="na"&gt;Options considered&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;1. Keep monthly + annual&lt;/span&gt;
  &lt;span class="s"&gt;2. Annual only, with a discount&lt;/span&gt;
  &lt;span class="s"&gt;3. Monthly only, with a price increase&lt;/span&gt;

&lt;span class="na"&gt;Reasoning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Option 2 reduces billing churn and support load; risk is lower conversion.&lt;/span&gt;

&lt;span class="na"&gt;Assumptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Conversion drops by no more than 20%&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Support tickets about billing fall noticeably&lt;/span&gt;

&lt;span class="na"&gt;Review date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2027-01-15&lt;/span&gt;
&lt;span class="na"&gt;Outcome (filled in at review)&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;assumptions&lt;/strong&gt; and &lt;strong&gt;review date&lt;/strong&gt; are what make the log more than a diary. They turn each decision into a small, checkable prediction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to keep it
&lt;/h2&gt;

&lt;p&gt;Anywhere searchable and shared:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A spreadsheet&lt;/strong&gt; with one row per decision&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Notion or similar database&lt;/strong&gt; with properties for status, decider, area and review date, plus a page body for the full reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown files in a repository&lt;/strong&gt; for technical teams (the ADR approach)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool matters less than having one agreed location. Link to the entry from wherever the decision was discussed (meeting notes, tickets, chat).&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the habit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make it part of the decision meeting.&lt;/strong&gt; The last item: "Who's writing the log entry?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep entries short.&lt;/strong&gt; Ten lines is plenty for most decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write it when you decide&lt;/strong&gt;, not weeks later; context fades quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a template&lt;/strong&gt; so nobody starts from blank.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reviewing decisions
&lt;/h2&gt;

&lt;p&gt;Set a recurring reminder — monthly or quarterly — to look at entries whose review date has passed. For each:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What actually happened?&lt;/li&gt;
&lt;li&gt;Were the assumptions right?&lt;/li&gt;
&lt;li&gt;Was the reasoning sound given what we knew then?&lt;/li&gt;
&lt;li&gt;Would we decide the same way again?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Record the outcome in the entry. If the decision changes, don't edit the original: create a new entry and mark the old one as superseded. That preserves the history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Logging only the decision, not the options and reasoning&lt;/li&gt;
&lt;li&gt;No review date, so nothing is ever checked&lt;/li&gt;
&lt;li&gt;Editing old entries instead of superseding them&lt;/li&gt;
&lt;li&gt;Storing the log somewhere nobody looks&lt;/li&gt;
&lt;li&gt;Logging trivial decisions until the habit becomes a chore&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Record important, hard-to-reverse decisions in a short, consistent format that includes context, options, reasoning, assumptions and a review date. Keep it in one searchable place, write entries at decision time, and review them against outcomes. A few minutes per decision builds a memory your team can actually use.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you'd rather start from a ready-made structure, I put together a small, inexpensive, AI-assisted kit on this topic: &lt;a href="https://freetierkits.pages.dev/p/84.html" rel="noopener noreferrer"&gt;Decision log systems&lt;/a&gt;. There's a *&lt;/em&gt;&lt;a href="https://freetierkits.pages.dev/samples/84.html" rel="noopener noreferrer"&gt;free sample&lt;/a&gt;** (the intro plus one complete template), so you can check whether it's useful before paying anything. Everything above works without it. Other kits: &lt;a href="https://freetierkits.pages.dev/all.html" rel="noopener noreferrer"&gt;all products&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want the related kits together? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/productivity-focus-bundle-10-practical-kits" rel="noopener noreferrer"&gt;Productivity &amp;amp; Focus Bundle&lt;/a&gt; has this kit plus 9 others for $15, or get all 147 kits in the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>leadership</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Meeting Agendas That End on Time: A Practical Template and Rules</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:06:25 +0000</pubDate>
      <link>https://dev.to/freetierkits/meeting-agendas-that-end-on-time-a-practical-template-and-rules-6e8</link>
      <guid>https://dev.to/freetierkits/meeting-agendas-that-end-on-time-a-practical-template-and-rules-6e8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most bad meetings share a cause: nobody decided in advance what the meeting was for. A good agenda fixes that. It forces the organiser to state the purpose, lets people prepare, and gives everyone permission to stop when the work is done. Here's a template and a set of rules you can start using this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  First question: does this need a meeting?
&lt;/h2&gt;

&lt;p&gt;Before writing an agenda, check whether the goal could be reached another way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sharing information only?&lt;/strong&gt; A written update or short recorded video is often enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collecting input?&lt;/strong&gt; A shared document with comments may work better and include quieter people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making a decision, solving a problem or resolving a disagreement?&lt;/strong&gt; These usually benefit from a live conversation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it's the third kind, write an agenda.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agenda template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Meeting: [Name]
Date / time / length: [e.g. Tue 10:00, 30 min]
Purpose: [One sentence: what will be different after this meeting?]
Desired outcome: [Decision made / plan agreed / list of options]
Attendees: [Name – role in this meeting]
Pre-read: [Links, and what to read before]

Agenda
1. [Topic] – [Owner] – [Minutes] – [Type: inform / discuss / decide]
2. ...
3. Recap: decisions, action items, owners, deadlines – 5 min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;type&lt;/strong&gt; label for each item is the most useful part. "Decide" items need a proposal and a decision-maker; "discuss" items need a time box; "inform" items might belong in the pre-read instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules for writing the agenda
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the purpose as an outcome.&lt;/strong&gt; "Agree the Q1 launch date" is better than "Q1 launch".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put decisions first.&lt;/strong&gt; Energy and attention are highest at the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-box every item&lt;/strong&gt;, and make the sum shorter than the meeting so there's buffer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assign an owner per item&lt;/strong&gt; — the person who presents and drives it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phrase items as questions&lt;/strong&gt;: "Should we move the launch to March?" focuses discussion better than a topic name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send it at least a day in advance&lt;/strong&gt; for recurring meetings, earlier for important ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invite only people with a role.&lt;/strong&gt; Others can read the notes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Running the meeting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start on time&lt;/strong&gt;, even if someone is late. Waiting rewards lateness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restate the purpose&lt;/strong&gt; in the first minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a timekeeper&lt;/strong&gt; — someone other than the facilitator if possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Park off-topic items&lt;/strong&gt; in a visible "parking lot" list instead of debating them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close each "decide" item explicitly&lt;/strong&gt;: "So we're deciding X. Any objections?" Then write it down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The last five minutes matter most
&lt;/h2&gt;

&lt;p&gt;Reserve time for a recap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decisions made&lt;/strong&gt; (and who made them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action items&lt;/strong&gt;, each with one owner and a deadline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open questions&lt;/strong&gt; and where they'll be handled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An action item without an owner usually doesn't happen. "We'll look into it" isn't an action item; "Sam drafts the pricing options by Friday" is.&lt;/p&gt;

&lt;h2&gt;
  
  
  After the meeting
&lt;/h2&gt;

&lt;p&gt;Send short notes within a few hours, in the same place each time (the meeting invite, a shared document or the team channel). Notes should fit on one screen: decisions, actions, owners, deadlines, and links. Long transcripts are rarely read; if you record meetings or use automatic transcription, still write the short summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recurring meetings
&lt;/h2&gt;

&lt;p&gt;Recurring meetings drift. Every couple of months, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this meeting still needed?&lt;/li&gt;
&lt;li&gt;Could it be shorter or less frequent?&lt;/li&gt;
&lt;li&gt;Are the right people attending?&lt;/li&gt;
&lt;li&gt;Are we using the agenda, or just talking?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defaulting to 25 or 50 minutes instead of 30 or 60 gives people a break between back-to-back meetings; many calendar tools have a setting for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a 30-minute decision meeting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Purpose: Decide whether to switch our support tool before January.
1. Recap of the two options (pre-read) – Ana – 5 min – inform
2. Questions and concerns – all – 10 min – discuss
3. Decision: switch now, switch later, or stay – Lee (decides) – 10 min – decide
4. Recap: actions and owners – 5 min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No stated purpose&lt;/li&gt;
&lt;li&gt;Agendas that are just topic names&lt;/li&gt;
&lt;li&gt;Too many items for the time available&lt;/li&gt;
&lt;li&gt;No decision-maker named for "decide" items&lt;/li&gt;
&lt;li&gt;No written follow-up&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Check whether you need a meeting, write the purpose as an outcome, label every item inform/discuss/decide, time-box and assign owners, close decisions explicitly, keep five minutes for a recap and send short notes the same day. The agenda is what lets a meeting end early.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you'd rather start from a ready-made structure, I put together a small, inexpensive, AI-assisted kit on this topic: &lt;a href="https://freetierkits.pages.dev/p/83.html" rel="noopener noreferrer"&gt;Meeting agenda templates&lt;/a&gt;. There's a *&lt;/em&gt;&lt;a href="https://freetierkits.pages.dev/samples/83.html" rel="noopener noreferrer"&gt;free sample&lt;/a&gt;** (the intro plus one complete template), so you can check whether it's useful before paying anything. Everything above works without it. Other kits: &lt;a href="https://freetierkits.pages.dev/all.html" rel="noopener noreferrer"&gt;all products&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want the related kits together? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/productivity-focus-bundle-10-practical-kits" rel="noopener noreferrer"&gt;Productivity &amp;amp; Focus Bundle&lt;/a&gt; has this kit plus 9 others for $15, or get all 147 kits in the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>remote</category>
      <category>teamwork</category>
    </item>
    <item>
      <title>How to Schedule Deep Work When Your Calendar Is Already Full</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 12:03:28 +0000</pubDate>
      <link>https://dev.to/freetierkits/how-to-schedule-deep-work-when-your-calendar-is-already-full-4pc8</link>
      <guid>https://dev.to/freetierkits/how-to-schedule-deep-work-when-your-calendar-is-already-full-4pc8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Deep work" — a term popularised by Cal Newport — means focused, uninterrupted effort on cognitively demanding tasks: writing, designing, analysing, coding, strategic thinking. Most people agree it matters. The trouble is that calendars fill up with meetings and messages, and deep work gets whatever scraps are left. Here's a practical way to protect time for it, even in a busy week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Know what your deep work actually is
&lt;/h2&gt;

&lt;p&gt;List the three to five tasks in your role that create the most value and need sustained concentration. Be concrete: "write the quarterly report", "design the onboarding flow", "draft chapter 4". If you can't name them, focus sessions turn into inbox time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Find your best hours
&lt;/h2&gt;

&lt;p&gt;Most people have a few hours a day when concentration comes more easily. For many it's the morning, but not for everyone. For one week, note when focused work felt easiest and when it felt like pushing through mud. Use those hours for deep work and move meetings and admin elsewhere where you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Block time like a meeting
&lt;/h2&gt;

&lt;p&gt;Put deep work in your calendar as real events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Length:&lt;/strong&gt; 60–120 minutes is a practical range for most people; start with 60 if you're not used to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; even three blocks a week is a meaningful change if you currently have none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; use the actual task ("Draft report section 2"), not "Focus".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility:&lt;/strong&gt; mark yourself busy. If your team uses shared calendars, explain what the blocks are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some people prefer a fixed daily rhythm (e.g. 8:30–10:30 every day); others plan blocks weekly around meetings. Both work. The fixed rhythm requires fewer decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Protect the block
&lt;/h2&gt;

&lt;p&gt;Interruptions are the main enemy. Before each session:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Close email and chat, or set status to "Do not disturb".&lt;/li&gt;
&lt;li&gt;Silence phone notifications or put the phone in another room.&lt;/li&gt;
&lt;li&gt;Open only the files and tabs needed for the task.&lt;/li&gt;
&lt;li&gt;Write a one-line goal for the session: "Finish outline and first 500 words."&lt;/li&gt;
&lt;li&gt;Keep a notepad for stray thoughts ("reply to Tom") so you can capture and return.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your role requires being reachable, agree a backup channel for real emergencies, so you don't need to check everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Shape the rest of your day
&lt;/h2&gt;

&lt;p&gt;Deep work is easier when shallow work has a place too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch messages&lt;/strong&gt;: check email and chat at set times (e.g. late morning and mid-afternoon).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster meetings&lt;/strong&gt; on certain days or half-days, leaving other days lighter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shut down deliberately&lt;/strong&gt;: end the day by noting where you stopped and the first step for tomorrow. Starting is the hardest part of a deep work session; a clear first step helps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 6: Track and adjust
&lt;/h2&gt;

&lt;p&gt;Keep a simple count of deep work hours per week. A spreadsheet or a tally on paper works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Week | Planned blocks | Completed | Hours | Main output
41   |       5        |     3     |  4.5  | report draft
42   |       5        |     4     |  6.0  | report final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each week, ask what broke the blocks that didn't happen — a recurring meeting, messages, low energy — and fix one thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  When your job is mostly reactive
&lt;/h2&gt;

&lt;p&gt;Some roles (support, operations, management) are reactive by design. Deep work still helps, but in smaller doses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Negotiate one or two protected blocks per week with your manager or team.&lt;/li&gt;
&lt;li&gt;Use shorter sessions (45 minutes) more often.&lt;/li&gt;
&lt;li&gt;Trade coverage with a colleague so each of you gets focus time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling blocks without a defined task&lt;/li&gt;
&lt;li&gt;Choosing hours when your energy is lowest&lt;/li&gt;
&lt;li&gt;Letting "just one quick message" break the session&lt;/li&gt;
&lt;li&gt;Planning five hours a day immediately and burning out&lt;/li&gt;
&lt;li&gt;Never reviewing what stops blocks from happening&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Name your high-value tasks, find your best hours, block them in the calendar with specific goals, remove interruptions during the session, batch shallow work around it and track hours weekly. Start with a few protected blocks and grow from there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you'd rather start from a ready-made structure, I put together a small, inexpensive, AI-assisted kit on this topic: &lt;a href="https://freetierkits.pages.dev/p/82.html" rel="noopener noreferrer"&gt;Deep work protocols&lt;/a&gt;. There's a *&lt;/em&gt;&lt;a href="https://freetierkits.pages.dev/samples/82.html" rel="noopener noreferrer"&gt;free sample&lt;/a&gt;** (the intro plus one complete template), so you can check whether it's useful before paying anything. Everything above works without it. Other kits: &lt;a href="https://freetierkits.pages.dev/all.html" rel="noopener noreferrer"&gt;all products&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want the related kits together? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/productivity-focus-bundle-10-practical-kits" rel="noopener noreferrer"&gt;Productivity &amp;amp; Focus Bundle&lt;/a&gt; has this kit plus 9 others for $15, or get all 147 kits in the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>focus</category>
      <category>remote</category>
      <category>career</category>
    </item>
    <item>
      <title>Sales Scripts That Don't Sound Scripted: A Framework for Discovery Calls</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 12:02:52 +0000</pubDate>
      <link>https://dev.to/freetierkits/sales-scripts-that-dont-sound-scripted-a-framework-for-discovery-calls-2kpc</link>
      <guid>https://dev.to/freetierkits/sales-scripts-that-dont-sound-scripted-a-framework-for-discovery-calls-2kpc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Script" has a bad reputation, because most people picture someone reading a wall of text at a stranger. A good sales script is closer to a pilot's checklist: a structure that makes sure you cover what matters, while leaving room for an actual conversation. This is a framework for discovery calls — the first real conversation with a potential customer — that works for freelancers, agencies and small B2B teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal of a discovery call
&lt;/h2&gt;

&lt;p&gt;You are not trying to close on the first call. You're trying to find out three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is there a real problem&lt;/strong&gt; that matters enough to spend money on?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can you solve it&lt;/strong&gt; better than the alternatives (including doing nothing)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there a path to a decision&lt;/strong&gt; — budget, timing, the right people?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any answer is no, the best outcome is a polite, quick exit. That saves both sides time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five-part structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Opening (1–2 minutes)
&lt;/h3&gt;

&lt;p&gt;Set the agenda and get permission:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Thanks for making time. I'd suggest we spend most of this call on what you're trying to achieve, then I'll share how I usually help, and at the end we can decide together whether a next step makes sense. Does that work?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This lowers pressure, and it makes ending without a sale feel normal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Situation (5 minutes)
&lt;/h3&gt;

&lt;p&gt;Understand the context with open questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Can you walk me through how you handle this today?"&lt;/li&gt;
&lt;li&gt;"Who's involved in that process?"&lt;/li&gt;
&lt;li&gt;"What tools are you using?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep these brief. Too many situation questions feel like an interrogation.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Problem and impact (10 minutes)
&lt;/h3&gt;

&lt;p&gt;This is the core. Dig into what's not working and why it matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What's the most frustrating part of that?"&lt;/li&gt;
&lt;li&gt;"How often does that happen?"&lt;/li&gt;
&lt;li&gt;"What does it cost you — in time, money or missed opportunities?"&lt;/li&gt;
&lt;li&gt;"What have you tried already?"&lt;/li&gt;
&lt;li&gt;"What happens if nothing changes in the next six months?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;strong&gt;summarise back&lt;/strong&gt; in their words: "So if I've got it right, the main issue is X, it happens about Y, and it's costing roughly Z. Is that fair?" Summarising is the single most underused technique in sales.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit (5 minutes)
&lt;/h3&gt;

&lt;p&gt;Only now describe your solution, and only the parts that address what you just heard. Short examples beat feature lists: "A client with a similar setup reduced that from two days to half a day by…" Avoid claims you can't back up.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Next step (2–3 minutes)
&lt;/h3&gt;

&lt;p&gt;Be explicit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Based on what you've said, I think a proposal for A and B makes sense. Would it be useful if I sent that by Thursday, and we booked 20 minutes on Monday to go through it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Get a date in the calendar before you hang up. "I'll think about it" with no date usually means the deal fades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling common objections
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"It's too expensive."&lt;/strong&gt; Ask: "Compared to what?" Then revisit the cost of the problem they described. Sometimes the honest answer is a smaller scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"We need to think about it."&lt;/strong&gt; Ask: "Of course — what specifically would you want to think through?" This often surfaces the real concern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Send me some information."&lt;/strong&gt; Ask what they'd look for in it, so you send something relevant, and agree on when to talk again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"We're working with someone else."&lt;/strong&gt; Ask what's working well with them. If it's going well, respect that and leave the door open.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making it sound natural
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Write prompts, not paragraphs. Bullet points you glance at, not lines you read.&lt;/li&gt;
&lt;li&gt;Practise out loud a few times until the questions feel like yours.&lt;/li&gt;
&lt;li&gt;Listen more than you talk; a common rule of thumb is that the prospect should speak most of the time.&lt;/li&gt;
&lt;li&gt;Take notes in the prospect's words; you'll reuse them in the proposal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Open with an agenda, keep situation questions short, spend most of the call on problems and their impact, summarise back, present only the relevant parts of your offer, and leave with a concrete next step in the calendar. Structure is what lets you sound relaxed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you'd rather start from a ready-made structure, I put together a small, inexpensive, AI-assisted kit on this topic: &lt;a href="https://freetierkits.pages.dev/p/24.html" rel="noopener noreferrer"&gt;Sales script packs&lt;/a&gt;. There's a *&lt;/em&gt;&lt;a href="https://freetierkits.pages.dev/samples/24.html" rel="noopener noreferrer"&gt;free sample&lt;/a&gt;** (the intro plus one complete template), so you can check whether it's useful before paying anything. Everything above works without it. Other kits: &lt;a href="https://freetierkits.pages.dev/all.html" rel="noopener noreferrer"&gt;all products&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want the related kits together? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/freelancer-business-bundle-8-practical-kits" rel="noopener noreferrer"&gt;Freelancer Business Bundle&lt;/a&gt; has this kit plus 7 others for $15, or get all 147 kits in the &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sales</category>
      <category>business</category>
      <category>startup</category>
      <category>communication</category>
    </item>
    <item>
      <title>Which Workflows Should You Automate First? A Blueprint for Small Teams</title>
      <dc:creator>FreeTier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:17:14 +0000</pubDate>
      <link>https://dev.to/freetierkits/which-workflows-should-you-automate-first-a-blueprint-for-small-teams-15e3</link>
      <guid>https://dev.to/freetierkits/which-workflows-should-you-automate-first-a-blueprint-for-small-teams-15e3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclosure: this post was written with AI assistance and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Automation tools like Zapier, Make, n8n and Power Automate make it easy to connect apps. The hard part isn't building a workflow — it's choosing the right ones, and building them so they don't silently break. Here's a blueprint for picking, designing and maintaining automations in a small business or team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Inventory your repetitive work
&lt;/h2&gt;

&lt;p&gt;For one or two weeks, keep a simple log of tasks that feel repetitive. For each, note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What triggers it (a form, an email, a payment, a date)&lt;/li&gt;
&lt;li&gt;What you do (copy data, send a message, create a file)&lt;/li&gt;
&lt;li&gt;How often it happens&lt;/li&gt;
&lt;li&gt;How long it takes&lt;/li&gt;
&lt;li&gt;What goes wrong when it's done badly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll usually end up with 10–30 candidates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Score and choose
&lt;/h2&gt;

&lt;p&gt;Score each candidate from 1–5 on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequency × time&lt;/strong&gt; — how many minutes per month it costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error cost&lt;/strong&gt; — what a mistake costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stability&lt;/strong&gt; — does the process stay the same, or change every month?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt; — how many apps and decisions are involved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automate first what is frequent, stable and simple. Leave processes that change often, or that need judgement, for later — or keep them manual. Automating a messy process just makes the mess faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Map before you build
&lt;/h2&gt;

&lt;p&gt;Draw the workflow as a sequence before touching any tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger: New paid order in shop
  → Step 1: Add customer to spreadsheet (Orders tab)
  → Step 2: Send welcome email with download link
  → Step 3: If order &amp;gt; $100 → notify owner in chat
  → Step 4: Create follow-up task in 7 days
Failure: if step 2 fails → email owner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mapping reveals missing data (do you actually have the customer's name?), decision points and the things that can fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Build with reliability in mind
&lt;/h2&gt;

&lt;p&gt;A few habits prevent most automation headaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use stable identifiers.&lt;/strong&gt; Match records by an ID or email, not by name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add error notifications.&lt;/strong&gt; Most platforms can alert you when a run fails; turn it on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid loops.&lt;/strong&gt; A workflow that updates a record that triggers the same workflow can run forever and use up your plan's task quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with real but harmless data.&lt;/strong&gt; Use your own email or a test record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep secrets in the tool's credential store&lt;/strong&gt;, not pasted into steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name things clearly.&lt;/strong&gt; "Shop → Sheet → Welcome email (v2)" beats "My Zap 7".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Document every automation
&lt;/h2&gt;

&lt;p&gt;Keep a simple register — a spreadsheet or a database with one row per automation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Apps&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Last checked&lt;/th&gt;
&lt;th&gt;What breaks if it stops&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last column matters most. When something stops working, you need to know immediately what's affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Monitor and review
&lt;/h2&gt;

&lt;p&gt;Automations decay when apps change their fields or APIs, or when a connected account's password changes. Schedule a monthly 15-minute check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review failed runs&lt;/li&gt;
&lt;li&gt;Confirm key automations ran as expected&lt;/li&gt;
&lt;li&gt;Check your plan's usage limits&lt;/li&gt;
&lt;li&gt;Retire workflows nobody needs any more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common first automations
&lt;/h2&gt;

&lt;p&gt;These are often good starting points because they're frequent and simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Form submissions → spreadsheet or CRM + confirmation email&lt;/li&gt;
&lt;li&gt;New invoice paid → thank-you email + update records&lt;/li&gt;
&lt;li&gt;New calendar booking → prep document created from a template&lt;/li&gt;
&lt;li&gt;New file in a folder → notify the team&lt;/li&gt;
&lt;li&gt;Weekly scheduled report compiled from a spreadsheet&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing a tool
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zapier&lt;/strong&gt;: easiest to start, large app library, gets expensive at volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make&lt;/strong&gt;: visual, flexible, generally cheaper per operation, steeper learning curve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt;: open source and self-hostable, good if you're technical and want control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power Automate&lt;/strong&gt;: natural fit if your business runs on Microsoft 365.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pricing and limits change regularly, so check current plans before committing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Log repetitive work, score candidates on frequency, error cost, stability and simplicity, map each workflow before building it, add error alerts, document every automation in a register and review monthly. Fewer, reliable automations beat many fragile ones.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you'd rather start from a ready-made structure, I put together a small, inexpensive, AI-assisted kit on this topic: &lt;a href="https://freetierkits.pages.dev/p/22.html" rel="noopener noreferrer"&gt;Workflow automation blueprints&lt;/a&gt;. There's a *&lt;/em&gt;&lt;a href="https://freetierkits.pages.dev/samples/22.html" rel="noopener noreferrer"&gt;free sample&lt;/a&gt;** (the intro plus one complete template), so you can check whether it's useful before paying anything. Everything above works without it. Other kits: &lt;a href="https://freetierkits.pages.dev/all.html" rel="noopener noreferrer"&gt;all products&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want every kit? The &lt;a href="https://freetier-kits-shop.fourthwall.com/products/all-access-bundle-147-practical-kits" rel="noopener noreferrer"&gt;All-Access Bundle&lt;/a&gt; has 147 kits for $39 (card/PayPal guest checkout).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>nocode</category>
      <category>smallbusiness</category>
    </item>
  </channel>
</rss>
