jsonplaceholder

A simple fake REST API server for testing and prototyping.

JSONPlaceholder

JSONPlaceholder is a simple fake REST API for testing and prototyping.

It's like an image placeholder but for web developers.

JSONPlaceholder is powered by JSON Server.

Most of the time when trying a new library, hacking a prototype or following a tutorial, I found myself in need of some data.

I didn't like the idea of using some public API because I had the feeling that I was spending more time registering a client and understanding a complex API than focusing on my task.

But I liked the idea of image placeholders for web designers. So I decided to code a little Express server inspired by that and here is JSONPlaceholder.

You can find it running here and are free to use it in your developments: http://jsonplaceholder.typicode.com.

Or you can run it locally:

$ npm install -g jsonplaceholder
$ jsonplaceholder

I hope you will find it useful.

  • No registration
  • Zero-config
  • Basic API
  • "Has many" relationships
  • Filters and nested resources
  • Cross-domain (CORS and JSONP)
  • Supports GET, POST, PUT, PATCH, DELETE and OPTIONS verbs
  • Compatible with Backbone, AngularJS, Ember, ...

Let's start with resources, JSONPlaceholder provides the usual suspects:

  • Posts http://jsonplaceholder.typicode.com/posts/1
  • Comments http://jsonplaceholder.typicode.com/comments/1
  • Albums http://jsonplaceholder.typicode.com/albums/1
  • Photos http://jsonplaceholder.typicode.com/photos/1
  • Users http://jsonplaceholder.typicode.com/users/1
  • Todos http://jsonplaceholder.typicode.com/todos/1

Here's some code using jQuery showing what can be done with JSONPlaceholder. Since GitHub loads jQuery, you can simply copy and paste these examples in a console.

$.ajax('http://jsonplaceholder.typicode.com/posts/1', {
  method: 'GET'
}).then(function(data) {
  console.log(data);
});
$.ajax('http://jsonplaceholder.typicode.com/posts', {
  method: 'GET'
}).then(function(data) {
  console.log(data);
});
// POST adds a random id to the object sent 
$.ajax('http://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  data: {
    title: 'foo',
    body: 'bar',
    userId: 1
  }
}).then(function(data) {
  console.log(data);
});
 
/* will return
{
  id: 134985902, // Random id
  title: 'foo',
  body: 'bar',
  userId: 1
}
*/

Note: the resource will not be really created on the server but it will be faked as if.

$.ajax('http://jsonplaceholder.typicode.com/posts/1', {
  method: 'PUT',
  data: {
    id: 1,
    title: 'foo',
    body: 'bar',
    userId: 1
  }
}).then(function(data) {
  console.log(data);
});
 
/* will return
{
  id: 1
  title: 'foo',
  body: 'bar',
  userId: 1
}
*/
$.ajax('http://jsonplaceholder.typicode.com/posts/1', {
  method: 'PATCH',
  data: {
    title: 'foo'
  }
}).then(function(data) {
  console.log(data);
});
 
/* will return
{
  id: 1
  title: 'foo',
  body: 'quia et suscipit [...]',
  userId: 1
}
*/

Note: the resource will not be really updated on the server but it will be faked as if.

// DELETE returns a 204 status only 
$.ajax('http://jsonplaceholder.typicode.com/posts/1', {
  method: 'DELETE'
});

Note: the resource will not be really deleted on the server but it will be faked as if.

Basic filtering is supported through query parameters.

// Will return all the posts that belong to the first user 
$.ajax('http://jsonplaceholder.typicode.com/posts?userId=1').then(function(data) {
  console.log(data);
});

One level of nested route is available.

$.ajax('http://jsonplaceholder.typicode.com/posts/1/comments').then(function(data) {
  console.log(data);
});
// Which is equivalent to /comments?postId=1 

Here's the list of available nested routes:

  • http://jsonplaceholder.typicode.com/posts/1/comments
  • http://jsonplaceholder.typicode.com/albums/1/photos
  • http://jsonplaceholder.typicode.com/users/1/albums
  • http://jsonplaceholder.typicode.com/users/1/todos
  • http://jsonplaceholder.typicode.com/users/1/posts
$.ajax('http://jsonplaceholder.typicode.com/posts/1', {
  dataType: 'jsonp'
}).then(function(data) {
  console.log(data);
});