ひとことで言うと#
使う側の視点で、わかりやすく一貫性のあるAPIを設計するための原則集。名前の付け方、エラーハンドリング、バージョニングなど、長く使われるAPIを作るための実践的なガイドライン。
押さえておきたい用語#
- リソース指向設計
- URLを名詞(リソース)で構成し、HTTPメソッド(GET/POST/PUT/DELETE)で操作を表現する設計思想。
- エンドポイント
- APIが外部に公開する個々のURLのこと。
/v1/usersや/v1/orders/{id}など。 - べき等性(Idempotency)
- 同じリクエストを何度送っても結果が変わらない性質を指す。GET・PUT・DELETEはべき等、POSTは非べき等。
- OpenAPI(Swagger)
- APIの仕様を機械可読な形式で記述する標準フォーマット。ドキュメント自動生成やコード生成に活用される。
- HTTPステータスコード
- サーバーがクライアントに返す3桁の数値コードである。200系は成功、400系はクライアントエラー、500系はサーバーエラー。
API設計原則の全体像#
こんな悩みに効く#
- APIの設計がエンドポイントごとにバラバラで、使いにくいと言われる
- 破壊的変更が必要になるたびに、クライアント側の修正が大変
- エラーレスポンスが統一されておらず、フロントエンドの実装者が困っている
基本の使い方#
URLはリソース(名詞)を表し、HTTPメソッドで操作を表現する。
GET /users— ユーザー一覧取得POST /users— ユーザー作成GET /users/{id}— 特定ユーザー取得PUT /users/{id}— ユーザー更新DELETE /users/{id}— ユーザー削除
ポイント: URLに動詞を入れない(/getUsersは避ける)。リソースは複数形を使う。
成功時とエラー時のレスポンス形式を統一する。
- 成功:
{ "data": {...}, "meta": { "total": 100, "page": 1 } } - エラー:
{ "error": { "code": "VALIDATION_ERROR", "message": "メールアドレスが不正です", "details": [...] } } - HTTPステータスコードを正しく使う(200, 201, 400, 401, 404, 500)
ポイント: すべてのエンドポイントで同じ形式を使う。フロントエンドの共通エラーハンドリングが可能になる。
破壊的変更に備えたバージョン管理を導入する。
- URLにバージョンを含める:
/v1/users、/v2/users - フィールドの追加は後方互換。フィールドの削除は破壊的変更
- 非推奨(Deprecation)期間を設けて移行期間を確保する
ポイント: 最初から完璧なAPIは作れない。拡張しやすい構造にしておくことが重要。
API利用者が迷わない情報を提供する。
- OpenAPI(Swagger)でAPIスキーマを定義し、ドキュメントを自動生成する
- リクエスト/レスポンスの具体例を必ず載せる
- ページネーション、フィルタリング、ソートの共通パターンを統一する
ポイント: 良いAPIは「ドキュメントを読まなくても使える」レベルを目指す。
具体例#
エンドポイント設計:
GET /v1/projects/{projectId}/tasks?status=open&sort=-createdAt&page=1&limit=20POST /v1/projects/{projectId}/tasks— タスク作成PATCH /v1/tasks/{taskId}— タスクの一部更新
成功レスポンス例:
{
"data": [
{ "id": "t-001", "title": "API設計書を書く", "status": "open" }
],
"meta": { "total": 42, "page": 1, "limit": 20 }
}エラーレスポンス例:
{
"error": {
"code": "NOT_FOUND",
"message": "タスクが見つかりません",
"details": [{ "field": "taskId", "value": "t-999" }]
}
}フロントエンドはdataとerrorの2パターンだけハンドリングすればよく、エラー処理コードが従来の1/3に削減された。
状況: 5名のバックエンドチームが、各自の好みでAPI設計をしていた。レスポンス形式が3パターン混在し、フロントエンドチームがエンドポイントごとにパーサーを書いていた。
施策:
- 1ページのAPIスタイルガイドを作成(命名規則、レスポンス形式、ステータスコード一覧)
- PRテンプレートに「APIスタイルガイド準拠チェック」を追加
- 既存APIのうちアクセス頻度上位10エンドポイントを新形式に移行
1ページのスタイルガイドがチーム全体の「迷い」を解消した。APIレビューの指摘事項は月42件→12件に減少し、新エンドポイントの結合工数は平均3日→1日に短縮された。
状況: 外部パートナー向けAPI。ドキュメントが古く、エラーメッセージが内部コード(ERR_0042)のままで、パートナーからの問い合わせが月80件。
施策:
- OpenAPI 3.0でスキーマを再定義し、Swagger UIで公開
- エラーコードを人間が読めるものに変更(
INVALID_EMAIL、RATE_LIMIT_EXCEEDED) - サンドボックス環境を提供し、本番データなしでテスト可能に
パートナーからの問い合わせが月80件→15件に減少し、新規パートナーの連携開発期間が平均4週間→10日に短縮。API呼び出し数は月間50万→150万に増加し、間接的にARRが12%向上した。
やりがちな失敗パターン#
- エンドポイントごとにレスポンス形式が違う — あるAPIは
{ "result": ... }、別のAPIは{ "data": ... }。チーム全体のAPIスタイルガイドを作り、レビューで守る - すべてHTTP 200で返す — エラーもHTTP 200で返し、bodyの中で成否を判定させる。HTTPステータスコードを正しく使い、クライアントのエラーハンドリングを簡潔にする
- 内部実装がAPIに漏れる — DBのカラム名がそのままレスポンスのフィールド名になっている。APIのインターフェースは利用者目線で設計し、内部実装とは切り離す
- ページネーションを後付けする — 最初はリスト全件返しで、データ増加後に慌ててページネーションを導入。既存クライアントが壊れる。最初からページネーションを設計に含める
まとめ#
API設計は 「使う人の体験」 を最優先する。リソース指向、一貫したレスポンス形式、適切なHTTPステータスコード、バージョニングの4つを押さえれば、使いやすいAPIの基盤ができる。OpenAPIでスキーマ駆動開発を取り入れると、ドキュメントとコードの一貫性も保てる。まずはチームのAPIスタイルガイドを1ページ作ることから始めよう。