
Uma interface de programação de aplicações (API, do inglês application programming interface) é uma conexão entre computadores ou entre programas de computador. É um tipo de interface de software que oferece um serviço a outras partes de software. Um documento ou padrão que descreve como construir essa conexão ou interface é chamado de especificação de API. Diz-se que um sistema computacional que atende a esse padrão implementa ou expõe uma API. O termo API pode referir-se tanto à especificação quanto à implementação.
Ao contrário de uma interface do usuário, que conecta um computador a uma pessoa, uma interface de programação de aplicações conecta computadores ou partes de software entre si. Ela não se destina a ser usada diretamente por uma pessoa (o usuário final), a não ser por um programador que a esteja incorporando a um software. Uma API costuma ser composta de diferentes partes, que funcionam como ferramentas ou serviços disponíveis para o programador. Diz-se que um programa ou programador que usa uma dessas partes chama essa porção da API. As chamadas que compõem a API também são conhecidas como sub-rotinas, métodos, requisições ou endpoints. Uma especificação de API define essas chamadas, isto é, explica como usá-las ou implementá-las.
Um dos principais propósitos das APIs é ocultar os detalhes internos do funcionamento de um sistema, expondo apenas as partes que um programador considerará úteis e mantendo-as consistentes mesmo que os detalhes internos mudem posteriormente. Uma API pode ser feita sob medida para um par específico de sistemas ou ser um padrão compartilhado que permite a interoperabilidade entre muitos sistemas.
O termo API é frequentemente usado para se referir a APIs web, que permitem a comunicação entre computadores conectados pela internet. Também há APIs para linguagens de programação, bibliotecas de software, sistemas operacionais e hardware de computador. As APIs surgiram na década de 1940, embora o termo só tenha aparecido nas décadas de 1960 e 1970.
Uma API abre um sistema de software a interações vindas de fora. Ela permite que dois sistemas de software se comuniquem através de uma fronteira — uma interface — usando sinais mutuamente acordados. Em outras palavras, uma API conecta entidades de software. Ao contrário de uma interface do usuário, uma API normalmente não é visível para os usuários: ela é uma parte "dos bastidores" de um sistema de software, usada para a comunicação entre máquinas.
Uma API bem projetada expõe apenas os objetos ou as ações de que o software ou os desenvolvedores de software precisam e oculta os detalhes que não têm utilidade. Essa abstração simplifica a programação.

A construção de software com APIs já foi comparada ao uso de brinquedos de blocos de montar, como os blocos Lego. Os serviços ou as bibliotecas de software são análogos aos blocos: podem ser unidos por meio de suas APIs, compondo um novo produto de software.:Prefácio O processo de união é chamado de integração.
Como exemplo, considere um sensor meteorológico que oferece uma API. Quando determinada mensagem é transmitida ao sensor, ele detecta as condições meteorológicas do momento e responde com um boletim meteorológico. A mensagem que ativa o sensor é uma chamada de API, e o boletim é uma resposta da API. Um aplicativo de previsão do tempo poderia integrar-se a várias APIs de sensores meteorológicos, reunindo dados de toda uma área geográfica.
Uma API é frequentemente comparada a um contrato. Ela representa um acordo entre partes: um provedor de serviço, que oferece a API, e os desenvolvedores de software, que dependem dela. Se a API permanecer estável, ou se mudar apenas de maneiras previsíveis, a confiança dos desenvolvedores na API aumentará, o que pode aumentar o uso que fazem dela.

O termo API descrevia inicialmente uma interface apenas para programas voltados ao usuário final, conhecidos como programas aplicativos. Essa origem ainda se reflete no nome "interface de programação de aplicações". Hoje, o termo é mais amplo e inclui também software utilitário e até interfaces de hardware.
A ideia de API é muito mais antiga que o próprio termo. Os cientistas da computação britânicos Maurice Wilkes e David Wheeler trabalharam, na década de 1940, em uma biblioteca de software modular para o EDSAC, um dos primeiros computadores. As sub-rotinas dessa biblioteca eram armazenadas em fita de papel perfurada, organizada em um arquivo de gavetas. Esse arquivo também continha o que Wilkes e Wheeler chamaram de "catálogo da biblioteca", com anotações sobre cada sub-rotina e sobre como incorporá-la a um programa. Hoje, esse catálogo seria chamado de API (ou especificação ou documentação de API), porque instrui o programador sobre como usar cada sub-rotina de que ele precisa.
O livro de Wilkes e Wheeler The Preparation of Programs for an Electronic Digital Computer contém a primeira especificação de API publicada. Joshua Bloch considera que Wilkes e Wheeler "inventaram latentemente" a API, porque ela é mais um conceito descoberto do que inventado.

O termo application program interface (sem o sufixo -ing de programming) foi registrado pela primeira vez em um artigo intitulado Data structures and techniques for remote computer graphics ("Estruturas de dados e técnicas para computação gráfica remota"), apresentado em uma conferência da AFIPS em 1968. Os autores desse artigo usam o termo para descrever a interação de uma aplicação — neste caso, um programa gráfico — com o restante do sistema computacional. Uma interface de aplicação consistente (composta de chamadas de sub-rotinas em Fortran) tinha o objetivo de livrar o programador de lidar com as idiossincrasias do dispositivo de exibição gráfica e de proporcionar independência de hardware caso o computador ou o monitor fossem substituídos.
Segundo o próprio C. J. Date, foi ele quem introduziu o termo no campo dos bancos de dados, em um artigo de 1974 intitulado The Relational and Network Approaches: Comparison of the Application Programming Interfaces ("As abordagens relacional e em rede: comparação das interfaces de programação de aplicações"). A API tornou-se parte da arquitetura ANSI/SPARC para sistemas de gerenciamento de banco de dados. Essa arquitetura tratava a interface de programação de aplicações separadamente de outras interfaces, como a interface de consulta. Na década de 1970, profissionais de banco de dados observaram que essas diferentes interfaces podiam ser combinadas: uma interface de aplicação suficientemente rica poderia dar suporte também às demais.
Essa observação levou a APIs que davam suporte a todos os tipos de programação, e não apenas à programação de aplicações. Em 1990, o tecnólogo Carl Malamud definia a API simplesmente como "um conjunto de serviços disponíveis a um programador para executar determinadas tarefas".

A ideia de API foi ampliada novamente com o advento das chamadas de procedimento remoto e das APIs web. À medida que as redes de computadores se tornaram comuns nas décadas de 1970 e 1980, os programadores passaram a querer chamar bibliotecas localizadas não apenas em seus computadores locais, mas também em computadores situados em outros lugares. Essas chamadas de procedimento remoto eram bem suportadas, em particular, pela linguagem Java. Na década de 1990, com a difusão da internet, padrões como CORBA, COM e DCOM competiram para se tornar a forma mais comum de expor serviços de API.
A tese de doutorado de Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures, apresentada na Universidade da Califórnia em Irvine em 2000, delineou a transferência de estado representacional (REST) e descreveu a ideia de uma "interface de programação de aplicações baseada em rede", que Fielding contrastou com as APIs tradicionais "baseadas em bibliotecas". As APIs web baseadas em XML e JSON passaram a ter ampla adoção comercial a partir de 2000, e a API web é hoje o significado mais comum do termo API.
A Web semântica, proposta por Tim Berners-Lee em 2001, incluía "APIs semânticas", que reformulavam a API como uma interface de dados aberta e distribuída, e não como uma interface de comportamento de software. Interfaces e agentes proprietários tornaram-se mais difundidos que os abertos, mas a ideia da API como interface de dados se consolidou. Como as APIs web são amplamente usadas para trocar dados de todos os tipos on-line, API tornou-se um termo amplo, que descreve grande parte da comunicação na internet. Usado dessa forma, o termo API tem significado parcialmente sobreposto ao do termo protocolo de comunicação.
A interface de uma biblioteca de software é um tipo de API. A API descreve e prescreve o "comportamento esperado" (uma especificação), enquanto a biblioteca é uma "implementação real" desse conjunto de regras.
Uma mesma API pode ter várias implementações (ou nenhuma, se for abstrata), na forma de diferentes bibliotecas que compartilham a mesma interface de programação.
A separação entre a API e sua implementação pode permitir que programas escritos em uma linguagem usem uma biblioteca escrita em outra. Por exemplo, como Scala e Java são compiladas para bytecode compatível, os desenvolvedores de Scala podem aproveitar qualquer API Java.
O uso de uma API pode variar conforme o tipo de linguagem de programação envolvida. Uma API para uma linguagem procedimental, como Lua, pode consistir principalmente em rotinas básicas para executar código, manipular dados ou tratar erros, enquanto uma API para uma linguagem orientada a objetos, como Java, fornece uma especificação de classes e de seus métodos. A lei de Hyrum afirma que "com um número suficiente de usuários de uma API, não importa o que se promete no contrato: todos os comportamentos observáveis do sistema passarão a ser usados como dependência por alguém". Por outro lado, estudos indicam que a maioria das aplicações que usam uma API utiliza apenas uma pequena parte dela.
As vinculações de linguagem (language bindings) também são APIs. Ao mapear os recursos e as capacidades de uma linguagem para uma interface implementada em outra, uma vinculação de linguagem permite que uma biblioteca ou serviço escrito em uma linguagem seja usado no desenvolvimento em outra. Ferramentas como o SWIG e o F2PY, um gerador de interfaces entre Fortran e Python, facilitam a criação dessas interfaces.
Uma API também pode estar relacionada a um framework de software: um framework pode basear-se em várias bibliotecas que implementam diversas APIs, mas, ao contrário do uso normal de uma API, o acesso ao comportamento incorporado ao framework é mediado pela extensão de seu conteúdo com novas classes acopladas ao próprio framework.
Além disso, o fluxo de controle geral do programa pode ficar fora do controle de quem faz a chamada e nas mãos do framework, por meio de inversão de controle ou de um mecanismo semelhante.
Uma API pode especificar a interface entre uma aplicação e o sistema operacional. O POSIX, por exemplo, especifica um conjunto de APIs comuns que visam permitir que uma aplicação escrita para um sistema operacional compatível com POSIX seja compilada para outro sistema operacional compatível com POSIX.
O Linux e o Berkeley Software Distribution são exemplos de sistemas operacionais que implementam as APIs POSIX.
A Microsoft tem procurado manter a compatibilidade retroativa de suas APIs, em particular da API do Windows (Win32), de modo que aplicações mais antigas podem ser executadas em versões mais novas do Windows por meio de uma configuração específica de cada executável, chamada "modo de compatibilidade". Não está claro em que medida o acesso dos desenvolvedores da Microsoft às APIs internas dos sistemas operacionais da empresa representa uma vantagem. Em 1987, Richard A. Shaffer, do Technologic Computer Letter, comparou a situação a um jogo de beisebol em que "a Microsoft é dona de todos os tacos e do campo", e grandes fornecedores, como a Lotus Development e a Ashton-Tate, teriam recebido informações sobre a próxima versão do MS-DOS que os desenvolvedores de software menores não receberam. Ed Esber, da Ashton-Tate, disse em uma entrevista de 1987, no entanto, que Bill Gates lhe contara que seus desenvolvedores às vezes precisavam reescrever software baseado em versões preliminares de APIs. Gates observou na entrevista que os aplicativos da Microsoft para o Macintosh eram mais bem-sucedidos que os feitos para o MS-DOS, porque a empresa não precisava dedicar recursos também ao Mac OS.
Uma API difere de uma interface binária de aplicação (ABI) porque a API é baseada em código-fonte, enquanto a ABI é baseada em código binário. Por exemplo, o POSIX fornece APIs, enquanto a Linux Standard Base fornece uma ABI.
As APIs remotas permitem que os desenvolvedores manipulem recursos remotos por meio de protocolos, padrões específicos de comunicação que permitem que diferentes tecnologias funcionem em conjunto, independentemente de linguagem ou plataforma. Por exemplo, a API Java Database Connectivity permite que os desenvolvedores consultem muitos tipos diferentes de bancos de dados com o mesmo conjunto de funções, enquanto a API Java Remote Method Invocation permite a invocação de funções que operam remotamente, mas que parecem locais para o desenvolvedor.
Assim, as APIs remotas são úteis para manter a abstração de objetos na programação orientada a objetos: uma chamada de método executada localmente em um objeto proxy invoca o método correspondente no objeto remoto, usando o protocolo de comunicação remota, e obtém o resultado para ser usado localmente como valor de retorno. Desse modo, as operações feitas sobre o objeto proxy refletem-se no objeto remoto.
No contexto do desenvolvimento web, uma API é normalmente definida como um conjunto de especificações, como as mensagens de requisição do Hypertext Transfer Protocol (HTTP), acompanhado de uma definição da estrutura das mensagens de resposta, geralmente no formato XML (Extensible Markup Language) ou JSON (JavaScript Object Notation). Um exemplo seria a API de uma transportadora que pode ser adicionada a um site de comércio eletrônico para facilitar a contratação de serviços de envio e incluir automaticamente as tarifas de frete atuais, sem que o desenvolvedor do site precise inserir a tabela de tarifas da transportadora em um banco de dados web. Embora "API web" tenha sido historicamente quase sinônimo de web service, em 2008 observava-se uma tendência (a chamada Web 2.0) de abandono dos serviços web baseados no SOAP (Simple Object Access Protocol) e da arquitetura orientada a serviços (SOA) em favor de recursos web mais diretos, no estilo de transferência de estado representacional (REST), e da arquitetura orientada a recursos (ROA). Parte dessa tendência está relacionada ao movimento da Web semântica em direção ao Resource Description Framework (RDF), um conceito que promove tecnologias de engenharia de ontologias baseadas na web. As APIs web permitem combinar várias APIs em novas aplicações, conhecidas como mashups.
No campo das redes sociais, as APIs web permitiram que comunidades on-line compartilhassem conteúdo e dados entre comunidades e aplicações. Dessa forma, o conteúdo criado em um lugar pode ser publicado e atualizado dinamicamente em vários locais da web. Por exemplo, a API do X (antigo Twitter) oferece endpoints para pesquisar publicações e para obter os tópicos em alta de uma localização geográfica.
O projeto de uma API tem impacto significativo sobre o seu uso. O princípio da ocultação de informação descreve o papel das interfaces de programação como facilitadoras da programação modular, ao ocultar os detalhes de implementação dos módulos, de modo que os usuários dos módulos não precisem compreender as complexidades internas deles. Assim, o projeto de uma API procura fornecer apenas as ferramentas que um usuário esperaria. O projeto de interfaces de programação representa uma parte importante da arquitetura de software, a organização de um software complexo.
As APIs são uma das formas mais comuns de integração entre empresas de tecnologia. As empresas que fornecem e usam APIs são consideradas membros de um ecossistema de negócios.
As principais políticas para o lançamento de uma API são:
Um fator importante quando uma API se torna pública é a sua "estabilidade de interface". Mudanças na API — por exemplo, a remoção de elementos — podem quebrar a compatibilidade com os clientes que dependem dela.
Quando partes de uma API apresentada publicamente estão sujeitas a mudanças e, portanto, não são estáveis, essas partes devem ser documentadas explicitamente como "instáveis". Por exemplo, na biblioteca Google Guava, as partes consideradas instáveis, que podem mudar em breve, são marcadas com a anotação Java @Beta.
Uma API pública pode, às vezes, declarar partes de si mesma como obsoletas (deprecated). Isso geralmente significa que essa parte da API deve ser considerada candidata a remoção, por ter sido substituída por outra. Essas declarações permitem que os desenvolvedores deixem de usar partes da API que serão removidas ou deixarão de ser suportadas no futuro.
O código cliente pode conter usos inovadores ou oportunistas não previstos pelos projetistas da API. Em outras palavras, em uma biblioteca com uma base significativa de usuários, quando um elemento passa a fazer parte da API pública, ele pode ser usado de diversas maneiras.
Em 19 de fevereiro de 2020, a Akamai publicou seu relatório State of the Internet, que mostrava a tendência crescente de criminosos cibernéticos atacarem plataformas de APIs públicas de empresas de serviços financeiros em todo o mundo. De dezembro de 2017 a novembro de 2019, a Akamai observou 85,42 bilhões de ataques de abuso de credenciais. Quase 20% deles, ou 16,55 bilhões, foram dirigidos a nomes de host identificados como endpoints de API. Desses, 473,5 milhões tiveram como alvo organizações do setor de serviços financeiros.
A documentação de uma API descreve quais serviços ela oferece e como usá-los, com o objetivo de cobrir tudo o que um cliente precisaria saber para fins práticos.
A documentação é crucial para o desenvolvimento e a manutenção de aplicações que usam a API. A documentação de APIs é tradicionalmente encontrada em arquivos de documentação, mas também pode ser encontrada em mídias sociais, como blogs, fóruns e sites de perguntas e respostas.
Os arquivos de documentação tradicionais costumam ser apresentados por meio de um sistema de documentação, como o Javadoc ou o Pydoc, que tem aparência e estrutura consistentes. No entanto, os tipos de conteúdo incluídos na documentação variam de uma API para outra.
Para maior clareza, a documentação de uma API pode incluir uma descrição das classes e dos métodos da API, bem como cenários típicos de uso, trechos de código, justificativas de projeto, discussões sobre desempenho e contratos, mas os detalhes de implementação dos próprios serviços da API costumam ser omitidos. Ela pode assumir várias formas, incluindo documentos instrucionais, tutoriais e obras de referência, e incluir diversos tipos de informação, como guias e descrições de funcionalidades.
As restrições e as limitações sobre como a API pode ser usada também são abordadas pela documentação. Por exemplo, a documentação de uma função de API pode indicar que seus parâmetros não podem ser nulos ou que a própria função não é segura para threads. Como a documentação de APIs tende a ser extensa, é um desafio para os redatores mantê-la atualizada e para os usuários lê-la com atenção, o que pode resultar em defeitos de software.
A documentação de APIs pode ser enriquecida com metadados, como as anotações Java. Esses metadados podem ser usados pelo compilador, por ferramentas e pelo ambiente de tempo de execução para implementar comportamentos ou tratamentos personalizados.
É possível gerar documentação de APIs de forma orientada a dados. Observando muitos programas que usam determinada API, é possível inferir os usos típicos, bem como os contratos e as diretivas exigidos. Em seguida, podem-se usar modelos para gerar linguagem natural a partir dos dados minerados.
Em 2010, a Oracle Corporation processou o Google por ter distribuído uma nova implementação de Java incorporada ao sistema operacional Android. O Google não havia obtido permissão para reproduzir a API Java, embora essa permissão tivesse sido concedida ao projeto semelhante OpenJDK. No caso Oracle v. Google, o juiz William Alsup decidiu que os elementos da API Java replicados pelo Google não eram passíveis de proteção por direito autoral nos Estados Unidos e que uma vitória da Oracle teria ampliado consideravelmente a proteção dos direitos autorais a um "conjunto funcional de símbolos", permitindo a proteção de comandos simples de software:
Aceitar a pretensão da Oracle seria permitir que qualquer pessoa protegesse por direito autoral uma versão de código destinada a executar um sistema de comandos e, assim, impedisse todos os demais de escrever suas próprias versões diferentes para executar todos ou parte dos mesmos comandos.
A decisão de Alsup foi revertida em 2014, em recurso ao Tribunal de Apelação para o Circuito Federal, embora a questão de saber se esse uso de APIs constituía fair use tenha ficado em aberto.
Em 2016, após um julgamento de duas semanas, um júri concluiu que a reimplementação da API Java pelo Google constituía fair use, mas a Oracle anunciou que recorreria da decisão. A Oracle venceu o recurso: o Tribunal de Apelação para o Circuito Federal decidiu que o uso das APIs pelo Google não se qualificava como fair use. Em 2019, o Google recorreu à Suprema Corte dos Estados Unidos contra as decisões sobre a proteção por direitos autorais e sobre o fair use, e a Suprema Corte aceitou examinar o caso em novembro de 2019. Devido à pandemia de COVID-19, as sustentações orais, inicialmente marcadas para março de 2020, foram adiadas para outubro de 2020.
A Suprema Corte decidiu o caso a favor do Google em 5 de abril de 2021.
|meio= ignorado (ajuda)