Free REST API for Testing and Learning

Blog Fake API for Testing CRUD Operations

A simple and developer-friendly Blog API for practicing REST API workflows like GET, POST, PUT, PATCH, and DELETE. Use it to learn API basics, test apps, build demos, or practice frontend integration with realistic blog post data.

Best for

Students, frontend developers, API beginners, and app prototyping.

Supports

cURL, Fetch, Axios, Python, Ruby on Rails, and Next.js.

Base URL

https://shrimo.com/fake-api/blog

Base URL

https://shrimo.com/fake-api/blog

What is this API for?

Use this API to practice CRUD operations with blog posts. CRUD stands for Create, Read, Update, and Delete.

Quick Test

Send a GET request to https://shrimo.com/fake-api/blog to retrieve a list of blog posts and test your API flow.

Quick start example

Start with a simple GET request to fetch all blog posts. This is the easiest way to confirm the API is working in your app or test environment.

javascript
fetch("https://shrimo.com/fake-api/blog")
  .then((res) => res.json())
  .then((data) => console.log(data));

Blog object schema

Each blog post includes fields such as title, content, category, status, author, tags, and publish date. This structure makes it useful for CMS demos, blog dashboards, admin panels, editor forms, and frontend integration.

json
{
  "id": "672f0eaa814c297b16f90096",
  "title": "How to Learn JavaScript",
  "content": "This is a comprehensive guide to learning JavaScript from scratch.",
  "category": "Programming",
  "status": "Published",
  "author": "John Doe",
  "tags": ["JavaScript", "Tutorial", "Learning"],
  "publishDate": "2026-04-20T00:00:00.000Z",
  "createdAt": "2026-04-15T10:00:00.000Z",
  "updatedAt": "2026-04-15T10:00:00.000Z"
}

API reference

GET/blog

Get all blog posts. Use this for blog list pages, dashboards, and content feeds.

GET/blog/:id

Get one blog post by ID. Use this for a detail page or edit form.

POST/blog

Create a new blog post. Useful for editor forms and content creation flows.

PUT/blog/:id

Replace an existing blog post with a full updated version.

PATCH/blog/:id

Update one or more fields on an existing blog post.

DELETE/blog/:id

Delete a blog post by ID.

GET/blog

Get all blog posts

What it does: Use GET when you want to read or fetch data.

When to use it: Use this when you want to display all blog posts in a list, feed, or dashboard.

Request Body

No request body needed for this method.

Example Response

json
{
  "success": true,
  "count": 2,
  "data": [
    {
      "id": "672f0eaa814c297b16f90096",
      "title": "How to Learn JavaScript",
      "content": "This is a comprehensive guide to learning JavaScript from scratch.",
      "category": "Programming",
      "status": "Published",
      "author": "John Doe",
      "tags": ["JavaScript", "Tutorial", "Learning"],
      "publishDate": "2026-04-20T00:00:00.000Z"
    },
    {
      "id": "672f0eaa814c297b16f90097",
      "title": "Getting Started with React",
      "content": "Learn the basics of building UI with React.",
      "category": "Frontend",
      "status": "Draft",
      "author": "Jane Smith",
      "tags": ["React", "Frontend"],
      "publishDate": "2026-04-22T00:00:00.000Z"
    }
  ]
}
Simple note: GET requests only read data. They do not create, update, or delete anything.

GET /blog examples by language

cURL

bash
curl -X GET "https://shrimo.com/fake-api/blog"

JavaScript (Fetch)

javascript
const getBlogs = async () => {
  const response = await fetch("https://shrimo.com/fake-api/blog");
  const data = await response.json();

  console.log(data);
};

getBlogs();

JavaScript (Axios)

javascript
import axios from "axios";

const getBlogs = async () => {
  try {
    const response = await axios.get("https://shrimo.com/fake-api/blog");
    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

getBlogs();

Python

python
import requests

response = requests.get("https://shrimo.com/fake-api/blog")
data = response.json()

print(data)

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

uri = URI.parse("https://shrimo.com/fake-api/blog")
response = Net::HTTP.get_response(uri)

if response.is_a?(Net::HTTPSuccess)
  puts JSON.parse(response.body)
else
  puts "Error: #{response.code}"
end

Next.js

javascript
export default async function BlogPage() {
  const res = await fetch("https://shrimo.com/fake-api/blog", {
    cache: "no-store",
  });

  const result = await res.json();

  return (
    <div>
      <h1>All Blog Posts</h1>

      {result.data.map((blog) => (
        <div key={blog.id}>
          <h2>{blog.title}</h2>
          <p>{blog.content}</p>
        </div>
      ))}
    </div>
  );
}
GET/blog/:id

Get one blog post by ID

What it does: Use GET with an ID when you want only one blog post.

When to use it: Use this when you want to open one blog post and show its details.

Request Body

No request body needed for this method.

Example Response

json
{
  "success": true,
  "count": 1,
  "data": {
    "id": "672f0eaa814c297b16f90096",
    "title": "How to Learn JavaScript",
    "content": "This is a comprehensive guide to learning JavaScript from scratch.",
    "category": "Programming",
    "status": "Published",
    "author": "John Doe",
    "tags": ["JavaScript", "Tutorial", "Learning"],
    "publishDate": "2026-04-20T00:00:00.000Z"
  }
}
Simple note: The ID identifies the exact blog post you want to retrieve.

GET /blog/:id examples by language

cURL

bash
curl -X GET "https://shrimo.com/fake-api/blog/672f0eaa814c297b16f90096"

JavaScript (Fetch)

javascript
const getBlogById = async (id) => {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`);
  const data = await response.json();

  console.log(data);
};

getBlogById("672f0eaa814c297b16f90096");

JavaScript (Axios)

javascript
import axios from "axios";

const getBlogById = async (id) => {
  try {
    const response = await axios.get(`https://shrimo.com/fake-api/blog/${id}`);
    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

getBlogById("672f0eaa814c297b16f90096");

Python

python
import requests

blog_id = "672f0eaa814c297b16f90096"
response = requests.get(f"https://shrimo.com/fake-api/blog/{blog_id}")

print(response.json())

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

blog_id = "672f0eaa814c297b16f90096"
uri = URI.parse("https://shrimo.com/fake-api/blog/#{blog_id}")
response = Net::HTTP.get_response(uri)

if response.is_a?(Net::HTTPSuccess)
  puts JSON.parse(response.body)
else
  puts "Error: #{response.code}"
end

Next.js

javascript
export default async function BlogDetailsPage() {
  const res = await fetch("https://shrimo.com/fake-api/blog/672f0eaa814c297b16f90096", {
    cache: "no-store",
  });

  const result = await res.json();
  const blog = result.data;

  return (
    <div>
      <h1>{blog.title}</h1>
      <p>{blog.content}</p>
      <p>Status: {blog.status}</p>
    </div>
  );
}
POST/blog

Create a new blog post

What it does: Use POST when you want to create new data.

When to use it: Use this when a user submits a blog editor form or creates a new post.

Request Body

json
{
  "title": "How to Build a REST API",
  "content": "This post explains how to build a REST API from scratch.",
  "category": "Backend",
  "status": "Draft",
  "author": "John Doe",
  "tags": ["API", "Backend", "Node.js"],
  "publishDate": "2026-04-20"
}

Example Response

json
{
  "success": true,
  "message": "Blog post created successfully.",
  "data": {
    "id": "672f0eaa814c297b16f90096",
    "title": "How to Build a REST API",
    "content": "This post explains how to build a REST API from scratch.",
    "category": "Backend",
    "status": "Draft",
    "author": "John Doe",
    "tags": ["API", "Backend", "Node.js"],
    "publishDate": "2026-04-20T00:00:00.000Z"
  }
}
Simple note: POST usually requires a request body containing the new data you want to save.

POST /blog examples by language

cURL

bash
curl -X POST "https://shrimo.com/fake-api/blog" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "How to Build a REST API",
    "content": "This post explains how to build a REST API from scratch.",
    "category": "Backend",
    "status": "Draft",
    "author": "John Doe",
    "tags": ["API", "Backend", "Node.js"],
    "publishDate": "2026-04-20"
  }'

JavaScript (Fetch)

javascript
const createBlog = async () => {
  const response = await fetch("https://shrimo.com/fake-api/blog", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      title: "How to Build a REST API",
      content: "This post explains how to build a REST API from scratch.",
      category: "Backend",
      status: "Draft",
      author: "John Doe",
      tags: ["API", "Backend", "Node.js"],
      publishDate: "2026-04-20",
    }),
  });

  const data = await response.json();
  console.log(data);
};

createBlog();

JavaScript (Axios)

javascript
import axios from "axios";

const createBlog = async () => {
  try {
    const response = await axios.post("https://shrimo.com/fake-api/blog", {
      title: "How to Build a REST API",
      content: "This post explains how to build a REST API from scratch.",
      category: "Backend",
      status: "Draft",
      author: "John Doe",
      tags: ["API", "Backend", "Node.js"],
      publishDate: "2026-04-20",
    });

    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

createBlog();

Python

python
import requests

payload = {
    "title": "How to Build a REST API",
    "content": "This post explains how to build a REST API from scratch.",
    "category": "Backend",
    "status": "Draft",
    "author": "John Doe",
    "tags": ["API", "Backend", "Node.js"],
    "publishDate": "2026-04-20"
}

response = requests.post("https://shrimo.com/fake-api/blog", json=payload)
print(response.json())

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

uri = URI.parse("https://shrimo.com/fake-api/blog")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri, {
  "Content-Type" => "application/json"
})

request.body = {
  title: "How to Build a REST API",
  content: "This post explains how to build a REST API from scratch.",
  category: "Backend",
  status: "Draft",
  author: "John Doe",
  tags: ["API", "Backend", "Node.js"],
  publishDate: "2026-04-20"
}.to_json

response = http.request(request)
puts JSON.parse(response.body)

Next.js

javascript
async function createBlog() {
  const response = await fetch("https://shrimo.com/fake-api/blog", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      title: "How to Build a REST API",
      content: "This post explains how to build a REST API from scratch.",
      category: "Backend",
      status: "Draft",
      author: "John Doe",
      tags: ["API", "Backend", "Node.js"],
      publishDate: "2026-04-20",
    }),
  });

  return response.json();
}
PUT/blog/:id

Replace a blog post with PUT

What it does: Use PUT when you want to update an existing item with a full new version.

When to use it: Use this when you want to replace most or all values of an existing blog post.

Request Body

json
{
  "title": "How to Build a REST API - Updated",
  "content": "This updated post explains REST API design, routing, and testing.",
  "category": "Backend",
  "status": "Published",
  "author": "John Doe",
  "tags": ["API", "Backend", "REST"],
  "publishDate": "2026-04-25"
}

Example Response

json
{
  "success": true,
  "message": "Blog post updated successfully.",
  "data": {
    "id": "672f0eaa814c297b16f90096",
    "title": "How to Build a REST API - Updated",
    "content": "This updated post explains REST API design, routing, and testing.",
    "category": "Backend",
    "status": "Published",
    "author": "John Doe",
    "tags": ["API", "Backend", "REST"],
    "publishDate": "2026-04-25T00:00:00.000Z"
  }
}
Simple note: Think of PUT as a full update. It is best when you are sending all major fields again.

PUT /blog/:id examples by language

cURL

bash
curl -X PUT "https://shrimo.com/fake-api/blog/672f0eaa814c297b16f90096" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "How to Build a REST API - Updated",
    "content": "This updated post explains REST API design, routing, and testing.",
    "category": "Backend",
    "status": "Published",
    "author": "John Doe",
    "tags": ["API", "Backend", "REST"],
    "publishDate": "2026-04-25"
  }'

JavaScript (Fetch)

javascript
const updateBlog = async (id) => {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      title: "How to Build a REST API - Updated",
      content: "This updated post explains REST API design, routing, and testing.",
      category: "Backend",
      status: "Published",
      author: "John Doe",
      tags: ["API", "Backend", "REST"],
      publishDate: "2026-04-25",
    }),
  });

  const data = await response.json();
  console.log(data);
};

updateBlog("672f0eaa814c297b16f90096");

JavaScript (Axios)

javascript
import axios from "axios";

const updateBlog = async (id) => {
  try {
    const response = await axios.put(`https://shrimo.com/fake-api/blog/${id}`, {
      title: "How to Build a REST API - Updated",
      content: "This updated post explains REST API design, routing, and testing.",
      category: "Backend",
      status: "Published",
      author: "John Doe",
      tags: ["API", "Backend", "REST"],
      publishDate: "2026-04-25",
    });

    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

updateBlog("672f0eaa814c297b16f90096");

Python

python
import requests

blog_id = "672f0eaa814c297b16f90096"

payload = {
    "title": "How to Build a REST API - Updated",
    "content": "This updated post explains REST API design, routing, and testing.",
    "category": "Backend",
    "status": "Published",
    "author": "John Doe",
    "tags": ["API", "Backend", "REST"],
    "publishDate": "2026-04-25"
}

response = requests.put(f"https://shrimo.com/fake-api/blog/{blog_id}", json=payload)
print(response.json())

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

blog_id = "672f0eaa814c297b16f90096"
uri = URI.parse("https://shrimo.com/fake-api/blog/#{blog_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Put.new(uri.request_uri, {
  "Content-Type" => "application/json"
})

request.body = {
  title: "How to Build a REST API - Updated",
  content: "This updated post explains REST API design, routing, and testing.",
  category: "Backend",
  status: "Published",
  author: "John Doe",
  tags: ["API", "Backend", "REST"],
  publishDate: "2026-04-25"
}.to_json

response = http.request(request)
puts JSON.parse(response.body)

Next.js

javascript
async function updateBlog(id) {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      title: "How to Build a REST API - Updated",
      content: "This updated post explains REST API design, routing, and testing.",
      category: "Backend",
      status: "Published",
      author: "John Doe",
      tags: ["API", "Backend", "REST"],
      publishDate: "2026-04-25",
    }),
  });

  return response.json();
}
PATCH/blog/:id

Partially update a blog post

What it does: Use PATCH when you want to change only one or two fields.

When to use it: Use this when you only want to update status, title, tags, or another small part of the blog post.

Request Body

json
{
  "status": "Published"
}

Example Response

json
{
  "success": true,
  "message": "Blog post patched successfully.",
  "data": {
    "id": "672f0eaa814c297b16f90096",
    "title": "How to Learn JavaScript",
    "content": "This is a comprehensive guide to learning JavaScript from scratch.",
    "category": "Programming",
    "status": "Published",
    "author": "John Doe",
    "tags": ["JavaScript", "Tutorial", "Learning"],
    "publishDate": "2026-04-20T00:00:00.000Z"
  }
}
Simple note: PATCH is ideal for lightweight updates such as changing a post from Draft to Published.

PATCH /blog/:id examples by language

cURL

bash
curl -X PATCH "https://shrimo.com/fake-api/blog/672f0eaa814c297b16f90096" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "Published"
  }'

JavaScript (Fetch)

javascript
const patchBlog = async (id) => {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "PATCH",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      status: "Published",
    }),
  });

  const data = await response.json();
  console.log(data);
};

patchBlog("672f0eaa814c297b16f90096");

JavaScript (Axios)

javascript
import axios from "axios";

const patchBlog = async (id) => {
  try {
    const response = await axios.patch(`https://shrimo.com/fake-api/blog/${id}`, {
      status: "Published",
    });

    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

patchBlog("672f0eaa814c297b16f90096");

Python

python
import requests

blog_id = "672f0eaa814c297b16f90096"

payload = {
    "status": "Published"
}

response = requests.patch(f"https://shrimo.com/fake-api/blog/{blog_id}", json=payload)
print(response.json())

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

blog_id = "672f0eaa814c297b16f90096"
uri = URI.parse("https://shrimo.com/fake-api/blog/#{blog_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(uri.request_uri, {
  "Content-Type" => "application/json"
})

request.body = {
  status: "Published"
}.to_json

response = http.request(request)
puts JSON.parse(response.body)

Next.js

javascript
async function patchBlog(id) {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "PATCH",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      status: "Published",
    }),
  });

  return response.json();
}
DELETE/blog/:id

Delete a blog post

What it does: Use DELETE when you want to remove data.

When to use it: Use this when a user clicks a delete button and you want to remove the blog post permanently.

Request Body

No request body needed for this method.

Example Response

json
{
  "success": true,
  "message": "Blog post deleted successfully."
}
Simple note: DELETE usually only needs the resource ID in the URL.

DELETE /blog/:id examples by language

cURL

bash
curl -X DELETE "https://shrimo.com/fake-api/blog/672f0eaa814c297b16f90096"

JavaScript (Fetch)

javascript
const deleteBlog = async (id) => {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "DELETE",
  });

  const data = await response.json();
  console.log(data);
};

deleteBlog("672f0eaa814c297b16f90096");

JavaScript (Axios)

javascript
import axios from "axios";

const deleteBlog = async (id) => {
  try {
    const response = await axios.delete(`https://shrimo.com/fake-api/blog/${id}`);
    console.log(response.data);
  } catch (error) {
    console.error("Error:", error.message);
  }
};

deleteBlog("672f0eaa814c297b16f90096");

Python

python
import requests

blog_id = "672f0eaa814c297b16f90096"
response = requests.delete(f"https://shrimo.com/fake-api/blog/{blog_id}")

print(response.json())

Ruby on Rails

ruby
require "net/http"
require "uri"
require "json"

blog_id = "672f0eaa814c297b16f90096"
uri = URI.parse("https://shrimo.com/fake-api/blog/#{blog_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(uri.request_uri)
response = http.request(request)

puts JSON.parse(response.body)

Next.js

javascript
async function deleteBlog(id) {
  const response = await fetch(`https://shrimo.com/fake-api/blog/${id}`, {
    method: "DELETE",
  });

  return response.json();
}

Status codes made simple

200 OK

The request worked successfully and data was returned.

201 Created

A new blog post was created successfully.

400 Bad Request

The request body is missing required fields or contains invalid data.

404 Not Found

The blog post with that ID does not exist.

Best learning order

1. Start with GET /blog

2. Then try POST /blog

3. Then use GET /blog/:id

4. Then learn PUT and PATCH

5. Finally test DELETE /blog/:id

Frequently asked questions

What is a fake Blog API?

A fake Blog API is a sample or mock API used for testing, learning, prototyping, and frontend integration without depending on a live production backend.

Is this Blog API free to use?

Yes. This Blog API is designed for learning, testing, and developer practice.

Can I use this API with React or Next.js?

Yes. You can use this API with React, Next.js, JavaScript Fetch, Axios, Python requests, and other HTTP libraries.

What is the difference between PUT and PATCH?

PUT is generally used to replace the full resource with updated data, while PATCH is used to update only part of a resource, such as just the status field.

Related links

Need this for a real project?

We can help you turn this workflow into a production-ready system.

Tools are useful for quick work, learning, and testing. If you need the same idea inside a real website, dashboard, CRM, portal, API, or business workflow, our team can plan, design, and build it with proper user roles, validation, performance, and long-term support.

Want to learn this properly?

Learn practical web development with guided training.

If you are a student, fresher, or developer building your skills, explore training and internship options instead of only using the tool once.