home / skills / aj-geddes / useful-ai-prompts / api-changelog-versioning

api-changelog-versioning skill

/skills/api-changelog-versioning

This skill helps you generate API changelogs and versioning documentation with clear breaking changes, migration guides, and migration timelines for developers.

npx playbooks add skill aj-geddes/useful-ai-prompts --skill api-changelog-versioning

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
11.9 KB
---
name: api-changelog-versioning
description: Document API changes, breaking changes, migration guides, and version history for APIs. Use when documenting API versioning, breaking changes, or creating API migration guides.
---

# API Changelog & Versioning

## Overview

Create comprehensive API changelogs that document changes, deprecations, breaking changes, and provide migration guides for API consumers.

## When to Use

- API version changelogs
- Breaking changes documentation
- Migration guides between versions
- Deprecation notices
- API upgrade guides
- Backward compatibility notes
- Version comparison

## API Changelog Template

```markdown
# API Changelog

## Version 3.0.0 - 2025-01-15

### 🚨 Breaking Changes

#### Authentication Method Changed

**Previous (v2):**
```http
GET /api/users
Authorization: Token abc123
```

**Current (v3):**
```http
GET /api/v3/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
```

**Impact:** All API consumers must switch from API tokens to JWT Bearer tokens

**Migration Steps:**
1. Obtain JWT token from `/api/v3/auth/login` endpoint
2. Replace `Authorization: Token` with `Authorization: Bearer`
3. Update token refresh logic (JWT tokens expire after 1 hour)

**Migration Deadline:** June 1, 2025 (v2 auth will be deprecated)

**Migration Guide:** [JWT Authentication Guide](docs/migration/v2-to-v3-auth.md)

---

#### Response Format Changed

**Previous (v2):**
```json
{
  "id": "123",
  "name": "John Doe",
  "email": "[email protected]"
}
```

**Current (v3):**
```json
{
  "data": {
    "id": "123",
    "type": "user",
    "attributes": {
      "name": "John Doe",
      "email": "[email protected]"
    }
  }
}
```

**Impact:** All API responses now follow JSON:API specification

**Migration:**
```javascript
// Before (v2)
const user = await response.json();
console.log(user.name);

// After (v3)
const { data } = await response.json();
console.log(data.attributes.name);

// Or use our SDK which handles this automatically
import { ApiClient } from '@company/api-sdk';
const user = await client.users.get('123');
console.log(user.name); // SDK unwraps the response
```

---

#### Removed Endpoints

| Removed Endpoint | Replacement | Notes |
|------------------|-------------|-------|
| `GET /api/users/list` | `GET /api/v3/users` | Use pagination parameters |
| `POST /api/users/create` | `POST /api/v3/users` | RESTful convention |
| `GET /api/search` | `GET /api/v3/search` | Now supports advanced filters |

---

### ✨ New Features

#### Webhook Support

Subscribe to real-time events:

```http
POST /api/v3/webhooks
Content-Type: application/json

{
  "url": "https://your-app.com/webhook",
  "events": ["user.created", "user.updated", "user.deleted"],
  "secret": "your-webhook-secret"
}
```

**Webhook Payload:**
```json
{
  "event": "user.created",
  "timestamp": "2025-01-15T14:30:00Z",
  "data": {
    "id": "123",
    "type": "user",
    "attributes": {
      "name": "John Doe",
      "email": "[email protected]"
    }
  }
}
```

**Documentation:** [Webhook Guide](docs/webhooks.md)

---

#### Batch Operations

Process multiple records in a single request:

```http
POST /api/v3/users/batch
Content-Type: application/json

{
  "operations": [
    {
      "method": "POST",
      "path": "/users",
      "body": { "name": "User 1", "email": "[email protected]" }
    },
    {
      "method": "PATCH",
      "path": "/users/123",
      "body": { "name": "Updated Name" }
    },
    {
      "method": "DELETE",
      "path": "/users/456"
    }
  ]
}
```

**Response:**
```json
{
  "results": [
    { "status": 201, "data": { "id": "789", ... } },
    { "status": 200, "data": { "id": "123", ... } },
    { "status": 204 }
  ]
}
```

**Limits:** Maximum 100 operations per batch request

---

#### Field Filtering

Request only the fields you need:

```http
GET /api/v3/users/123?fields=id,name,email
```

**Before (full response):**
```json
{
  "data": {
    "id": "123",
    "type": "user",
    "attributes": {
      "name": "John Doe",
      "email": "[email protected]",
      "phone": "+1234567890",
      "address": { "street": "123 Main St", "city": "NYC" },
      "preferences": { /* ... */ },
      "metadata": { /* ... */ }
      // ... many more fields
    }
  }
}
```

**After (filtered response):**
```json
{
  "data": {
    "id": "123",
    "type": "user",
    "attributes": {
      "name": "John Doe",
      "email": "[email protected]"
    }
  }
}
```

**Benefits:**
- Reduced response size (up to 80% smaller)
- Faster response times
- Lower bandwidth usage

---

### πŸ”§ Improvements

#### Performance Enhancements

- **50% faster response times** for list endpoints
- **Database query optimization** reducing average query time from 150ms to 50ms
- **Caching layer** added for frequently accessed resources
- **CDN integration** for static assets

**Benchmark Comparison:**

| Endpoint | v2 (avg) | v3 (avg) | Improvement |
|----------|----------|----------|-------------|
| GET /users | 320ms | 140ms | 56% faster |
| GET /users/{id} | 180ms | 60ms | 67% faster |
| POST /users | 250ms | 120ms | 52% faster |

---

#### Better Error Messages

**Before (v2):**
```json
{
  "error": "Validation failed"
}
```

**After (v3):**
```json
{
  "errors": [
    {
      "code": "VALIDATION_ERROR",
      "field": "email",
      "message": "Email format is invalid",
      "suggestion": "Use format: [email protected]"
    },
    {
      "code": "VALIDATION_ERROR",
      "field": "password",
      "message": "Password too weak",
      "suggestion": "Password must be at least 8 characters with uppercase, lowercase, and numbers"
    }
  ]
}
```

---

#### Enhanced Rate Limiting

New rate limit headers in every response:

```http
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 950
X-RateLimit-Reset: 1642694400
X-RateLimit-Window: 3600
Retry-After: 3600
```

**Rate Limits by Plan:**

| Plan | Requests/Hour | Burst | Reset |
|------|---------------|-------|-------|
| Free | 100 | 10/min | 1 hour |
| Pro | 1,000 | 50/min | 1 hour |
| Enterprise | 10,000 | 200/min | 1 hour |

---

### πŸ”’ Security

- **TLS 1.3 Required:** Dropped support for TLS 1.2
- **JWT Expiry:** Tokens now expire after 1 hour (was 24 hours)
- **Rate Limiting:** Stricter limits on authentication endpoints
- **CORS:** Updated allowed origins (see security policy)
- **Input Validation:** Enhanced validation on all endpoints

---

### πŸ—‘οΈ Deprecated

#### Deprecation Schedule

| Feature | Deprecated | Removal Date | Replacement |
|---------|------------|--------------|-------------|
| API Token Auth | v3.0.0 | 2025-06-01 | JWT Bearer tokens |
| XML Response Format | v3.0.0 | 2025-04-01 | JSON only |
| `/api/v1/*` endpoints | v3.0.0 | 2025-03-01 | `/api/v3/*` |
| Query param `filter` | v3.0.0 | 2025-05-01 | Use `filters[field]=value` |

**Deprecation Warnings:**

All deprecated features return a warning header:

```http
HTTP/1.1 200 OK
Deprecation: true
Sunset: Sat, 01 Jun 2025 00:00:00 GMT
Link: <https://docs.example.com/migration/v2-to-v3>; rel="deprecation"
```

---

### πŸ“Š Version Support Policy

| Version | Status | Release Date | End of Support |
|---------|--------|--------------|----------------|
| v3.x | Current | 2025-01-15 | TBD |
| v2.x | Maintenance | 2024-01-01 | 2025-07-01 |
| v1.x | End of Life | 2023-01-01 | 2024-12-31 |

**Support Levels:**
- **Current:** Full support, new features
- **Maintenance:** Bug fixes and security patches only
- **End of Life:** No support, upgrade required

---

## Migration Guide: v2 β†’ v3

### Step 1: Update Base URL

```javascript
// Before
const API_BASE = 'https://api.example.com/api';

// After
const API_BASE = 'https://api.example.com/api/v3';
```

### Step 2: Migrate Authentication

```javascript
// Before (v2) - API Token
const response = await fetch(`${API_BASE}/users`, {
  headers: {
    'Authorization': `Token ${apiToken}`
  }
});

// After (v3) - JWT Bearer
const tokenResponse = await fetch(`${API_BASE}/auth/login`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email, password })
});
const { token } = await tokenResponse.json();

const response = await fetch(`${API_BASE}/users`, {
  headers: {
    'Authorization': `Bearer ${token}`
  }
});
```

### Step 3: Update Response Parsing

```javascript
// Before (v2)
const user = await response.json();
console.log(user.name);

// After (v3) - Unwrap data object
const { data } = await response.json();
console.log(data.attributes.name);

// Or use SDK
import { ApiClient } from '@company/api-sdk';
const client = new ApiClient(token);
const user = await client.users.get('123');
console.log(user.name); // SDK handles unwrapping
```

### Step 4: Update Error Handling

```javascript
// Before (v2)
try {
  const response = await fetch(`${API_BASE}/users`);
  if (!response.ok) {
    const error = await response.json();
    console.error(error.error);
  }
} catch (error) {
  console.error(error);
}

// After (v3) - Handle multiple errors
try {
  const response = await fetch(`${API_BASE}/users`);
  if (!response.ok) {
    const { errors } = await response.json();
    errors.forEach(err => {
      console.error(`${err.field}: ${err.message}`);
      console.log(`Suggestion: ${err.suggestion}`);
    });
  }
} catch (error) {
  console.error(error);
}
```

### Step 5: Update Pagination

```javascript
// Before (v2)
const response = await fetch(`${API_BASE}/users?page=1&per_page=20`);

// After (v3)
const response = await fetch(`${API_BASE}/users?page[number]=1&page[size]=20`);

// Response structure
{
  "data": [...],
  "meta": {
    "page": {
      "current": 1,
      "size": 20,
      "total": 150,
      "totalPages": 8
    }
  },
  "links": {
    "first": "/api/v3/users?page[number]=1",
    "last": "/api/v3/users?page[number]=8",
    "next": "/api/v3/users?page[number]=2",
    "prev": null
  }
}
```

### Step 6: Testing

```javascript
// Run tests against v3 API
npm run test:api -- --api-version=v3

// Test migration gradually
const USE_V3 = process.env.USE_API_V3 === 'true';
const API_BASE = USE_V3
  ? 'https://api.example.com/api/v3'
  : 'https://api.example.com/api/v2';
```

---

## Version Comparison

### Feature Matrix

| Feature | v1 | v2 | v3 |
|---------|----|----|-----|
| REST API | βœ… | βœ… | βœ… |
| GraphQL | ❌ | ❌ | βœ… |
| Webhooks | ❌ | ❌ | βœ… |
| Batch Operations | ❌ | ❌ | βœ… |
| Field Filtering | ❌ | βœ… | βœ… |
| JSON:API Format | ❌ | ❌ | βœ… |
| JWT Auth | ❌ | βœ… | βœ… |
| API Token Auth | βœ… | βœ… | ⚠️ Deprecated |
| XML Responses | βœ… | ⚠️ Deprecated | ❌ |

Legend: βœ… Supported | ❌ Not Available | ⚠️ Deprecated

---

## SDK Updates

Update to the latest SDK version:

```bash
# JavaScript/TypeScript
npm install @company/api-sdk@^3.0.0

# Python
pip install company-api-sdk>=3.0.0

# Ruby
gem install company-api-sdk -v '~> 3.0'

# Go
go get github.com/company/api-sdk/v3
```

**SDK Changelog:** [SDK Releases](https://github.com/company/api-sdk/releases)

---

## Support & Resources

- **Migration Support:** [email protected]
- **Documentation:** https://docs.example.com/v3
- **API Status:** https://status.example.com
- **Community Forum:** https://community.example.com
- **GitHub Issues:** https://github.com/company/api/issues
```

## Best Practices

### βœ… DO
- Clearly mark breaking changes
- Provide migration guides with code examples
- Include before/after comparisons
- Document deprecation timelines
- Show impact on existing implementations
- Provide SDKs for major versions
- Use semantic versioning
- Give advance notice (3-6 months)
- Maintain backward compatibility when possible
- Document version support policy

### ❌ DON'T
- Make breaking changes without notice
- Remove endpoints without deprecation period
- Skip migration examples
- Forget to version your API
- Change behavior without documentation
- Rush deprecations

## Resources

- [Stripe API Versioning](https://stripe.com/docs/api/versioning)
- [GitHub API Changes](https://docs.github.com/en/rest/overview/api-versions)
- [Semantic Versioning](https://semver.org/)
- [JSON:API Specification](https://jsonapi.org/)

Overview

This skill generates clear, structured API changelogs that record version history, breaking changes, deprecations, migration steps, and upgrade guidance. It helps product and engineering teams produce actionable release notes so API consumers can upgrade reliably. The output emphasizes impact, timelines, and code examples for fast adoption.

How this skill works

The skill inspects API change details (endpoints, auth, response formats, performance, security) and formats them into a consistent changelog template with sections for breaking changes, new features, improvements, deprecations, and version support policy. It produces migration guides with before/after examples, step-by-step migration tasks, and suggested SDK or client updates. It also recommends deprecation headers, timelines, and testing steps.

When to use it

  • Publishing API version releases or patch notes
  • Documenting breaking changes and required migrations
  • Creating step-by-step migration guides for consumers
  • Announcing deprecation schedules and sunset dates
  • Comparing features and support across versions

Best practices

  • Clearly label breaking changes and list exact impact on clients
  • Include code examples showing before and after usage
  • Provide explicit migration steps and a firm sunset date
  • Offer SDK upgrades or helper snippets that unwrap new response formats
  • Advertise deprecation headers (Deprecation, Sunset, Link) and give 3–6 months notice
  • Provide tests and sample requests to validate migrations

Example use cases

  • Release notes for a major version that switches auth from API tokens to JWT Bearer with migration steps
  • A migration guide converting response parsing to JSON:API data/attributes structure
  • Deprecation notice listing removed endpoints, replacements, and removal dates
  • Performance upgrade summary showing benchmarks and recommended client changes
  • Webhook and batch operations documentation with example payloads and limits

FAQ

How do I mark a breaking change so consumers notice it?

Label it under a dedicated β€œBreaking Changes” section, describe the exact impact, provide before/after examples, list migration steps, and include a Sunset date and Deprecation header guidance.

What minimal info should a migration guide include?

Base URL updates, authentication changes, response parsing examples, error handling updates, pagination changes, test commands, and a clear migration deadline.