REST API JSON Response Best Practices
A well-structured JSON API response saves every consumer of your API time — frontend developers, mobile teams, and third-party integrators alike. Inconsistent shapes, unclear errors, and missing pagination metadata are some of the most common complaints about internal APIs. This guide covers the practices that make a JSON API pleasant to use.
Use a Consistent Response Envelope
Wrap every response — success or failure — in the same top-level shape, so clients can write one parsing path instead of branching per endpoint:
// Success response
{
"success": true,
"data": {
"id": 501,
"customerName": "Priya Sharma",
"total": 1499.0
},
"meta": null
}
// Error response — same top-level shape
{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more fields are invalid.",
"details": [
{ "field": "email", "message": "must be a valid email address" }
]
}
}Structure Errors Consistently
- Machine-readable code —
"VALIDATION_ERROR","NOT_FOUND","RATE_LIMITED"— so clients can branch logic without string-matching a message. - Human-readable message — safe to show directly to a user or log for debugging.
- Correct HTTP status code — 400 for bad input, 401 for missing auth, 403 for forbidden, 404 for not found, 422 for semantic validation errors, 500 for server errors.
- Field-level details — for validation failures, list exactly which fields failed and why.
- Never leak internals — do not include stack traces or database error strings in production error responses.
Pagination Metadata
List endpoints should return pagination details alongside the data, not force the client to guess:
{
"success": true,
"data": [
{ "id": 1, "name": "Priya Sharma" },
{ "id": 2, "name": "Rahul Verma" }
],
"meta": {
"page": 1,
"pageSize": 20,
"totalItems": 143,
"totalPages": 8,
"hasNextPage": true
}
}Naming Conventions: camelCase vs snake_case
Pick one convention and apply it everywhere — mixing conventions within a single API is the single most common source of frontend integration bugs:
// camelCase — common in JavaScript/TypeScript-first APIs
{ "customerName": "Priya Sharma", "orderTotal": 1499.0, "isPaid": true }
// snake_case — common in Python/Ruby ecosystems
{ "customer_name": "Priya Sharma", "order_total": 1499.0, "is_paid": true }
// Never mix within one response:
{ "customerName": "Priya Sharma", "order_total": 1499.0 } // inconsistent — avoidMore Practices Worth Adopting
- Use ISO 8601 for dates —
"2026-07-11T14:30:00Z", never a locale-specific string like"11/07/2026". - Never return null and missing key interchangeably — decide whether an absent field means "not applicable" (omit the key) or "explicitly empty" (
null), and be consistent. - Version your API — via URL (
/v1/orders) or a header, so breaking changes do not silently break existing clients. - Keep responses flat where possible — avoid unnecessary nesting that forces clients to write
data.result.items[0].value. - Document with real examples — a live example response is worth more than a written schema description alone.
Frequently Asked Questions
Either is acceptable as long as it is consistent across the entire API. camelCase is more common in JavaScript-first APIs since it matches JavaScript variable naming conventions, while snake_case is common in Python and Ruby ecosystems. Pick one and never mix them within the same API.
A good JSON API error response includes a machine-readable error code, a human-readable message, and the appropriate HTTP status code. For validation errors, it should also list which specific fields failed and why, so clients can display precise feedback.
Yes. Dev Brains AI JSON Formatter validates and pretty-prints any JSON response so you can quickly confirm its structure is correct.