An interactive comparison of API paradigms
{
  user(id: "1") {
    name
    email
    posts {
      title
      comments {
        text
      }
    }
  }
}
                    // Response will appear here
                    GET /users/1
GET /users/1/posts
GET /posts/1/comments
GET /posts/2/comments
...
                    // Response will appear here
                    Client specifies exactly what data it needs in a single request
Server defines fixed data structures returned by multiple endpoints
Single endpoint for all operations
Multiple endpoints based on resources
No over-fetching or under-fetching
Often returns too much or too little data
Continuous evolution without versioning
Often requires explicit versioning (v1, v2)