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
| Aspecto | Antes | Depois |
|---|---|---|
| Como obter | POST /auth com email + senha | Gerar em maisretorno.com/app/meu-perfil/api |
| Pré-requisito | Conta cadastrada | Subscription ativa de algum plano |
| Validade | 60 minutos (JWT expira) | Estática, sem expiração |
| Header principal | Authorization: Bearer <access_token> | X-Api-Key: <api_key> (server-side) |
| Header alternativo | — | Authorization: Bearer <api_key> (única opção via browser, por CORS) |
| Renovação | Refazer POST /auth ao receber 401 | Não há; gere uma nova no portal se invalidar (a anterior é revogada) |
| Onde guardar | Cache curto em memória / Redis | Variável de ambiente / gerenciador de segredos |
| Limite de uso | Não havia quota explícita por chave | Cota mensal por plano (500 / 1.5k / 5k / 15k / Enterprise) — 429 quando esgota |
Código — Antes
Python
Node.js
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
Python
Node.js
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
- Formato de datas no response: Epoch (int) → ISO date string (YYYY-MM-DD) em quotes e available-wallets
- Estrutura do asset-info: Campos aninhados sob chave do mercado → Campos flat no root
- Search response:
name→nicename,asset_type→typeem search - Wallet available-months: Objetos com
dateem epoch → Objetos comdateem YYYY-MM-DD em available-wallets - Path params de wallet: CNPJ puro → identifier com formato
cnpj:fiem available-wallets e wallet-detail - Parâmetro
adjusted: Removido do stats. No quotes, é hardcodedtrue(não é parâmetro) - Rota de quotes: Nome mudou de
historical-quotesparaquotes
Campos reorganizados
- Campos de fundos reorganizados:
cvm_property,class_lvl_*,networth,quota_holdersmovidos para o novo endpoint /fund-class-subclass - Campo
metaremovido: Os endpoints de wallet não são mais retornados como metadata do header do fundo - Novo campo
trading_currency: Adicionado no response de stats e em vários DTOs de asset-info
1. Search
API Antiga
GET /market-data/v4/search/{term}API Nova
GET /mr-data/v4/api/search/{query}Parâmetros de Input
| Parâmetro | API Antiga | API Nova | Mudança |
|---|---|---|---|
term / query | path, string (term) | path, string (query) | Renomeado |
include_tesouro_titulo | query, bool, default true | -- | Removido |
has_quotes | -- | query, bool, optional | Novo |
Campos do Response (array de objetos)
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
identifier | string | identifier | string | Sem mudança |
name | string | nicename | string | Renomeado |
asset_type | string | type | string | Renomeado |
has_quotes | boolean | has_quotes | boolean | Sem mudança |
slug | string|null | -- | -- | Removido |
2. Stats
API Antiga
GET /market-data/v4/{identifier}/statsAPI Nova
GET /mr-data/v4/api/stats/{identifier}Parâmetros de Input
| Parâmetro | API Antiga | API Nova | Mudança |
|---|---|---|---|
identifier | path, string | path, string | Sem mudança |
start_date | query, string (YYYY-MM-DD), opt | query, string (YYYY-MM-DD), opt | Sem mudança |
end_date | query, string (YYYY-MM-DD), opt | query, string (YYYY-MM-DD), opt | Sem mudança |
adjusted | query, bool, default true | -- | Removido |
format_decimal | query, bool, default false | query, bool, default false | Sem mudança |
details | -- | query, bool, default false | Novo |
Campos do Response
| Campo Antigo | Tipo | Campo Novo | Tipo | Mudança |
|---|---|---|---|---|
stats | object | stats | object | Sem 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_currency | string | Novo |
3. Quotes (Historical Quotes)
API Antiga
GET /market-data/v4/{identifier}/historical-quotesAPI Nova
GET /mr-data/v4/api/quotes/{identifier}Atenção: A rota mudou de
historical-quotes para quotes.Parâmetros de Input
| Parâmetro | API Antiga | API Nova | Mudança |
|---|---|---|---|
identifier | path, string | path, string | Sem mudança |
start_date | query, string (YYYY-MM-DD), opt | query, string (YYYY-MM-DD), opt | Sem mudança |
end_date | query, string (YYYY-MM-DD), opt | query, string (YYYY-MM-DD), opt | Sem mudança |
adjusted | query, bool, default true | -- (hardcoded true) | Removido como param |
Campos do Response
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
nicename | string | nicename | string | Sem mudança |
slug | string|null | -- | -- | Removido |
| -- | -- | currency | string | Novo |
quotes[].d | integer (epoch ms) | quotes[].d | string (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 Antigo | Tipo | Campo Novo | Tipo | Mudança |
|---|---|---|---|---|
identifier | string | identifier | string | Sem mudança |
nicename | string | nicename | string | Sem mudança |
asset_type_mr | string | type | string | Renomeado |
first_quote_date | string | first_quote | string | Renomeado * |
last_quote_date | string | last_quote | string | Renomeado * |
last_update | string | last_update | string | Sem mudança |
has_quotes | boolean | has_quotes | boolean | Sem mudança |
* Exceção IDX: Para Índices, os campos mantêm o nome antigo
Nota: Na nova API,
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 Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
fi (wrapper) | object | -- | -- | Removido campos no root |
fi.cnpj | integer | cnpj | string | Root Tipo mudou |
fi.name | string | name | string | Root |
fi.networth | number | -- | -- | Removido → fund-class-subclass |
fi.admin | object | admin | object | Root |
fi.asset_managers | array | asset_managers | array | Root |
| -- | -- | trading_currency | string | Novo |
| -- | -- | classes_subclasses | array | Novo (RCVM 175) |
▶
B3 (Ações, FIIs, ETFs, etc.)
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
b3 (wrapper) | object | -- | -- | Removido campos no root |
b3.ticker | string | ticker | string | Root |
b3.company_name | string | company_name | string | Root |
b3.market_cap | integer | market_cap | number | Root |
b3.trading_currency | string | trading_currency | string | Root |
b3.asset_class | string | type | string | Renomeado |
▶
Índices (IDX)
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
idx (wrapper) | object | -- | -- | Removido campos no root |
idx.ticker | string | ticker | string | Root |
idx.trading_currency | string | trading_currency | string | Root |
Nota: Para IDX, os campos de data mantêm o nome antigo:
first_quote_date e last_quote_date.▶
Tesouro Direto (TD)
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
td (wrapper) | object | -- | -- | Removido campos no root |
td.maturity_date | string | maturity | string | Root Renomeado |
| -- | -- | trading_currency | string | Novo |
▶
Títulos Públicos (TP)
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
tp (wrapper) | object | -- | -- | Removido campos no root |
tp.isin | string | isin | string | Root |
tp.maturity_date | string | maturity_date | string | Root |
| -- | -- | trading_currency | string | Novo |
▶
Crypto (CC) — Novo na API nova
| Campo | Tipo |
|---|---|
nicename | string |
identifier | string |
trading_currency | string |
type | string |
first_quote | string |
last_quote | string |
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-monthsAPI Nova
GET /mr-data/v4/api/available-wallets/{identifier}Campos do Response
| Campo Antigo | Tipo Antigo | Campo Novo | Tipo Novo | Mudança |
|---|---|---|---|---|
date | integer (epoch ms) | date | string (YYYY-MM-DD) | Tipo mudou Breaking |
open | boolean | open | boolean | Sem mudança |
6. Wallet Detail
API Antiga
GET /market-data/v4/wallet/{cnpj}/detailsAPI Nova
GET /mr-data/v4/api/wallet-detail/{identifier}Principais mudanças:
| Aspecto | API Antiga | API Nova |
|---|---|---|
| Data de referência | date (epoch int) | reference_month (string "YYYY-MM") |
| Agrupamento | Por tipo de aplicação (chave dinâmica) | Por classes[] (array estruturado) |
| Percentuais | Não tinha | percentage, class_percentage, value |
7. Fund Class/Subclass Novo
API Antiga
Não existiaAPI 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)
| Campo | Tipo | Descrição |
|---|---|---|
identifier | string | Identificador da classe/subclasse |
nicename | string | Nome amigável do fundo |
quotaholders | number|null | Número de cotistas |
networth | number|null | Patrimônio líquido |
first_quote | string | Data da primeira cotação |
last_quote | string | Data da última cotação |
benchmark | string | Benchmark do fundo |
long_term_tributation | boolean | Tributação de longo prazo |
pension_fund | boolean | Se é fundo de pensão |
exclusive | boolean|null | Se é fundo exclusivo |
situation | string|null | Situação do fundo |
cvm_category Novo | string|null | Categoria CVM |
anbima_type Novo | string|null | Tipo ANBIMA |