Skip to content

REST API Design


Definition

REST API Definition


HTTP Methods

HTTP Methods


Status Codes

HTTP Status Codes


Request/Response Design

// REQUEST DESIGN

// Path parameters: Identify resource
GET /users/{userId}/orders/{orderId}

// Query parameters: Filter, sort, paginate
GET /users?status=active&sort=created_at:desc&page=1&limit=20

// Request body: Create/update data
POST /users
Content-Type: application/json
{
    "name": "John Doe",
    "email": "[email protected]"
}

// RESPONSE DESIGN

// Single resource
{
    "id": "123",
    "name": "John Doe",
    "email": "[email protected]",
    "createdAt": "2024-01-15T10:30:00Z"
}

// Collection with pagination
{
    "data": [
        { "id": "1", "name": "John" },
        { "id": "2", "name": "Jane" }
    ],
    "pagination": {
        "page": 1,
        "limit": 20,
        "total": 100,
        "totalPages": 5
    },
    "links": {
        "self": "/users?page=1",
        "next": "/users?page=2",
        "last": "/users?page=5"
    }
}

// Error response
{
    "error": {
        "code": "VALIDATION_ERROR",
        "message": "Invalid request parameters",
        "details": [
            { "field": "email", "message": "Invalid email format" },
            { "field": "age", "message": "Must be positive" }
        ]
    },
    "requestId": "abc-123"
}

Versioning

API Versioning


Best Practices

// URL NAMING
// ✓ Use nouns: /users, /orders, /products
// ✗ Avoid verbs: /getUsers, /createOrder

// ✓ Plural nouns: /users, /orders
// ✗ Singular: /user, /order (inconsistent)

// ✓ Lowercase with hyphens: /order-items
// ✗ camelCase or underscores: /orderItems, /order_items

// ✓ Hierarchy reflects relationships
GET /users/123/orders/456/items

// FILTERING, SORTING, PAGINATION
GET /orders?status=pending&created_after=2024-01-01
GET /orders?sort=created_at:desc,total:asc
GET /orders?page=2&limit=20
GET /orders?cursor=eyJpZCI6MTIzfQ==  // Cursor pagination

// PARTIAL RESPONSES (fields selection)
GET /users/123?fields=id,name,email

// BULK OPERATIONS
POST /users/bulk
[{ "name": "John" }, { "name": "Jane" }]

DELETE /orders?ids=1,2,3

// ASYNC OPERATIONS
POST /reports
202 Accepted
Location: /reports/123/status

GET /reports/123/status
{ "status": "processing", "progress": 45 }

// RATE LIMITING HEADERS
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1609459200

Tips & Tricks

Tips and Tricks