{
    "api": "YAML JSON TOON Database",
    "version": "1.0.0",
    "format": "json",
    "dataset": {
        "id": 23,
        "slug": "http-client-error-guide",
        "title": "HTTP Client Error Status Codes (4xx)",
        "description": "Guide to 4xx client error responses: when to use 400 vs 401 vs 403 vs 404 vs 429, proper error responses, and user experience.",
        "category": "HTTP Status Codes",
        "category_slug": "http-status-codes",
        "tags": "http,client-errors,4xx,error-handling,security,rate-limiting",
        "view_count": 0,
        "created_at": 1777673262,
        "updated_at": 1777673262
    },
    "data": {
        "client_errors": [
            {
                "code": 400,
                "name": "Bad Request",
                "cause": "Malformed syntax, invalid request message framing, or deceptive request routing.",
                "example": "Missing required JSON field, invalid JSON syntax, query parameter type mismatch",
                "response_body": "{\"error\": \"Invalid input\", \"field\": \"email\", \"message\": \"Email format invalid\"}",
                "notes": "Server cannot or will not process request due to client error (not server fault)"
            },
            {
                "code": 401,
                "name": "Unauthorized",
                "cause": "Request requires user authentication; credentials missing or invalid.",
                "example": "No Authorization header, expired JWT, invalid API key",
                "response_headers": "WWW-Authenticate: Bearer realm=\"api\"",
                "notes": "Do not use for missing permissions (use 403); client may retry with credentials"
            },
            {
                "code": 403,
                "name": "Forbidden",
                "cause": "Server understood request but refuses to authorize; valid credentials but insufficient permissions.",
                "example": "User role lacks access to admin endpoint, IP blocked, account suspended",
                "response_body": "{\"error\": \"Access denied\", \"reason\": \"insufficient_privileges\"}",
                "notes": "Never expose why access denied in production (security through obscurity); log details server-side"
            },
            {
                "code": 404,
                "name": "Not Found",
                "cause": "Requested resource does not exist on server.",
                "example": "Non-existent URL path, deleted resource, typo in endpoint",
                "notes": "Do not reveal whether resource exists (prevents user enumeration); return generic message"
            },
            {
                "code": 405,
                "name": "Method Not Allowed",
                "cause": "Request method not supported for target resource.",
                "example": "GET on /api/users (expects POST), DELETE on read-only endpoint",
                "response_headers": "Allow: POST, PUT",
                "notes": "Include Allow header listing supported methods"
            },
            {
                "code": 408,
                "name": "Request Timeout",
                "cause": "Server did not receive complete request in time it was prepared to wait.",
                "example": "Client slow-down; slow POST body upload, client closed connection prematurely",
                "notes": "May be retried by client with exponential backoff; distinguish from 504 (server timeout)"
            },
            {
                "code": 409,
                "name": "Conflict",
                "cause": "Request conflicts with current state of resource; cannot be completed.",
                "example": "Editing stale version (optimistic concurrency), duplicate unique key, file lock conflict",
                "response_body": "{\"error\": \"Conflict\", \"detail\": \"Version mismatch; resource modified by others\"}",
                "notes": "Include details about conflict in body so client can resolve (e.g., current version)"
            },
            {
                "code": 429,
                "name": "Too Many Requests",
                "cause": "User sent too many requests in given time (rate limiting).",
                "example": "Exceeded 100 requests/minute limit, burst limit exceeded",
                "response_headers": "Retry-After: 60 (seconds)",
                "notes": "Include Retry-After header; implement exponential backoff on client"
            },
            {
                "code": 431,
                "name": "Request Header Fields Too Large",
                "cause": "Server unwilling to process request due to individual header fields too large.",
                "example": "Cookie header exceeds 4KB, extremely long User-Agent, huge custom header",
                "notes": "Often due to oversized cookies; consider clearing cookies or session reset"
            }
        ],
        "error_response_format": {
            "standard_fields": ["error", "message", "details", "code", "timestamp"],
            "example": {
                "error": "invalid_input",
                "message": "The provided email address is not valid.",
                "field": "email",
                "value": "not-an-email",
                "documentation_url": "https://api.example.com/docs/errors#INVALID_EMAIL"
            },
            "security_notes": "Never leak internal error messages, stack traces, SQL, file paths, or server configuration in production errors"
        }
    }
}
