Guia de Migração da API Mais Retorno

Atualizado em fevereiro de 2026

Autenticação: Token → API Key

O fluxo OAuth (POST /auth com email/senha → access_token JWT) foi substituído por uma api_key estática, gerada em maisretorno.com/app/meu-perfil/api. A chave (formato mr_xxx_xxxxxxxx...) é vinculada a uma subscription ativa de algum plano (Free / Basic / Starter / Growth / Enterprise) e é exibida em texto plano apenas uma vez.

Como gerar sua api_key (vídeo ~30s)

Antes
Authorization: Bearer <access_token JWT, 60min>
Depois
X-Api-Key: <api_key estática>

Resumo das mudanças

AspectoAntesDepois
Como obterPOST /auth com email + senhaGerar em maisretorno.com/app/meu-perfil/api
Pré-requisitoConta cadastradaSubscription ativa de algum plano
Validade60 minutos (JWT expira)Estática, sem expiração
Header principalAuthorization: Bearer <access_token>X-Api-Key: <api_key> (server-side)
Header alternativoAuthorization: Bearer <api_key> (única opção via browser, por CORS)
RenovaçãoRefazer POST /auth ao receber 401Não há; gere uma nova no portal se invalidar (a anterior é revogada)
Onde guardarCache curto em memória / RedisVariável de ambiente / gerenciador de segredos
Limite de usoNão havia quota explícita por chaveCota mensal por plano (500 / 1.5k / 5k / 15k / Enterprise) — 429 quando esgota

Código — Antes

import requests

# 1. Obter access_token via POST /auth (válido por 60min)
auth_response = requests.post(
    "https://data.maisretorno.com/auth",
    data={
        "grant_type": "password",
        "username": "seu-email@exemplo.com",
        "password": "sua-senha",
        "client_id": "mrdata",
    },
)
token = auth_response.json()["access_token"]

# 2. Usar token nas requisições
response = requests.get(
    "https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3",
    headers={"Authorization": f"Bearer {token}"},
)
print(response.json())
// 1. Obter access_token via POST /auth (válido por 60min)
const authRes = await fetch("https://data.maisretorno.com/auth", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    grant_type: "password",
    username: "seu-email@exemplo.com",
    password: "sua-senha",
    client_id: "mrdata",
  }),
});
const { access_token: token } = await authRes.json();

// 2. Usar token nas requisições
const response = await fetch(
  "https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3",
  { headers: { Authorization: `Bearer ${token}` } }
);
console.log(await response.json());

Código — Depois

import requests

# 1. Gere a api_key uma única vez no portal e guarde com segurança
#    (formato: mr_xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxx)
api_key = "SUA_API_KEY"

# 2. Use direto nas requisições — sem POST /auth, sem expiração de 60min
#    Server-side: prefira X-Api-Key (recomendado pelo spec)
response = requests.get(
    "https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3",
    headers={"X-Api-Key": api_key},
)
print(response.json())
// 1. Gere a api_key uma única vez no portal e guarde com segurança
//    (formato: mr_xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxx)
const apiKey = "SUA_API_KEY";

// 2. Use direto nas requisições — sem POST /auth, sem expiração de 60min
//    Server-side: prefira X-Api-Key (recomendado pelo spec)
const response = await fetch(
  "https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3",
  { headers: { "X-Api-Key": apiKey } }
);
console.log(await response.json());
Migração rápida: remova a chamada inicial ao POST /auth, troque o header Authorization: Bearer <token> por X-Api-Key: <api_key> e exclua toda a lógica de retry/renovação por expiração. Se o cliente roda em browser, mantenha Authorization: Bearer <api_key> (CORS só libera esse header).

Breaking Changes

Mudanças que quebram parsing/paths

Campos reorganizados

API Antiga
GET /market-data/v4/search/{term}
API Nova
GET /mr-data/v4/api/search/{query}

Parâmetros de Input

ParâmetroAPI AntigaAPI NovaMudança
term / querypath, string (term)path, string (query)Renomeado
include_tesouro_tituloquery, bool, default true--Removido
has_quotes--query, bool, optionalNovo

Campos do Response (array de objetos)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
identifierstringidentifierstringSem mudança
namestringnicenamestringRenomeado
asset_typestringtypestringRenomeado
has_quotesbooleanhas_quotesbooleanSem mudança
slugstring|null----Removido

2. Stats

API Antiga
GET /market-data/v4/{identifier}/stats
API Nova
GET /mr-data/v4/api/stats/{identifier}

Parâmetros de Input

ParâmetroAPI AntigaAPI NovaMudança
identifierpath, stringpath, stringSem mudança
start_datequery, string (YYYY-MM-DD), optquery, string (YYYY-MM-DD), optSem mudança
end_datequery, string (YYYY-MM-DD), optquery, string (YYYY-MM-DD), optSem mudança
adjustedquery, bool, default true--Removido
format_decimalquery, bool, default falsequery, bool, default falseSem mudança
details--query, bool, default falseNovo

Campos do Response

Campo AntigoTipoCampo NovoTipoMudança
statsobjectstatsobjectSem mudança
Timeframes: last_3_months, last_6_months, last_12_months, last_24_months, last_36_months, last_48_months, last_60_months, ytd, mtd, begin — cada um com: profitability, sharpe_ratio, volatility
----trading_currencystringNovo

3. Quotes (Historical Quotes)

API Antiga
GET /market-data/v4/{identifier}/historical-quotes
API Nova
GET /mr-data/v4/api/quotes/{identifier}
Atenção: A rota mudou de historical-quotes para quotes.

Parâmetros de Input

ParâmetroAPI AntigaAPI NovaMudança
identifierpath, stringpath, stringSem mudança
start_datequery, string (YYYY-MM-DD), optquery, string (YYYY-MM-DD), optSem mudança
end_datequery, string (YYYY-MM-DD), optquery, string (YYYY-MM-DD), optSem mudança
adjustedquery, bool, default true-- (hardcoded true)Removido como param

Campos do Response

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
nicenamestringnicenamestringSem mudança
slugstring|null----Removido
----currencystringNovo
quotes[].dinteger (epoch ms)quotes[].dstring (YYYY-MM-DD)Tipo mudou Breaking

4. Asset Info (Header)

API Antiga
GET /market-data/v4/{identifier}
API Nova
GET /mr-data/v4/api/asset-info/{identifier}
Mudança estrutural: A API antiga retorna campos específicos do tipo de ativo aninhados sob uma chave com o nome do mercado (ex: fi, b3, deb). A API nova retorna tudo flat no root level com DTOs específicos por tipo de ativo.

Campos Comuns (todos os tipos)

Campo AntigoTipoCampo NovoTipoMudança
identifierstringidentifierstringSem mudança
nicenamestringnicenamestringSem mudança
asset_type_mrstringtypestringRenomeado
first_quote_datestringfirst_quotestringRenomeado *
last_quote_datestringlast_quotestringRenomeado *
last_updatestringlast_updatestringSem mudança
has_quotesbooleanhas_quotesbooleanSem mudança
* Exceção IDX: Para Índices, os campos mantêm o nome antigo first_quote_date / last_quote_date.
Nota: Na nova API, last_update e has_quotes estão presentes em B3, DEB, IDX, TD, TP e Crypto, mas não em FI e RFS.

Asset Info por Tipo de Ativo

Fundos (FI)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
fi (wrapper)object----Removido campos no root
fi.cnpjintegercnpjstringRoot Tipo mudou
fi.namestringnamestringRoot
fi.networthnumber----Removido → fund-class-subclass
fi.adminobjectadminobjectRoot
fi.asset_managersarrayasset_managersarrayRoot
----trading_currencystringNovo
----classes_subclassesarrayNovo (RCVM 175)

B3 (Ações, FIIs, ETFs, etc.)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
b3 (wrapper)object----Removido campos no root
b3.tickerstringtickerstringRoot
b3.company_namestringcompany_namestringRoot
b3.market_capintegermarket_capnumberRoot
b3.trading_currencystringtrading_currencystringRoot
b3.asset_classstringtypestringRenomeado

Índices (IDX)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
idx (wrapper)object----Removido campos no root
idx.tickerstringtickerstringRoot
idx.trading_currencystringtrading_currencystringRoot
Nota: Para IDX, os campos de data mantêm o nome antigo: first_quote_date e last_quote_date.

Tesouro Direto (TD)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
td (wrapper)object----Removido campos no root
td.maturity_datestringmaturitystringRoot Renomeado
----trading_currencystringNovo

Títulos Públicos (TP)

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
tp (wrapper)object----Removido campos no root
tp.isinstringisinstringRoot
tp.maturity_datestringmaturity_datestringRoot
----trading_currencystringNovo

Crypto (CC) — Novo na API nova

CampoTipo
nicenamestring
identifierstring
trading_currencystring
typestring
first_quotestring
last_quotestring
Na API antiga, crypto era retornado no search mas não havia um DTO específico para o header.

5. Available Wallets

API Antiga
GET /market-data/v4/wallet/{cnpj}/available-months
API Nova
GET /mr-data/v4/api/available-wallets/{identifier}

Campos do Response

Campo AntigoTipo AntigoCampo NovoTipo NovoMudança
dateinteger (epoch ms)datestring (YYYY-MM-DD)Tipo mudou Breaking
openbooleanopenbooleanSem mudança

6. Wallet Detail

API Antiga
GET /market-data/v4/wallet/{cnpj}/details
API Nova
GET /mr-data/v4/api/wallet-detail/{identifier}

Principais mudanças:

AspectoAPI AntigaAPI Nova
Data de referênciadate (epoch int)reference_month (string "YYYY-MM")
AgrupamentoPor tipo de aplicação (chave dinâmica)Por classes[] (array estruturado)
PercentuaisNão tinhapercentage, class_percentage, value

7. Fund Class/Subclass Novo

API Antiga
Não existia
API Nova
GET /mr-data/v4/api/fund-class-subclass/{identifier}
Endpoint novo: Retorna informações detalhadas de uma classe ou subclasse de fundo (estrutura RCVM 175). Muitos campos que antes estavam em fi.cvm_property do endpoint /{identifier} agora estão neste endpoint dedicado.

Campos do Response (FundClassSubclassDto)

CampoTipoDescrição
identifierstringIdentificador da classe/subclasse
nicenamestringNome amigável do fundo
quotaholdersnumber|nullNúmero de cotistas
networthnumber|nullPatrimônio líquido
first_quotestringData da primeira cotação
last_quotestringData da última cotação
benchmarkstringBenchmark do fundo
long_term_tributationbooleanTributação de longo prazo
pension_fundbooleanSe é fundo de pensão
exclusiveboolean|nullSe é fundo exclusivo
situationstring|nullSituação do fundo
cvm_category Novostring|nullCategoria CVM
anbima_type Novostring|nullTipo ANBIMA