アプリケーションプログラミングインターフェース(API )は、コンピュータ間またはコンピュータプログラム間の接続です。これはソフトウェアインターフェースの一種であり、他のソフトウェアにサービスを提供します。[ 1 ]このような接続またはインターフェースの構築方法を記述した文書または標準は、API仕様と呼ばれます。この標準に準拠したコンピュータシステムは、APIを実装または公開していると言われます。APIという用語は、仕様または実装のいずれかを指す場合があります
コンピュータと人をつなぐユーザーインターフェースとは対照的に、アプリケーションプログラミングインターフェースは、コンピュータまたはソフトウェア同士をつなぎます。これは、それをソフトウェアに組み込むコンピュータプログラマー[ 1 ]以外の人 (エンドユーザー) が直接使用することを意図していません。API は、多くの場合、プログラマーが利用できるツールまたはサービスとして機能する異なる部分で構成されています。これらの部分の 1 つを使用するプログラムまたはプログラマーは、 API のその部分を呼び出すと言われます。API を構成する呼び出しは、サブルーチン、メソッド、リクエスト、またはエンドポイントとも呼ばれます。API 仕様はこれらの呼び出しを定義し、それらを使用または実装する方法を説明します。
APIの目的の一つは、システム内部の動作の詳細を隠蔽し、プログラマーにとって有用な部分のみを公開することで、内部の詳細が後から変更された場合でも一貫性を維持することです。APIは特定のシステムペア向けにカスタム構築される場合もあれば、多くのシステム間の 相互運用性を可能にする共通標準となる場合もあります。
APIという用語は、インターネットで接続されたコンピュータ間の通信を可能にするWeb API [ 2 ]を指すことが多い。プログラミング言語、ソフトウェアライブラリ、コンピュータオペレーティングシステム、コンピュータハードウェア用のAPIも存在する。APIは1940年代に誕生したが、その用語が使われるようになったのは1960年代から70年代になってからである。
APIは、ソフトウェアシステムを外部からのインタラクションに開放します。APIは、2つのソフトウェアシステムが、相互に合意されたシグナルを用いて、境界(インターフェース)を越えて通信することを可能にします。[ 3 ]つまり、APIはソフトウェアエンティティを相互に接続します。ユーザーインターフェースとは異なり、APIは通常、ユーザーからは見えません。これはソフトウェアシステムの「裏側」にある部分であり、マシン間通信に使用されます。[ 4 ]
適切に設計されたAPIは、ソフトウェアやソフトウェア開発者に必要なオブジェクトやアクションのみを公開します。不要な詳細は隠蔽されます。この抽象化により、プログラミングが簡素化されます。[ 5 ]

APIを用いたソフトウェア構築は、レゴブロックなどの積み木玩具の使用に例えられます。ソフトウェアサービスやソフトウェアライブラリは、積み木に似ています。これらはAPIを介して結合され、新しいソフトウェア製品を構成することができます。[ 6 ]この結合プロセスは統合と呼ばれます。[ 3 ]
例として、APIを提供する気象センサーを考えてみましょう。特定のメッセージがセンサーに送信されると、センサーは現在の気象状況を検知し、天気予報を返します。センサーを起動するメッセージはAPI呼び出しであり、天気予報はAPI応答です。[ 7 ]天気予報アプリは、複数の気象センサーAPIと統合し、地理的なエリア全体から気象データを収集する可能性があります。
APIはしばしば契約に例えられます。APIは、APIを提供するサービスプロバイダーと、それを利用するソフトウェア開発者という当事者間の合意を表します。APIが安定しているか、予測可能な方法でのみ変更されていれば、開発者のAPIへの信頼は高まり、APIの利用が増える可能性があります。[ 8 ]

APIという用語は、当初、エンドユーザー向けプログラム(アプリケーションプログラム)向けのインターフェースのみを指していました。この由来は、現在でも「アプリケーション・プログラミング・インターフェース」という名称に反映されています。今日では、この用語はより広義に解釈され、ユーティリティソフトウェアやハードウェアインターフェースも含みます。[ 10 ]
APIという概念は、その用語自体よりもはるかに古い歴史を持つ。イギリスのコンピュータ科学者モーリス・ウィルクスとデイビッド・ウィーラーは、 1940年代に初期のコンピュータであるEDSAC向けにモジュール型ソフトウェアライブラリの開発に取り組んだ。このライブラリのサブルーチンは、ファイリングキャビネットに整理されたパンチ紙テープに格納されていた。このキャビネットには、ウィルクスとウィーラーが「ライブラリカタログ」と呼んだ、各サブルーチンに関するメモとプログラムへの組み込み方法をまとめた資料も含まれていた。今日では、このようなカタログはAPI(あるいはAPI仕様書、APIドキュメント)と呼ばれる。これは、プログラマが必要とする各サブルーチンの使い方(あるいは「呼び出し方」)を指示するものであるからである。[ 10 ]
ウィルクスとウィーラーの著書『電子デジタルコンピュータのためのプログラムの準備』には、初めて公開されたAPI仕様が掲載されている。ジョシュア・ブロックは、APIは発明されたというよりは発見された概念であるため、ウィルクスとウィーラーはAPIを「潜在的に発明した」と考えている。[ 10 ]

「アプリケーション・プログラム・インターフェース」(-ing接尾辞なし)という用語が初めて記録されたのは、1968年のAFIPS会議で発表された「リモート・コンピュータ・グラフィックスのためのデータ構造と技術」という論文である。 [ 12 ] [ 10 ]この論文の著者は、この用語をアプリケーション(この場合はグラフィックス・プログラム)とコンピュータ・システムの他の部分との相互作用を説明するために使用している。一貫性のあるアプリケーション・インターフェース(Fortranサブルーチン呼び出しで構成)は、プログラマがグラフィックス・ディスプレイ・デバイスの特異性に対処する手間を省き、コンピュータまたはディスプレイが交換された場合でもハードウェアの独立性を確保することを目的としていた。 [ 11 ]
この用語は、 CJ Date [ 13 ]が1974年に発表した論文「リレーショナル・アプローチとネットワーク・アプローチ:アプリケーション・プログラミング・インターフェースの比較」において、データベース分野に導入されました。[ 14 ] APIは、データベース管理システムのためのANSI/SPARCフレームワークの一部となりました。このフレームワークでは、アプリケーション・プログラミング・インターフェースは、クエリ・インターフェースなどの他のインターフェースとは別に扱われていました。1970年代のデータベース専門家は、これらの異なるインターフェースを組み合わせることができ、十分に豊富なアプリケーション・インターフェースは他のインターフェースもサポートできることに気づきました。[ 9 ]
この観察から、アプリケーションプログラミングだけでなく、あらゆる種類のプログラミングをサポートするAPIが生まれました。1990年までに、APIは技術者カール・マラマッドによって「プログラマが特定のタスクを実行するために利用できる一連のサービス」と定義されました。[ 15 ]

APIの概念は、リモート・プロシージャ・コール(RPC )とWeb APIの登場とともに再び拡張されました。 1970年代から80年代にかけてコンピュータ・ネットワークが普及するにつれ、プログラマーはローカル・コンピュータだけでなく、他の場所にあるコンピュータ上のライブラリも呼び出すことを望むようになりました。こうしたRPCは、特にJava言語によって十分にサポートされていました。1990年代には、インターネットの普及に伴い、 CORBA、COM、DCOMなどの標準が、APIサービスを公開するための最も一般的な方法となるために競い合いました。[ 16 ]
ロイ・フィールディングは2000年にカリフォルニア大学アーバイン校で学位論文「アーキテクチャスタイルとネットワークベースのソフトウェアアーキテクチャの設計」を発表し、表現状態転送(REST)の概要を説明し、「ネットワークベースのアプリケーションプログラミングインターフェース」という概念を従来の「ライブラリベース」APIと対比させました。[ 17 ] XMLおよびJSON Web APIは2000年から商用利用が広がり、2021年現在も続いています。現在、Web APIはAPIという用語の最も一般的な意味となっています。[ 2 ]
2001年にティム・バーナーズ=リーが提唱したセマンティックウェブには、「セマンティックAPI」が含まれていました。これは、APIをソフトウェアの動作インターフェースではなく、オープンで分散されたデータインターフェースとして再構築したものです。 [ 18 ]独自のインターフェースやエージェントがオープンなものよりも普及しましたが、データインターフェースとしてのAPIという概念が定着しました。ウェブAPIはあらゆる種類のデータをオンラインで交換するために広く使用されているため、APIはインターネット上の通信の多くを説明する広義の用語となっています。[ 16 ]このように使用される場合、APIという用語は通信プロトコルという用語と意味が重複します。
ソフトウェアライブラリへのインターフェースはAPIの一種です。APIは「期待される動作」(仕様)を記述・規定しますが、ライブラリはこの一連のルールの「実際の実装」です
単一の API は、同じプログラミング インターフェイスを共有する異なるライブラリの形式で、複数の実装 (または抽象的であるため実装なし) を持つことができます。
APIと実装を分離することで、ある言語で書かれたプログラムから別の言語で書かれたライブラリを利用できるようになります。例えば、ScalaとJavaは互換性のあるバイトコードにコンパイルされるため、Scala開発者はあらゆるJava APIを活用できます。[ 19 ]
APIの利用方法は、使用するプログラミング言語の種類によって異なります。Luaのような手続き型言語のAPIは、主にコードの実行、データの操作、エラー処理などの基本ルーチンで構成されますが、Javaのようなオブジェクト指向言語のAPIは、クラスとそのクラスメソッドの仕様を提供します。[ 20 ] [ 21 ]ハイラムの法則は、「APIのユーザーが十分であれば、契約で何を約束したかは関係ありません。システムのすべての観測可能な動作は、誰かが依存していることになります。」と述べています。[ 22 ]一方、いくつかの研究によると、APIを使用するほとんどのアプリケーションは、APIの小さな部分を使用する傾向があります。 [ 23 ]
言語バインディングもAPIの一種です。ある言語の機能や性能を別の言語で実装されたインターフェースにマッピングすることで、ある言語で書かれたライブラリやサービスを別の言語で開発する際に利用できるようになります。[ 24 ] SWIGやF2PY (FortranからPythonへのインターフェースジェネレータ)などのツールは、このようなインターフェースの作成を容易にします。[ 25 ]
API はソフトウェア フレームワークと関連付けることもできます。フレームワークは複数の API を実装する複数のライブラリに基づくことができますが、API の通常の使用とは異なり、フレームワークに組み込まれた動作へのアクセスは、フレームワーク自体にプラグインされた新しいクラスを使用してそのコンテンツを拡張することによって仲介されます。
さらに、制御の反転や同様のメカニズムによって、プログラム全体の制御フローが呼び出し元の制御から外れ、フレームワークの制御下に置かれることもあります。 [ 26 ] [ 27 ]
APIは、アプリケーションとオペレーティングシステム間のインターフェースを指定できます。[ 28 ] 例えば、POSIXは、POSIX準拠のオペレーティングシステム用に作成されたアプリケーションを別のPOSIX準拠のオペレーティングシステム用に コンパイルできるようにすることを目的とした共通APIのセットを規定しています
LinuxとBerkeley Software DistributionはPOSIX APIを実装したオペレーティングシステムの例である。[ 29 ]
マイクロソフトは、特にWindows API (Win32) ライブラリ内で下位互換性のある API に強くこだわっており、古いアプリケーションは「互換モード」と呼ばれる実行ファイル固有の設定を使用して新しいバージョンの Windows でも実行できる可能性がある。[ 30 ]マイクロソフトの開発者が同社のオペレーティングシステムの内部 API にアクセスできることがどの程度有利であるかは不明である。1987年のテクノロジックコンピュータレターのリチャード A. シェイファーは、この状況を「マイクロソフトがすべてのバットとフィールドを所有している」野球の試合に例え、[ 31 ]ロータス デベロップメントやアシュトン テイトなどの大手ベンダーは、小規模なソフトウェア開発者には提供されていないMS-DOS 5.0に関する情報を受け取っていたと報じられている。[ 32 ]アシュトン テイトのエド エスバーは、1987 年のインタビューで、ビル ゲイツから、開発者は初期の API に基づいてソフトウェアを書き直さなければならないことがあると言われたと述べている。ゲイツ氏はインタビューの中で、マイクロソフトのApple MacintoshアプリケーションがMS-DOS用よりも成功したのは、同社がMac OSにもリソースを割く必要がなかったためだと指摘した。[ 33 ]
APIはアプリケーションバイナリインターフェース(ABI)とは異なり、APIはソースコードベースであるのに対し、ABIはバイナリベースです。例えば、POSIXはAPIを提供しますが、Linux Standard BaseはABIを提供します。[ 34 ] [ 35 ]
リモートAPIを使用すると、開発者はプロトコル(言語やプラットフォームに関係なく、さまざまなテクノロジーを連携させるための特定の通信標準)を介してリモートリソースを操作できます。たとえば、Java Database Connectivity APIを使用すると、開発者は同じ関数セットを使用してさまざまな種類のデータベースにクエリを実行できます。一方、 Javaリモートメソッド呼び出しAPIは、Javaリモートメソッドプロトコルを使用して、リモートで操作されるが開発者にはローカルに見える関数の呼び出しを可能にします。 [ 36 ] [ 37 ]
したがって、リモート API は、オブジェクト指向プログラミングにおけるオブジェクトの抽象化を維持するのに役立ちます。プロキシオブジェクト上でローカルに実行されるメソッド呼び出しは、リモート プロトコルを使用してリモート オブジェクト上の対応するメソッドを呼び出し、戻り値としてローカルで使用される結果を取得します。
プロキシオブジェクトを変更すると、リモートオブジェクトもそれに応じて変更されます。[ 38 ]
Web APIは、企業とその資産を利用するアプリケーション間のやり取りを行うための定義済みのインターフェースであり、機能プロバイダーを指定し、APIユーザーにサービスパスまたはURLを公開するためのサービスレベルアグリーメント(SLA)でもあります。APIアプローチは、異なるタイプの消費者にサービスを提供する異なるアプリケーションに、一連のサービスへのプログラムインターフェースを提供することを中心としたアーキテクチャアプローチです。[ 39 ]
ウェブ開発の文脈で使用される場合、APIは通常、ハイパーテキスト転送プロトコル(HTTP)リクエストメッセージなどの仕様セットと、通常は拡張マークアップ言語( XML)またはJavaScriptオブジェクト記法(JSON )形式のレスポンスメッセージの構造定義として定義されます。例えば、eコマースに特化したウェブサイトに追加できる配送会社APIは、配送サービスの注文を容易にし、サイト開発者が配送会社の料金表をウェブデータベースに入力することなく、現在の配送料金を自動的に表示します。「ウェブAPI」は歴史的にウェブサービスとほぼ同義でしたが、最近のトレンド(いわゆるWeb 2.0 )では、シンプルオブジェクトアクセスプロトコル( SOAP)ベースのウェブサービスとサービス指向アーキテクチャ(SOA)から、より直接的な表現状態転送(REST)スタイルのウェブリソースとリソース指向アーキテクチャ(ROA)へと移行しています。[ 40 ]このトレンドの一部は、ウェブベースのオントロジーエンジニアリング技術を促進する概念であるリソース記述フレームワーク(RDF)へのセマンティックウェブの動向に関連しています。 Web APIは、複数のAPIを組み合わせてマッシュアップと呼ばれる新しいアプリケーションを作成することを可能にします。[ 41 ] ソーシャルメディア分野では、Web APIによってWebコミュニティがコミュニティ間やアプリケーション間でコンテンツやデータを共有することが容易になりました。これにより、ある場所で作成されたコンテンツを、Web上の複数の場所に動的に投稿および更新することが可能になります。[ 42 ]例えば、TwitterのREST APIは開発者がTwitterのコアデータにアクセスできるようにし、Search APIは開発者がTwitterの検索やトレンドデータとやり取りするための方法を提供します。[ 43 ]
APIの設計はその使用に大きな影響を与えます。[ 5 ]情報隠蔽の原則は、プログラミングインターフェースの役割を、モジュールの実装の詳細を隠すことでモジュールプログラミングを可能にし、モジュールのユーザーがモジュール内の複雑さを理解する必要がないようにすることです。[ 44 ]したがって、APIの設計は、ユーザーが期待するツールのみを提供するように試みます。[ 5 ]プログラミングインターフェースの設計は、複雑なソフトウェアの構成であるソフトウェアアーキテクチャの重要な部分を表しています。 [ 45 ]
APIは、テクノロジー企業が統合を行う一般的な方法の1つです。APIを提供および使用する企業は、ビジネスエコシステムのメンバーとみなされます。[ 46 ]
APIを公開するための主なポリシーは次のとおりです。[ 47 ]
APIが公開される際に重要な要素となるのは、「インターフェースの安定性」です。APIの変更(例えば、関数呼び出しに新しいパラメータを追加するなど)は、そのAPIに依存するクライアントとの互換性を損なう可能性があります。[ 51 ]
公開されているAPIの一部が変更の対象となり、安定していない場合は、そのAPIの該当部分を明示的に「不安定」と文書化する必要があります。例えば、Google Guavaライブラリでは、不安定とみなされ、近いうちに変更される可能性のある部分には、 Javaアノテーション が付けられています@Beta。[ 52 ]
公開APIは、その一部が非推奨または廃止されると宣言することがあります。これは通常、APIの一部が削除候補、または後方互換性のない形で変更される可能性があることを意味します。したがって、これらの変更により、開発者は将来削除またはサポートされなくなるAPIの一部から移行することができます。[ 53 ]
クライアントコードには、API設計者が意図していなかった革新的または便宜的な使用法が含まれている可能性があります。言い換えれば、大規模なユーザーベースを持つライブラリの場合、要素がパブリックAPIの一部になると、さまざまな方法で使用される可能性があります。[ 54 ] Akamaiは 2020年2月19日に年次レポート「インターネットの現状」を発表し、世界中の金融サービスのパブリックAPIプラットフォームを標的とするサイバー犯罪者の傾向が高まっていることを示しました。2017年12月から2019年11月までの間に、Akamaiは854.2億件の認証情報侵害攻撃を観測しました。約20%にあたる165.5億件は、APIエンドポイントとして定義されたホスト名に対するものでした。このうち4億7,350万件は金融サービス部門の組織を標的としていました。[ 55 ]
APIドキュメントは、APIが提供するサービスとそのサービスの使用方法を説明し、クライアントが実用上知っておく必要のあるすべての情報を網羅することを目的としています
ドキュメントは、APIを使用するアプリケーションの開発と保守に不可欠です。[ 56 ] APIドキュメントは、伝統的にドキュメントファイルに含まれていますが、ブログ、フォーラム、Q&Aウェブサイトなどのソーシャルメディアにも掲載されています。[ 57 ]
従来のドキュメントファイルは、JavadocやPydocといった、一貫した外観と構造を持つドキュメントシステムを介して提供されることが多い。しかし、ドキュメントに含まれるコンテンツの種類はAPIごとに異なる。[ 58 ]
明確さを重視するため、APIドキュメントには、API内のクラスとメソッドの説明、一般的な使用シナリオ、コードスニペット、設計上の根拠、パフォーマンスに関する議論、契約などが含まれる場合がありますが、APIサービス自体の実装の詳細は通常は省略されます。APIドキュメントは、説明文書、チュートリアル、参考資料など、さまざまな形式を取ります。また、ガイドや機能など、さまざまな種類の情報が含まれます。
APIの使用方法に関する制限事項もドキュメントに記載されています。例えば、API関数のドキュメントには、パラメータがnullであってはならないことや、関数自体がスレッドセーフではないことなどが明記されている場合があります。[ 59 ] APIドキュメントは網羅的になる傾向があるため、作成者にとってはドキュメントを最新の状態に保つことが難しく、ユーザーにとっては注意深く読むことが難しく、バグが発生する可能性もあります。[ 51 ]
APIドキュメントは、 Javaアノテーションなどのメタデータ情報で強化することができます。このメタデータは、コンパイラ、ツール、ランタイム環境でカスタム動作やカスタム処理を実装するために使用できます。[ 60 ]
データ駆動型でAPIドキュメントを生成することが可能です。特定のAPIを使用する多くのプログラムを観察することで、典型的な使用方法や必要な契約や指示を推測することが可能です。[ 61 ]そして、テンプレートを用いてマイニングされたデータから自然言語を生成することができます。
2010年、オラクル社は、Androidオペレーティングシステムに組み込まれたJavaの新しい実装を配布したとして、Google社を提訴した。[ 62 ] Google社は、類似のOpenJDKプロジェクトには許可を与えていたものの、Java APIの複製許可を取得していなかった。ウィリアム・アルサップ判事は、オラクル対Google訴訟において、APIは米国では著作権で保護できないと判決を下し、オラクル社が勝訴すれば著作権保護の範囲が「機能的な記号の集合」にまで拡大され、単純なソフトウェアコマンドの著作権保護も認められることになると述べた。
オラクルの主張を受け入れるということは、コマンドのシステムを実行するコードの一つのバージョンを誰でも著作権で保護できるようにし、それによって他のすべての人が同じコマンドの全部または一部を実行する異なるバージョンを書くことを禁止することになる。[ 63 ] [ 64 ]
アルサップの判決は2014年に連邦巡回控訴裁判所への控訴により覆されたが、このようなAPIの使用が公正使用に該当するかどうかという問題は未解決のままであった。[ 65 ] [ 66 ]
2016年、2週間の裁判の後、陪審はGoogleによるJava APIの再実装がフェアユースに該当すると判断したが、オラクルは控訴すると誓った。[ 67 ]オラクルは控訴で勝訴し、連邦巡回控訴裁判所はGoogleによるAPIの使用はフェアユースの要件を満たさないとの判決を下した。[ 68 ] 2019年、Googleは著作権とフェアユースの両方の判決をめぐって米国最高裁判所に控訴し、最高裁判所は審査を認めた。[ 69 ] COVID-19パンデミックのため、この事件の口頭審理は2020年10月まで延期された。[ 70 ]
この訴訟は最高裁判所によってグーグルの勝訴で判決された。[ 71 ]
「API」またはその拡張版である「アプリケーション・プログラミング・インターフェース」という略語を耳にすると、ほとんどの場合、HTTPを使用してJSONまたはXML形式の機械可読データへのアクセスを提供するという現代的なアプローチを指しており、多くの場合、単に「Web API」と呼ばれます。APIはコンピューティングとほぼ同じくらい長い間存在してきましたが、現代のWeb APIは2000年代初頭に形を整え始めました。