<?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>Forem: Mock Bolt</title>
    <description>The latest articles on Forem by Mock Bolt (@mockbolt02).</description>
    <link>https://forem.com/mockbolt02</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3870355%2F4e796547-aeed-4baa-9a79-0decf5eb0d20.png</url>
      <title>Forem: Mock Bolt</title>
      <link>https://forem.com/mockbolt02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mockbolt02"/>
    <language>en</language>
    <item>
      <title>Stop using ngrok just to inspect webhooks — 5-second alternative</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Sat, 25 Apr 2026 07:02:28 +0000</pubDate>
      <link>https://forem.com/mockbolt02/stop-using-ngrok-just-to-inspect-webhooks-5-second-alternative-5gjg</link>
      <guid>https://forem.com/mockbolt02/stop-using-ngrok-just-to-inspect-webhooks-5-second-alternative-5gjg</guid>
      <description>&lt;p&gt;Every time I integrate a third-party webhook I do the same annoying dance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start a local server&lt;/li&gt;
&lt;li&gt;Open a terminal, run &lt;code&gt;ngrok http 3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy the URL&lt;/li&gt;
&lt;li&gt;Paste it into the webhook dashboard&lt;/li&gt;
&lt;li&gt;Trigger a test event&lt;/li&gt;
&lt;li&gt;Stare at the ngrok terminal output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's 5 minutes of setup &lt;em&gt;before&lt;/em&gt; I've written a single line of handler code.&lt;br&gt;
And the URL changes every restart.&lt;/p&gt;
&lt;h2&gt;
  
  
  The read-only trap
&lt;/h2&gt;

&lt;p&gt;The next tool most developers reach for is &lt;strong&gt;webhook.site&lt;/strong&gt;. &lt;br&gt;
It's much faster — you get a URL instantly, no install.&lt;/p&gt;

&lt;p&gt;But it has one big limitation: &lt;strong&gt;it's read-only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your webhook source gets a fixed &lt;code&gt;200 OK&lt;/code&gt; with no body. That means you can't test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How your code handles a &lt;code&gt;422&lt;/code&gt; response (retry logic)&lt;/li&gt;
&lt;li&gt;Whether your handler correctly parses a &lt;code&gt;201&lt;/code&gt; with a payload&lt;/li&gt;
&lt;li&gt;What actually gets returned to the calling service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For pure inspection ("what does Stripe actually send?") it's fine.&lt;br&gt;
For anything more, you're stuck.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I use instead
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;MockBolt&lt;/a&gt; is an instant mock API — paste JSON, &lt;br&gt;
get a live public HTTPS endpoint in seconds. Every request is logged in real time.&lt;/p&gt;

&lt;p&gt;For webhook testing it means you get &lt;strong&gt;both sides&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the full incoming request (body, headers, IP, timing)&lt;/li&gt;
&lt;li&gt;Control exactly what goes back to the webhook source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No install. No account. No CLI. No local server.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a Stripe webhook in 60 seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Create the endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;, paste the response Stripe expects back:&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;"received"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set status code to &lt;code&gt;200&lt;/code&gt;. Click &lt;strong&gt;Generate Mock&lt;/strong&gt;. &lt;br&gt;
You get a URL like &lt;code&gt;https://mockbolt.com/b/7f3d2c1a-...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Add it in Stripe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dashboard → Developers → Webhooks → Add endpoint → paste your MockBolt URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Send a test event&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click "Send test webhook" → pick &lt;code&gt;payment_intent.succeeded&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open the MockBolt manage tab. The full Stripe payload appears in the &lt;br&gt;
real-time inspector instantly — headers, body, everything Stripe sends.&lt;/p&gt;

&lt;p&gt;No terminal. No restart. No port forwarding.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a GitHub webhook
&lt;/h2&gt;

&lt;p&gt;Same flow:&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;"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;"ok"&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;Status &lt;code&gt;200&lt;/code&gt;. Generate Mock. Copy URL.&lt;/p&gt;

&lt;p&gt;Repo → Settings → Webhooks → Add webhook → paste URL.&lt;br&gt;
Select &lt;code&gt;application/json&lt;/code&gt;. Choose events (&lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull_request&lt;/code&gt;, etc.)&lt;/p&gt;

&lt;p&gt;GitHub fires a ping immediately when you save. You'll see the full &lt;br&gt;
ping payload arrive in MockBolt within 2 seconds.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a Shopify order webhook
&lt;/h2&gt;

&lt;p&gt;Shopify expects &lt;code&gt;200&lt;/code&gt; with an empty body on success:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the endpoint in your Shopify Partners app settings.&lt;br&gt;
Trigger a test order from the Shopify admin.&lt;br&gt;
See the exact &lt;code&gt;orders/create&lt;/code&gt; payload — line items, customer, totals, everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use each tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Best tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Just need to see what payload a webhook sends&lt;/td&gt;
&lt;td&gt;webhook.site or MockBolt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to control the response (status + body)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MockBolt&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to forward to your local running server&lt;/td&gt;
&lt;td&gt;ngrok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing retry logic end-to-end&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MockBolt&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permanent staging webhook endpoint&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MockBolt&lt;/strong&gt; ($2 one-time, never expires)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging a webhook that fires infrequently&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MockBolt&lt;/strong&gt; (auto-extends if active)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  One more thing: request replay
&lt;/h2&gt;

&lt;p&gt;MockBolt logs every request. There's a replay button (↩) on each row — &lt;br&gt;
re-sends the exact request to your endpoint with one click.&lt;/p&gt;

&lt;p&gt;Useful when you want to test a handler change without triggering &lt;br&gt;
a new real event from Stripe/GitHub/Shopify.&lt;/p&gt;




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

&lt;p&gt;→ &lt;a href="https://mockbolt.com/webhook-testing" rel="noopener noreferrer"&gt;mockbolt.com/webhook-testing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a free endpoint in 5 seconds. No account, no install.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What webhook services are you integrating? Drop a comment and I'll show &lt;br&gt;
the exact payload setup for each one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>testing</category>
      <category>webhooks</category>
    </item>
    <item>
      <title>Stop setting up json-server for every prototype. There's a faster way.</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Mon, 20 Apr 2026 17:37:13 +0000</pubDate>
      <link>https://forem.com/mockbolt02/stop-setting-up-json-server-for-every-prototype-theres-a-faster-way-33bl</link>
      <guid>https://forem.com/mockbolt02/stop-setting-up-json-server-for-every-prototype-theres-a-faster-way-33bl</guid>
      <description>&lt;p&gt;You're building a frontend. The backend isn't ready. You need one endpoint that returns a list of users.&lt;/p&gt;

&lt;p&gt;So you do what you always do:&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; &lt;span class="nt"&gt;-g&lt;/span&gt; json-server
&lt;span class="nb"&gt;mkdir &lt;/span&gt;mock-server &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;mock-server
&lt;span class="nb"&gt;touch &lt;/span&gt;db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you write the JSON, configure the routes, figure out why CORS is blocking your React app, fix it, run the server — and 15 minutes later you finally have a &lt;code&gt;GET /users&lt;/code&gt; endpoint returning fake data.&lt;/p&gt;

&lt;p&gt;For something you'll throw away tomorrow.&lt;/p&gt;

&lt;p&gt;I've done this probably 200 times. Every single time I think: &lt;em&gt;there has to be a faster way.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually tried first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Postman mock servers&lt;/strong&gt; — require an account, a workspace, a collection. Too much setup for a throwaway endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beeceptor&lt;/strong&gt; — requires signup. Gets in the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mockoon&lt;/strong&gt; — great tool, but runs locally. Useless when you want to share the endpoint with a teammate or test from a mobile device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RequestBin&lt;/strong&gt; — receives requests, doesn't respond with data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick Express server&lt;/strong&gt; — still requires Node, a file, and remembering to kill the process later.&lt;/p&gt;

&lt;p&gt;None of these solve the actual problem: I want to paste JSON and get a URL. Right now. From any machine. Without installing anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I spent a weekend building &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;MockBolt&lt;/a&gt;&lt;/strong&gt; — paste JSON, get a live API endpoint instantly.&lt;/p&gt;

&lt;p&gt;No account. No install. No CLI. No local server.&lt;/p&gt;

&lt;p&gt;Here's the full flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Paste your JSON response&lt;/li&gt;
&lt;li&gt;Pick which HTTP methods it should accept&lt;/li&gt;
&lt;li&gt;Optionally set a custom status code, response delay, or custom headers&lt;/li&gt;
&lt;li&gt;Click Generate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get a URL like &lt;code&gt;https://mockbolt.com/b/abc123&lt;/code&gt;. That's your live API. Takes about 10 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using it from a React app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&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="nf"&gt;fetch&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://mockbolt.com/b/abc123&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No proxy config. No CORS headers to set. &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; is open by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things I use it for constantly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Testing error handling
&lt;/h3&gt;

&lt;p&gt;Set the status code to 500 or 503, point your app at it, verify your error boundary actually works.&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="nf"&gt;fetch&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://mockbolt.com/b/your-endpoint&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server error: &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="s2"&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;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;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="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;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;Caught:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend before backend is ready
&lt;/h3&gt;

&lt;p&gt;Share the mock URL with your team. Everyone points at the same endpoint. When the real API is ready — swap one URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demoing to clients
&lt;/h3&gt;

&lt;p&gt;Spin up a mock with realistic data, build the UI on top of it, demo without any backend running. Works from their browser, their phone, anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workshops and tutorials
&lt;/h3&gt;

&lt;p&gt;I've run internal workshops where I needed everyone to hit the same API instantly. Creating a mock took 10 seconds. No one installed anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing Postman collections
&lt;/h3&gt;

&lt;p&gt;Point a collection at a mock endpoint to verify request structure and headers before the real endpoint exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Simulating a slow API
&lt;/h2&gt;

&lt;p&gt;Set response delay to 2000ms and your mock simulates a slow server:&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;// Your loading skeleton should show for 2 seconds&lt;/span&gt;
&lt;span class="c1"&gt;// Your timeout logic should kick in at the right time&lt;/span&gt;
&lt;span class="c1"&gt;// This exercises real fetch lifecycle — not a fake setTimeout&lt;/span&gt;
&lt;span class="nf"&gt;fetch&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://mockbolt.com/b/your-slow-endpoint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Way more realistic than wrapping mock data in &lt;code&gt;setTimeout&lt;/code&gt; inside your component. It exercises actual fetch lifecycle including cancellation and &lt;code&gt;AbortController&lt;/code&gt; behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Competitor comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;MockBolt&lt;/th&gt;
&lt;th&gt;Beeceptor&lt;/th&gt;
&lt;th&gt;Mockoon&lt;/th&gt;
&lt;th&gt;json-server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No signup&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No install&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live in &amp;lt; 10s&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open CORS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response delay&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom headers&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable URL&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI + PostgreSQL, async SQLAlchemy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 18, TypeScript, Tailwind CSS, Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: AWS Lightsail behind Cloudflare&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Lemon Squeezy (HMAC-signed webhooks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The webhook validation was the most interesting part to build — mode-aware HMAC secrets, idempotent payment recording, atomic upgrade transactions. Worth a separate post if anyone's interested.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MockBolt can do today
&lt;/h2&gt;

&lt;p&gt;Since I originally wrote this article, MockBolt has shipped a lot. &lt;br&gt;
Here's what it actually supports now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time request inspector&lt;/strong&gt; — every hit is logged with method, IP, country, query params, request body, and response time. Updates live as requests come in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request replay&lt;/strong&gt; — re-send any logged request with one click (great for testing handler changes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error rate simulation&lt;/strong&gt; — randomly return errors at a configurable %, or trigger errors on a specific header value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP allowlist&lt;/strong&gt; — restrict which IPs can hit your endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic variables&lt;/strong&gt; — &lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;, &lt;code&gt;{{randomInt}}&lt;/code&gt;, &lt;code&gt;{{name}}&lt;/code&gt; replaced at serve time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook testing&lt;/strong&gt; — point any webhook source (Stripe, GitHub, Shopify) at a MockBolt URL and inspect the full payload in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vault&lt;/strong&gt; — anonymous account (no email) that saves all your mocks in one dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity-based TTL&lt;/strong&gt; — free mocks that get 10+ requests in 7 days auto-extend (don't expire)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For permanent endpoints: $2 one-time per mock, never expires.&lt;/p&gt;

&lt;p&gt;Full feature breakdown: &lt;a href="https://mockbolt.com/pricing" rel="noopener noreferrer"&gt;mockbolt.com/pricing&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Try it: &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
No signup. Takes 10 seconds. Let it expire or delete it when you're done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy to answer questions in the comments — especially if you have use cases I haven't thought of.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>I was tired of json-server — so I built a free mock API tool (no signup needed)</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Sat, 11 Apr 2026 06:21:45 +0000</pubDate>
      <link>https://forem.com/mockbolt02/i-was-tired-of-json-server-so-i-built-a-free-mock-api-tool-no-signup-needed-fkn</link>
      <guid>https://forem.com/mockbolt02/i-was-tired-of-json-server-so-i-built-a-free-mock-api-tool-no-signup-needed-fkn</guid>
      <description>&lt;p&gt;Every frontend project I start hits the same wall.&lt;/p&gt;

&lt;p&gt;I have a UI to build. I know what the API responses should look like. But the backend isn't ready yet.&lt;/p&gt;

&lt;p&gt;So I spend 15–20 minutes doing the same setup ritual:&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; &lt;span class="nt"&gt;-g&lt;/span&gt; json-server
&lt;span class="c"&gt;# create db.json&lt;/span&gt;
&lt;span class="c"&gt;# configure routes&lt;/span&gt;
&lt;span class="c"&gt;# run json-server --watch db.json --port 3001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's the &lt;em&gt;fast&lt;/em&gt; version. If I need CORS headers, custom status codes, or simulated delay, it gets longer.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;MockBolt&lt;/strong&gt; to remove that setup time entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MockBolt does
&lt;/h2&gt;

&lt;p&gt;Paste JSON → click Generate → get a live public API URL.&lt;/p&gt;

&lt;p&gt;That's it. No npm install. No terminal tab. No local port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mockbolt.com/b/7f3d2c1a-9b8e-4f5a-b6d0-3e2c1f4a8b7d
&lt;span class="c"&gt;# returns your JSON immediately&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE)&lt;/li&gt;
&lt;li&gt;Returns your JSON with the right status code&lt;/li&gt;
&lt;li&gt;Has open CORS — works from any browser origin&lt;/li&gt;
&lt;li&gt;Accepts custom response headers&lt;/li&gt;
&lt;li&gt;Can simulate latency up to 10 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each mock gives you two URLs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public URL&lt;/strong&gt; — share this with your frontend or teammates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management URL&lt;/strong&gt; — keep this private; edit payload, status code, methods, and delay anytime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No account. No email. No credit card. Free for 24 hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;Say I'm building a frontend that needs a &lt;code&gt;/users&lt;/code&gt; endpoint but the backend isn't ready. In MockBolt:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Paste this JSON:&lt;/strong&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;"users"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"viewer"&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;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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;2.&lt;/strong&gt; Select GET, click &lt;strong&gt;Generate Endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Get a URL like &lt;code&gt;https://mockbolt.com/b/e8bdb0ce-8ed9-44a8-adcc-b0af6a054443&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Hit it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mockbolt.com/b/e8bdb0ce-8ed9-44a8-adcc-b0af6a054443
&lt;span class="c"&gt;# {"users":[{"id":1,"name":"Alice","role":"admin"},{"id":2,"name":"Bob","role":"viewer"}],"total":2}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done in under 30 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing error states and slow responses
&lt;/h2&gt;

&lt;p&gt;MockBolt lets you set any status code from 100 to 599 and add a response delay.&lt;/p&gt;

&lt;p&gt;Want to test how your app handles a &lt;code&gt;503 Service Unavailable&lt;/code&gt;? Set the status code, generate the endpoint, point your error-state tests at it.&lt;/p&gt;

&lt;p&gt;Want to test loading spinners and skeleton screens? Set a 2000ms delay.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;copy-as-code&lt;/strong&gt; panel also generates ready-to-run snippets in curl, fetch, axios, and Python requests — paste directly into your test file.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: FastAPI (Python) + PostgreSQL&lt;/li&gt;
&lt;li&gt;Frontend: React + TypeScript + Vite + Tailwind CSS&lt;/li&gt;
&lt;li&gt;Deployed on AWS Lightsail behind Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few interesting decisions along the way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting behind Cloudflare&lt;/strong&gt; — &lt;code&gt;slowapi&lt;/code&gt; needs to read &lt;code&gt;CF-Connecting-IP&lt;/code&gt; instead of &lt;code&gt;request.client.host&lt;/code&gt; (which returns the Docker bridge IP behind Nginx). Took a couple of iterations to get this right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hit count accuracy&lt;/strong&gt; — early on the counter was off because Cloudflare was caching GET responses. Fixed it with aggressive cache-busting headers: &lt;code&gt;Cache-Control: no-cache, no-store, must-revalidate, max-age=0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anonymous management&lt;/strong&gt; — instead of accounts, each mock gets a UUID secret token as the only credential. Tradeoff: if you lose the management URL you can't recover it. But it removes signup friction entirely and means zero user data to protect.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's shipped since launch
&lt;/h2&gt;

&lt;p&gt;I've shipped a lot since this article. Here's what MockBolt does now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request inspector (the big one)&lt;/strong&gt;&lt;br&gt;
Every request to your mock is logged — method, IP, country flag, query params, &lt;br&gt;
request body, response time. Updates live via streaming as hits come in. &lt;br&gt;
Free tier shows last 25 requests. Premium shows full history with CSV export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request replay&lt;/strong&gt;&lt;br&gt;
↩ button on every log row. Resends the exact request to your endpoint.&lt;br&gt;
Useful when you tweak a handler and want to re-test without triggering a new real event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhook testing&lt;/strong&gt;&lt;br&gt;
MockBolt turns out to be a great webhook testing tool too — point Stripe, GitHub, &lt;br&gt;
or Shopify at your URL, trigger an event, see the full payload instantly.&lt;br&gt;
Unlike webhook.site, you also control what goes back to the caller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error simulation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random error rate: "return 500 on 20% of requests"&lt;/li&gt;
&lt;li&gt;Header-triggered: "if &lt;code&gt;X-Test: true&lt;/code&gt; header → return 422"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;IP allowlist&lt;/strong&gt;&lt;br&gt;
Restrict which IPs can reach your endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic variables&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;, &lt;code&gt;{{randomInt}}&lt;/code&gt;, &lt;code&gt;{{name}}&lt;/code&gt; replaced at serve time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vault (anonymous accounts)&lt;/strong&gt;&lt;br&gt;
Create a vault with one click — no email, no password, just a key saved in your browser.&lt;br&gt;
All mocks link to it automatically. Dashboard shows hit counts, expiry, payment history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activity-based TTL&lt;/strong&gt;&lt;br&gt;
Free mocks that get 10+ requests in 7 days auto-extend — they don't expire while active.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt; — still free, still no signup&lt;/p&gt;




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

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free, requires zero setup, works from any browser or terminal.&lt;/p&gt;

&lt;p&gt;Would love your feedback — especially on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the public URL + secret management URL flow clear on first use?&lt;/li&gt;
&lt;li&gt;What would make this a daily tool for you vs. a one-off utility?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Solo project, built over a few weekends. Happy to answer questions about the stack or any of the design decisions.&lt;/em&gt;&lt;/p&gt;

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