āļāļēāļĢāđāļāđ JSON āđāļ REST API: āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļ
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 āļāļāļāļāļļāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļāļąāļāļāļē