Python
Exemplos com a biblioteca requests. Compatível com Python 3.8+.
Instalação
pip install requestsCliente reutilizável
Use uma Session para reaproveitar conexão e header de auth.
import requests
API_BASE = "https://seurastreio.com.br/api/public"
API_KEY = "sr_live_sua_chave_aqui"
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {API_KEY}"})Rastreamento
def rastrear(codigo: str) -> dict:
r = session.get(f"{API_BASE}/rastreio/{codigo}")
r.raise_for_status()
return r.json()
dados = rastrear("BR123456789BR")
print(dados["eventoMaisRecente"]["descricao"])
# Plano pago: dados["historico"], dados["previsaoEntrega"]Consulta de CEP
import re
def buscar_cep(cep: str) -> dict | None:
limpo = re.sub(r"\D", "", cep)
r = session.get(f"{API_BASE}/cep/{limpo}")
json = r.json()
return json["data"] if json.get("success") else None
print(buscar_cep("01310-100"))Criar Logística Reversa
def criar_lr(payload: dict) -> dict:
r = session.post(f"{API_BASE}/logistica-reversa", json=payload)
json = r.json()
if not json.get("ok"):
raise RuntimeError(f"{json.get('code')}: {json.get('message')}")
return json
criar_lr({
"credentialId": "9a2c1f80-1234-4abc-9def-000000000001",
"tipo": "A",
"servicoEnvio": "pac",
"remetente": {
"nome": "Maria Silva",
"logradouro": "Rua das Flores",
"numero": "100",
"complemento": "",
"bairro": "Centro",
"cidade": "São Paulo",
"uf": "SP",
"cep": "01310100",
"ddd": "11",
"telefone": "987654321",
"email": "[email protected]",
},
})Listar com paginação
def listar_todas_lrs() -> list[dict]:
items = []
cursor = None
while True:
params = {"limit": 100}
if cursor:
params["cursor"] = cursor
r = session.get(f"{API_BASE}/logistica-reversa", params=params)
data = r.json()
items.extend(data["items"])
cursor = data.get("nextCursor")
if not cursor:
break
return items
print(len(listar_todas_lrs()), "LRs no total")Tratamento de erro
from requests.exceptions import HTTPError
def call(method: str, path: str, **kwargs) -> dict:
r = session.request(method, f"{API_BASE}{path}", **kwargs)
json = r.json() if r.content else {}
if r.status_code == 401:
raise RuntimeError("Chave de API inválida")
if r.status_code == 429:
raise RuntimeError(
f"Cota estourada ({json.get('current')}/{json.get('max')})"
)
try:
r.raise_for_status()
except HTTPError:
raise RuntimeError(json.get("message") or f"HTTP {r.status_code}")
return jsonPara cargas altas considere
httpx com cliente assíncrono. A API responde rápido, mas paralelizar paginação encurta sincronizações de muitos itens.