واجهة برمجة التطبيقات  واجهة برمجة التطبيقات اختصاراً API، وصفٌ العناصر البرمجيّة حسب وظائفها، ومدخلاتها ومخرجاتها. ويتمثل الهدف الرئيسيّ منها في توفير قائمة من الوظائف المستقلّة تمامًا عن الآلية التي نفّذت بها، لتتيح للآخرين التواصل معها من خلال أيّ آلية أخرى.  وهي مجموعة تعاريف وبروتوكولات وأدوات خاصة بالروتين الفرعي ومصممة لبناء البرمجيات التطبيقية. وتعني بشكل عام مجموعة من الطرق الواضحة التعريف للتواصل بين مختلف مكونات البرمجيات. من شأن الواجهة الجيدة أن تسهّل تطوير برامج الحاسوب عبر توفير كافة الكتل البرمجية الإنشائية اللازمة، ليعمل المبرمج بعد ذلك على رصفها وجمعها.  وقد تكون الواجهة مخصصة لنظام على الويب أو لنظام تشغيل أو نظام قاعدة بيانات أو عتاد الحاسوب أو مكتبة برمجيات.  وتأتي مواصفات الواجهة بأشكال مختلفة ولكنها غالبًا ما تشمل مواصفات الروتين أو بنية البيانات أو أصناف الكائنات أو المتغيرات أو نداءات الإجراءات البعيدة. «بوزيكس» (POSIX) وواجهة برمجة تطبيقات ويندوز Windows API وواجهة البرمجة المتقدمة لناقل «سكزي»ASPI هي أمثلة عن الأشكال المتعددة التي تتخذها واجهة برمجة التطبيقات. ويتم عادةً تزويد ملفات توثيق الواجهة لتسهيل الاستخدام وإعادة التنفيذ.  مثلما تسهّل واجهة المستخدم الرسومية على الأشخاص استخدام البرامج، تسهّل واجهة برمجية التطبيق على مطوّر البرمجيات استعمال تكنولوجيات معينة في بناء التطبيقات. من خلال تجريد التنفيذ الكامن والكشف عن الكائنات أو الأعمال التي يحتاجها المطور فحسب، تسهّل واجهة برمجة التطبيقات عملية البرمجة. وفي حين أنّ الواجهة الرسومية لـعميل بريد إلكتروني قد تزوّد المستخدم بزرّ يؤدي كل الخطوات اللازمة لاستحضار كل الرسائل الإلكترونية الجديدة والإضاءة عليها، فإن واجهة برمجة التطبيقات الخاصة بوحدات إدخال/إخراج الملف قد تعطي المطوّر وظيفة تنسخ الملف من موقع إلى آخر بدون أن تستدعي من المطوّر أن يفهم عمليات نظام الملفات التي تجري خلف الكواليس.  هناك نوعان من الـ (API):  أحدهما يعتمد على لغة البرمجة؛ بمعنى أنه متاحٌ فقط في لغة برمجة معينة، ويقوم على استخدام syntax وعناصر هذه اللغة لجعله ملائما للاستخدام في هذا السياق.  والآخر مستقل عن اللغة وهذا يعني أنه مكتوب بطريقة تتيح له أن يستخدم في العديد من لغات البرمجة (عادةً an assembly/C-level interface) وهذا النمط مطلوب في أنواع الواجهات البرمجية API المستخدمة في خدمة غير المرتبطة بعملية معالجة معينة، أو نظام تشغيل وعادة ما تكون متاحة كروتين منفصل.  مثال عن النوع الثاني هو على سبيل المثال، الموقع الذي يعرض أماكن تواجد المطاعم في مكان ما يتيح للمستخدم بوضع مجموعة معلومات إضافية على نفس خريطة الموقع التي جلبت من خرائط جوجل (خرائط جوجل)، وذلك بسبب ان خرائط جوجل تحتوي على هذا النوع والذي يسمح بعمل هذا الشيء. واجهة برمجة التطبيقات الخاصة بخرائط جوجل تتحكم بماهية المعلومات التي يمكن للمستخدم استغلالها وما الذي يستطيع أن يعمل بها وكذلك ليس على الخرائط الخاصة لجوجل فقط بل أنها تستخدم في العديد من المهام الأخرى مثل ربطها بموقع إلكتروني لإتاحة فرصة عملية الشراء من خلال الموقع بالفيزا أو كروت الــ ATM.  يشكل إنشاء واستخدام واجهات برمجة التطبيقات موضوعًا رئيسيًا في البرمجة المعاصرة. تستفيد التطبيقات عادة من العديد من واجهات البرمجة؛ المنفذة من طرف المكتبات البرمجية التي يمكن أن تستخدم بدورها واجهات برمجة أخرى.  في البنيات الخدمية يمكن للتطبيقات أن تعتمد على الميزات التي تقدمها برامج طرف ثالث عن طريق واجهات برمجة منفذة من طرف خدمات الويب.  واجهة البرمجة تسمح على سبيل المثال للبرنامج بالوصول إلى الخدمات التي يقدمها نظام التشغيل الذي يستضيف البرنامج. واجهة socket هي مثال كلاسيكي من واجهة البرمجة، تسمح للبرنامج من استغلال إمكانيات طبقة الشبكة لنظام التشغيل.  تكون عادةً واجهة برمجة التطبيقات مرتبطة بمكتبة برمجية. تصف هذه الواجهة وتحدد "السلوك المتوقع" (توصيف) حين تكون المكتبة في طور "التنفيذ الفعلي" لمجموعة القواعد هذه. يمكن للواجهة الواحدة أن تجري عدة عمليات تنفيذ (أو ألّا تجري أي عملية تنفيذ إذا كانت مجرّدة) على هيئة مكتبات مختلفة تتشارك واجهة البرمجة نفسها.  ويتيح فصل الواجهة عن تنفيذها للبرامج المكتوبة بلغة معينة استخدام مكتبة موضوعة بلغة أخرى. على سبيل المثال، بما أن لغتَي «سكالا» و«جافا» تتحولان إلى كود وحدات البايت (bytecode) المطابق، يستطيع مطوّر «سكالا» أن يستفيد من أي واجهة جافا.  تختلف وجهة استعمال واجهة برمجة التطبيقات باختلاف لغة البرمجة المستخدمة. فواجهة اللغة الإجرائية على غرار «لوا» قد تتكوّن بالدرجة الأولى من روتين أساسي لتنفيذ الكود والتصرّف بالبيانات أو التعامل مع الأخطاء، في حين أن واجهة اللغة الكائنية التوجّهة مثل جافا قد تعطي توصيفًا للأصناف وطرق الأصناف الخاصة بها.  واجهة ربط اللغة هي أيضًا نوع من واجهات برمجة التطبيقات. عند ربط خصائص وإمكانيات لغة معينة بواجهة منفّذة بلغة أخرى، تسمح واجهة ربط اللغة باستخدام المكتبة أو الخدمة المكتوبة بلغة معينة عند التطوير بلغة أخرى. وثمة أدوات تسهّل إنشاء مثل هذه الواجهات، منها أداة «التضمين المبسّط وتوليد الواجهات» SWIG وF2PY (مولّد واجهة من فورتران إلى بايثون).  من الممكن أيضًا أن ترتبط واجهة برمجة التطبيقات بإطار عمل برمجي، حيث يمكن أن يستند إطار العمل إلى عدة مكتبات تنفّذ عدة واجهات لبرمجة التطبيقات، ولكن بخلاف وجهة الاستعمال المعتادة لواجهة برمجة التطبيقات، يتم الوصول إلى السلوك المضمّن في إطار العمل بواسطة توسيع محتواه عبر أصناف جديدة موصولة بإطار العمل نفسه.  فضلاً عن ذلك، فإن آلية التحكم بالتدفق في البرنامج ككل قد تخرج عن سيطرة المتّصل وتصبح تحت سيطرة إطار العمل عبر تغيير وجهة التحكم أو آلية مشابهة.  بوسع واجهة برمجة التطبيقات أن تحدد الواجهة ما بين التطبيق ونظام التشغيل. على سبيل المثال، تحدد بوزيكس مجموعة من الواجهات المشتركة لبرمجة التطبيقات تهدف إلى السماح بتحويل تطبيق مكتوب خصيصًا لنظام تشغيل متطابق مع بوزيكس إلى نظام تشغيل آخر متطابق مع بوزيكس. لينكس وتوزيعة برمجيات بريكلي هما من الأمثلة عن أنظمة التشغيل التي تطبّق واجهات برمجة التطبيقات الخاصة ببوزيكس.  أعربت شركة مايكروسوفت عن التزام كبير بواجهة برمجة تطبيقات ذات توافقية رجعية، خصوصًا ضمن مكتبة (ويندوز32) الخاصة بواجهة برمجة تطبيقات ويندوز، ليصبح بالإمكان تشغيل التطبيقات القديمة على النسخ الأجدد من ويندوز بواسطة إعداد مخصص للبرامج التنفيذية يُدعى «نمط التوافقية».  تختلف واجهة برمجة التطبيقات عن واجهة التطبيق الثنائية من حيث أن الأولى مستندة إلى كود مصدري والثانية مستندة إلى ملف ثنائي. مثلاً، توفّر بوزيكس واجهات برمجة التطبيقات، في حين توفّر قاعدة لينكس النموذجية واجهة تطبيق ثنائية.  تتيح هذه الواجهات البعيدة للمطوّرين التصرّف بالموارد البعيدة من خلال البروتوكولات، ومعايير تواصل محددة تسمح لتكنولوجيات مختلفة العمل معًا بغض النظر عن اللغة البرمجية أو المنصة. على سبيل المثال، تتيح واجهة برمجة التطبيقات الخاصة بـ«اتصالية قاعدة بيانات جافا» للمطورين الاستعلام عن عدة أنواع مختلفة من قواعد البيانات بواسطة المجموعة نفسها من الوظائف، في حين أنّ واجهة برمجة التطبيقات الخاصة بتقنية جافا لاستدعاء الطرائق عن بُعد تستخدم بروتوكول جافا للطرائق البعادي للسماح باستدعاء الوظائف العاملة عن بُعد والتي تبدو محلية للمطوّر.  بالتالي، تعتبر الواجهات البعيدة لبرمجة التطبيقات مفيدة في الحفاظ على تجرد الكائنات في البرمجة الكائنية التوجّة؛ حيث أن نداء استدعاء الطرائق الذي يتم محليًا على كائن وكيل يستدعي الطريقة المطابقة في الكائن البعيد بواسطة البروتوكول البُعادي، ويحصل على النتيجة التي ستستخدم محليًا بمثابة قيمة مرجعة. وسيؤدي أي تعديل على الكائن الوكيل إلى تعديل مطابق في الكائن البعيد.  هي الواجهات المعرّفة التي تحدث من خلالها التفاعلات بين المؤسسة والتطبيقات التي تستخدم أصولها، وهي أيضًا عبارة عن اتفاقية مبرمة على مستوى الخدمات من أجل تحديد المزوّد وعرض مسار الخدمة أو عنوان الموقع الإلكتروني (url) لمستخدمي الواجهة. وتعتبر مقاربة واجهة برمجة التطبيقات واجهةً هندسية تدور حول تزويد واجهات قابلة للبرمجة وخاصة بمجموعة خدمات إلى تطبيقات مختلفة تقدّم الخدمات لمختلف أنواع المستهلكين.  وعند استخدام هذه الواجهة في سياق تطوير الويب، تعرّف عادةً واجهة برمجة التطبيقات على أنها مجموعة تطبيقات، على غرار رسائل الطلبات التابعة لبروتوكول نقل النص الفائق، مع تعريف لبنية رسائل الرد، وهي عادةً موضوعة بلغة الترميز القابلة للامتداد أو بصيغة ترميز جافا سكريبت (جسون). ومن الأمثلة عنها واجهة برمجة التطبيقات الخاصة بشركة شحن، حيث يمكن إضافة هذه الواجهة إلى موقع إلكتروني مخصص للتجارة الإلكترونية من أجل تسهيل آلية طلب خدمة الشحن وإدراج تكلفة الشحن الراهنة تلقائيًا بدون أن يضطر مطوّر الموقع إلى إدخال جدول تكاليف الشحن في قاعدة بيانات على الويب. وفي حين كان من الشائع اعتبار مصطلح «واجهة برمجة التطبيقات الخاصة بالويب» مرادفًا لخدمة الويب، فإن التوجه الأخير (ويُعرف باسم ويب 2.0) بات يبتعد عن خدمات الويب القائمة على بروتوكول «سواب» والبنية الخدمية ويتجه نحو موارد ويب من نوع أكثر مباشرةً لنقل الحالة التمثيلية (رست) ونحو البنية الموجهة نحو الموارد. ويتعلق هذا التوجه جزئيًا بتحرّك الويب الدلالي بإتجاه إطار توصيف الموارد، وهو مفهوم يروّج لتكنولوجيات هندسة الأنطولوجيات (علم المعلومات).  تتيح واجهات برمجة التطبيقات الخاصة بالويب الجمع بين عدة واجهات لبرمجة التطبيقات ضمن تطبيقات جديدة في ما يُعرف بتقنية المزج. في مجال التواصل الاجتماعي، أتاحت واجهات برمجة التطبيقات الخاصة بالويب لجماعات الويب تسهيل تشارك المحتوى والبيانات بين الجماعات والتطبيقات. وبهذه الطريقة، أصبح المحتوى المبتكر في مكان معين قابلًا للنشر والتحديث في عدة أماكن أخرى على الشبكة. على سبيل المثال، تتيح واجهة برمجة التطبيقات لنقل الحالة التمثيلية «رست» على تويتر للمطوّرين أن يصلوا إلى بيانات تويتر الجوهرية فيما تؤمّن واجهة برمجة التطبيقات الخاصة بالبحث عدة طرق يستخدمها المطورون للتفاعل مع بيانات البحث والتوجهات على تويتر.  في صناعة البرمجيات المعاصرة، تستخدم تطبيقات الكمبيوتر عادة العديد من برامج طرف ثالث على سبيل المثال نظام التشغيل، المكتبات القياسية ونظام خوادم التطبيقات. كل من هذه المنتجات لديها واجهة البرمجة الخاصة بها. وبالتالي، كل مبرمج يشارك في تطوير هذه المنتجات، فهو يشارك أيضا، بوعي أو لا، في تجارة واجهات البرمجة. من وجهة نظر تجارية، الواجهات البرمجية هي عبارة عن عقد يصف فيه المقاول وظائف العرض الذي يقدمه وميزاته وحدوده.  البناء عن طريق تجميع البرامج يتطلب أن تعرف الشركة المصنعة كيفية تفاعل الأجزاء المكونة له، والذي يقوم بعملية التجميع لا يحتاج إلى معرفة تفاصيل عمل كل جزء طالما أنه يعرف واجهة برامجها وهي الحد الأدنى الذي يحتاج المبرمج إلى معرفته ليكون قادر على استخدام البرمجيات الأخرى. أما لإستعمال وظيفة، فمن الضروري أن يعرف إسمها، متغيراتها ونوع النتيجة.  يتم توزيع واجهات البرمجة في السوق كمنتج برمجيات عادي يتم تحسينه بشكل منتظم. تنفيذ الوظائف التي تستعمل عن طريق واجهات البرمجة يمكن أن يتغير بشكل منتظم أيضا، مع الحفاظ على الواجهة وفقا للعقد.  لتصميم واجهة برمجة التطبيقات تأثيرٌ كبير على استعمالها. يصف مبدأ إخفاء البيانات دور واجهات البرمجة في تمكين البرمجة التركيبية عبر إخفاء تفاصيل التنفيذ الخاصة بالتركيبات/الوحدات بشكل لا يكون مستخدم التركيبة بحاجة إلى فهم التعقيدات التي تنطوي عليها. من هنا، يحاول تصميم واجهة برمجة التطبيقات أن يوفّر الأدوات التي يتوقعها المستخدم لا أكثر. ويشكل تصميم واجهات البرمجة جزءًا مهمًا من المعمارية البرمجية أي آلية تنظيم قسم معقّد من البرمجيات.  جوشوا بلوش، وكين لاين، وميتشي هينيغ هم من الكتّاب الكثر الذين أعطوا توصيات بشأن كيفية تصميم واجهات برمجة التطبيقات.  واجهات برمجة التطبيقات هي إحدى الطرق الشائعة التي تستخدمها شركات التكنولوجيا للتوحّد مع بعضها. وتعتبر الشركات التي تؤمّن وتستخدم هذه الواجهات بمثابة أفراد في نظام اتصال خاص بالأعمال.  السياسات الرئيسية لإصدار واجهات برمجة التطبيقات هي:   يعتبر "ثبات الواجهة" عاملاً مهمًا عندما تطرح واجهة برمجة التطبيقات للاستعمال العام. فأي تغيير يجريه المطوّر في أي جزء منها – كإضافة مَعلمات جديدة لنداء الدالة – قد يبطل التوافق مع العملاء الذين يعتمدون على واجهة برمجة التطبيقات تلك.  حين تكون بعض أجزاء واجهة برمجة التطبيقات المطروحة للاستعمال العام معرضة للتغيير وبالتالي غير ثابتة، يجب أن يتم توثيق هذه الأجزاء الخاصة بواجهة برمجة تطبيقات معينة صراحةً على أنها "غير ثابتة". في مكتبة جوجل جوافا مثلاً، تم تحديد الأجزاء التي تعتبر غير ثابتة والتي قد تتغير في المستقبل القريب بعلامة جافا @Beta.  في بعض الأحيان، قد تعلن واجهة برمجة التطبيقات العلنية عن إلغاء بعض أجزائها أو "عدم النصح باستخدامها". وهذا يعني عادةً أنه يجب اعتبار هذه الأجزاء مرشّحة للإزالة أو التعديل بطريقة عكسية غير متوافقة. بالتالي تتيح هذه التغييرات للمطورين الابتعاد تدريجيًا عن أجزاء الواجهة التي سيتم إزالتها أو التي لن تكون مدعومة في المستقبل.  تصف وثائق واجهات برمجة التطبيقات الخدمات التي تقدمها الواجهة وكيفية استخدام هذه الخدمات، راميةً إلى تغطية كافة النواحي التي يحتاج العميل إلى معرفتها لدواعي التطبيق. والوثائق ضرورية لتطوير التطبيقات وصيانتها بواسطة واجهة برمجة التطبيقات. والوثائق الخاصة بواجهة برمجة التطبيقات متواجدة عادةً في ملفات الوثائق إنما يمكن إيجادها على وسائل التواصل الاجتماعي كالمدونات الإلكترونية والمنتديات ومواقع الأسئلة والأجوبة.  وغالبًا ما تعرض الوثائق التقليدية من خلال نظام توثيق على غرار جافادوك أو بايدوك يتمتع بشكل وتركيبة ثابتين. ولكن أنواع المحتوى المتضمن في الوثائق تختلف بين واجهة وأخرى. لدواعي الوضوح، قد تشمل وثائق الواجهة وصفًا للفئات والطرق الخاصة بالواجهة إلى جانب «سيناريوهات الاستعمال العادي وقصاصات الكود ومبررات التصميم ومناقشات الأداء والعقود» إنما يتم عادةً إغفال تفاصيل التنفيذ الخاصة بخدمات الواجهة نفسها.  وكذلك تحتوي هذه الوثائق على القيود والضوابط المفروضة على كيفية استخدام الواجهة، حيث يمكن للوثائق الخاصة بإحدى دالّات الواجهة مثلاً أن تذكر أنه لا يمكن إبطال معلماتها أو أن الدالة نفسها لا تتمتع بسلامة الخيوط أو أن بروتوكول الزيادة والإبطال يمنعان التبادل الذاتي. وبما أن وثائق واجهات برمجة التطبيقات تكون عادةً شاملة، يصعب على الكتّاب تحديثها بانتظام وعلى المستخدمين قراءتها بتمعّن، الأمر الذي قد يتسبب بأخطاء برمجية.  يمكن إغناء الوثائق ببيانات وصفية على غرار التعليقات التوضيحية من جافا. وتستخدم هذه البيانات الوصفية من قبل المحول البرمجي والأدوات وبيئة تنفيذ البرامج من أجل تنفيذ سلوك مخصص أو معالجة مخصصة.  في العام 2010، قامت شركة أوراكل بمقاضاة جوجل بسبب نشر تنفيذٍ جديد لجافا كان متضمنًا في نظام تشغيل أندرويد. ولم تكن شركة جوجل قد حصلت على أي إذن بإعادة نسخ واجهة برمجة تطبيقات جافا مع أن مشروعًا مماثلاً ويدعى «عدة تطوير جافا المفتوحة» سبق أن أعطي الإذن بذلك. وفي قضية أوراكل ضد جوجل، حكم القاضي ويليم ألسب بعدم جواز إخضاع واجهات برمجة التطبيقات لحقوق التأليف والنشر في الولايات المتحدة، وكان فوز شركة أوراكل بالقضية ليوسّع حماية حقوق النشر إلى حدٍّ كبير ويسمح بإخضاع أبسط أوامر البرمجيات لحماية حقوق النشر والتأليف.  إنّ القبول بمطلب شركة أوراكل يعني السماح لأي شخصٍ كان بالاحتفاظ بحق النشر والتأليف لنسخة كود معينة لازمة لإنجاز منظومة أوامر وبالتالي يمنع كل الأشخاص الآخرين من كتابة نسخهم الخاصة المختلفة عنه من أجل إنجاز الأوامر نفسها كلها أو جزء منها.  ولكن في العام 2014، أُبطل الحكم الصادر عن القاضي ألسب في محكمة الاستئناف، مع أن المسألة المتعلقة بما إذا كان هذا النوع من استعمال واجهات برمجة التطبيقات يعتبر استخدامًا عادلاً بقيت بدون معالجة.  وفي العام 2016، وبعد محاكمة دامت لأسبوعين، أصدر أحد القضاة قرارًا اعتبر فيه إعادة تنفيذ جوجل لواجهة برمجة تطبيقات جافا استخدامًا عادلاً، إلا أن شركة أوراكل تعهدت بالطعن في هذا القرار. وبالفعل فازت أوراكل بالطعن حيث حكمت محكمة الاستئناف الفيدرالية بأن استخدام جوجل لواجهات برمجة التطبيقات لا يصنّف بالاستخدام العادل.      قد يكون لواجهات البرمجة وظائف متعددة. على سبيل المثال، في J2EE، تظهر الوظائف التالية:  ويمكن استخدام واجهات برمجة التطبيقات لتبسيط الوصول إلى واجهات برمجة تطبيقات أخرى.  يمكن لواجهات البرمجة أن تحمل وتسير بيانات وصفية. أمثلة:API بيانات 9i Oracle والبيانات الوصفية العلائقية SAP. مثال جافا: API للوصول ومعالجة البيانات المسجلة في مصدر بيانات. مثال: البيانات الوصفية في API ل SAS مثال: DB2 مكعب مثال: تحميل Loading metadata to Livelink using Bulk Loader API's