Programador Leigo
Python 10 min leitura 15 MAR 2026

Como consumir APIs com Python e requests

Aprenda a buscar dados de qualquer API REST com a biblioteca requests. Do GET ao POST com autenticação.


O que é consumir uma API?

Uma API (Application Programming Interface) é uma forma de dois sistemas conversarem. Quando você consulta a previsão do tempo no celular, o app está consumindo uma API. Com Python, você pode fazer o mesmo em poucas linhas.

pip install requests

Sua primeira requisição

import requests

resposta = requests.get("https://api.github.com")
print(resposta.status_code)  # 200
print(resposta.json())       # dicionario com dados

requests.get() faz uma requisição GET — o tipo mais comum, usado para buscar dados.


Entendendo a resposta

import requests

r = requests.get("https://api.github.com/users/python")

print(r.status_code)      # 200 = sucesso
print(r.headers)           # cabecalhos da resposta
print(r.text)              # corpo como string
print(r.json())            # corpo como dicionario Python

dados = r.json()
print(dados["name"])       # Python
print(dados["public_repos"])

Códigos de status mais comuns

Código Significado
200 Sucesso
201 Criado com sucesso
400 Requisição inválida
401 Não autorizado
404 Não encontrado
500 Erro no servidor

Passando parâmetros na URL

Em vez de montar a URL na mão, use o parâmetro params:

import requests

params = {
    "q": "python",
    "sort": "stars",
    "order": "desc"
}

r = requests.get("https://api.github.com/search/repositories", params=params)
dados = r.json()

for repo in dados["items"][:5]:
    print(f"{repo['name']} - {repo['stargazers_count']} estrelas")

O requests monta a URL automaticamente: ?q=python&sort=stars&order=desc.


Enviando dados com POST

import requests

dados = {
    "title": "Meu post",
    "body": "Conteudo do post",
    "userId": 1
}

r = requests.post("https://jsonplaceholder.typicode.com/posts", json=dados)

print(r.status_code)  # 201
print(r.json())       # post criado com id

Use json= para enviar JSON (o mais comum em APIs modernas) ou data= para form-encoded.


Headers e autenticação

Headers personalizados

import requests

headers = {
    "Accept": "application/json",
    "User-Agent": "MeuApp/1.0"
}

r = requests.get("https://api.github.com", headers=headers)

Autenticação com token

import os
import requests

token = os.environ["API_TOKEN"]

headers = {
    "Authorization": f"Bearer {token}"
}

r = requests.get("https://api.exemplo.com/dados", headers=headers)

Autenticação básica

import requests

r = requests.get(
    "https://api.exemplo.com/dados",
    auth=("usuario", "senha")
)

Tratando erros

import requests

def buscar_usuario(username):
    try:
        r = requests.get(
            f"https://api.github.com/users/{username}",
            timeout=10
        )
        r.raise_for_status()  # levanta erro se status >= 400
        return r.json()
    except requests.Timeout:
        print("A requisicao demorou demais")
    except requests.HTTPError as e:
        print(f"Erro HTTP: {e}")
    except requests.RequestException as e:
        print(f"Erro na requisicao: {e}")
    return None

usuario = buscar_usuario("python")
if usuario:
    print(usuario["name"])

Sempre use timeout para evitar que seu script trave esperando uma resposta que nunca chega.


Exemplo prático: consulta de CEP

import requests

def buscar_cep(cep):
    cep = cep.replace("-", "")
    r = requests.get(f"https://viacep.com.br/ws/{cep}/json/", timeout=10)
    r.raise_for_status()
    dados = r.json()

    if "erro" in dados:
        return None
    return dados

endereco = buscar_cep("01001-000")
if endereco:
    print(f"{endereco['logradouro']}, {endereco['bairro']}")
    print(f"{endereco['localidade']} - {endereco['uf']}")

Exemplo prático: previsão do tempo

import requests

def previsao(cidade):
    url = "https://wttr.in"
    params = {"format": "j1"}

    r = requests.get(f"{url}/{cidade}", params=params, timeout=10)
    r.raise_for_status()
    dados = r.json()

    atual = dados["current_condition"][0]
    temp = atual["temp_C"]
    desc = atual["lang_pt"][0]["value"]
    umidade = atual["humidity"]

    print(f"Cidade: {cidade}")
    print(f"Temperatura: {temp} C")
    print(f"Condicao: {desc}")
    print(f"Umidade: {umidade}%")

previsao("Sao Paulo")

Paginação

Muitas APIs retornam dados em páginas. Você precisa iterar:

import requests

def buscar_todos_repos(usuario):
    repos = []
    page = 1

    while True:
        r = requests.get(
            f"https://api.github.com/users/{usuario}/repos",
            params={"page": page, "per_page": 100},
            timeout=10
        )
        r.raise_for_status()
        dados = r.json()

        if not dados:
            break

        repos.extend(dados)
        page += 1

    return repos

repos = buscar_todos_repos("python")
print(f"Total: {len(repos)} repositorios")

Sessions: reutilizando conexões

Se você vai fazer várias requisições para a mesma API, use Session:

import requests

session = requests.Session()
session.headers.update({
    "Authorization": "Bearer meu_token",
    "Accept": "application/json"
})

# Todas as requisicoes usam os mesmos headers
r1 = session.get("https://api.exemplo.com/users")
r2 = session.get("https://api.exemplo.com/posts")

É mais eficiente porque reutiliza a conexão TCP.


Resumo

Método Quando usar
requests.get() Buscar dados
requests.post() Enviar/criar dados
requests.put() Atualizar dados (completo)
requests.patch() Atualizar dados (parcial)
requests.delete() Deletar dados
Parâmetro Para que serve
params= Query string na URL
json= Corpo em JSON
headers= Cabeçalhos HTTP
auth= Autenticação básica
timeout= Limite de tempo

Consumir APIs é uma das habilidades mais valorizadas no mercado. Com requests, qualquer API vira uma fonte de dados para seus projetos Python.

Continue lendo

Compartilhar