Get a full fake REST API with zero coding in less than 30 seconds (seriously)

Overview

JSON Server Node.js CI

Get a full fake REST API with zero coding in less than 30 seconds (seriously)

Created with <3 for front-end developers who need a quick back-end for prototyping and mocking.

See also:

 

Gold sponsors 🥇

 

 

 

 

 

 

Bronze sponsors 🥉

 

 

Become a sponsor and have your company logo here

Sponsor

Please help me build OSS 👉 GitHub Sponsors ❤️

Table of contents

Getting started

Install JSON Server

npm install -g json-server

Create a db.json file with some data

{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}

Start JSON Server

json-server --watch db.json

Now if you go to http://localhost:3000/posts/1, you'll get

{ "id": 1, "title": "json-server", "author": "typicode" }

Also when doing requests, it's good to know that:

  • If you make POST, PUT, PATCH or DELETE requests, changes will be automatically and safely saved to db.json using lowdb.
  • Your request body JSON should be object enclosed, just like the GET output. (for example {"name": "Foobar"})
  • Id values are not mutable. Any id value in the body of your PUT or PATCH request will be ignored. Only a value set in a POST request will be respected, but only if not already taken.
  • A POST, PUT or PATCH request should include a Content-Type: application/json header to use the JSON in the request body. Otherwise it will return a 2XX status code, but without changes being made to the data.

Routes

Based on the previous db.json file, here are all the default routes. You can also add other routes using --routes.

Plural routes

GET    /posts
GET    /posts/1
POST   /posts
PUT    /posts/1
PATCH  /posts/1
DELETE /posts/1

Singular routes

GET    /profile
POST   /profile
PUT    /profile
PATCH  /profile

Filter

Use . to access deep properties

GET /posts?title=json-server&author=typicode
GET /posts?id=1&id=2
GET /comments?author.name=typicode

Paginate

Use _page and optionally _limit to paginate returned data.

In the Link header you'll get first, prev, next and last links.

GET /posts?_page=7
GET /posts?_page=7&_limit=20

10 items are returned by default

Sort

Add _sort and _order (ascending order by default)

GET /posts?_sort=views&_order=asc
GET /posts/1/comments?_sort=votes&_order=asc

For multiple fields, use the following format:

GET /posts?_sort=user,views&_order=desc,asc

Slice

Add _start and _end or _limit (an X-Total-Count header is included in the response)

GET /posts?_start=20&_end=30
GET /posts/1/comments?_start=20&_end=30
GET /posts/1/comments?_start=20&_limit=10

Works exactly as Array.slice (i.e. _start is inclusive and _end exclusive)

Operators

Add _gte or _lte for getting a range

GET /posts?views_gte=10&views_lte=20

Add _ne to exclude a value

GET /posts?id_ne=1

Add _like to filter (RegExp supported)

GET /posts?title_like=server

Full-text search

Add q

GET /posts?q=internet

Relationships

To include children resources, add _embed

GET /posts?_embed=comments
GET /posts/1?_embed=comments

To include parent resource, add _expand

GET /comments?_expand=post
GET /comments/1?_expand=post

To get or create nested resources (by default one level, add custom routes for more)

GET  /posts/1/comments
POST /posts/1/comments

Database

GET /db

Homepage

Returns default index file or serves ./public directory

GET /

Extras

Static file server

You can use JSON Server to serve your HTML, JS and CSS, simply create a ./public directory or use --static to set a different static files directory.

mkdir public
echo 'hello world' > public/index.html
json-server db.json
json-server db.json --static ./some-other-dir

Alternative port

You can start JSON Server on other ports with the --port flag:

$ json-server --watch db.json --port 3004

Access from anywhere

You can access your fake API from anywhere using CORS and JSONP.

Remote schema

You can load remote schemas.

$ json-server http://example.com/file.json
$ json-server http://jsonplaceholder.typicode.com/db

Generate random data

Using JS instead of a JSON file, you can create data programmatically.

// index.js
module.exports = () => {
  const data = { users: [] }
  // Create 1000 users
  for (let i = 0; i < 1000; i++) {
    data.users.push({ id: i, name: `user${i}` })
  }
  return data
}
$ json-server index.js

Tip use modules like Faker, Casual, Chance or JSON Schema Faker.

HTTPS

There are many ways to set up SSL in development. One simple way is to use hotel.

Add custom routes

Create a routes.json file. Pay attention to start every route with /.

{
  "/api/*": "/$1",
  "/:resource/:id/show": "/:resource/:id",
  "/posts/:category": "/posts?category=:category",
  "/articles\\?id=:id": "/posts/:id"
}

Start JSON Server with --routes option.

json-server db.json --routes routes.json

Now you can access resources using additional routes.

/api/posts # → /posts
/api/posts/1  # → /posts/1
/posts/1/show # → /posts/1
/posts/javascript # → /posts?category=javascript
/articles?id=1 # → /posts/1

Add middlewares

You can add your middlewares from the CLI using --middlewares option:

// hello.js
module.exports = (req, res, next) => {
  res.header('X-Hello', 'World')
  next()
}
json-server db.json --middlewares ./hello.js
json-server db.json --middlewares ./first.js ./second.js

CLI usage

json-server [options] <source>

Options:
  --config, -c       Path to config file           [default: "json-server.json"]
  --port, -p         Set port                                    [default: 3000]
  --host, -H         Set host                             [default: "localhost"]
  --watch, -w        Watch file(s)                                     [boolean]
  --routes, -r       Path to routes file
  --middlewares, -m  Paths to middleware files                           [array]
  --static, -s       Set static files directory
  --read-only, --ro  Allow only GET requests                           [boolean]
  --no-cors, --nc    Disable Cross-Origin Resource Sharing             [boolean]
  --no-gzip, --ng    Disable GZIP Content-Encoding                     [boolean]
  --snapshots, -S    Set snapshots directory                      [default: "."]
  --delay, -d        Add delay to responses (ms)
  --id, -i           Set database id property (e.g. _id)         [default: "id"]
  --foreignKeySuffix, --fks  Set foreign key suffix, (e.g. _id as in post_id)
                                                                 [default: "Id"]
  --quiet, -q        Suppress log messages from output                 [boolean]
  --help, -h         Show help                                         [boolean]
  --version, -v      Show version number                               [boolean]

Examples:
  json-server db.json
  json-server file.js
  json-server http://example.com/db.json

https://github.com/typicode/json-server

You can also set options in a json-server.json configuration file.

{
  "port": 3000
}

Module

If you need to add authentication, validation, or any behavior, you can use the project as a module in combination with other Express middlewares.

Simple example

$ npm install json-server --save-dev
// server.js
const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()

server.use(middlewares)
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})
$ node server.js

The path you provide to the jsonServer.router function is relative to the directory from where you launch your node process. If you run the above code from another directory, it’s better to use an absolute path:

const path = require('path')
const router = jsonServer.router(path.join(__dirname, 'db.json'))

For an in-memory database, simply pass an object to jsonServer.router().

Please note also that jsonServer.router() can be used in existing Express projects.

Custom routes example

Let's say you want a route that echoes query parameters and another one that set a timestamp on every resource created.

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()

// Set default middlewares (logger, static, cors and no-cache)
server.use(middlewares)

// Add custom routes before JSON Server router
server.get('/echo', (req, res) => {
  res.jsonp(req.query)
})

// To handle POST, PUT and PATCH you need to use a body-parser
// You can use the one used by JSON Server
server.use(jsonServer.bodyParser)
server.use((req, res, next) => {
  if (req.method === 'POST') {
    req.body.createdAt = Date.now()
  }
  // Continue to JSON Server router
  next()
})

// Use default router
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})

Access control example

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()

server.use(middlewares)
server.use((req, res, next) => {
 if (isAuthorized(req)) { // add your authorization logic here
   next() // continue to JSON Server router
 } else {
   res.sendStatus(401)
 }
})
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})

Custom output example

To modify responses, overwrite router.render method:

// In this example, returned resources will be wrapped in a body property
router.render = (req, res) => {
  res.jsonp({
    body: res.locals.data
  })
}

You can set your own status code for the response:

// In this example we simulate a server side error response
router.render = (req, res) => {
  res.status(500).jsonp({
    error: "error message here"
  })
}

Rewriter example

To add rewrite rules, use jsonServer.rewriter():

// Add this before server.use(router)
server.use(jsonServer.rewriter({
  '/api/*': '/$1',
  '/blog/:resource/:id/show': '/:resource/:id'
}))

Mounting JSON Server on another endpoint example

Alternatively, you can also mount the router on /api.

server.use('/api', router)

API

jsonServer.create()

Returns an Express server.

jsonServer.defaults([options])

Returns middlewares used by JSON Server.

  • options
    • static path to static files
    • logger enable logger middleware (default: true)
    • bodyParser enable body-parser middleware (default: true)
    • noCors disable CORS (default: false)
    • readOnly accept only GET requests (default: false)

jsonServer.router([path|object])

Returns JSON Server router.

Deployment

You can deploy JSON Server. For example, JSONPlaceholder is an online fake API powered by JSON Server and running on Heroku.

Links

Video

Articles

Third-party tools

License

MIT

Supporters

Comments
  • Command to start json-server is not working.

    Command to start json-server is not working.

    I am trying to start JSON server with following command $ json-server --watch db.json

    I am not able to start the server. I am getting command not found error

    “json-server: command not found”

    I referred https://github.com/typicode/json-server http://www.betterpixels.co.uk/projects/2015/05/09/mock-up-your-rest-api-with-json-server/

    I am using iMac (Mid 2010) with latest OS (macOS Sierra) version 10.12

    Please help me to resolve the issue. Thanks

    opened by KavyaKn 42
  • json-server cache the data?

    json-server cache the data?

    I run json-server by json-server --watch db.json.

    I modified the db.json, then the terminal shows db.json has changed, reloading...,( it shows twice..) everything looks well.

    But when i got the data by AJAX. The response not changed. At first, i thought my chrome may cache the data, so add time to the URL like this posts?_limit=1441026369153. But it doesn't work.

    Then i use my safari to get the data, i get the new data. I refresh my chrome, still not work.

    Wow, after i write this bug report, i refresh my chrome. I got the new data.....O__O "… ~(~ ̄▽ ̄)~

    +_+... OS: Windows 10 Pro 64, Browser: Chrome 44.0.2403.157 m, what's wrong with my operation. Etag? Expire=-1? Cache-Control=no-cache? Everything looks normal. Thanks~~ O(∩_∩)O

    opened by zhoukekestar 23
  • Nested requests returning 404

    Nested requests returning 404

    So I have a json file that has the following schema:

    {
      "environments": [
        {
          "id": 12,
          "reports": [
            {
              "id": 17
            },
            {
              "id": 25
            }
          ]
        },
        {
          "id": 19,
          "reports": [
            {
              "id": 22
            },
            {
              "id": 30
            }
          ]
        }
      ]
    }
    

    /environments works, as does /environments/12, so I figured I could use the route /environments/12/reports to return that array, but it's returning a 404 instead. Am I doing something wrong here?

    My env:

    • Mac OS X Yosemite
    • NVM 0.24.0
    • io.js 1.8.1
    • json-server 0.7.3
    opened by therebelrobot 22
  • Is it possible to 'get' data using POST with json-server?

    Is it possible to 'get' data using POST with json-server?

    Hi,

    I am trying to get response using POST. My POST body has some key-value pairs which determine what needs to be responded. Is it possible to get data back from POST method ?

    Thanks

    opened by vsharma2266 18
  • how to work with many json files together?

    how to work with many json files together?

    I have more than 10 json files in one project. Different file is using for different purpose, i don't want to join them into one file. How to work with all of them in json-server?

    opened by bi-kai 15
  • can't watch multiple files

    can't watch multiple files

    I'd like to watch more than 1 file. In the instructions it is listed

    --watch, -w Watch file(s)

    but I'm not able to make it working if I launch it as

    json-server -w one.json two.json more.json

    Could you help me, please? It is really important

    opened by JimmyD5 14
  • How to wrap responses?

    How to wrap responses?

    Hi, thanks for your wonderful json server.

    I was wondering if it is possible to modify the server response. For example, if I get /posts currently I receive an array of posts. I would like to receive an object with one property posts and the list of post as the value of the property:

    { posts: [ /* list of posts here */ ] }
    

    I have been playing with the middleware but I can't hijack the server response. Any clues?

    opened by arqex 14
  • integrate json-server with express server

    integrate json-server with express server

    I'm trying to create a JSON-Server with express server where my entity models in JSON file.

    any full example to help me with this?

    // app.js file
    
    var jsonServer = require('json-server');
    
    // Returns an Express server
    var server = jsonServer.create();
    
    // Set default middlewares (logger, static, cors and no-cache)
    server.use(jsonServer.defaults());
    
    // Add custom routes
    // server.get('/custom', function (req, res) { res.json({ msg: 'hello' }) })
    
    // Returns an Express router
    var router = jsonServer.router('db.json');
    
    server.use(router);
    
    server.listen(3000);
    

    and running with

    node app.js
    
    opened by warapitiya 13
  • Run as a background task.

    Run as a background task.

    $ json-server -p 1337 db.json > /dev/null 2>&1 &
    

    and then

    $ curl http://localhost:1337/posts/1
    

    Just hangs forever, bit wired, am I missing something here? //cc @typicode

    opened by hemanth 13
  • How to serve image files?

    How to serve image files?

    Sample image link http://localhost:3000/assets/images/coffee/large/coffee.gif not working with json-server, it's not possible to server static assets? (script files, css styles, images) Or is there any way to plug sharp (image resizer node package) into json-server

    opened by vko-online 13
  • How to run json-server under HTTPS?

    How to run json-server under HTTPS?

    Hi,

    I have been working on a project using json-server on localhost. It worked well until I wanted it to serve JSON responses from an actual server. Now, I have hosted my front-end code in Apache (under HTTPS) and ran json-server as a background process using nohup in my server. After this, the front-end code is unable to access any response from json-server.

    I see multiple issues here -

    • Apache is running on port 80 under HTTPS and json-server is running in localhost w.r.to the server on default port 3000
    • Chrome browser does not allow mixed content.
    • json-server always runs on localhost. I could not force it to run on HTTPS (I'm not sure if this can be done)

    I could not find a solution for this. Any idea how I can run json-server under HTTPS on an actual server? Any help would be much appreciated.

    PS. json-server is able to serve responses when the front-end is served from HTTP. However, I am using service workers in my project which need HTTPS to work.

    opened by kranthilakum 12
  • can i host it on github pages?

    can i host it on github pages?

    I need get request only, can i host json-server on github pages?

    Or how to use <script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/server/index.min.js"></script> on static site?

    opened by mnsn123 0
  • Bump json5 from 2.2.0 to 2.2.3

    Bump json5 from 2.2.0 to 2.2.3

    Bumps json5 from 2.2.0 to 2.2.3.

    Release notes

    Sourced from json5's releases.

    v2.2.3

    v2.2.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Changelog

    Sourced from json5's changelog.

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Commits
    • c3a7524 2.2.3
    • 94fd06d docs: update CHANGELOG for v2.2.3
    • 3b8cebf docs(security): use GitHub security advisories
    • f0fd9e1 docs: publish a security policy
    • 6a91a05 docs(template): bug -> bug report
    • 14f8cb1 2.2.2
    • 10cc7ca docs: update CHANGELOG for v2.2.2
    • 7774c10 fix: add proto to objects and arrays
    • edde30a Readme: slight tweak to intro
    • 97286f8 Improve example in readme
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Can you add the content returned to a normal type, such as a number, string

    Can you add the content returned to a normal type, such as a number, string

    Not all requests need to return json data types. Some requests return a normal type, not an array or object type. This will prompt an error.

    Some error occurred Error: Type of "detail" (number) is not supported. Use objects or arrays of objects. The corresponding file contents are as follows: db.json

    "detail":0,
    

    Look forward to adding this feature, thank you

    opened by xjl456852 0
  • When tried to serve the json file in repllit

    When tried to serve the json file in repllit

    JSON Server is running GET /db 304 2.237 ms - - GET /__rules 404 1.864 ms - 2 GET /__rules 404 0.507 ms - 2 GET /db 304 0.267 ms - - GET /db 304 0.482 ms - - GET /__rules 404 1.441 ms - 2

    The code: // server.js const path = require('path') const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router(path.join(__dirname, 'db.json')) const middlewares = jsonServer.defaults() server.use(middlewares) server.use(router) server.listen(3000, () => { console.log('JSON Server is running') })

    opened by pakosaan 0
  • add filter for getting first result

    add filter for getting first result

    Add ability to get the first resource from the index

    For my use cases it's often important to be able to get the first matching value from the list endpoints.

    • Useful when id fields are different for each resources. ie: BookId, AuthorId GET /books?BooktId=213&_first=true
    • Useful when combined with other fields to search or sort GET /books?author=bkulyk&_sort=publish_date&_first=true

    combined with custom routes

    {
      "/api/books/id": "/books?BookId=:id&_first=true"
    }
    
    opened by bkulyk 0
Releases(v0.17.0)
Owner
null
A JavaScript, zero-dependency, super small version of IP2Location LITE country lookups.

ip3country This is a zero-dependency, super small, IP address to 2-letter country code lookup library. There are already several libraries available,

Statsig 34 Dec 14, 2022
A fully-featured Node.js REST client built for ease-of-use and resilience

flashheart A fully-featured Node.js REST client built for ease-of-use and resilience flashheart is built on http-transport to provide everything you n

BBC 118 Jun 21, 2022
HTTP Client for Visual Studio Code to POST JSON, XML, image, ... files to REST APIs

friflo POST Goal Main goal of this extension is storing all HTTP request & response data automatically as files in a VSCode workspace. This ensures th

Ullrich Praetz 2 Nov 18, 2021
Minimal, type-safe REST client using JS proxies

Minimal, type-safe REST client using JS proxies.

Johann Schopplich 124 Dec 16, 2022
A full-featured http proxy for node.js

node-http-proxy node-http-proxy is an HTTP programmable proxying library that supports websockets. It is suitable for implementing components such as

http ... PARTY! 13.1k Jan 3, 2023
Full-featured, middleware-oriented, programmatic HTTP and WebSocket proxy for node.js

rocky A multipurpose, full-featured, middleware-oriented and hackable HTTP/S and WebSocket proxy with powerful built-in features such as versatile rou

Tom 370 Nov 24, 2022
Hello! Welcome to Our own Live Code Editor 2!! This is supported tabs and full-screen editing, Console, tabs and more are coming. We uses this one in our all tutorials. Made by @E-Coders & @Genius398

Live Code Editor 2 Hello! this is our live code editor an another second release version of our main Resporibity. This have style as tabs and more fea

Educational Websites 5 Nov 18, 2021
Isomorphic WHATWG Fetch API, for Node & Browserify

isomorphic-fetch Fetch for node and Browserify. Built on top of GitHub's WHATWG Fetch polyfill. Warnings This adds fetch as a global so that its API i

Matt Andrews 6.9k Jan 2, 2023
A light-weight module that brings the Fetch API to Node.js

A light-weight module that brings Fetch API to Node.js. Consider supporting us on our Open Collective: Motivation Features Difference from client-side

Node Fetch 8.1k Jan 4, 2023
Convenience wrapper for Got to interact with the GitHub API

gh-got Convenience wrapper for Got to interact with the GitHub API Unless you're already using Got, you should probably use GitHub's own @octokit/rest

Sindre Sorhus 175 Dec 25, 2022
Bearer provides all of the tools to build, run and manage API integrations.

Bearer - The API Integration Framework Bearer provides all of the tools to build, run and manage API Learn more Archive Status Bearer JS has been arch

Bearer.sh 22 Oct 31, 2022
An HTTP Web Server for Chrome (chrome.sockets API)

An HTTP Web Server for Chrome (chrome.sockets API)

Kyle Graehl 1.2k Dec 31, 2022
Prefect API Authentication/Authorization Proxy for on-premises deployments

Proxy Authorization Service for Prefect UI and Prefect CLI Prefect is a great platform for building data flows/pipelines. It supports hybrid execution

Softrams 20 Dec 10, 2022
👌A useful zero-dependencies, less than 434 Bytes (gzipped), pure JavaScript & CSS solution for drop an annoying pop-ups confirming the submission of form in your web apps.

Throw out pop-ups confirming the submission of form! A useful zero-dependencies, less than 434 Bytes (gzipped), pure JavaScript & CSS solution for dro

Vic Shóstak 35 Aug 24, 2022
Data structures & algorithms implementations and coding problem solutions. Written in Typescript and tested with Jest. Coding problems are pulled from LeetCode and Daily Coding Problem.

technical-interview-prep Data structures & algorithms implementations and coding problem solutions. Written in Typescript and tested with Jest. Coding

Lesley Chang 7 Aug 5, 2022
Generate deterministic fake values: The same input will always generate the same fake-output.

import { copycat } from '@snaplet/copycat' copycat.email('foo') // => '[email protected]' copycat.email('bar') // => 'Thurman.Schowalter668@

Snaplet 201 Dec 30, 2022
2x times faster than chalk and use 5x less space in node_modules

Nano Colors A tiny and fast Node.js library for formatting terminal text with ANSI colors. It is 2 times faster than chalk. Both loading and calls. No

Andrey Sitnik 886 Dec 30, 2022
A react component helps bring Figma's Cursor Chat to your web applications in less than 3 minutes, making real-time collaboration anywhere

@yomo/react-cursor-chat ?? Introduction A react component helps bring Figma's Cursor Chat to your web applications in less than 3 minutes, making real

YoMo 84 Nov 17, 2022
Automatically convert those LESS file which is not using less function to CSS.

less-2-css Automatically convert those .less file which is not using less function to .css. Why Less is a powerful CSS pre-processor, but it also very

UmiJS 14 May 24, 2022
Jetcap is a free online REST API that you can use whenever you need some fake data ✨

Jetcap Jetcap is a simple fake REST API for testing and prototyping. When to use ✨ Jetcap is a free online REST API that you can use whenever you need

Rades Pratama 8 Nov 13, 2022