Initial commit
This commit is contained in:
339
skills/writing-api-docs/SKILL.md
Normal file
339
skills/writing-api-docs/SKILL.md
Normal file
@@ -0,0 +1,339 @@
|
||||
---
|
||||
name: writing-api-docs
|
||||
description: |
|
||||
Patterns and structure for writing API reference documentation including
|
||||
endpoint descriptions, request/response schemas, and error documentation.
|
||||
|
||||
trigger: |
|
||||
- Documenting REST API endpoints
|
||||
- Writing request/response examples
|
||||
- Documenting error codes
|
||||
- Creating API field descriptions
|
||||
|
||||
skip_when: |
|
||||
- Writing conceptual guides → use writing-functional-docs
|
||||
- Reviewing documentation → use documentation-review
|
||||
- Writing code → use dev-team agents
|
||||
|
||||
sequence:
|
||||
before: [documentation-review]
|
||||
|
||||
related:
|
||||
similar: [writing-functional-docs]
|
||||
complementary: [api-field-descriptions, documentation-structure]
|
||||
---
|
||||
|
||||
# Writing API Reference Documentation
|
||||
|
||||
API reference documentation describes what each endpoint does, its parameters, request/response formats, and error conditions. It focuses on the "what" rather than the "why."
|
||||
|
||||
---
|
||||
|
||||
## API Reference Principles
|
||||
|
||||
### RESTful and Predictable
|
||||
- Follow standard HTTP methods and status codes
|
||||
- Use consistent URL patterns
|
||||
- Document idempotency behavior
|
||||
|
||||
### Consistent Formats
|
||||
- Requests and responses use JSON
|
||||
- Clear typing and structures
|
||||
- Standard error format
|
||||
|
||||
### Explicit Versioning
|
||||
- Document version in URL path
|
||||
- Note backward compatibility
|
||||
- Mark deprecated fields clearly
|
||||
|
||||
---
|
||||
|
||||
## Endpoint Documentation Structure
|
||||
|
||||
### Basic Structure
|
||||
|
||||
```markdown
|
||||
# Endpoint Name
|
||||
|
||||
Brief description of what this endpoint does.
|
||||
|
||||
## Request
|
||||
|
||||
### HTTP Method and Path
|
||||
|
||||
`POST /v1/organizations/{organizationId}/ledgers/{ledgerId}/accounts`
|
||||
|
||||
### Path Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| organizationId | uuid | Yes | The unique identifier of the Organization |
|
||||
| ledgerId | uuid | Yes | The unique identifier of the Ledger |
|
||||
|
||||
### Request Body
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "string",
|
||||
"assetCode": "string",
|
||||
"type": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### Request Body Fields
|
||||
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| name | string | Yes | The name of the Account |
|
||||
| assetCode | string | Yes | The code of the Asset (e.g., "BRL", "USD") |
|
||||
| type | string | No | The account type classification |
|
||||
|
||||
## Response
|
||||
|
||||
### Success Response (201 Created)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "3172933b-50d2-4b17-96aa-9b378d6a6eac",
|
||||
"name": "Customer Account",
|
||||
"assetCode": "BRL",
|
||||
"status": {
|
||||
"code": "ACTIVE"
|
||||
},
|
||||
"createdAt": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### Response Fields
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| id | uuid | The unique identifier of the created Account |
|
||||
| name | string | The name of the Account |
|
||||
| createdAt | timestamptz | Timestamp of creation (UTC) |
|
||||
|
||||
## Errors
|
||||
|
||||
| Status Code | Error Code | Description |
|
||||
|-------------|------------|-------------|
|
||||
| 400 | INVALID_REQUEST | Request body validation failed |
|
||||
| 404 | LEDGER_NOT_FOUND | The specified Ledger does not exist |
|
||||
| 409 | ACCOUNT_EXISTS | An account with this alias already exists |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Field Description Patterns
|
||||
|
||||
### Basic Field Description
|
||||
|
||||
```markdown
|
||||
| name | string | The name of the Account |
|
||||
```
|
||||
|
||||
### Field with Constraints
|
||||
|
||||
```markdown
|
||||
| code | string | The asset code (max 10 characters, uppercase) |
|
||||
```
|
||||
|
||||
### Field with Example
|
||||
|
||||
```markdown
|
||||
| email | string | User email address (e.g., "user@example.com") |
|
||||
```
|
||||
|
||||
### Required vs Optional
|
||||
|
||||
```markdown
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| name | string | Yes | The name of the Account |
|
||||
| alias | string | No | A user-friendly identifier. If omitted, uses the account ID |
|
||||
```
|
||||
|
||||
### Deprecated Fields
|
||||
|
||||
```markdown
|
||||
| chartOfAccountsGroupName | string | **[Deprecated]** Use `route` instead. The name of the group. |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Types Reference
|
||||
|
||||
Use consistent type names across all documentation:
|
||||
|
||||
| Type | Description | Example |
|
||||
|------|-------------|---------|
|
||||
| `uuid` | UUID v4 identifier | `3172933b-50d2-4b17-96aa-9b378d6a6eac` |
|
||||
| `string` | Text value | `"Customer Account"` |
|
||||
| `text` | Long text value | `"Detailed description..."` |
|
||||
| `integer` | Whole number | `42` |
|
||||
| `boolean` | True/false value | `true` |
|
||||
| `timestamptz` | ISO 8601 timestamp (UTC) | `2024-01-15T10:30:00Z` |
|
||||
| `jsonb` | JSON object | `{"key": "value"}` |
|
||||
| `array` | List of values | `["item1", "item2"]` |
|
||||
| `enum` | One of predefined values | `currency`, `crypto`, `commodity` |
|
||||
|
||||
---
|
||||
|
||||
## Request/Response Examples
|
||||
|
||||
### Complete Request Example
|
||||
|
||||
Always show a realistic, working example:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "João Silva - Checking",
|
||||
"assetCode": "BRL",
|
||||
"type": "checking",
|
||||
"alias": "@joao_checking",
|
||||
"metadata": {
|
||||
"customerId": "cust_123456",
|
||||
"branch": "0001"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Complete Response Example
|
||||
|
||||
Show all fields that would be returned:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "3172933b-50d2-4b17-96aa-9b378d6a6eac",
|
||||
"organizationId": "7c3e4f2a-1b8d-4e5c-9f0a-2d3e4f5a6b7c",
|
||||
"ledgerId": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
|
||||
"name": "João Silva - Checking",
|
||||
"assetCode": "BRL",
|
||||
"type": "checking",
|
||||
"alias": "@joao_checking",
|
||||
"status": {
|
||||
"code": "ACTIVE",
|
||||
"description": null
|
||||
},
|
||||
"metadata": {
|
||||
"customerId": "cust_123456",
|
||||
"branch": "0001"
|
||||
},
|
||||
"createdAt": "2024-01-15T10:30:00Z",
|
||||
"updatedAt": "2024-01-15T10:30:00Z",
|
||||
"deletedAt": null
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Documentation
|
||||
|
||||
### Standard Error Format
|
||||
|
||||
```json
|
||||
{
|
||||
"code": "ACCOUNT_NOT_FOUND",
|
||||
"message": "The specified account does not exist",
|
||||
"details": {
|
||||
"accountId": "invalid-uuid"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error Table Format
|
||||
|
||||
| Status Code | Error Code | Description | Resolution |
|
||||
|-------------|------------|-------------|------------|
|
||||
| 400 | INVALID_REQUEST | Request validation failed | Check request body format |
|
||||
| 401 | UNAUTHORIZED | Missing or invalid authentication | Provide valid API key |
|
||||
| 403 | FORBIDDEN | Insufficient permissions | Contact admin for access |
|
||||
| 404 | NOT_FOUND | Resource does not exist | Verify the resource ID |
|
||||
| 409 | CONFLICT | Resource already exists | Use a different identifier |
|
||||
| 422 | UNPROCESSABLE_ENTITY | Business rule violation | Check business constraints |
|
||||
| 500 | INTERNAL_ERROR | Server error | Retry or contact support |
|
||||
|
||||
---
|
||||
|
||||
## HTTP Status Codes
|
||||
|
||||
### Success Codes
|
||||
|
||||
| Code | Usage |
|
||||
|------|-------|
|
||||
| 200 OK | Successful GET, PUT, PATCH |
|
||||
| 201 Created | Successful POST that creates a resource |
|
||||
| 204 No Content | Successful DELETE |
|
||||
|
||||
### Error Codes
|
||||
|
||||
| Code | Usage |
|
||||
|------|-------|
|
||||
| 400 Bad Request | Malformed request syntax |
|
||||
| 401 Unauthorized | Missing or invalid authentication |
|
||||
| 403 Forbidden | Valid auth but insufficient permissions |
|
||||
| 404 Not Found | Resource does not exist |
|
||||
| 409 Conflict | Resource state conflict (e.g., duplicate) |
|
||||
| 422 Unprocessable Entity | Valid syntax but invalid semantics |
|
||||
| 429 Too Many Requests | Rate limit exceeded |
|
||||
| 500 Internal Server Error | Server-side error |
|
||||
|
||||
---
|
||||
|
||||
## Pagination Documentation
|
||||
|
||||
When an endpoint returns paginated results:
|
||||
|
||||
```markdown
|
||||
### Query Parameters
|
||||
|
||||
| Parameter | Type | Default | Description |
|
||||
|-----------|------|---------|-------------|
|
||||
| limit | integer | 10 | Number of results per page (max 100) |
|
||||
| page | integer | 1 | Page number to retrieve |
|
||||
|
||||
### Pagination Response
|
||||
|
||||
```json
|
||||
{
|
||||
"items": [...],
|
||||
"page": 1,
|
||||
"limit": 10,
|
||||
"totalItems": 150,
|
||||
"totalPages": 15
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API Versioning Notes
|
||||
|
||||
When documenting versioned APIs:
|
||||
|
||||
```markdown
|
||||
> **Note:** You're viewing documentation for the **current version** (v3).
|
||||
> For previous versions, use the version switcher.
|
||||
```
|
||||
|
||||
For deprecated endpoints:
|
||||
|
||||
```markdown
|
||||
> **Deprecated:** This endpoint will be removed in v4. Use [/v3/accounts](link) instead.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quality Checklist
|
||||
|
||||
Before finishing API documentation, verify:
|
||||
|
||||
- [ ] HTTP method and path are correct
|
||||
- [ ] All path parameters documented
|
||||
- [ ] All query parameters documented
|
||||
- [ ] All request body fields documented with types
|
||||
- [ ] All response fields documented with types
|
||||
- [ ] Required vs optional fields are clear
|
||||
- [ ] Realistic request/response examples included
|
||||
- [ ] All error codes documented
|
||||
- [ ] Deprecated fields are marked
|
||||
- [ ] Links to related endpoints included
|
||||
Reference in New Issue
Block a user