Conectando seu código ao mundo dos dados
Fique por dentro das aulas, conteúdos, newsletter!
Que cada gole desperte uma nova ideia.
Que cada script abra uma nova conversa.
Que o Café com R, se torne um ponto de encontro nosso!
API = Application Programming Interface
Uma API é como um garçom em um restaurante:
Exemplos do dia a dia:
Em vez de baixar arquivos manualmente:
# ❌ Jeito manual (trabalhoso)
# 1. Abrir navegador
# 2. Baixar CSV
# 3. Salvar em pasta
# 4. Importar no R
dados <- read.csv("dados_baixados.csv")Use APIs para automatizar:
REST = Representational State Transfer
Princípios básicos:
https://api.exemplo.com/usuarioshttps://api.exemplo.com/usuarios/123GET - Buscar dadosPOST - Criar novo recursoPUT/PATCH - Atualizar recursoDELETE - Remover recursoMais princípios:
Stateless - Cada requisição é independente
Formato JSON - Dados estruturados e legíveis
Exemplo de URL REST:
GET https://api.loja.com/produtos/123
GET https://api.loja.com/produtos?categoria=livros
POST https://api.loja.com/produtos
PUT https://api.loja.com/produtos/123
DELETE https://api.loja.com/produtos/123
Estrutura completa:
Componentes:
https://api.exemplo.com/dadosPrincipais opções:
# httr2 - Moderno e recomendado
library(httr2)
request("https://api.exemplo.com") |>
req_perform() |>
resp_body_json()
# httr - Clássico (ainda usado)
library(httr)
GET("https://api.exemplo.com")
# jsonlite - Para processar JSON
library(jsonlite)
fromJSON("dados.json")Recomendação: use httr2 para projetos novos
API pública: JSONPlaceholder (para testes)
Processar os dados:
# Converter para data frame
library(purrr)
df_usuarios <- map_df(usuarios, as_tibble)
head(df_usuarios)Resultado: - Lista de usuários convertida em tibble - Pronto para análise!
Entenda as respostas da API:
| Código | Significado | Descrição |
|---|---|---|
| 200 | OK | Sucesso! Dados retornados |
| 201 | Created | Recurso criado com sucesso |
| 204 | No Content | Sucesso, mas sem dados de retorno |
| 400 | Bad Request | Erro na sua requisição |
| 401 | Unauthorized | Autenticação necessária |
Mais códigos importantes:
| Código | Significado | Descrição |
|---|---|---|
| 403 | Forbidden | Sem permissão |
| 404 | Not Found | Recurso não existe |
| 429 | Too Many Requests | Limite de requisições excedido |
| 500 | Internal Server Error | Erro no servidor |
JSON é o formato padrão de APIs REST:
Processar no R:
Muitas APIs exigem identificação:
Usar a chave nas requisições:
requisicao <- request("https://api.exemplo.com/dados") |>
req_headers(
"Authorization" = paste("Bearer", api_key)
) |>
req_perform()Configurar .Renviron:
Filtrar e personalizar resultados:
Parâmetros dinâmicos:
APIs limitam quantidade de dados por requisição:
Criar novos recursos na API:
# Dados a enviar
novo_usuario <- list(
nome = "Carlos Santos",
email = "carlos@exemplo.com",
idade = 28
)
# POST request
resposta <- request("https://api.exemplo.com/usuarios") |>
req_method("POST") |>
req_headers(
"Authorization" = paste("Bearer", api_key),
"Content-Type" = "application/json"
) |>
req_body_json(novo_usuario) |>
req_perform()Verificar o resultado:
# Verificar sucesso
resp_status(resposta) # Deve ser 201
# Ver recurso criado
usuario_criado <- resp_body_json(resposta)
usuario_criado$idDica: Status 201 (Created) indica que o recurso foi criado com sucesso!
APIs podem falhar - esteja preparado:
buscar_dados_seguro <- function(url) {
tryCatch({
resposta <- request(url) |>
req_retry(max_tries = 3) |> # Tentar 3 vezes
req_timeout(30) |> # Timeout de 30s
req_perform()
# Verificar status
if (resp_status(resposta) != 200) {
stop("Erro na API: ", resp_status_desc(resposta))
}
return(resp_body_json(resposta))APIs limitam número de requisições:
Atenção aos limites
Exemplos comuns: - 100 requisições por hora - 1000 requisições por dia - 10 requisições por minuto
resultados[[i]] <- request(urls[i]) |>
req_perform() |>
resp_body_json()
# Aguardar entre requisições
if (i < length(urls)) {
Sys.sleep(delay)
}
}
return(resultados)
}Dica: Sempre respeite os limites para não ser bloqueado!
Buscar municípios brasileiros:
Processar os dados:
Buscar endereço por CEP:
Buscar repositórios de um usuário:
repos <- resp_body_json(resposta)
# Extrair informações relevantes
map_df(repos, function(r) {
tibble(
nome = r$name,
descricao = r$description %||% NA,
linguagem = r$language %||% NA,
stars = r$stargazers_count,
forks = r$forks_count,
atualizado = r$updated_at
)
})
}
# Uso
meus_repos <- buscar_repos_github("hadley")1. Segurança
Use HTTPS sempre
Nunca commite tokens
Rotacione credenciais
2. Performance
Cache resultados quando possível
Respeite rate limits
Use paginação
3. Confiabilidade
Trate erros graciosamente
Implemente retry lógico
Valide dados recebidos
4. Manutenibilidade
Documente endpoints
Organize seu código
Escreva testes
Recursos públicos disponíveis:
1. IBGE - Dados geográficos e estatísticos - https://servicodados.ibge.gov.br/api/docs
2. Banco Central - Indicadores econômicos - https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/
3. Portal da Transparência - http://www.transparencia.gov.br/api-de-dados
4. Dados Abertos do Governo - https://dados.gov.br/
5. TSE - Dados eleitorais - https://dadosabertos.tse.jus.br/
Documentação de APIs:
Conversor curl para httr2: https://curlconverter.com/r/
Processamento:
Utilitários:
Entenda o que está acontecendo:
# Ver headers
resp_headers(resposta)
# 3. Modo verbose para debug
resposta <- req |>
req_verbose() |> # Mostra toda comunicação
req_perform()Dica: Use req_dry_run() para testar sem fazer a requisição real!
Com plumber - transforme funções R em API:
library(plumber)
# arquivo api.R
#* @apiTitle Minha API de Análise
#* @apiDescription API para análises estatísticas
#* Calcular média
#* @param valores Lista de números separados por vírgula
#* @get /media
function(valores) {
nums <- as.numeric(strsplit(valores, ",")[[1]])
mean(nums, na.rm = TRUE)
}#* Testar normalidade
#* @param valores Lista de números separados por vírgula
#* @post /normalidade
function(valores) {
nums <- as.numeric(strsplit(valores, ",")[[1]])
teste <- shapiro.test(nums)
list(
estatistica = teste$statistic,
p_valor = teste$p.value
)
}
# Iniciar servidor
# plumber::plumb("api.R")$run(port = 8000)O que você aprendeu:
Próximos passos:
Lembre-se: APIs são portas para um mundo de dados!
Documentação:
Tutoriais:
APIs para praticar:
Livros e Guias:
Wickham, H. (2024). httr2: Tools for HTTP. R package. https://httr2.r-lib.org/
Trost, J., & Richardson, E. (2022). Plumber: An API Generator for R. https://www.rplumber.io/
Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation.
Slides criados com Quarto
# Seu primeiro passo
library(httr2)
request("https://api.exemplo.com/dados") |>
req_perform() |>
resp_body_json()
# O mundo de dados aguarda você!Dúvidas? Compartilhe suas experiências com APIs!
Esta apresentação é parte do projeto Café com R
É OPEN, USE, COMPARTILHE!
Perguntas? Dúvidas? Sugestões?
Próximo passo: Abra seu RStudio e comece a praticar!
Fique por dentro das aulas, conteúdos, newsletter!
Que cada gole desperte uma nova ideia.
Que cada script abra uma nova conversa.
Que o Café com R, se torne um ponto de encontro nosso!

Jennifer Lopes • Café com R