Install
$ agentstack add skill-luckys-agent-skills-rest-api-best-practices ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
REST API Best Practices
Use this skill when the main question is how to design, review, or improve a REST API — from URL structure to error formats to security.
Working Style
- Start from what the consumer needs, not from what the database looks like.
- Use HTTP as designed — methods, status codes, and headers carry meaning.
- Express domain capabilities, not data operations.
- Make errors as informative as successes.
- Design for change: version early, break compatibility deliberately.
Design Workflow
- Define the resources.
- What are the concepts the consumer needs to interact with?
- Name them with nouns, in plural form.
- Avoid verbs in URLs — the HTTP method is the verb.
- Choose the right HTTP method.
- GET for retrieval (safe, idempotent, cacheable)
- POST for creation or non-idempotent operations
- PUT for full replacement (idempotent)
- PATCH for partial update
- DELETE for removal (idempotent)
- Design the URL.
- Keep paths flat where possible — at most two levels of nesting.
- Use query parameters for filtering, sorting, and pagination.
- Use task URLs (
POST /orders/{id}/cancel) for domain operations that aren't simple CRUD.
- Define response shapes.
- Choose a consistent field naming convention (camelCase or snake_case) and stick to it.
- Return only what the consumer needs.
- Use HTTP headers for metadata (pagination, rate limits).
- Define error responses.
- Use the right 4xx or 5xx status code — never return 200 for errors.
- Return a structured error body with a machine-readable code and a human-readable message.
- Follow RFC 9457 (Problem Details, which obsoletes RFC 7807) when the team needs a standard.
- Add versioning.
- Default to URL versioning (
/v1/). - Treat a breaking change as a reason to bump the version, not to patch silently.
Heuristics
Resource Naming
Nouns, plural, lowercase, kebab-case for multi-word: /user-profiles, /order-items.
HTTP Method Semantics
GET is safe and must never change state. POST creates or triggers actions. PUT replaces the entire resource. PATCH patches specific fields. DELETE removes.
Status Code Choice
2xx = success. 4xx = client error. 5xx = server error. Never return 200 for a failed operation.
Error Format
One consistent error envelope for all failures. Machine-readable code field, human-readable message, optional errors array for field-level validation details.
Pagination
Default to cursor-based for large or real-time datasets. Offset-based is fine for small, bounded collections. Always include a Link header with navigation links.
CRUD vs. Task-Based Design
Avoid exposing raw CRUD when the domain has real business operations. Prefer POST /orders/{id}/cancel over PATCH /orders/{id} with { "status": "cancelled" }.
Day-to-Day Rules
- Use plural nouns for collection endpoints.
- Never put verbs in URL paths — the HTTP method is the verb.
- Return 201 Created (not 200) after a successful POST that creates a resource.
- Include a
Locationheader pointing to the new resource after 201. - Return 204 No Content when there is nothing meaningful to return in the body.
- Never expose stack traces, SQL errors, or internal paths in error responses.
- Paginate every collection endpoint — never return an unbounded list.
- Use
AcceptandContent-Typeheaders for content negotiation. - Put secrets in headers, never in query parameters.
- Always use HTTPS — never plain HTTP for API traffic.
Good Signals
- URL paths read like a sentence:
GET /orders/{id}/items. - Every status code is intentional and precise.
- Errors have a machine-readable code the client can branch on.
- Pagination is consistent across all collection endpoints.
- Breaking changes require a version bump.
- The API surface reflects domain language, not table names.
Warning Signs
- Verbs in URL paths:
/getUser,/createOrder,/deleteItem. - 200 OK returned for validation errors or business failures.
- Error bodies expose stack traces or raw SQL.
- Collections returned without pagination.
- Inconsistent field naming: sometimes
userId, sometimesuser_id. - Every endpoint maps directly to a database table with full CRUD.
- No versioning strategy — breaking changes deployed silently.
- API key or token passed as a query parameter.
- Response objects nested more than two levels deep.
- No request ID header — errors cannot be correlated in logs.
- No documentation or documentation that doesn't match reality.
References
- Read
references/url-design.mdfor URL structure, naming conventions, nesting rules, versioning, and task-based URLs. - Read
references/http-semantics.mdfor HTTP method semantics, idempotency, safety, status code selection, and key headers. - Read
references/request-response-design.mdfor filtering, sorting, pagination (offset and cursor), content negotiation, and response shape. - Read
references/error-handling.mdfor RFC 9457 Problem Details, centralized mapping, status policy, redaction, domain failure translation, and validation errors. - Read
references/security.mdfor authentication (JWT, API keys, OAuth 2.0), authorization, rate limiting, CORS, and HTTPS enforcement. - Read
references/api-design-philosophy.mdfor REST architectural constraints, the CRUD anti-pattern, task-based API design, and HATEOAS. - Read
references/observability.mdfor request IDs, structured logging, metrics, distributed tracing, health endpoints, and alerting. - Read
references/documentation.mdfor what to document per endpoint, working examples, OpenAPI 3.x spec structure, keeping docs executable with contract testing, and changelog practices. - Read
references/caching.mdfor Cache-Control directives, ETag/Last-Modified validation, conditional writes (optimistic concurrency), cache layers, and invalidation strategies. - Read
references/testing-apis.mdfor the API test pyramid, contract testing (OpenAPI, Pact), what to test beyond the happy path, and test isolation. - Read
references/language-examples.mdfor an index of language-specific implementation examples. - Read
references/typescript-examples.mdfor REST API implementation in TypeScript (Express, NestJS). - Read
references/python-examples.mdfor REST API implementation in Python (FastAPI, Django REST Framework). - Read
references/go-examples.mdfor REST API implementation in Go (net/http, Chi). - Read
references/php-examples.mdfor REST API implementation in PHP (Laravel, Symfony). - Read
references/java-examples.mdfor REST API implementation in Java (Spring Boot 3.x). - Read
references/rust-examples.mdfor REST API implementation in Rust (axum).
Related Skills
- Use
ddd-best-practiceswhen the API surface should reflect a Bounded Context or align with domain language. - Use
design-patterns-best-practicesfor internal patterns within the API implementation (Repository, Service Layer, etc.). - Use
oop-best-practicesfor controller and service design within the API layer.
Source Influences
This skill is synthesized from:
- REST API Design Rulebook by Mark Masse
- RESTful Web APIs by Leonard Richardson & Mike Amundsen
- RFC 9457 — Problem Details for HTTP APIs
- RFC 9110 — HTTP Semantics
- Fran Iglesias — API REST series (franiglesias.github.io)
- Derek Comartin — "CRUD APIs are Poor Design" (codeopinion.com)
- Postman REST API Best Practices
- Building Microservices by Sam Newman
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: luckys
- Source: luckys/agent-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.