API Documentation: как писать документацию, которую читают

← Вернуться к статьям

Введение

Хорошая документация API — это не просто описание endpoints. Это полноценный справочник, который помогает разработчикам быстро понять, как использовать API, интегрироваться с ним и решать возникающие проблемы. Плохая документация может стать причиной отказа от использования API, даже если сам API отлично работает.

В этом руководстве мы рассмотрим лучшие практики написания документации API: структуру документации, примеры запросов и ответов, документирование ошибок, ведение changelog и использование инструментов для автоматической генерации документации (Swagger UI, ReDoc, ReadMe).

✅ Что вы узнаете:

💡 Почему важна хорошая документация?

Хорошая документация уменьшает время интеграции, снижает количество вопросов в поддержку, увеличивает adoption rate API и улучшает developer experience. Разработчики выбирают API не только по функциональности, но и по качеству документации.

📋 Содержание

1. Структура документации 📐

Хорошая структура документации помогает разработчикам быстро найти нужную информацию. Документация должна быть логично организована и легко навигируема.

Обязательные разделы

# API Documentation

## 1. Getting Started (Начало работы)
- Введение в API
- Быстрый старт (Quick Start)
- Аутентификация
- Базовый пример использования

## 2. Authentication (Аутентификация)
- Типы аутентификации
- Получение токена
- Использование токена
- Refresh token
- Обработка ошибок аутентификации

## 3. Endpoints (Endpoints)
- Обзор всех endpoints
- Группировка по ресурсам
- Детальное описание каждого endpoint

## 4. Request/Response (Запросы и ответы)
- Форматы данных
- Примеры запросов
- Примеры ответов
- Коды состояний

## 5. Errors (Ошибки)
- Список всех ошибок
- Коды ошибок
- Примеры обработки ошибок

## 6. Rate Limiting (Ограничение запросов)
- Лимиты запросов
- Заголовки rate limiting
- Обработка превышения лимитов

## 7. SDKs & Libraries (SDK и библиотеки)
- Доступные SDK
- Примеры использования
- Установка

## 8. Changelog (История изменений)
- История версий API
- Breaking changes
- Deprecated endpoints

## 9. Support (Поддержка)
- FAQ
- Контакты поддержки
- Community

Навигация и поиск


✅ Принципы хорошей структуры:

2. Примеры запросов и ответов 💡

Примеры — самая важная часть документации. Разработчики часто начинают с примеров, а не с описания. Примеры должны быть реальными, рабочими и покрывать основные сценарии.

Структура примера endpoint

Пример: Получение пользователя

GET /api/v1/users/{id}

Получает информацию о пользователе по его ID.

Параметры пути:

Заголовки:

Authorization: Bearer {access_token}
Content-Type: application/json

Пример запроса:

curl -X GET https://api.example.com/v1/users/123 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  -H "Content-Type: application/json"

Пример ответа (200 OK):

{
  "id": "123",
  "email": "user@example.com",
  "name": "John Doe",
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-11-07T14:20:00Z"
}

Пример ответа (404 Not Found):

{
  "error": {
    "code": "USER_NOT_FOUND",
    "message": "User with ID 123 not found",
    "details": {}
  }
}

Примеры для разных языков

## Примеры запросов

### JavaScript (Fetch)
\`\`\`javascript
const response = await fetch('https://api.example.com/v1/users/123', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
  }
});

const user = await response.json();
console.log(user);
\`\`\`

### Python (Requests)
\`\`\`python
import requests

headers = {
    'Authorization': f'Bearer {token}',
    'Content-Type': 'application/json'
}

response = requests.get(
    'https://api.example.com/v1/users/123',
    headers=headers
)

user = response.json()
print(user)
\`\`\`

### cURL
\`\`\`bash
curl -X GET https://api.example.com/v1/users/123 \
  -H "Authorization: Bearer {token}"
\`\`\`

### Node.js (Axios)
\`\`\`javascript
const axios = require('axios');

const response = await axios.get(
  'https://api.example.com/v1/users/123',
  {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  }
);

console.log(response.data);
\`\`\`

Интерактивные примеры


Try it out

3. Error Documentation (Документирование ошибок) ⚠️

Документирование ошибок критически важно. Разработчики должны понимать, какие ошибки возможны, как их обрабатывать и что делать при их возникновении.

Структура описания ошибок

Код ошибки HTTP Status Описание Решение
VALIDATION_ERROR 400 Ошибка валидации входных данных Проверьте формат данных в запросе
UNAUTHORIZED 401 Требуется аутентификация Добавьте валидный токен в заголовки
FORBIDDEN 403 Недостаточно прав для доступа Обратитесь к администратору
NOT_FOUND 404 Ресурс не найден Проверьте правильность ID ресурса
RATE_LIMIT_EXCEEDED 429 Превышен лимит запросов Подождите или используйте другой ключ API
INTERNAL_ERROR 500 Внутренняя ошибка сервера Повторите запрос позже или обратитесь в поддержку

Примеры ошибок с деталями

// Пример ошибки валидации (400 Bad Request)
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": {
      "fields": {
        "email": ["Email is required", "Invalid email format"],
        "password": ["Password must be at least 8 characters"]
      }
    },
    "request_id": "req_1234567890"
  }
}

// Пример ошибки аутентификации (401 Unauthorized)
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or expired token",
    "details": {
      "reason": "token_expired",
      "expired_at": "2025-11-07T12:00:00Z"
    },
    "request_id": "req_1234567890"
  }
}

// Пример ошибки rate limiting (429 Too Many Requests)
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded",
    "details": {
      "limit": 100,
      "remaining": 0,
      "reset_at": "2025-11-07T13:00:00Z"
    },
    "request_id": "req_1234567890"
  }
}

Обработка ошибок в коде

// JavaScript пример обработки ошибок
async function getUser(id) {
  try {
    const response = await fetch(`/api/v1/users/${id}`, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });

    if (!response.ok) {
      const error = await response.json();
      
      switch (error.error.code) {
        case 'UNAUTHORIZED':
          // Токен истек, обновляем его
          await refreshToken();
          return getUser(id); // Повторяем запрос
          
        case 'NOT_FOUND':
          console.error('User not found:', id);
          return null;
          
        case 'RATE_LIMIT_EXCEEDED':
          // Ждем до reset_at
          const resetTime = new Date(error.error.details.reset_at);
          await sleep(resetTime - Date.now());
          return getUser(id); // Повторяем запрос
          
        default:
          throw new Error(error.error.message);
      }
    }

    return await response.json();
  } catch (error) {
    console.error('Failed to get user:', error);
    throw error;
  }
}

4. Changelog (История изменений) 📝

Changelog помогает разработчикам отслеживать изменения в API, понимать breaking changes и планировать обновления своих интеграций.

Формат changelog

# Changelog

## [2.0.0] - 2025-11-07

### Breaking Changes
- Удален endpoint `GET /api/v1/users/{id}/profile` 
  Используйте `GET /api/v1/users/{id}` вместо него
- Изменен формат ответа для `POST /api/v1/users`
  Теперь возвращается объект `user` вместо массива
  
### Added
- Новый endpoint `GET /api/v1/users/{id}/activities` для получения активности пользователя
- Поддержка фильтрации по дате для `GET /api/v1/orders`
- Поля `last_login_at` и `is_active` в модели пользователя

### Changed
- Улучшена производительность `GET /api/v1/users` (время ответа снижено на 40%)
- Обновлена валидация email (теперь поддерживает международные домены)

### Deprecated
- Endpoint `GET /api/v1/products/legacy` помечен как deprecated
  Будет удален в версии 3.0.0. Используйте `GET /api/v1/products`

### Fixed
- Исправлена ошибка при создании пользователя с длинным именем
- Исправлена проблема с кэшированием в `GET /api/v1/products`

### Security
- Улучшена защита от SQL injection
- Добавлена дополнительная валидация токенов

---

## [1.2.0] - 2025-10-15

### Added
- Поддержка pagination для всех списков
- Новые фильтры для поиска пользователей

### Fixed
- Исправлена ошибка rate limiting для новых ключей API

---

## [1.1.0] - 2025-09-20

### Added
- Webhook для событий создания пользователя
- Поддержка bulk operations для заказов

### Changed
- Улучшена документация по аутентификации

Keep a Changelog формат

# Changelog

All notable changes to this API will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added
- Planned feature 1
- Planned feature 2

### Changed
- Planned change 1

## [2.0.0] - 2025-11-07

### [Added]
- New endpoint for user activities

### [Changed]
- Improved performance for users list

### [Deprecated]
- Old endpoint `/api/v1/users/legacy`

### [Removed]
- Removed deprecated endpoint `/api/v1/users/old`

### [Fixed]
- Fixed validation error for long names

### [Security]
- Enhanced token validation

✅ Best practices для changelog:

5. Swagger UI и OpenAPI 📘

Swagger UI — популярный инструмент для визуализации OpenAPI спецификации. OpenAPI (ранее Swagger) — стандарт описания REST API.

OpenAPI спецификация

# openapi.yaml
openapi: 3.0.0
info:
  title: Example API
  description: API для управления пользователями
  version: 2.0.0
  contact:
    name: API Support
    email: support@example.com

servers:
  - url: https://api.example.com/v1
    description: Production server

paths:
  /users/{id}:
    get:
      summary: Получить пользователя
      description: Возвращает информацию о пользователе по его ID
      operationId: getUserById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: ID пользователя
      responses:
        '200':
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '404':
          description: Пользователь не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: string
          example: "123"
        email:
          type: string
          format: email
          example: "user@example.com"
        name:
          type: string
          example: "John Doe"
        created_at:
          type: string
          format: date-time
          example: "2025-01-15T10:30:00Z"
    
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string

  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

security:
  - BearerAuth: []

Генерация документации из кода

// Express.js с swagger-jsdoc
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');

const swaggerOptions = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: 'Example API',
      version: '2.0.0',
      description: 'API для управления пользователями'
    },
    servers: [
      {
        url: 'https://api.example.com/v1',
        description: 'Production server'
      }
    ]
  },
  apis: ['./routes/*.js'] // Путь к файлам с комментариями
};

const swaggerSpec = swaggerJsdoc(swaggerOptions);

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));

/**
 * @swagger
 * /users/{id}:
 *   get:
 *     summary: Получить пользователя
 *     tags: [Users]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Успешный ответ
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/User'
 */
app.get('/api/v1/users/:id', getUserById);
✅ Преимущества Swagger UI:

6. ReDoc 📕

ReDoc — альтернатива Swagger UI с более красивым и читаемым интерфейсом. Особенно хорошо подходит для публичной документации.

Настройка ReDoc

// Express.js с ReDoc
const express = require('express');
const app = express();
const path = require('path');
const fs = require('fs');

// Загружаем OpenAPI спецификацию
const openApiSpec = JSON.parse(
  fs.readFileSync(path.join(__dirname, 'openapi.json'), 'utf8')
);

// HTML для ReDoc
const redocHtml = `


  
    API Documentation
    
    
    
    
  
  
    
    
  

`;

app.get('/docs', (req, res) => {
  res.send(redocHtml);
});

app.get('/api-docs/openapi.json', (req, res) => {
  res.json(openApiSpec);
});

app.listen(3000);

Настройка тем ReDoc


✅ Преимущества ReDoc:
❌ Недостатки ReDoc:

7. ReadMe 📖

ReadMe — платформа для создания красивой документации API с возможностью версионирования, аналитики и кастомизации.

Интеграция с ReadMe

// ReadMe API Explorer интеграция
// Установка: npm install readmeio

const readme = require('readmeio');

// Middleware для логирования запросов в ReadMe
app.use((req, res, next) => {
  // Сохраняем оригинальный res.send
  const originalSend = res.send.bind(res);

  res.send = function(data) {
    // Отправляем в ReadMe для анализа
    readme.log({
      apiKey: process.env.README_API_KEY,
      userId: req.user?.id,
      label: req.user?.email,
      email: req.user?.email,
      method: req.method,
      url: req.originalUrl,
      statusCode: res.statusCode,
      request: {
        headers: req.headers,
        body: req.body,
        query: req.query
      },
      response: {
        body: data
      }
    }).catch(console.error);

    return originalSend(data);
  };

  next();
});

Особенности ReadMe

Функция Описание
API Explorer Интерактивное тестирование API прямо в документации
Аналитика Отслеживание использования документации и API
Версионирование Документация для разных версий API
Кастомизация Полный контроль над дизайном и функциональностью
SSO Интеграция с корпоративными системами
Webhooks Автоматическое обновление документации
✅ Преимущества ReadMe:
❌ Недостатки ReadMe:

Best Practices для документации 🌟

✅ 10 правил качественной документации:

  1. Пишите для пользователя — думайте с точки зрения разработчика
  2. Начинайте с примеров — примеры важнее описаний
  3. Используйте реальные данные — примеры должны быть реалистичными
  4. Документируйте все ошибки — каждая возможная ошибка
  5. Добавляйте контекст — объясняйте "почему", а не только "как"
  6. Ведите changelog — отслеживайте все изменения
  7. Используйте интерактивные примеры — возможность протестировать
  8. Поддерживайте актуальность — обновляйте вместе с API
  9. Добавляйте поиск — быстрый поиск по документации
  10. Собирайте обратную связь — узнавайте, что улучшить

Чек-лист документации

☐ Есть раздел Getting Started с быстрым стартом
☐ Все endpoints документированы
☐ Есть примеры запросов для каждого endpoint
☐ Есть примеры ответов (успешных и с ошибками)
☐ Документированы все возможные ошибки
☐ Описаны все параметры запросов
☐ Описаны все поля ответов
☐ Есть примеры для популярных языков (JS, Python, cURL)
☐ Ведется changelog
☐ Документация доступна в разных форматах (HTML, PDF)
☐ Есть поиск по документации
☐ Настроена аналитика использования
☐ Документация регулярно обновляется
☐ Есть контакты поддержки
☐ Добавлены FAQ для частых вопросов

Сравнение инструментов

Инструмент Тип Стоимость Интерактивность Кастомизация
Swagger UI Open-source Бесплатно ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
ReDoc Open-source Бесплатно ⭐⭐ ⭐⭐⭐
ReadMe SaaS Платно ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Postman SaaS/Desktop Freemium ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Slate Open-source Бесплатно ⭐⭐ ⭐⭐⭐⭐

Заключение

Хорошая документация API — это не роскошь, а необходимость. Она значительно улучшает developer experience, уменьшает количество вопросов в поддержку и увеличивает adoption rate API. Инвестируйте время в создание качественной документации — это окупится.

💡 Ключевые выводы:

⚠️ Частые ошибки:

Создайте Mock API за 2 минуты

Используйте Mock API для тестирования документации и примеров запросов без необходимости настраивать реальный backend. LightBox API позволяет быстро создать тестовые endpoints для вашей документации.

Попробовать бесплатно →
← Вернуться к статьям