Use when designing REST or GraphQL APIs, defining endpoints, implementing pagination/filtering, handling API versioning, or establishing API documentation with OpenAPI/Swagger.
Use when designing REST or GraphQL APIs, defining endpoints, implementing pagination/filtering, handling API versioning, or establishing API documentation with OpenAPI/Swagger.
GET /users?status=active&role=admin # Filtering
GET /users?sort=name&order=asc # Sorting
GET /users?fields=id,name,email # Field selection
GET /users?search=john # Search
Complex Filters
GET /orders?created_gte=2024-01-01&created_lte=2024-12-31
GET /products?price_min=10&price_max=100
GET /users?tags=premium,verified
Versioning
URL Versioning (Recommended)
/api/v1/users
/api/v2/users
Header Versioning
GET /users
Accept: application/vnd.api+json; version=2
Authentication
Bearer Token
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
API Key
X-API-Key: your-api-key
// or in query param (less secure)
GET /users?api_key=your-api-key
{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Too many requests","retryAfter":60}}
Endpoint Examples
User CRUD
POST /api/v1/users # Create user
GET /api/v1/users # List users
GET /api/v1/users/:id # Get user
PUT /api/v1/users/:id # Replace user
PATCH /api/v1/users/:id # Update user
DELETE /api/v1/users/:id # Delete user
# Nested resources
GET /api/v1/users/:id/orders # User's orders
POST /api/v1/users/:id/orders # Create order for user
Actions (RPC-style)
For non-CRUD operations, use verbs as sub-resources:
POST /api/v1/users/:id/activate
POST /api/v1/orders/:id/cancel
POST /api/v1/payments/:id/refund
GraphQL Patterns
Schema Design
type User {id: ID!name: String!email: String!orders:[Order!]!}typeQuery{
user(id: ID!): User
users(filter: UserFilter, pagination: Pagination): UserConnection!}typeMutation{
createUser(input: CreateUserInput!): User!
updateUser(id: ID!, input: UpdateUserInput!): User!
deleteUser(id: ID!): Boolean!}input UserFilter {status: UserStatus
role: UserRole
search: String
}input Pagination {first: Int
after: String
last: Int
before: String
}
Error Handling
type MutationResult {success: Boolean!errors:[Error!]user: User
}type Error {code: String!message: String!field: String
}typeMutation{
createUser(input: CreateUserInput!): MutationResult!}