
Api Designer
- 659 installs
- 65 repo stars
- Updated June 21, 2026
- charon-fan/agent-playbook
api-designer is a Claude Code skill that designs or refines REST and GraphQL APIs with resource-oriented routes, verbs, status codes, and maintainable specs for developers who need robust contracts before coding services
About
api-designer is an agent-playbook skill that acts as a REST and GraphQL API architect for new designs or reviews of existing APIs. It emphasizes resource-oriented routes, correct HTTP verbs, meaningful status codes, and maintainable specifications developers can implement against. The skill allows Read, Write, Edit, Bash, Grep, Glob, WebFetch, and WebSearch, and triggers background hooks for pattern learning and session logging after completion. Reach for api-designer when scaffolding a new service boundary, reviewing an API for scalability, or improving an existing surface before implementation begins.
- Activates for new API design, API review, improvements, and specification authoring.
- REST guidance: resource-oriented paths, method safety/idempotency table, and status-code usage.
- Explicit anti-patterns (e.g., POST /getUsers, redundant /create segments).
- GraphQL expertise called out alongside REST in the skill description.
- Playbook hooks suggest post-completion logging and background self-improvement triggers.
Api Designer by the numbers
- 659 all-time installs (skills.sh)
- Ranked #542 of 4,386 Backend & APIs skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/charon-fan/agent-playbook --skill api-designerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 659 |
|---|---|
| repo stars | ★ 65 |
| Security audit | 3 / 3 scanners passed |
| Last updated | June 21, 2026 |
| Repository | charon-fan/agent-playbook ↗ |
How do you design scalable REST and GraphQL APIs?
Design or refine REST and GraphQL APIs with resource-oriented routes, correct HTTP verbs, status codes, and maintainable specs before implementation.
Who is it for?
Backend developers defining or reviewing service APIs who want opinionated REST and GraphQL structure before writing handlers.
Skip if: Teams that only need client SDK generation, database schema design without HTTP surfaces, or automatic OpenAPI codegen from existing code alone.
When should I use this skill?
User asks to design a new API, review REST or GraphQL structure, or improve routes, verbs, and error semantics.
What you get
Resource-oriented route map, HTTP verb matrix, status code guidance, and review notes ready for OpenAPI or schema implementation.
- API route specification
- status code matrix
- design review notes
Files
API Designer
Expert in designing REST and GraphQL APIs that are robust, scalable, and maintainable.
When This Skill Activates
Activates when you:
- Design a new API
- Review API design
- Improve existing API
- Create API specifications
REST API Design Principles
1. Resource-Oriented Design
Good:
GET /users # List users
POST /users # Create user
GET /users/{id} # Get specific user
PATCH /users/{id} # Update user
DELETE /users/{id} # Delete userAvoid:
POST /getUsers # Should be GET
POST /users/create # Redundant
GET /users/get/{id} # Redundant2. HTTP Methods
| Method | Safe | Idempotent | Purpose |
|---|---|---|---|
| GET | ✓ | ✓ | Read resource |
| POST | ✗ | ✗ | Create resource |
| PUT | ✗ | ✓ | Replace resource |
| PATCH | ✗ | ✗ | Update resource |
| DELETE | ✗ | ✓ | Delete resource |
3. Status Codes
| Code | Meaning | Usage |
|---|---|---|
| 200 | OK | Successful GET, PATCH, DELETE |
| 201 | Created | Successful POST |
| 204 | No Content | Successful DELETE with no body |
| 400 | Bad Request | Invalid input |
| 401 | Unauthorized | Missing or invalid auth |
| 403 | Forbidden | Authenticated but not authorized |
| 404 | Not Found | Resource doesn't exist |
| 409 | Conflict | Resource already exists |
| 422 | Unprocessable | Valid syntax but semantic errors |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server error |
4. Naming Conventions
- URLs: kebab-case (
/user-preferences) - JSON: camelCase (
{"userId": "123"}) - Query params: snake_case or camelCase (
?page_size=10)
5. Pagination
GET /users?page=1&page_size=20
Response:
{
"data": [...],
"pagination": {
"page": 1,
"page_size": 20,
"total": 100,
"total_pages": 5
}
}6. Filtering and Sorting
GET /users?status=active&sort=-created_at,name
# -created_at = descending
# name = ascendingGraphQL API Design
Schema Design
type Query {
user(id: ID!): User
users(limit: Int, offset: Int): UserConnection!
}
type Mutation {
createUser(input: CreateUserInput!): CreateUserPayload!
updateUser(id: ID!, input: UpdateUserInput!): UpdateUserPayload!
}
type User {
id: ID!
email: String!
profile: Profile
posts(first: Int, after: String): PostConnection!
}
type UserConnection {
edges: [UserEdge!]!
pageInfo: PageInfo!
}
type UserEdge {
node: User!
cursor: String!
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}Best Practices
- Nullability: Default to non-null, nullable only when appropriate
- Connections: Use cursor-based pagination for lists
- Payloads: Use mutation payloads for consistent error handling
- Descriptions: Document all types and fields
API Versioning
Approaches
URL Versioning (Recommended):
/api/v1/users
/api/v2/usersHeader Versioning:
GET /users
Accept: application/vnd.myapi.v2+jsonVersioning Guidelines
- Start with v1
- Maintain backwards compatibility when possible
- Deprecate old versions with notice
- Document breaking changes
Authentication & Authorization
Authentication Methods
1. JWT Bearer Token
Authorization: Bearer <token>2. API Key
X-API-Key: <key>3. OAuth 2.0
Authorization: Bearer <access_token>Authorization
- Use roles/permissions
- Document required permissions per endpoint
- Return 403 for authorization failures
Rate Limiting
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1631234567Recommended limits:
- Public APIs: 100-1000 requests/hour
- Authenticated APIs: 1000-10000 requests/hour
- Webhooks: 10-100 requests/minute
Documentation Requirements
- All endpoints documented
- Request/response examples
- Authentication requirements
- Error response formats
- Rate limits
- SDK examples (if available)
Scripts
Generate API scaffold:
python scripts/generate_api.py <resource-name>Validate API design:
python scripts/validate_api.py openapi.yamlReferences
references/rest-patterns.md- REST design patternsreferences/graphql-patterns.md- GraphQL design patterns- REST API Tutorial
- GraphQL Best Practices
API Designer
A Claude Code skill for REST and GraphQL API design.
Installation
This skill is part of the agent-playbook collection.
Usage
You: Design an API for user management
You: Create API specification
You: Review this API designAPI Design Principles
1. Resource-Oriented: Nouns, not verbs 2. Consistent Naming: kebab-case for URLs 3. Proper HTTP Methods: GET, POST, PUT, DELETE 4. Status Codes: Correct HTTP status codes 5. Versioning: Plan for API evolution
Scripts
Generate API scaffold:
python scripts/generate_api.py <resource-name>Resources
GraphQL Patterns
Schema Design
- Use clear type names
- Avoid overly generic fields
Pagination
- Prefer cursor-based pagination
Mutations
- Use input objects for complex mutations
- Return updated entities and errors
REST Patterns
Resource Naming
- Use nouns (e.g., /users)
- Use plural for collections
Methods
- GET for retrieval
- POST for creation
- PUT/PATCH for updates
- DELETE for removal
Status Codes
- 200 OK
- 201 Created
- 204 No Content
- 400/401/403/404 for errors
#!/usr/bin/env python3
# Template generator for API design.
from pathlib import Path
import argparse
import textwrap
def write_output(path: Path, content: str, force: bool) -> bool:
if path.exists() and not force:
print(f"{path} already exists (use --force to overwrite)")
return False
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content, encoding="utf-8")
return True
def main() -> int:
parser = argparse.ArgumentParser(description="Generate a starter API design.")
parser.add_argument("--output", default="api-design.md", help="Output file path")
parser.add_argument("--name", default="example", help="Primary resource name")
parser.add_argument("--owner", default="team", help="Owning team or service")
parser.add_argument("--force", action="store_true", help="Overwrite existing file")
args = parser.parse_args()
content = textwrap.dedent(
f"""\
# API Design
## Overview
Describe the API for {args.name}.
## Ownership
- Owner: {args.owner}
- Stakeholders: TBD
## Goals
- Provide CRUD for {args.name}
- Maintain backward compatibility
## Non-Goals
- Bulk export
- Cross-service transactions
## Resources
- {args.name}
- {args.name}-metadata
## Endpoints
| Method | Path | Description | Auth |
| --- | --- | --- | --- |
| GET | /{args.name} | List {args.name} | Required |
| POST | /{args.name} | Create {args.name} | Required |
## Authentication
- OAuth2 bearer tokens
- Service-to-service mTLS
## Error Model
- Use RFC7807 problem details
- Standard error codes and retry hints
## Pagination and Filtering
- Cursor-based pagination
- Filter by status, owner, and created_at
## Rate Limits
- 100 rps per token, burst 200
## Observability
- Structured logs with request_id
- Metrics: latency, error rate, saturation
## Open Questions
- Define data retention policy
"""
).strip() + "\n"
output = Path(args.output)
if not write_output(output, content, args.force):
return 1
print(f"Wrote {output}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
# Template validator for API design.
from pathlib import Path
import argparse
DEFAULT_REQUIRED = [
"## Overview",
"## Ownership",
"## Resources",
"## Endpoints",
"## Authentication",
"## Error Model",
"## Pagination",
"## Rate Limits",
]
def main() -> int:
parser = argparse.ArgumentParser(description="Validate a generated artifact.")
parser.add_argument("--input", default="api-design.md", help="Input file path")
parser.add_argument(
"--require",
action="append",
default=[],
help="Additional required section heading",
)
args = parser.parse_args()
path = Path(args.input)
if not path.exists():
print(f"Missing file: {path}")
return 1
text = path.read_text(encoding="utf-8", errors="ignore")
text_lower = text.lower()
required = DEFAULT_REQUIRED + args.require
missing = [section for section in required if section.lower() not in text_lower]
if missing:
print("Missing required sections: " + ", ".join(missing))
return 1
print(f"Validated {path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
Related skills
FAQ
Does api-designer support GraphQL and REST?
api-designer covers both REST and GraphQL API architecture, including resource-oriented routes, HTTP verbs, status codes, and maintainable specifications for new or existing APIs.
When does api-designer activate in agent-playbook?
api-designer activates when designing a new API, reviewing API design, or improving an existing API, with optional background hooks for learning patterns and logging sessions.
Is Api Designer safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.