← āļāļĨāļąāļšāđ„āļ›āļ„āļđāđˆāļĄāļ·āļ­

āļāļēāļĢāđƒāļŠāđ‰ JSON āđƒāļ™ REST API: āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”

· āđāļ—āđ‡āļ: json, rest-api, api-design, json-best-practices, pagination, web-development

JSON āđƒāļ™ REST API

JSON āđāļĨāļ° REST API āđ€āļ›āđ‡āļ™āļ„āļđāđˆāļ—āļĩāđˆāļĨāļ‡āļ•āļąāļ§āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡ āđ„āļ§āļĒāļēāļāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļšāļēāļ‚āļ­āļ‡ JSON, āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļš array āđāļšāļš native āđāļĨāļ°āļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ āļēāļĐāļēāđāļšāļšāļŠāļēāļāļĨāļ—āļģāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļ›āļĢāļīāļĒāļēāļĒāļŠāļģāļŦāļĢāļąāļš Web API āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ āđāļ•āđˆāļāļēāļĢāđƒāļŠāđ‰ JSON āđƒāļ™ API āļ‚āļ­āļ‡āļ„āļļāļ“āđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āļžāļ­ -- āļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāđāļšāļšāđāļœāļ™āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļĒāļ­āļĄāļĢāļąāļšāļ—āļģāđƒāļŦāđ‰ API āļ‚āļ­āļ‡āļ„āļļāļ“āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™ āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ āđāļĨāļ°āļœāļŠāļēāļ™āļĢāļ§āļĄāđ„āļ”āđ‰āļ‡āđˆāļēāļĒ

āļĢāļđāļ›āđāļšāļš Request āđāļĨāļ° Response

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ Envelope āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™

āđƒāļŠāđ‰ JSON envelope āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš API āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļēāļ‡āļāļąāđˆāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāļ„āļēāļ”āđ€āļ”āļēāđ„āļ”āđ‰āđāļĨāļ°āļĨāļ”āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”

{
  "status": "success",
  "data": {
    "user": {
      "id": 123,
      "name": "Alice",
      "email": "alice@example.com"
    }
  },
  "meta": {
    "requestId": "req-a1b2c3d4",
    "timestamp": "2026-07-19T10:30:00Z"
  }
}

Snake Case āļāļąāļš Camel Case

āđ€āļĨāļ·āļ­āļāđāļšāļšāđāļœāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđāļšāļšāļŦāļ™āļķāđˆāļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āļ—āļąāđˆāļ§āļ—āļąāđ‰āļ‡ API āļ‚āļ­āļ‡āļ„āļļāļ“:

  • Camel Case (createdAt, firstName): āļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ JavaScript/TypeScript
  • Snake Case (created_at, first_name): āļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ Python, Ruby āđāļĨāļ° PHP

āđ„āļĄāđˆāļ§āđˆāļēāļ„āļļāļ“āļˆāļ°āđ€āļĨāļ·āļ­āļāđāļšāļšāđ„āļŦāļ™ āļˆāļąāļ”āļ—āļģāđ€āļ­āļāļŠāļēāļĢāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™āđāļĨāļ°āļžāļīāļˆāļēāļĢāļ“āļēāđƒāļŠāđ‰ transformation layer āļŦāļēāļāļ āļēāļĐāļē backend āļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļŠāđ‰āđāļšāļšāđāļœāļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡

HTTP Status Codes āļāļąāļš JSON

HTTP status codes āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđ€āļŠāļĢāļīāļĄāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš JSON āļ‚āļ­āļ‡āļ„āļļāļ“ āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™:

| Status Code | Meaning | When to Use | |-------------|---------|-------------| | 200 OK | Success | GET, PUT, PATCH success | | 201 Created | Resource created | POST success | | 204 No Content | Deletion success | DELETE success (no JSON body) | | 400 Bad Request | Invalid JSON syntax | Malformed request body | | 401 Unauthorized | Authentication required | Missing or invalid token | | 403 Forbidden | Insufficient permissions | Valid auth but not allowed | | 404 Not Found | Resource doesn't exist | Invalid ID or path | | 422 Unprocessable Entity | Validation failure | Semantic errors in valid JSON | | 429 Too Many Requests | Rate limit hit | Client exceeding limits | | 500 Internal Server Error | Server-side failure | Unexpected errors |

āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļĄāļēāļ•āļĢāļāļēāļ™

{
  "status": "error",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "The request body contains invalid fields",
    "details": [
      {
        "field": "email",
        "message": "Must be a valid email address",
        "code": "INVALID_FORMAT"
      },
      {
        "field": "age",
        "message": "Must be a positive integer",
        "code": "OUT_OF_RANGE"
      }
    ]
  }
}

āļ—āļĢāļąāļžāļĒāļēāļāļĢāđāļšāļšāļ‹āđ‰āļ­āļ™ (Nested Resources)

āļāļēāļĢāđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒ

REST API āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđāļŠāļ”āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡ āļ™āļĩāđˆāļ„āļ·āļ­āļĢāļđāļ›āđāļšāļšāļ—āļąāđˆāļ§āđ„āļ›:

āđāļšāļšāļāļąāļ‡ (Embedded / eager loading):

{
  "order": {
    "id": 5001,
    "total": 29.99,
    "customer": {
      "id": 123,
      "name": "Alice",
      "email": "alice@example.com"
    },
    "items": [
      {
        "productId": 42,
        "name": "Widget",
        "quantity": 2,
        "price": 14.99
      }
    ]
  }
}

āđāļšāļšāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ (Referenced / lazy loading) -- āđƒāļŠāđ‰ IDs āđāļĨāļ°āđƒāļŦāđ‰ endpoints āđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļ:

{
  "order": {
    "id": 5001,
    "total": 29.99,
    "customerId": 123,
    "itemIds": [101, 102]
  }
}

āļāļŽāļ—āļąāđˆāļ§āđ„āļ›: āļāļąāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āđ€āļŠāļĄāļ­ āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļ”āļķāļ‡āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļŦāļĢāļ·āļ­āđƒāļ™āđ€āļ§āļĨāļēāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™

āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļšāđˆāļ‡āļŦāļ™āđ‰āļē (Pagination)

āđ€āļĄāļ·āđˆāļ­āļŠāđˆāļ‡āļ„āļ·āļ™āļĢāļēāļĒāļāļēāļĢāļ—āļĢāļąāļžāļĒāļēāļāļĢ āļāļēāļĢāđāļšāđˆāļ‡āļŦāļ™āđ‰āļēāđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™ āđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļšāđˆāļ‡āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™:

Offset-Based Pagination

{
  "status": "success",
  "data": [
    { "id": 1, "name": "User 1" },
    { "id": 2, "name": "User 2" }
  ],
  "pagination": {
    "page": 1,
    "perPage": 20,
    "totalItems": 156,
    "totalPages": 8,
    "links": {
      "first": "/api/users?page=1&perPage=20",
      "prev": null,
      "next": "/api/users?page=2&perPage=20",
      "last": "/api/users?page=8&perPage=20"
    }
  }
}

Cursor-Based Pagination (āđāļ™āļ°āļ™āļģāļŠāļģāļŦāļĢāļąāļšāļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ)

{
  "status": "success",
  "data": [
    { "id": 100, "name": "User 100" },
    { "id": 101, "name": "User 101" }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6MTAxfQ==",
    "hasMore": true
  }
}

āļāļēāļĢāđāļšāđˆāļ‡āļŦāļ™āđ‰āļēāđāļšāļš cursor āļĄāļĩāļ„āļ§āļēāļĄāļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āļĄāļēāļāļāļ§āđˆāļēāļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĢāļĩāļĒāļĨāđ„āļ—āļĄāđŒāļ—āļĩāđˆāļĢāļ°āđ€āļšāļĩāļĒāļ™āđƒāļŦāļĄāđˆāļ­āļēāļˆāđ€āļĨāļ·āđˆāļ­āļ™āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļŦāļ™āđ‰āļē

JSON āđƒāļ™ API Requests

POST / PUT Request Bodies

āļĢāļąāļš JSON āļ”āđ‰āļ§āļĒ header Content-Type: application/json:

{
  "title": "New Blog Post",
  "content": "This is the content...",
  "tags": ["json", "rest-api"],
  "published": false
}

āļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļšāļēāļ‡āļŠāđˆāļ§āļ™āļ”āđ‰āļ§āļĒ PATCH

āđƒāļŠāđ‰ PATCH āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļšāļēāļ‡āļŠāđˆāļ§āļ™ āļĢāļąāļšāđ€āļ‰āļžāļēāļ°āļŸāļīāļĨāļ”āđŒāļ—āļĩāđˆāļ„āļ§āļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡:

// PATCH /api/users/123
{
  "email": "newemail@example.com"
}

āļāļēāļĢāļāļĢāļ­āļ‡ āļāļēāļĢāđ€āļĢāļĩāļĒāļ‡āļĨāļģāļ”āļąāļš āđāļĨāļ°āļāļēāļĢāļ„āđ‰āļ™āļŦāļē

āđƒāļŠāđ‰ query parameters āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļĢāļąāļāļĐāļē JSON body āđƒāļŦāđ‰āļŠāļ°āļ­āļēāļ”:

GET /api/users?filter[role]=admin&sort=-createdAt&search=alice
{
  "status": "success",
  "data": [ /* filtered, sorted results */ ]
}

āļāļēāļĢāļˆāļģāļāļąāļ”āļ­āļąāļ•āļĢāļē (Rate Limiting)

āļĢāļ§āļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļˆāļģāļāļąāļ”āļ­āļąāļ•āļĢāļēāđƒāļ™ response headers āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāđƒāļ™ JSON body:

{
  "status": "error",
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests. Please try again later."
  },
  "meta": {
    "rateLimit": {
      "limit": 100,
      "remaining": 0,
      "resetAt": "2026-07-19T11:00:00Z"
    }
  }
}

āļĢāļēāļĒāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ‚āļ­āļ‡ JSON

  • [ ] āđƒāļŠāđ‰āļāļēāļĢāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ„āļĩāļĒāđŒāļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™ (camelCase āļŦāļĢāļ·āļ­ snake_case āļ•āļĨāļ­āļ”āļ—āļąāđ‰āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ)
  • [ ] āļŠāđˆāļ‡āļ„āļ·āļ™ HTTP status codes āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ—āļļāļāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš
  • [ ] āļĢāļ§āļĄāļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™āļžāļĢāđ‰āļ­āļĄāļĢāļŦāļąāļŠāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āđˆāļēāļ™āđ„āļ”āđ‰
  • [ ] āđāļšāđˆāļ‡āļŦāļ™āđ‰āļē list endpoints āļ”āđ‰āļ§āļĒ pagination object āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™
  • [ ] āđƒāļŠāđ‰ JSON Schema āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļ—āļģāđ€āļ­āļāļŠāļēāļĢāđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ request/response
  • [ ] āļ•āļąāđ‰āļ‡āļ„āđˆāļē Content-Type: application/json āļšāļ™ JSON endpoints āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
  • [ ] āļšāļĩāļšāļ­āļąāļ”āļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš JSON āļ”āđ‰āļ§āļĒ gzip āļŦāļĢāļ·āļ­ brotli āđƒāļ™āļāļēāļĢāļœāļĨāļīāļ•
  • [ ] āļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļ‚āļĩāļ”āļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ” payload āļŠāļđāļ‡āļŠāļļāļ” (āđ€āļŠāđˆāļ™ 1MB āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ›āļĢāļīāļĒāļēāļĒ)
  • [ ] āđƒāļŠāđ‰ HTTPS āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāļ‚āđ‰āļ­āļĄāļđāļĨ JSON āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļŠāđˆāļ‡
  • [ ] āļˆāļąāļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāļ”āļĩāļšāļąāļāđ‚āļ”āļĒāđ„āļĄāđˆāđ€āļ›āļīāļ”āđ€āļœāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™

āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš JSON āļ‚āļ­āļ‡ API āļ‚āļ­āļ‡āļ„āļļāļ“

āļĢāļąāļ™āļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš API āļ‚āļ­āļ‡āļ„āļļāļ“āļœāđˆāļēāļ™ JSON validator āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļāđˆāļ­āļ™āļ–āļķāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒ āļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļš JSON āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āđāļĨāļ°āļ–āļđāļāļ•āđ‰āļ­āļ‡āļ—āļģāđƒāļŦāđ‰ API āļ‚āļ­āļ‡āļ„āļļāļ“āļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđāļĨāļ°āđ€āļ›āđ‡āļ™āļĄāļīāļ•āļĢāļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ JSON Formatter & Validator āļ‚āļ­āļ‡āđ€āļĢāļēāđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļš payloads āļ‚āļ­āļ‡āļ„āļļāļ“āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē

āļāļēāļĢāđƒāļŠāđ‰ JSON āđƒāļ™ REST API: āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ” - CoolTool