GET /users?status=active&role=admin # Simple equality
GET /users?created_after=2024-01-01 # Range filters
GET /users?search=john # Full-text search
GET /users?filter[status]=active # JSON:API style
Sorting
GET /users?sort=name # Ascending (default)
GET /users?sort=-created_at # Descending (prefix -)
GET /users?sort=status,-created_at # Multi-field sort
Error Responses
RFC 7807 Problem Details
{
"type": "https://api.example.com/errors/validation",
"title": "Validation Error",
"status": 422,
"detail": "The email field is not a valid email address.",
"instance": "/users",
"errors": [
{
"field": "email",
"message": "Must be a valid email address",
"code": "INVALID_FORMAT"
}
]
}
Error Design Principles
Use consistent error format across all endpoints
Include machine-readable error codes
Provide human-readable messages
Include field-level details for validation errors
Never expose stack traces or internal details in production
Rate Limiting
Algorithms
Algorithm
How It Works
Best For
Token bucket
Tokens added at fixed rate, consumed per request
Burst-tolerant APIs
Sliding window
Count requests in rolling time window
Strict rate enforcement
Fixed window
Count resets at interval boundaries
Simple implementation
Response Headers
X-RateLimit-Limit: 100 # Max requests per window
X-RateLimit-Remaining: 45 # Requests left
X-RateLimit-Reset: 1640000000 # Window reset time (Unix)
Retry-After: 30 # Seconds to wait (on 429)
Laravel API Patterns
API Resources (Response Transformation)
// Transform Eloquent models into consistent JSON responses
class UserResource extends JsonResource {
public function toArray(Request $request): array {
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'orders_count' => $this->when($this->orders_count !== null, $this->orders_count),
'created_at' => $this->created_at->toISOString(),
];
}
}
// Collection with pagination
return UserResource::collection(User::paginate(25));
Laravel API Best Practices
API Resources — Never return Eloquent models directly; use Resources for consistent shape
Form Requests — Validate and authorize in dedicated request classes
Sanctum — Token-based auth for SPAs and mobile (lightweight alternative to Passport)
Passport — Full OAuth2 server for third-party API access
API versioning — Use route prefixes (/api/v1/) or header-based
Rate limiting — Built-in via RateLimiter facade and throttle middleware
Scribe / Scramble — Auto-generate API docs from code annotations
Documentation
OpenAPI / Swagger
Design API-first — write spec before code
Include request/response examples for every endpoint
Document all error responses, not just success
Use $ref for reusable schemas
Generate client SDKs from spec (openapi-generator)
Documentation Best Practices
Interactive docs (Swagger UI, Stoplight, Redoc)
Include authentication setup and getting started guide
Provide runnable examples (cURL, SDK snippets)
Changelog for API changes
Status page for API health
Industry Guidelines Summary
Microsoft REST API Guidelines
Use JSON as default format
Collections return { value: [...] } wrapper
Support $filter, $orderby, $top, $skip OData conventions
Long-running operations return 202 Accepted with status URL
Google API Design Guide
Resource-oriented design
Standard methods: List, Get, Create, Update, Delete
Custom methods via :verb suffix — POST /users/{id}:activate
Use field masks for partial updates
Consistent naming: camelCase for fields, kebab-case for URLs
Zalando RESTful Guidelines
Must use lowercase with hyphens for path segments
Must use snake_case for query parameters and JSON fields