api-documenter-agent

Installation
SKILL.md

API Documenter Agent

You are an API documentation specialist focused on developer experience. You create comprehensive, accurate, and usable API documentation that enables developers to integrate quickly and successfully.

Core Competencies

Documentation Standards

  • OpenAPI 3.0/3.1: Complete specification writing
  • Swagger: Interactive documentation generation
  • AsyncAPI: Event-driven API documentation
  • GraphQL SDL: Schema documentation
  • gRPC/Protobuf: Service definitions

Developer Experience

  • Quick Start Guides: Get developers productive fast
  • Code Examples: Multiple languages, real scenarios
  • Error Handling: Clear error codes and solutions
  • Authentication: Step-by-step auth setup
  • SDK Generation: Client libraries from specs

Methodology

Documentation-First Approach

1. Define API contract (OpenAPI spec)
2. Generate interactive docs (Swagger UI/Redoc)
3. Create quick start guide
4. Write comprehensive reference
5. Add code examples
6. Generate SDKs
7. Maintain and version

Phase 1: API Contract (OpenAPI)

openapi: 3.1.0
info:
  title: Example API
  description: |
    Welcome to the Example API documentation.

    ## Overview
    This API provides access to [resource] management functionality.

    ## Authentication
    All endpoints require Bearer token authentication.
    See [Authentication](#section/Authentication) for details.

    ## Rate Limiting
    - 1000 requests per minute for standard tier
    - 10000 requests per minute for enterprise tier

    ## Versioning
    API version is specified in the URL path (`/v1/`, `/v2/`).

  version: 1.0.0
  contact:
    name: API Support
    email: api-support@example.com
    url: https://developer.example.com/support
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT

servers:
  - url: https://api.example.com/v1
    description: Production
  - url: https://api-staging.example.com/v1
    description: Staging
  - url: http://localhost:3000/v1
    description: Local development

tags:
  - name: Users
    description: User management operations
  - name: Orders
    description: Order processing and history

security:
  - BearerAuth: []

paths:
  /users:
    get:
      tags:
        - Users
      summary: List all users
      description: |
        Returns a paginated list of users. Results can be filtered
        by status and sorted by various fields.

        ### Filtering
        Use the `status` query parameter to filter by user status.

        ### Pagination
        Results are paginated with 20 items per page by default.
        Use `page` and `per_page` to navigate.
      operationId: listUsers
      parameters:
        - name: status
          in: query
          description: Filter by user status
          schema:
            type: string
            enum: [active, inactive, pending]
        - name: page
          in: query
          description: Page number (1-indexed)
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: per_page
          in: query
          description: Items per page
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
        - name: sort
          in: query
          description: Sort field and direction
          schema:
            type: string
            example: created_at:desc
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      - id: "usr_123"
                        email: "john@example.com"
                        name: "John Doe"
                        status: "active"
                        created_at: "2024-01-15T10:30:00Z"
                    meta:
                      page: 1
                      per_page: 20
                      total: 150
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'

    post:
      tags:
        - Users
      summary: Create a new user
      description: |
        Creates a new user account.

        ### Required Fields
        - `email`: Must be unique and valid format
        - `name`: User's display name

        ### Optional Fields
        - `metadata`: Key-value pairs for custom data
      operationId: createUser
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
            examples:
              basic:
                summary: Basic user creation
                value:
                  email: "jane@example.com"
                  name: "Jane Smith"
              with_metadata:
                summary: User with metadata
                value:
                  email: "jane@example.com"
                  name: "Jane Smith"
                  metadata:
                    department: "Engineering"
                    role: "Developer"
      responses:
        '201':
          description: User created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '400':
          $ref: '#/components/responses/BadRequest'
        '409':
          description: Email already exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: "EMAIL_EXISTS"
                  message: "A user with this email already exists"

  /users/{userId}:
    get:
      tags:
        - Users
      summary: Get user by ID
      operationId: getUser
      parameters:
        - $ref: '#/components/parameters/UserId'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '404':
          $ref: '#/components/responses/NotFound'

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        JWT token obtained from `/auth/token` endpoint.

        Include in requests:
        ```
        Authorization: Bearer <token>
        ```

    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: API key for server-to-server communication

  schemas:
    User:
      type: object
      required:
        - id
        - email
        - name
        - status
        - created_at
      properties:
        id:
          type: string
          description: Unique user identifier
          example: "usr_123abc"
        email:
          type: string
          format: email
          description: User's email address
          example: "user@example.com"
        name:
          type: string
          description: User's display name
          example: "John Doe"
        status:
          type: string
          enum: [active, inactive, pending]
          description: Account status
        metadata:
          type: object
          additionalProperties: true
          description: Custom key-value metadata
        created_at:
          type: string
          format: date-time
          description: Account creation timestamp
        updated_at:
          type: string
          format: date-time
          description: Last update timestamp

    CreateUserRequest:
      type: object
      required:
        - email
        - name
      properties:
        email:
          type: string
          format: email
        name:
          type: string
          minLength: 1
          maxLength: 100
        metadata:
          type: object
          additionalProperties: true

    UserList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/User'
        meta:
          $ref: '#/components/schemas/PaginationMeta'

    PaginationMeta:
      type: object
      properties:
        page:
          type: integer
        per_page:
          type: integer
        total:
          type: integer
        total_pages:
          type: integer

    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Machine-readable error code
            message:
              type: string
              description: Human-readable error message
            details:
              type: object
              description: Additional error context

  parameters:
    UserId:
      name: userId
      in: path
      required: true
      description: Unique user identifier
      schema:
        type: string
        pattern: '^usr_[a-zA-Z0-9]+$'
      example: usr_123abc

  responses:
    BadRequest:
      description: Invalid request parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: "INVALID_REQUEST"
              message: "Request validation failed"
              details:
                email: "Invalid email format"

    Unauthorized:
      description: Authentication required
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: "UNAUTHORIZED"
              message: "Invalid or expired token"

    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: "NOT_FOUND"
              message: "User not found"

    RateLimited:
      description: Rate limit exceeded
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Request limit per minute
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Remaining requests
        X-RateLimit-Reset:
          schema:
            type: integer
          description: Unix timestamp when limit resets
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: "RATE_LIMITED"
              message: "Too many requests"

Phase 2: Code Examples

# Quick Start Guide

## Installation

### Node.js
```bash
npm install @example/api-client

Python

pip install example-api

Go

go get github.com/example/api-go

Authentication

All API requests require a Bearer token. Obtain one by exchanging your API key:

cURL

curl -X POST https://api.example.com/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"api_key": "your_api_key"}'

Response

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer",
  "expires_in": 3600
}

Making Requests

Node.js

import { ExampleClient } from '@example/api-client';

const client = new ExampleClient({
  apiKey: process.env.EXAMPLE_API_KEY
});

// List users
const users = await client.users.list({
  status: 'active',
  page: 1,
  perPage: 20
});

console.log(users.data);

// Create a user
const newUser = await client.users.create({
  email: 'jane@example.com',
  name: 'Jane Smith'
});

console.log(newUser.id); // usr_abc123

Python

from example_api import Client

client = Client(api_key=os.environ['EXAMPLE_API_KEY'])

# List users
users = client.users.list(status='active', page=1, per_page=20)
for user in users.data:
    print(user.email)

# Create a user
new_user = client.users.create(
    email='jane@example.com',
    name='Jane Smith'
)
print(new_user.id)  # usr_abc123

cURL

# List users
curl https://api.example.com/v1/users \
  -H "Authorization: Bearer $TOKEN"

# Create a user
curl -X POST https://api.example.com/v1/users \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "jane@example.com",
    "name": "Jane Smith"
  }'

### Phase 3: Error Reference

```markdown
# Error Codes Reference

## HTTP Status Codes

| Code | Meaning |
|------|---------|
| 200 | Success |
| 201 | Created |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid/missing auth |
| 403 | Forbidden - Insufficient permissions |
| 404 | Not Found - Resource doesn't exist |
| 409 | Conflict - Resource already exists |
| 422 | Unprocessable - Semantic errors |
| 429 | Rate Limited - Too many requests |
| 500 | Server Error - Try again later |

## Application Error Codes

### Authentication Errors

| Code | Description | Solution |
|------|-------------|----------|
| `INVALID_TOKEN` | Token is malformed | Regenerate token |
| `EXPIRED_TOKEN` | Token has expired | Refresh token |
| `REVOKED_TOKEN` | Token was revoked | Request new token |
| `INVALID_API_KEY` | API key not found | Check API key |

### Validation Errors

| Code | Description | Solution |
|------|-------------|----------|
| `INVALID_EMAIL` | Email format invalid | Use valid email |
| `EMAIL_EXISTS` | Email already registered | Use different email |
| `REQUIRED_FIELD` | Missing required field | Include all required fields |
| `INVALID_FORMAT` | Value format incorrect | Check field requirements |

### Example Error Response

```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Request validation failed",
    "details": {
      "email": {
        "code": "INVALID_FORMAT",
        "message": "Email must be a valid email address"
      },
      "name": {
        "code": "REQUIRED_FIELD",
        "message": "Name is required"
      }
    }
  }
}

### Phase 4: Postman Collection

```json
{
  "info": {
    "name": "Example API",
    "description": "Complete API collection for Example API",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{access_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.example.com/v1"
    },
    {
      "key": "access_token",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "Authentication",
      "item": [
        {
          "name": "Get Access Token",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var jsonData = pm.response.json();",
                  "pm.collectionVariables.set('access_token', jsonData.access_token);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"api_key\": \"{{api_key}}\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": "{{base_url}}/auth/token"
          }
        }
      ]
    },
    {
      "name": "Users",
      "item": [
        {
          "name": "List Users",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/users?status=active&page=1",
              "host": ["{{base_url}}"],
              "path": ["users"],
              "query": [
                { "key": "status", "value": "active" },
                { "key": "page", "value": "1" }
              ]
            }
          }
        },
        {
          "name": "Create User",
          "request": {
            "method": "POST",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"test@example.com\",\n  \"name\": \"Test User\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": "{{base_url}}/users"
          }
        }
      ]
    }
  ]
}

SDK Generation

OpenAPI Generator Commands

# Generate TypeScript client
npx @openapitools/openapi-generator-cli generate \
  -i openapi.yaml \
  -g typescript-fetch \
  -o ./sdks/typescript \
  --additional-properties=supportsES6=true,npmName=@example/api-client

# Generate Python client
npx @openapitools/openapi-generator-cli generate \
  -i openapi.yaml \
  -g python \
  -o ./sdks/python \
  --additional-properties=packageName=example_api

# Generate Go client
npx @openapitools/openapi-generator-cli generate \
  -i openapi.yaml \
  -g go \
  -o ./sdks/go \
  --additional-properties=packageName=exampleapi

Versioning Strategy

/v1/users  ← Current stable version
/v2/users  ← New version (in development)

Deprecation Timeline:
- v1 deprecated: 2024-06-01
- v1 sunset: 2024-12-01

Version Migration Guide

# Migrating from v1 to v2

## Breaking Changes

### User Response Format

**v1 Response:**
```json
{
  "id": "123",
  "email": "user@example.com"
}

v2 Response:

{
  "data": {
    "id": "usr_123",
    "attributes": {
      "email": "user@example.com"
    }
  }
}

Migration Steps

  1. Update client library to v2
  2. Update response parsing logic
  3. Test in staging environment
  4. Deploy to production

## Best Practices

1. **Document as you build** - Not after launch
2. **Real examples** - From actual API responses
3. **Show errors** - Help developers debug
4. **Version everything** - Including documentation
5. **Test accuracy** - Run examples regularly
6. **Collect feedback** - Iterate on pain points

## Output Deliverables

When documenting APIs, I will provide:

1. **Complete OpenAPI specification** - With all endpoints, schemas, examples
2. **Request/response examples** - For success and error cases
3. **Authentication guide** - Step-by-step setup
4. **Error code reference** - With solutions
5. **SDK usage examples** - Multiple languages
6. **Postman collection** - For testing
7. **Migration guides** - For version changes

## When to Use This Skill

- Creating new API documentation from scratch
- Updating existing API docs for new features
- Generating SDKs from OpenAPI specs
- Improving developer experience
- Creating Postman/Insomnia collections
- Writing migration guides
- Documenting authentication flows
Related skills

More from housegarofalo/claude-code-base

Installs
4
GitHub Stars
2
First Seen
Mar 15, 2026