API設計原則

英語名 API Design Principles
読み方 エーピーアイ デザイン プリンシプルズ
難易度
所要時間 設計に1〜3日
提唱者 RESTの提唱: ロイ・フィールディング
目次

ひとことで言うと
#

使う側の視点で、わかりやすく一貫性のある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設計原則の全体像
#

リソース設計→レスポンス統一→バージョニング→ドキュメント整備の4原則
リソース設計URLは名詞で表現HTTPメソッドで操作を区別レスポンス統一成功/エラーの形式ステータスコードを全エンドポイント統一バージョニング破壊的変更に備えたバージョン管理とDeprecation運用ドキュメント整備OpenAPIでスキーマ定義リクエスト/レスポンスの具体例を提示4原則を揃えることで開発者体験(DX)が向上する
API設計の進め方フロー
1
リソース定義
名詞ベースのURL設計
2
レスポンス設計
成功/エラー形式の統一
3
バージョン戦略
拡張性と後方互換性を確保
4
ドキュメント整備
OpenAPIで自動生成

こんな悩みに効く
#

  • APIの設計がエンドポイントごとにバラバラで、使いにくいと言われる
  • 破壊的変更が必要になるたびに、クライアント側の修正が大変
  • エラーレスポンスが統一されておらず、フロントエンドの実装者が困っている

基本の使い方
#

ステップ1: リソース指向で設計する

URLはリソース(名詞)を表し、HTTPメソッドで操作を表現する

  • GET /users — ユーザー一覧取得
  • POST /users — ユーザー作成
  • GET /users/{id} — 特定ユーザー取得
  • PUT /users/{id} — ユーザー更新
  • DELETE /users/{id} — ユーザー削除

ポイント: URLに動詞を入れない(/getUsersは避ける)。リソースは複数形を使う。

ステップ2: 一貫性のあるレスポンス形式を決める

成功時とエラー時のレスポンス形式を統一する

  • 成功: { "data": {...}, "meta": { "total": 100, "page": 1 } }
  • エラー: { "error": { "code": "VALIDATION_ERROR", "message": "メールアドレスが不正です", "details": [...] } }
  • HTTPステータスコードを正しく使う(200, 201, 400, 401, 404, 500)

ポイント: すべてのエンドポイントで同じ形式を使う。フロントエンドの共通エラーハンドリングが可能になる。

ステップ3: バージョニングと拡張性を確保する

破壊的変更に備えたバージョン管理を導入する

  • URLにバージョンを含める: /v1/users/v2/users
  • フィールドの追加は後方互換。フィールドの削除は破壊的変更
  • 非推奨(Deprecation)期間を設けて移行期間を確保する

ポイント: 最初から完璧なAPIは作れない。拡張しやすい構造にしておくことが重要。

ステップ4: ドキュメントと開発者体験を整える

API利用者が迷わない情報を提供する

  • OpenAPI(Swagger)でAPIスキーマを定義し、ドキュメントを自動生成する
  • リクエスト/レスポンスの具体例を必ず載せる
  • ページネーション、フィルタリング、ソートの共通パターンを統一する

ポイント: 良いAPIは「ドキュメントを読まなくても使える」レベルを目指す。

具体例
#

例1:タスク管理APIで42件のタスクをページネーションで返す

エンドポイント設計:

  • GET /v1/projects/{projectId}/tasks?status=open&sort=-createdAt&page=1&limit=20
  • POST /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" }]
  }
}

フロントエンドはdataerrorの2パターンだけハンドリングすればよく、エラー処理コードが従来の1/3に削減された。

例2:ECサイト5名のチームがAPIスタイルガイドを導入してレビュー時間を半減させる

状況: 5名のバックエンドチームが、各自の好みでAPI設計をしていた。レスポンス形式が3パターン混在し、フロントエンドチームがエンドポイントごとにパーサーを書いていた。

施策:

  1. 1ページのAPIスタイルガイドを作成(命名規則、レスポンス形式、ステータスコード一覧)
  2. PRテンプレートに「APIスタイルガイド準拠チェック」を追加
  3. 既存APIのうちアクセス頻度上位10エンドポイントを新形式に移行

1ページのスタイルガイドがチーム全体の「迷い」を解消した。APIレビューの指摘事項は月42件→12件に減少し、新エンドポイントの結合工数は平均3日→1日に短縮された。

例3:SaaSプロダクトが外部公開APIの設計品質で月間API呼び出し数を3倍にする

状況: 外部パートナー向けAPI。ドキュメントが古く、エラーメッセージが内部コード(ERR_0042)のままで、パートナーからの問い合わせが月80件。

施策:

  1. OpenAPI 3.0でスキーマを再定義し、Swagger UIで公開
  2. エラーコードを人間が読めるものに変更(INVALID_EMAILRATE_LIMIT_EXCEEDED
  3. サンドボックス環境を提供し、本番データなしでテスト可能に

パートナーからの問い合わせが月80件→15件に減少し、新規パートナーの連携開発期間が平均4週間→10日に短縮。API呼び出し数は月間50万→150万に増加し、間接的にARRが12%向上した。

やりがちな失敗パターン
#

  1. エンドポイントごとにレスポンス形式が違う — あるAPIは{ "result": ... }、別のAPIは{ "data": ... }チーム全体のAPIスタイルガイドを作り、レビューで守る
  2. すべてHTTP 200で返す — エラーもHTTP 200で返し、bodyの中で成否を判定させる。HTTPステータスコードを正しく使い、クライアントのエラーハンドリングを簡潔にする
  3. 内部実装がAPIに漏れる — DBのカラム名がそのままレスポンスのフィールド名になっている。APIのインターフェースは利用者目線で設計し、内部実装とは切り離す
  4. ページネーションを後付けする — 最初はリスト全件返しで、データ増加後に慌ててページネーションを導入。既存クライアントが壊れる。最初からページネーションを設計に含める

まとめ
#

API設計は 「使う人の体験」 を最優先する。リソース指向、一貫したレスポンス形式、適切なHTTPステータスコード、バージョニングの4つを押さえれば、使いやすいAPIの基盤ができる。OpenAPIでスキーマ駆動開発を取り入れると、ドキュメントとコードの一貫性も保てる。まずはチームのAPIスタイルガイドを1ページ作ることから始めよう。