<?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: JohnMith</title>
    <description>The latest articles on Forem by JohnMith (@tuan_nhatnguyen_7e928cbf).</description>
    <link>https://forem.com/tuan_nhatnguyen_7e928cbf</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%2F3824144%2F4205f075-b079-488d-bb7a-7f547cdfd946.webp</url>
      <title>Forem: JohnMith</title>
      <link>https://forem.com/tuan_nhatnguyen_7e928cbf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tuan_nhatnguyen_7e928cbf"/>
    <language>en</language>
    <item>
      <title>I Waited 5 Days for a Backend API. So I Built My Own Mock Server.</title>
      <dc:creator>JohnMith</dc:creator>
      <pubDate>Tue, 14 Apr 2026 14:41:57 +0000</pubDate>
      <link>https://forem.com/tuan_nhatnguyen_7e928cbf/i-waited-5-days-for-a-backend-api-so-i-built-my-own-mock-server-55al</link>
      <guid>https://forem.com/tuan_nhatnguyen_7e928cbf/i-waited-5-days-for-a-backend-api-so-i-built-my-own-mock-server-55al</guid>
      <description>&lt;p&gt;6 months ago, I was working as a frontend developer on an e-commerce project.&lt;/p&gt;

&lt;p&gt;Sprint planning was done. I got assigned to build the product listing page. PM said: "Backend API will be ready this week."&lt;/p&gt;

&lt;p&gt;That week passed. No API.&lt;/p&gt;

&lt;p&gt;"Just 2 more days." -- 2 days turned into a week.&lt;/p&gt;

&lt;p&gt;While waiting, I did what every frontend dev has done at some point:&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;products&lt;/span&gt; &lt;span class="o"&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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;Test Product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&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="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;Test Product 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;199&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;Hardcoded data. Built the UI knowing I'd have to rewrite everything once the real API arrived. But what else could I do? The sprint deadline wasn't going to wait.&lt;/p&gt;

&lt;p&gt;That's when I thought: &lt;em&gt;"What if there was a tool that could create a real API in seconds -- one I could call with fetch(), and when the backend is ready, I just swap the URL?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;SnapMock&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is SnapMock?
&lt;/h2&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project, add an endpoint like &lt;code&gt;GET /products&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Paste your expected response JSON&lt;/li&gt;
&lt;li&gt;Get a live URL, call it with &lt;code&gt;fetch()&lt;/code&gt; like a real API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the real backend is ready -- swap the URL -- &lt;strong&gt;frontend code stays the same&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But static data wasn't enough. Testing UI with the same "Test User" 100 times is useless.&lt;/p&gt;

&lt;p&gt;So I added &lt;strong&gt;Dynamic Data&lt;/strong&gt; -- write &lt;code&gt;{{$fullName}}&lt;/code&gt; in your response, and every API call returns a different name. &lt;code&gt;{{$email}}&lt;/code&gt; returns a different email. &lt;code&gt;{{$avatar}}&lt;/code&gt; returns a different image. Test your UI with diverse, realistic data instead of staring at "John Doe" all day.&lt;/p&gt;

&lt;p&gt;Then I kept going:&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Generator
&lt;/h3&gt;

&lt;p&gt;Type "a list of 10 products with name, price, image, and rating" -- AI generates the full endpoint config. Too lazy to write JSON? Let AI do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditional Rules (Mock Rules)
&lt;/h3&gt;

&lt;p&gt;One endpoint, multiple responses based on conditions. Send a token -- get 200. No token -- get 401. Query &lt;code&gt;?error=true&lt;/code&gt; -- get 500. No need to create 5 separate endpoints.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chaos Mode
&lt;/h3&gt;

&lt;p&gt;Turn it on and your API randomly returns 500, 503, timeouts... See if your frontend actually handles errors gracefully. My QA team's favorite feature .&lt;/p&gt;

&lt;h3&gt;
  
  
  Stateful CRUD
&lt;/h3&gt;

&lt;p&gt;Create a resource called "users" and you automatically get GET, POST, PUT, DELETE. Add a user, delete a user -- data persists. Like having a mini backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import from Anywhere
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paste a &lt;strong&gt;Swagger/OpenAPI&lt;/strong&gt; spec -- auto-generate all endpoints&lt;/li&gt;
&lt;li&gt;Import a &lt;strong&gt;Postman Collection&lt;/strong&gt; -- instant mock API&lt;/li&gt;
&lt;li&gt;Paste a &lt;strong&gt;real API URL&lt;/strong&gt; -- SnapMock proxies it and creates a mock from the live response&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Use It Every Day
&lt;/h2&gt;

&lt;p&gt;Here's my actual workflow now:&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;// During development -- use SnapMock&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://snapmock.net/api/PROJECT_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products`&lt;/span&gt;&lt;span class="p"&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;x-snapmock-key&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;YOUR_KEY&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="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;setProducts&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="c1"&gt;// When backend is ready -- just change the URL&lt;/span&gt;
&lt;span class="c1"&gt;// const API_BASE = 'https://real-api.com';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more hardcoding. No more waiting. No more rewriting code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free to Use
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Requests/day&lt;/th&gt;
&lt;th&gt;Projects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;td&gt;500,000&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free plan includes Dynamic Data, Conditional Rules, Sequential Responses, Chaos Mode, and Stateful CRUD. More than enough for most development workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;snapmock.net&lt;/a&gt; -- sign up free, create your first mock API in 30 seconds.&lt;/p&gt;

&lt;p&gt;If you've ever been blocked by a backend that "will be ready next week," give it a try.&lt;/p&gt;

&lt;p&gt;Questions? Drop a comment below -- I read every one!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>api</category>
    </item>
    <item>
      <title>I Got Tired of Hardcoding Fake Data. So I Built a Mock API That Generates It Automatically.</title>
      <dc:creator>JohnMith</dc:creator>
      <pubDate>Sun, 12 Apr 2026 13:23:55 +0000</pubDate>
      <link>https://forem.com/tuan_nhatnguyen_7e928cbf/i-got-tired-of-hardcoding-fake-data-so-i-built-a-mock-api-that-generates-it-automatically-b6o</link>
      <guid>https://forem.com/tuan_nhatnguyen_7e928cbf/i-got-tired-of-hardcoding-fake-data-so-i-built-a-mock-api-that-generates-it-automatically-b6o</guid>
      <description>&lt;p&gt;It was a Tuesday morning. New sprint. My task: build the product listing page.&lt;/p&gt;

&lt;p&gt;Simple enough. Except the backend team told me the &lt;code&gt;/products&lt;/code&gt; API would be "ready by end of week."&lt;/p&gt;

&lt;p&gt;End of week came and went.&lt;/p&gt;

&lt;p&gt;So I did what every frontend dev does in this situation.&lt;br&gt;
When the real API finally came in - two weeks later - I spent another day ripping out all the hardcoded stuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There had to be a better way.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Static Fake Data
&lt;/h2&gt;

&lt;p&gt;Hardcoded mock data has a hidden cost most developers don't think about until it bites them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It masks real UI bugs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your test user is always "John Doe" with a price of "$9.99", you'll never catch truncation issues, layout overflow, or currency formatting bugs. Real users have names like "Maria Martinez-Gonzalez" and prices like "$1,299.00".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It's not shareable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your local JSON file doesn't help your QA teammate on a different machine. Or your designer reviewing the feature. Or the Postman collection your backend dev wants to test against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It couples test data to your codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When requirements change, you're updating mock data in five places instead of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Faker.js
&lt;/h2&gt;

&lt;p&gt;Faker.js is a JavaScript library that generates realistic fake data on demand. Every call returns different data - run it 100 times, get 100 different users, all realistic, all structurally consistent.&lt;/p&gt;

&lt;p&gt;This is great for local development and unit tests. But it still lives in your JavaScript code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the API itself generated fresh data on every request?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea That Changed How I Work
&lt;/h2&gt;

&lt;p&gt;I started wondering: what if I could write a mock API endpoint with placeholders and the server would resolve them with Faker.js on every single request?&lt;/p&gt;

&lt;p&gt;No code changes. Just configure once, get dynamic data forever.&lt;/p&gt;

&lt;p&gt;That's exactly what I built.&lt;/p&gt;

&lt;h2&gt;
  
  
  SnapMock: Mock APIs With Built-In Faker Tags
&lt;/h2&gt;

&lt;p&gt;SnapMock (&lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;https://snapmock.net&lt;/a&gt;) is the mock API platform I built to solve this problem. You create endpoints in a dashboard, define your response body with {{$tag}} placeholders, and every request gets fresh Faker-powered data.&lt;/p&gt;

&lt;p&gt;Same URL. Different data every time. Zero backend code.&lt;/p&gt;

&lt;p&gt;When your real API is ready, change one line - the URL - and remove the header. The rest of your frontend stays exactly the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Else SnapMock Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conditional rules - same endpoint, different response based on headers, query params, or body&lt;/li&gt;
&lt;li&gt;Sequential responses - return responses in order, great for pagination testing&lt;/li&gt;
&lt;li&gt;Chaos mode - randomly inject errors and latency to stress-test your frontend&lt;/li&gt;
&lt;li&gt;Stateful CRUD - GET/POST/PUT/DELETE with persistent state, zero backend code&lt;/li&gt;
&lt;li&gt;AI generation - describe in plain English, get a full endpoint config with Faker tags&lt;/li&gt;
&lt;li&gt;OpenAPI Import - paste a Swagger spec, import all endpoints at once&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you've ever sat around hardcoding fake JSON while waiting for a backend API - SnapMock is for you.&lt;/p&gt;

&lt;p&gt;Free tier: 5 projects, 1,000 requests/day. No credit card. No install.&lt;/p&gt;

&lt;p&gt;Try it at snapmock.net&lt;/p&gt;

&lt;p&gt;P.S. - The backend API I was waiting for that Tuesday? It shipped three weeks late, returned slightly different field names than agreed, and broke two of my components anyway. Some things never change. &lt;/p&gt;

&lt;p&gt;I hardcoded it.&lt;/p&gt;

&lt;p&gt;Fine for day one. By day four, I was maintaining three different fake datasets across five components, none of them matching each other, all named some variation of &lt;code&gt;mockData&lt;/code&gt;, &lt;code&gt;fakeProducts&lt;/code&gt;, &lt;code&gt;tempItems&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the real API finally came in &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Free Mock API Platform Because I Was Tired of Waiting for Backend" published: true</title>
      <dc:creator>JohnMith</dc:creator>
      <pubDate>Thu, 09 Apr 2026 12:57:23 +0000</pubDate>
      <link>https://forem.com/tuan_nhatnguyen_7e928cbf/i-built-a-free-mock-api-platform-because-i-was-tired-of-waiting-for-backendpublished-true-2ahl</link>
      <guid>https://forem.com/tuan_nhatnguyen_7e928cbf/i-built-a-free-mock-api-platform-because-i-was-tired-of-waiting-for-backendpublished-true-2ahl</guid>
      <description>&lt;p&gt;SnapMock — create mock APIs in 30 seconds with dynamic data, chaos testing, AI generation, and stateful CRUD. No install needed."&lt;br&gt;
tags: webdev, javascript, react, api&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ni1qgx28dlz6p4b7ajv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ni1qgx28dlz6p4b7ajv.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Every frontend developer knows this pain:&lt;/p&gt;

&lt;p&gt;Sprint starts. You're assigned to build the product listing page. Designs are ready. You open your editor, crack your knuckles, and...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The API isn't ready yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wait&lt;/strong&gt; for the backend team (and delay the sprint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardcode&lt;/strong&gt; dummy data (and remember to clean it up... right?)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up json-server&lt;/strong&gt; locally (and it works only on your machine)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've been through this cycle too many times. So I built &lt;strong&gt;&lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;SnapMock&lt;/a&gt;&lt;/strong&gt; — an online mock API platform where you create endpoints in 30 seconds and start building immediately.&lt;/p&gt;

&lt;p&gt;No installation. No deployment. No backend code.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick Demo: Mock API in 30 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create a project on &lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;snapmock.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Add an endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Method: GET
Path:   /api/products
Status: 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response body:&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;"products"&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;"iPhone 16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"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;999&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;"MacBook Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"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;2499&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;3&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;"AirPods Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"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;249&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;Step 3:&lt;/strong&gt; Call your API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-snapmock-key: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt;https://snapmock.net/api/YOUR_PROJECT_ID/products]&lt;span class="o"&gt;(&lt;/span&gt;https://snapmock.net/api/YOUR_PROJECT_ID/products&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Done.&lt;/strong&gt; Your frontend can now &lt;code&gt;fetch()&lt;/code&gt; real data while backend works in parallel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Features That Make SnapMock Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dynamic Data (Faker.js)
&lt;/h3&gt;

&lt;p&gt;Static JSON gets old fast. SnapMock lets you use dynamic tags:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$uuid}}"&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;"{{$fullName}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$email}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$avatar}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$company}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$lorem}}"&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;Every API call returns &lt;strong&gt;different, realistic data&lt;/strong&gt;. Your UI gets tested with diverse inputs automatically — no more "John Doe" everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditional Rules
&lt;/h3&gt;

&lt;p&gt;Return different responses based on request data:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Header &lt;code&gt;x-role&lt;/code&gt; = &lt;code&gt;"admin"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Full product list with admin fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header &lt;code&gt;x-role&lt;/code&gt; = &lt;code&gt;"user"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Limited product list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query &lt;code&gt;?page=2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Second page of results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Body contains &lt;code&gt;{"error": true}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;400 Bad Request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rules are evaluated in order — first match wins. This lets you simulate complex API behaviors without writing any backend logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chaos Engineering
&lt;/h3&gt;

&lt;p&gt;This is my favorite feature, and &lt;strong&gt;no other mock tool has it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enable Chaos Mode on any project and configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Error injection&lt;/strong&gt;: Random 500, 503, 404 responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency spikes&lt;/strong&gt;: Random delays (100ms to 5000ms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable failure rate&lt;/strong&gt;: 10%, 30%, 50% — you control the chaos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Because your app works great when everything returns 200. But production isn't that kind. Test your error boundaries, retry logic, and loading states &lt;strong&gt;before&lt;/strong&gt; users hit them.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-Powered Generation
&lt;/h3&gt;

&lt;p&gt;Don't want to write JSON by hand? Just describe what you need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A list of 10 blog posts with id, title, author, publishedAt, tags array, and a 200-word excerpt"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SnapMock uses Gemini AI to generate a realistic JSON response instantly. Edit it, save it, call it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stateful CRUD
&lt;/h3&gt;

&lt;p&gt;Create a single "stateful" endpoint and SnapMock auto-manages full CRUD operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /users&lt;/code&gt; → Returns all resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /users&lt;/code&gt; → Creates a new resource&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /users/:id&lt;/code&gt; → Returns one resource&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PUT /users/:id&lt;/code&gt; → Updates a resource&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DELETE /users/:id&lt;/code&gt; → Deletes a resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The state persists across requests (stored in Firebase Realtime Database), so your frontend can test real create → read → update → delete flows.&lt;/p&gt;

&lt;p&gt;Like having a real database — without having a database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Response Sequences
&lt;/h3&gt;

&lt;p&gt;Need your API to change behavior over time?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call 1 → Returns &lt;code&gt;{"status": "pending"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call 2 → Returns &lt;code&gt;{"status": "processing"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call 3 → Returns &lt;code&gt;{"status": "completed"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call 4 → Loops back to call 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for testing order status flows, payment processing, or any workflow that transitions through states.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Collaboration
&lt;/h3&gt;

&lt;p&gt;Invite team members to your project with role-based access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt;: Full control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Create and edit endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewer&lt;/strong&gt;: Read-only access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone shares the same project and API key. No more "hey can you send me that mock JSON?" messages.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Compares
&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;SnapMock&lt;/th&gt;
&lt;th&gt;json-server&lt;/th&gt;
&lt;th&gt;Mockoon&lt;/th&gt;
&lt;th&gt;Postman Mock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Online (no install)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic data (Faker.js)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI generation&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conditional rules&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chaos engineering&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateful CRUD&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response sequences&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team collaboration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;1,000 req/day&lt;/td&gt;
&lt;td&gt;Local only&lt;/td&gt;
&lt;td&gt;Local only&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Using with React
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hooks/useProducts.ts&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;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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="s1"&gt;react&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;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[https://snapmock.net/api/YOUR_PROJECT_ID](https://snapmock.net/api/YOUR_PROJECT_ID)&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;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useProducts&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setProducts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products`&lt;/span&gt;&lt;span class="p"&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;x-snapmock-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;API_KEY&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="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="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setProducts&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;products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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="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="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loading&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;When the real backend is ready, just swap the &lt;code&gt;API_BASE&lt;/code&gt; URL and remove the &lt;code&gt;x-snapmock-key&lt;/code&gt; header. &lt;strong&gt;Your frontend code stays the same.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Free to Start
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Requests/Day&lt;/th&gt;
&lt;th&gt;Projects&lt;/th&gt;
&lt;th&gt;Endpoints&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;100/project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ultra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free tier includes Dynamic Data, Conditional Rules, Sequences, Chaos Mode, and Stateful CRUD. Upgrade to Pro for GraphQL mocking and Postman import, or Ultra for JWT auth and webhook forwarding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack (for the curious)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 19, Vite, TailwindCSS v4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Firebase Cloud Functions (Gen 2, Node 20)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Firestore + Realtime Database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: Google Gemini&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Lemon Squeezy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Firebase Hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: GitHub Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total infrastructure cost: &lt;strong&gt;~$1/month&lt;/strong&gt;. Firebase's free tier is incredibly generous for a serverless app.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://snapmock.net" rel="noopener noreferrer"&gt;snapmock.net&lt;/a&gt;&lt;/strong&gt; — sign up free, create your first API in 30 seconds.&lt;/p&gt;

&lt;p&gt;I built this solo over 6 months. It's definitely not perfect yet — there are probably bugs I haven't found and UX flows that could be smoother.&lt;/p&gt;

&lt;p&gt;If you try it, I'd genuinely love your feedback. Bug reports, feature requests, criticism — all welcome. Just drop a comment below or reach out on Twitter.&lt;/p&gt;

&lt;p&gt;Happy mocking.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>development</category>
      <category>api</category>
    </item>
  </channel>
</rss>
