API란 소프트웨어의 소스 코드 레벨에서 서로 인터페이스(방식을 맞추는)하는 방식을 정의한다. 일반적으로 API의 표준 인터페이스는 함수 이며, 상위 레벨의 소프트웨어에서 더 하위 레벨의 소프트웨어를 호출할 수 있다. (C 언어는 하위 레벨의 시스템 콜을 이용해 메모리 주소 값을 불러올 수 이다.) 예를 들면, 화면에 글자를 출력하는 데 필요한 내용을 제공하는 함수의 집합을 API라고 할 수 있겠다.
API는 그저 인터페이스를 정의하며 그 정의를 실제로 구현한 소프트웨어를 API 구현체라고 한다.
API를 흔히 '계약' 이라고 부르는데, API는 쌍방 계약이 아니므로 법률적으로 본다면 정확한 비유는 아니다. 보통 상위 레벨의 소프트웨어인 API의 사용자는 API와 그 구현에 직접적인 영향을 끼치지 못한다. 그냥 API 그 자체를 사용하거나 사용하지 않거나 둘 중 하나이다. API는 양쪽 소프트웨어 모두가 API를 준수할 경우에만 동작하며 소스 코드 수준에서 호환된다. 즉, API의 구현체와 관계없이 그 API를 따르기만 한다면 성공적으로 컴파일 된다.
C 표준에서 정의하고 표준 C 라이브러리에서 구현한 C API가 좋은 예다. C API는 메모리 관리나 문자열 처리 루틴 같은 기본 함수를 정의하고 있다.
API가 소스 코드 수준의 인터페이스를 정의한다면, ABI는 특정 아키텍처 간에서 동작하는 소프트웨어 간의 바이너리 인터페이스를 정의한다. ABI는 애플리케이션 내에서의 상호 동작, 커널과 어플리케이션, 혹은 애플리케이션과 라이브러리 간의 상호 동작에 대해서 정의 API가 소스 코드 수준의 호환성을 보장한다면 ABI는 바이너리의 호환성을 보장하며 이는 오브젝트 코드를 다시 컴파일 하는 수고 없이 같은 ABI를 지원하는 시스템이라면, 동일한 기능을 수행하도록 보장한다.
ABI는 콜링 컨벤션, 바이트 순서, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크, 라이브러리 동작 방식, 바이너리 오브젝트 형식 같은 내용과 관련이 있다. 예를 들어 콜링 컨벤션은, 함수가 실행되는 방식, 인자가 함수로 전달되는 방식, 레지스터에 값을 저장하는 방식, 함수를 호출한 측에서 반환 값을 가져가는 방식 등을 정의한다.
특정 아키텍처의 다양한 운영체제(특히 i386 유닉스 시스템) 간의 단일 ABI를 정의하려는 시도가 몇 차례 있었으나 결실을 맺지 못했다. 리눅스를 포함한 운영체제는 각각의 요구사항에 부합하는 고유의 ABI를 정의하려는 경향이 있다. ABI는 아키텍처와 밀접한 관계가 있으며, ABI 대부분은 특정 레지스터나 어셈블리 명령어 같은 하드웨어에 국한된 개념을 다루고 있다. 따라서 리눅스에서는 아키텍처마다 다른 고유의 ABI를 가지고 있다. (커널을 뜯어보면 아키텍처마다 같은 기능을하는 소스코드가 다르다.)