REST API design conventions reference. An extension skill for api-architect that provides URL naming, HTTP method mapping, status code selection, pagination/filtering/sorting patterns, HATEOAS, and versioning strategies. Use when designing RESTful APIs involving 'REST conventions', 'URL design', 'HTTP status codes', 'pagination', 'API versioning', 'HATEOAS', etc. Note: GraphQL design and actual server implementation are outside the scope of this skill.
Scanned 9/7/2026
Install to Claude Code
npx -y skills add chodolmu/taskforge-pro --skill rest-api-conventions --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Rest Api Conventions?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/chodolmu-rest-api-conventions)More formats (shields.io, HTML) on the badges page.
---
name: rest-api-conventions
description: "REST API design conventions reference. An extension skill for api-architect that provides URL naming, HTTP method mapping, status code selection, pagination/filtering/sorting patterns, HATEOAS, and versioning strategies. Use when designing RESTful APIs involving 'REST conventions', 'URL design', 'HTTP status codes', 'pagination', 'API versioning', 'HATEOAS', etc. Note: GraphQL design and actual server implementation are outside the scope of this skill."
---
# REST API Conventions — RESTful API Design Conventions Reference
A reference of naming rules, status codes, and pagination patterns used by the api-architect agent when designing REST APIs.
## Target Agent
`api-architect` — Directly applies the conventions in this skill to API designs.
## URL Naming Rules
### Basic Principles
| Rule | Correct Example | Incorrect Example |
|------|----------------|-------------------|
| Plural nouns | `/users` | `/user`, `/getUsers` |
| Lowercase kebab-case | `/user-profiles` | `/userProfiles`, `/User_Profiles` |
| No verbs (use methods for CRUD) | `POST /orders` | `POST /createOrder` |
| Hierarchical relationships | `/users/{id}/orders` | `/getUserOrders` |
| No trailing slash | `/users` | `/users/` |
| No file extensions | `/users` (use Accept header) | `/users.json` |
### Resource URL Patterns
| Operation | Method | URL | Example |
|-----------|--------|-----|---------|
| List retrieval | GET | `/resources` | `GET /products` |
| Single retrieval | GET | `/resources/{id}` | `GET /products/123` |
| Create | POST | `/resources` | `POST /products` |
| Full update | PUT | `/resources/{id}` | `PUT /products/123` |
| Partial update | PATCH | `/resources/{id}` | `PATCH /products/123` |
| Delete | DELETE | `/resources/{id}` | `DELETE /products/123` |
### Relationship Resources
```
GET /users/{userId}/orders -- User's order list
GET /users/{userId}/orders/{orderId} -- User's specific order
POST /users/{userId}/orders -- Create order for user
```
### Non-CRUD Actions (RPC-Style Permitted)
```
POST /orders/{id}/cancel -- Cancel order
POST /users/{id}/verify-email -- Verify email
POST /reports/generate -- Generate report
POST /cart/checkout -- Proceed to checkout
```
## HTTP Status Code Selection Guide
### Success (2xx)
| Code | Meaning | When to Use |
|------|---------|-------------|
| 200 | OK | GET, PUT, PATCH success |
| 201 | Created | POST resource creation success (include Location header) |
| 204 | No Content | DELETE success, no response body |
### Client Errors (4xx)
| Code | Meaning | When to Use |
|------|---------|-------------|
| 400 | Bad Request | Malformed request, validation failure |
| 401 | Unauthorized | Authentication required (missing/expired token) |
| 403 | Forbidden | Authenticated but not authorized |
| 404 | Not Found | Resource does not exist |
| 405 | Method Not Allowed | HTTP method not permitted |
| 409 | Conflict | Resource conflict (duplicate creation, etc.) |
| 422 | Unprocessable Entity | Format is correct but violates business rules |
| 429 | Too Many Requests | Rate limit exceeded |
### Server Errors (5xx)
| Code | Meaning | When to Use |
|------|---------|-------------|
| 500 | Internal Server Error | Unexpected server error |
| 502 | Bad Gateway | Upstream service error |
| 503 | Service Unavailable | Maintenance/overload (include Retry-After header) |
## Pagination Patterns
### Offset-Based (Traditional)
```
GET /products?page=2&limit=20
Response:
{
"data": [...],
"pagination": {
"page": 2,
"limit": 20,
"total": 150,
"totalPages": 8
}
}
```
- Pros: Simple implementation, random page access
- Cons: Performance degradation with large datasets (OFFSET)
### Cursor-Based (Recommended)
```
GET /products?cursor=eyJpZCI6MTIzfQ&limit=20
Response:
{
"data": [...],
"pagination": {
"nextCursor": "eyJpZCI6MTQzfQ",
"hasMore": true
}
}
```
- Pros: Excellent performance with large datasets, safe for real-time data
- Cons: No total count or random page access
### Selection Criteria
| Scenario | Recommendation |
|----------|---------------|
| Admin dashboard (page numbers needed) | Offset |
| Infinite scroll | Cursor |
| Real-time feed | Cursor |
| 1M+ records | Cursor |
## Filtering/Sorting/Search Patterns
### Filtering
```
GET /products?category=electronics&price_min=10000&price_max=50000&status=active
```
### Sorting
```
GET /products?sort=price&order=asc
GET /products?sort=-created_at,+name (prefix style: - descending, + ascending)
```
### Search
```
GET /products?q=keyboard (full-text search)
GET /products?name=keyboard (specific field)
```
### Field Selection (Sparse Fieldsets)
```
GET /products?fields=id,name,price (only needed fields)
```
## Error Response Standard Format
### RFC 7807 (Problem Details)
```json
{
"type": "https://api.example.com/errors/validation",
"title": "Validation Error",
"status": 422,
"detail": "The request data is invalid",
"instance": "/products",
"errors": [
{
"field": "price",
"code": "INVALID_RANGE",
"message": "Price must be greater than 0"
}
]
}
```
## Versioning Strategies
| Strategy | Method | Pros | Cons |
|----------|--------|------|------|
| **URL Path** | `/v1/users` | Clear, simple routing | URL changes |
| **Header** | `Accept: application/vnd.api+json;version=1` | Clean URLs | Harder to debug |
| **Query** | `/users?version=1` | Can be optional | Complex caching |
**Recommended**: URL Path (`/v1/`) — Most intuitive and widely adopted
### Version Deprecation Policy
- New version released -> Maintain old version for 12 months
- Deprecation headers: `Deprecation: true`, `Sunset: 2025-12-31`
- Provide migration guide
## Response Envelope Pattern
### Single Resource Response
```json
{
"data": { "id": 1, "name": "Product" },
"meta": { "requestId": "abc-123" }
}
```
### List Response
```json
{
"data": [{ "id": 1 }, { "id": 2 }],
"pagination": { "page": 1, "limit": 20, "total": 150 },
"meta": { "requestId": "abc-123" }
}
```
## Idempotency
| Method | Idempotent | Safe | Description |
|--------|-----------|------|-------------|
| GET | Yes | Yes | Returns the same result |
| PUT | Yes | No | Same data repeated yields the same result |
| DELETE | Yes | No | Re-deleting an already deleted resource returns 404 |
| PATCH | No | No | Can make relative changes (counter++) |
| POST | No | No | May create duplicates -> Idempotency-Key recommended |
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!