Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Знакомство с API: практический взгляд PM
Краткий ответ
Я know APIs хорошо — не как разработчик (не пишу код), а как PM, который должен понимать, что возможно, а что нет. Это критически важно для принятия решений о фичах, партнёрствах и масштабировании.
Что я знаю: REST, GraphQL, webhooks
REST API
- Я понимаю структуру: GET, POST, PUT, DELETE
- Статус коды: 200 ✅, 400 ❌, 401 (нет доступа), 404 (не найдено), 429 (limit), 500 (ошибка сервера)
- Rate limiting: важно для масштаба
- Пример:
GET /api/v1/users/{id}возвращает JSON с данными пользователя
GraphQL
- Запрашиваешь только нужные поля (vs REST — вся запись)
- Сложнее для новичков, но мощнее
- Лучше для мобильных (меньше трафика)
- Минус: кэширование сложнее
Webhooks
- Server A отправляет данные Server B, когда что-то произойдёт
- Пример: "когда платёж прошёл, вебхук отправляет данные в твой сервис"
- Асинхронный, надёжнее чем polling
Что я использую в работе
1. Интеграции с третьими лицами
Я работал с API:
- Stripe (платежи): их docs показывают, какие endpoints есть
- Twilio (SMS): как отправить СМС через API
- Google Maps (геолокация): как встроить карту
- Slack (уведомления): как отправить сообщение в канал
- Notion (база данных): как запихать данные в Notion
Мой workflow:
- Открываю документацию API (docs.stripe.com и т.д.)
- Смотрю примеры запросов
- Спрашиваю разработчика: "Это возможно через их API или нужно кастом?"
2. Проектирование собственного API
Когда я проектирую API для нашего продукта, я думаю:
- Какие endpoints нужны?
- Какая структура данных?
- Какие статус коды?
- Какой rate limit?
Пример разговора с разработчиком:
Я: "Нам нужен endpoint, чтобы получить список заказов пользователя"
Разработчик: "Окей, GET /api/v1/orders?user_id=123&limit=50&offset=0"
Я: "Почему limit 50, а не 100? И нужна ли пагинация через offset?"
Разработчик: "Limit 50 потому что на БД нагрузка, offset потому что
JavaScript стандарт"
Я: "Окей. А нужен ли фильтр по дате? Клиенты просят список заказов за неделю"
Разработчик: "Да, добавим: GET /api/v1/orders?created_after=2024-01-01&created_before=2024-01-07"
3. Переговоры о платежи
Я вёл переговоры о rate limit за API:
- Бесплатный уровень: 100 запросов в минуту
- Премиум: 10K запросов в минуту
- Enterprise: custom
Это требует понимания того, сколько запросов надо клиентам.
Знаю минусы API
Ограничение 1: Rate limiting
- Google Maps: максимум 1000 запросов в день (бесплатный уровень)
- Если фича требует 10K запросов → нужно платить $5K/месяц
- Я должен знать это ДО запуска фичи
Ограничение 2: Downtime
- Stripe был down 30 минут в 2023 году
- Все платежи заморозились
- Я должен быть готов: либо на fallback, либо уведомить пользователей
Ограничение 3: Версионирование
- API v1 устаревает → API v2
- Клиенты должны мигрировать
- Я должен планировать эту миграцию на квартал вперёд
Ограничение 4: Безопасность
- API key не должна быть в frontend (она утечёт)
- Нужен backend proxy
- Недостаточное понимание = утечка данных
Знаю, когда нужен API, когда нет
Нужен API:
- Множество клиентов хочет встроить данные (как Stripe)
- Мобильное приложение (нужен бэкенд для синхро)
- Автоматизация (клиент хочет автоматически отправлять данные)
- Экосистема (как Slack имеет 1000+ apps через API)
Не нужен API:
- Всё работает через веб-интерфейс
- Клиентов мало, можно вручную
- Данные не чувствительны (и утечка не страшна)
Знаю про API дизайн
Хорошие API практики:
-
Версионирование:
/api/v1/,/api/v2/- Не ломаешь старые клиенты
-
Правильные HTTP методы:
- GET (читать)
- POST (создать)
- PUT/PATCH (обновить)
- DELETE (удалить)
-
Правильные endpoint'ы:
- Существительные, не глаголы:
/users, не/get-users - Иерархия:
/users/{id}/orders, не/get-user-orders
- Существительные, не глаголы:
-
Правильные статус коды:
200 OK — успешно 201 Created — новый ресурс создан 400 Bad Request — ошибка клиента (неправильные параметры) 401 Unauthorized — нет доступа (нужна авторизация) 403 Forbidden — хочешь видеть чужие данные (access denied) 404 Not Found — нет такого ресурса 429 Too Many Requests — превышен rate limit 500 Internal Server Error — ошибка сервера -
Документация: OpenAPI (Swagger) или AsyncAPI
- Разработчик смотрит docs → понимает, как использовать
Истории из опыта
История 1: Интеграция с платёжной системой
Мы запустили интеграцию со Stripe. Через неделю выяснилось: rate limit 100 запросов в минуту, нашего трафика недостаточно... Но когда мы масштабировались до 10K транзакций в день, Stripe начал отклонять запросы.
Лесс: нужно знать, какой rate limit у API, и убедиться, что вы под него подходите ПЕРЕД запуском.
История 2: Меняющийся API
Использовали Google Maps API v1. Google объявил: v1 умирает в 2024. Мы должны были мигрировать на v2. Это заняло месяц (переписали кучу кода).
Лесс: всегда проверяй roadmap API провайдера. Если API старая версия → может отключить в любой момент.
История 3: API docs плохие
Использовали API неизвестного стартапа. Их docs были ужасны. Мне потребовалось 2 недели, чтобы разработчик понял, как это работает.
Лесс: хорошая документация = экономия месяцев на интеграцию. Плохая docs = не интегрируемся.
Не знаю (честно)
- Я не пишу код для API (это работа разработчика)
- Я не помню точные синтаксис (открываю docs)
- Я не разбираюсь в микро-оптимизациях (как кэшировать в Redis при 10M запросов/сек)
Но я знаю, когда нужно спросить разработчика, и я знаю, правильный ли ответ.
Как я растю в этом
Читаю:
- REST API best practices (json:api standard)
- OpenAPI спецификация
- Примеры хороших API (Stripe, GitHub, Slack)
Пробую:
- Запускаю curl commands в терминале (самый простой способ тестировать API)
- Запускаю Postman для более сложных запросов
- Читаю логи → понимаю, что пошло не так
Спрашиваю:
- Разработчиков: "Почему ты выбрал этот rate limit?"
- Коллег PM: "Как другие компании обрабатывают версионирование?"
Итог
Я знаю API достаточно, чтобы:
- Говорить с разработчиками на их языке
- Проектировать интеграции
- Видеть, что возможно, а что нет
- Переговариваться с API провайдерами
- Читать документацию и понимать, как это работает
Я не знаю, как это писать, но я знаю, как это работает. И это достаточно для PM.