Obtendo as chaves para a API
Logado na conta do inter empresas no canto superior direito clique em: "Soluções para sua empresa"
Clique em nova integração


Selecione o que deseja permitir via acesso API e depois clique em "Criar integração"

Com a integração criada, você terá a opção de fazer o download uma única vez da chave de acesso (guarde com cuidado)


Em detalhar, você terá acesso as credenciais de acesso como clienteID e clienteSecret.
O certificado que baixamos, dependendo do banco, precisa ser instalado na máquina local.
Outro item que é importante, é converter o arquivo .CRT (certificado de segurança) em um arquivo .PEM
O formato CRT é um tipo de arquivo que pode armazenar um certificado, mas ele pode estar em diferentes codificações, como DER (Distinguished Encoding Rules) ou PEM (Privacy Enhanced Mail). A codificação DER é binária e geralmente usada para armazenar certificados.
O formato PEM é um formato de texto codificado em Base64 e começa e termina com um marcador, como -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----
Se quiser conferir, abra o arquivo com o bloco de notas e ele deverá estar no formato:
-----BEGIN CERTIFICATE-----
(conteúdo codificado)
-----END CERTIFICATE-----
Script em Python para converter .crt para .pem
Segue script em Python para converter o arquivo de certificado .CRT para .PEM para que eu possa fazer a conexão com a API do banco inter.
Lembrando que é necessário ter uma IDE para executar o script (estou utilizando o vs code), ter python instalado na máquina e no terminal do vs code, tive que instalar a biblioteca: pip install cryptography
import tkinter as tk
from tkinter import filedialog
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
# Função para converter o arquivo
def converter_certificado():
# Abrir a tela para selecionar o arquivo .crt
crt_path = filedialog.askopenfilename(title="Selecionar Certificado CRT", filetypes=[("Arquivo CRT", "*.crt")])
if not crt_path:
print("Nenhum arquivo selecionado.")
return
# Abrir a tela para salvar o arquivo .pem
pem_path = filedialog.asksaveasfilename(defaultextension=".pem", filetypes=[("Arquivo PEM", "*.pem")])
if not pem_path:
print("Nenhum arquivo de saída selecionado.")
return
try:
# Ler o arquivo .crt
with open(crt_path, "rb") as crt_file:
crt_data = crt_file.read()
# Carregar o certificado .crt
cert = x509.load_pem_x509_certificate(crt_data, default_backend())
# Salvar como .pem
with open(pem_path, "wb") as pem_file:
pem_file.write(cert.public_bytes(
encoding=serialization.Encoding.PEM
))
print(f"Certificado convertido e salvo em {pem_path}")
except Exception as e:
print(f"Ocorreu um erro: {e}")
# Configuração da interface gráfica
root = tk.Tk()
root.withdraw() # Ocultar a janela principal do Tkinter
converter_certificado()
Script em Python para testar credenciais e conexão com a API
Será necessário instalar a biblioteca no terminal: pip install requests
Não esqueça de alterar o caminho dos arquivos no seu computador e inserir o ID e senha.
import requests
# Caminho do certificado e chave
CERT_PATH = r"C:\Users\amand\Downloads\Inter_API-Chave_e_Certificado\Inter_API-Certificado.pem" # Arquivo PEM
KEY_PATH = r"C:\Users\amand\Downloads\Inter_API-Chave_e_Certificado\Inter API_Chave.key" # Chave privada
# URL da API para obter o token
url = "https://cdpj.partners.bancointer.com.br/oauth/v2/token"
# Credenciais da API
client_id = "seuIDaqui_mantenha_as_aspas_duplas"
client_secret = "senhaAqui_mantenha_as_aspas_duplas"
# Parâmetros da requisição
data = {
"grant_type": "client_credentials"
}
# Headers
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
# Fazendo a requisição com o certificado
response = requests.post(url, headers=headers, data=data, auth=(client_id, client_secret), cert=(CERT_PATH, KEY_PATH))
# Mostrando a resposta
print(f"Status Code: {response.status_code}")
print(response.json())
Saída no terminal: Status Code: 200
O código de status 200 significa que a requisição foi bem-sucedida e o retorno trouxe um access_token, que pode ser utilizado para acessar os recursos da API.
Script em Python para trazer o extrato da conta
Lembrando que conforme imagens acima, logada no internet banking do inter, eu habilitei a parte que a API tem permissão para consultar extratos.
Criei a pasta certificados para manter a chave .key e o certificado .pem e renomeei o arquivo com a chave .key inserindo no espaço, ficando assim Inter_API_...

import requests
from datetime import datetime
# Caminho do certificado e chave
CERT_PATH = r"C:\\certificados\Inter_API-Certificado.pem" # Arquivo PEM
KEY_PATH = r"C:\\certificados\Inter_API_Chave.key" # Chave privada
# Credenciais da API
client_id = "seuIDaqui_mantenha_as_aspas_duplas"
client_secret = "senhaAqui_mantenha_as_aspas_duplas"
# URL para obter o token
token_url = "https://cdpj.partners.bancointer.com.br/oauth/v2/token"
# Parâmetros para obter o token de acesso
token_data = {
'grant_type': 'client_credentials',
'scope': 'extrato.read'
}
# Fazendo a requisição para obter o token
try:
token_response = requests.post(token_url, data=token_data, auth=(client_id, client_secret), cert=(CERT_PATH, KEY_PATH))
token_response.raise_for_status() # Levanta uma exceção para códigos de status HTTP 4xx/5xx
except requests.exceptions.RequestException as e:
print(f"Erro ao obter o token de acesso: {e}")
print(f"Resposta da API: {token_response.text}")
exit()
# Extraindo o token de acesso
access_token = token_response.json().get('access_token')
if not access_token:
print("Não foi possível obter o token de acesso.")
exit()
# URL para consultar o extrato
extrato_url = "https://cdpj.partners.bancointer.com.br/banking/v2/extrato"
# Definindo o período de consulta
start_date = "2025-01-01" # Data de início
end_date = datetime.now().strftime('%Y-%m-%d') # Data de hoje
# Cabeçalhos para a requisição
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
# Parâmetros para o extrato
params = {
'dataInicio': start_date,
'dataFim': end_date
}
# Realizando a requisição à API
try:
response = requests.get(extrato_url, headers=headers, params=params, cert=(CERT_PATH, KEY_PATH))
response.raise_for_status() # Levanta uma exceção para códigos de status HTTP 4xx/5xx
except requests.exceptions.RequestException as e:
print(f"Erro ao obter o extrato: {e}")
print(f"Resposta da API: {response.text}")
exit()
# Processando a resposta
extrato_data = response.json()
print("Extrato obtido com sucesso:")
print(extrato_data)
Saída:

Script em Python para trazer o extrato da conta em um csv
import requests
import pandas as pd
import os
from datetime import datetime
import unicodedata
# Caminho do certificado e chave
CERT_PATH = r"C:\\certificados\\Inter_API-Certificado.pem" # Arquivo PEM
KEY_PATH = r"C:\\certificados\\Inter_API_Chave.key" # Chave privada
# Credenciais da API
client_id = "seuIDaqui_mantenha_as_aspas_duplas"
client_secret = "senhaAqui_mantenha_as_aspas_duplas"
# URL para obter o token
token_url = "https://cdpj.partners.bancointer.com.br/oauth/v2/token"
# Parâmetros para obter o token de acesso
token_data = {
'grant_type': 'client_credentials',
'scope': 'extrato.read'
}
# Função para remover acentos e padronizar strings
def tratar_acentos(texto):
if isinstance(texto, str):
texto = texto.strip() # Remover espaços extras
return unicodedata.normalize('NFKD', texto).encode('ascii', 'ignore').decode('utf-8')
return texto
# Fazendo a requisição para obter o token
try:
token_response = requests.post(token_url, data=token_data, auth=(client_id, client_secret), cert=(CERT_PATH, KEY_PATH))
token_response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Erro ao obter o token de acesso: {e}")
exit()
# Extraindo o token de acesso
access_token = token_response.json().get('access_token')
if not access_token:
print("Não foi possível obter o token de acesso.")
exit()
# URL para consultar o extrato
extrato_url = "https://cdpj.partners.bancointer.com.br/banking/v2/extrato"
# Definindo o período de consulta
start_date = "2025-01-01"
end_date = datetime.now().strftime('%Y-%m-%d')
# Cabeçalhos para a requisição
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
# Parâmetros para o extrato
params = {
'dataInicio': start_date,
'dataFim': end_date
}
# Realizando a requisição à API
try:
response = requests.get(extrato_url, headers=headers, params=params, cert=(CERT_PATH, KEY_PATH))
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Erro ao obter o extrato: {e}")
exit()
# Processando a resposta da API
extrato_data = response.json()
df = pd.json_normalize(extrato_data['transacoes']) # Ajuste conforme a estrutura real
# Aplicando a função para remover acentos e espaços extras
df = df.applymap(tratar_acentos)
# Converter colunas numéricas para float antes de salvar
for col in df.select_dtypes(include=['object']).columns:
try:
df[col] = df[col].str.replace(',', '.').astype(float)
except:
pass # Ignora colunas que não são realmente numéricas
# Caminho do arquivo de saída
file_path = 'extratointer.csv'
# Verifica se o arquivo já existe
if os.path.exists(file_path):
try:
existing_df = pd.read_csv(file_path, sep=';', decimal='.')
# Garantindo que todas as colunas estão no mesmo formato antes de concatenar
existing_df.columns = existing_df.columns.str.strip()
df.columns = df.columns.str.strip()
# Ordena as colunas para evitar problemas de comparação
df = df[sorted(df.columns)]
existing_df = existing_df[sorted(existing_df.columns)]
# Concatenando os novos dados com os antigos
combined_df = pd.concat([existing_df, df])
# **Removendo duplicatas corretamente** (considerando todas as colunas)
combined_df = combined_df.drop_duplicates(subset=combined_df.columns, keep="first")
# Salvando o novo arquivo sem duplicatas
combined_df.to_csv(file_path, index=False, encoding='utf-8', sep=';', decimal='.')
#df['valor'] = df['valor'].astype(str).str.replace('.', ',')
print("✅ Dados atualizados e duplicatas removidas com sucesso!")
except Exception as e:
print(f"❌ Erro ao processar o arquivo existente: {e}")
exit()
else:
try:
# Criando o arquivo se ele não existir
df.to_csv(file_path, index=False, encoding='utf-8', sep=';', decimal='.')
print("✅ Arquivo criado com os dados da API.")
except Exception as e:
print(f"❌ Erro ao criar o arquivo: {e}")
exit()