Skip to content
Back to skills

Api Design

ASecurity

REST API conventions — resources, status codes, pagination, error shapes. Use when designing or reviewing routes, controllers, endpoints, serializers, or schemas.

  • 8 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 3, 2026
ai-agentsapi

Works with

  • cursor
  • cli
  • api

Security analysis

A100/100

Scanned September 3, 2026

npx -y skills add edjchapman/claude-code-config --skill api-design --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Api Design?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Api Design
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/edjchapman-api-design/badge)](https://www.skillsdirectory.com/skills/edjchapman-api-design)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: api-design
description: REST API conventions — resources, status codes, pagination, error shapes. Use when designing or reviewing routes, controllers, endpoints, serializers, or schemas.
---

# API Design Standards

Apply these conventions when building or reviewing REST APIs.

## URL Structure

- Use nouns, not verbs: `/users` not `/getUsers`
- Plural resource names: `/users`, `/orders`, `/products`
- Nested resources for clear ownership: `/users/{id}/orders`
- Maximum 2 levels of nesting; beyond that, use query parameters
- Use kebab-case: `/user-profiles` not `/userProfiles`

## HTTP Methods

| Method | Purpose          | Idempotent | Response                  |
| ------ | ---------------- | ---------- | ------------------------- |
| GET    | Read resource(s) | Yes        | 200 with data             |
| POST   | Create resource  | No         | 201 with created resource |
| PUT    | Full replace     | Yes        | 200 with updated resource |
| PATCH  | Partial update   | Yes        | 200 with updated resource |
| DELETE | Remove resource  | Yes        | 204 no content            |

## Status Codes

Use the correct status code for the situation:

### Success

- `200 OK` -- successful GET, PUT, PATCH
- `201 Created` -- successful POST that creates a resource
- `204 No Content` -- successful DELETE

### Client Errors

- `400 Bad Request` -- validation failure, malformed input
- `401 Unauthorized` -- missing or invalid authentication
- `403 Forbidden` -- authenticated but lacking permission
- `404 Not Found` -- resource doesn't exist
- `409 Conflict` -- duplicate resource, state conflict
- `422 Unprocessable Entity` -- valid syntax but semantic errors
- `429 Too Many Requests` -- rate limit exceeded

### Server Errors

- `500 Internal Server Error` -- unexpected server failure
- `503 Service Unavailable` -- temporary overload or maintenance

## Error Response Format

Use a consistent error structure across all endpoints:

```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "The request contains invalid fields.",
    "details": [
      {
        "field": "email",
        "message": "Must be a valid email address."
      }
    ]
  }
}
```

- Always include a machine-readable `code`
- Include human-readable `message`
- Use `details` array for field-level validation errors
- Never expose stack traces or internal details in production

## Pagination

Use cursor-based or offset-based pagination for list endpoints:

```json
{
  "data": [...],
  "pagination": {
    "next_cursor": "abc123",
    "has_more": true,
    "total_count": 142
  }
}
```

- Default page size: 20, max: 100
- Include `total_count` when practical (skip for expensive counts)
- Use `cursor` param for cursor-based, `page`/`limit` for offset-based

## Filtering and Sorting

- Filter with query params: `GET /users?status=active&role=admin`
- Sort with `sort` param: `GET /users?sort=-created_at` (prefix `-` for descending)
- Search with `q` or `search` param: `GET /users?q=john`

## Versioning

- Use URL path versioning: `/api/v1/users`
- Only increment major version for breaking changes
- Support previous version for a documented deprecation period

## Response Envelope

Wrap responses consistently:

```json
{
  "data": { ... },
  "meta": {
    "request_id": "req_abc123",
    "timestamp": "2024-01-15T10:30:00Z"
  }
}
```

## Rate Limiting

- Return `429 Too Many Requests` when limit exceeded
- Include headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`
- Apply per-user or per-API-key, not per-IP alone

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.