Como Usar a API Mais Retorno
Guia completo com exemplos em Python e Node.js para consumir a API de dados Mais Retorno.
Comece aqui
A Market Data API entrega os dados de mercado da Mais Retorno: fundos de investimento (cotas, estatísticas, carteiras completas), ações e ETFs da B3 e do exterior (EUA e Londres), BDRs, criptomoedas, índices e títulos públicos — com histórico longo e indicadores calculados (rentabilidade, sharpe, volatilidade, drawdown).
Existem dois jeitos de consumir, e ambos usam o mesmo plano e o mesmo saldo de créditos:
- Vou programar (REST) — endpoints HTTP com api-key, exemplos em Python e Node.js. Siga para Autenticação.
- Vou usar com IA (MCP) — conecte no Claude, no ChatGPT ou em qualquer agente compatível e analise em linguagem natural, sem escrever código. Pule direto para MCP.
Sua primeira chamada em 30 segundos
Buscar ativos é grátis — teste agora sem gastar nenhum crédito (gere sua api-key em maisretorno.com/app/meu-perfil/api):
curl -H "X-Api-Key: SUA_API_KEY" \ "https://data.maisretorno.com/mr-data/v4/api/search/petrobras"
A resposta traz o identifier de cada ativo (ex.: petr4:b3) — é ele que você passa para todos os outros endpoints. Entenda o formato em Identificadores.
Autenticação
Todas as requisições exigem uma api_key vinculada a uma subscription ativa de algum plano (Free, Basic, Starter, Growth ou Enterprise).
Gere sua api_key
Acesse maisretorno.com/app/meu-perfil/api e gere sua api_key. O formato é mr_xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Envie a api_key nas requisições
Dois headers são aceitos:
- Server-side (recomendado):
X-Api-Key: SUA_API_KEY - Alternativo:
Authorization: Bearer SUA_API_KEY
Authorization, então chamadas a partir de SPA, extensão ou playground precisam usar Authorization: Bearer. Para backends Python/Node, prefira X-Api-Key.Authorization: Bearer pela restrição de CORS).Identificadores de Ativos
Todos os endpoints usam um identifier no formato ativo:mercado:
Endpoints Disponíveis
Base URL: https://data.maisretorno.com/mr-data/v4/api
| # | Endpoint | Rota | Descrição |
|---|---|---|---|
| 1 | Search (Busca) | GET /search/{query} | Busca ativos por termo, com filtros opcionais |
| 2 | Asset Info (Info do Ativo) | GET /asset-info/{identifier} | Retorna informações cadastrais completas de um ativo (CNPJ, setor, segmento, etc). O formato da resposta varia de acordo com o tipo de ativo. |
| 3 | Quotes (Cotações) | GET /quotes/{identifier} | Busca cotações históricas de um ativo. |
| 4 | Stats (Estatísticas) | GET /stats/{identifier} | Retorna estatísticas detalhadas de performance de um ativo específico. Esta rota é atendida pelo microserviço mr-ms-stats através do API Gateway. |
| 5 | Drawdown (Quedas) | GET /drawdown/{identifier} | Retorna a série temporal de drawdown desde o último topo dentro do range + summary com max e current. |
| 6 | Available Wallets (Carteiras) | GET /available-wallets/{identifier} | Retorna as datas das carteiras disponíveis para um fundo específico |
| 7 | Wallet Detail (Detalhe da Carteira) | GET /wallet-detail/{identifier} | Retorna os detalhes completos da carteira de um fundo em um mês/ano específico |
| 8 | Fund Class/Subclass (Classe/Subclasse) | GET /fund-class-subclass/{identifier} | Retorna informações detalhadas de uma classe ou subclasse de fundo |
| 9 | Fund Structure (Estrutura do Fundo) | GET /fund-structure/{identifier} | Lista plana e paginada das classes e séries (subclasses) do fundo. Aceita o identificador do CNPJ ou o de qualquer série do mesmo fundo. |
1. Search (Busca)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
has_quotes | boolean | Não | true | Filtrar apenas ativos que possuem cotações |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["has_quotes"] = "true" # Filtrar apenas ativos que possuem cotações
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/search/petrobras",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("has_quotes", "true"); // Filtrar apenas ativos que possuem cotações
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/search/petrobras?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
[
{
"identifier": "string",
"nicename": "string",
"type": "string",
"has_quotes": true
}
]2. Asset Info (Info do Ativo)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
link_old_historic | boolean | Não | true | false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi). |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["link_old_historic"] = "true" # false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi).
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("link_old_historic", "true"); // false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi).
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4:b3?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"identifier": "string",
"nicename": "string",
"first_quote": "string",
"last_quote": "string",
"linked_identifier": "51646633000102-s0000728187:fi",
"cnpj": "string",
"name": "string",
"trading_currency": "string",
"admin": {},
"asset_managers": [
{
"nicename": "XP Asset Management",
"slug": "xp-asset",
"cnpj": "12345678000190"
}
],
"classes_subclasses": [
{
"identifier": "10338491000139-s0000255564:fi",
"nicename": "Classe A",
"quotaholders": 150,
"networth": 85362537.22
}
]
}{
"nicename": "string",
"identifier": "string",
"first_quote": "string",
"last_quote": "string",
"last_update": "string",
"has_quotes": true,
"cnpj": 0,
"code_cvm": 0,
"company_name": "string",
"actuation_segment": "string",
"actuation_sector": "string",
"actuation_subsector": "string",
"issuer_company": "string",
"ticker": "string",
"asset_description": "string",
"situation": "string",
"specification_code": "string",
"market_cap": 0,
"corporate_governance_tier": "string",
"trading_currency": "string",
"isin": "string",
"type": "string"
}{
"nicename": "string",
"identifier": "string",
"last_update": "string",
"has_quotes": true,
"name": "string",
"slug": "string",
"trading_currency": "string",
"type": "string",
"first_quote": "string",
"last_quote": "string",
"shortname": "string"
}{
"nicename": "string",
"identifier": "string",
"type": "string",
"first_quote_date": "string",
"last_quote_date": "string",
"last_update": "string",
"has_quotes": true,
"ticker": "string",
"description": "string",
"trading_currency": "string",
"situation": "string"
}{
"nicename": "string",
"identifier": "string",
"type": "string",
"first_quote": "string",
"last_quote": "string",
"last_update": "string",
"has_quotes": true,
"maturity": "string",
"security_type": "string",
"trading_currency": "string"
}{
"nicename": "string",
"identifier": "string",
"type": "string",
"first_quote": "string",
"last_quote": "string",
"last_update": "string",
"has_quotes": true,
"issuance_date": "string",
"isin": "string",
"maturity_date": "string",
"indexer": "string",
"code": 0,
"pay_coupon": true,
"coupon_rate": "string",
"coupon_frequency": "string",
"security_type": "string",
"bond_stripping": "string",
"trading_currency": "string"
}{
"identifier": "string",
"nicename": "string",
"type": "string",
"first_quote": "string",
"last_quote": "string",
"has_quotes": true,
"trading_currency": "string"
}3. Quotes (Cotações)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
start_date | string | Não | 2024-01-01 | Data inicial para buscar cotações (formato: YYYY-MM-DD) |
end_date | string | Não | 2024-12-31 | Data final para buscar cotações (formato: YYYY-MM-DD) |
adjusted | boolean | Não | false | true (padrão): série ajustada, que reinveste proventos, amortização e juros — é a base correta para calcular rentabilidade, mas é recalculada para trás a cada novo provento, então o valor devolvido para uma data passada muda com o tempo. false: preço efetivamente negociado no dia (o PU, no caso de renda fixa) — preserva o valor observado naquela data e é a base correta para registrar uma transação ou manter marcação a mercado histórica. As duas divergem, e quanto mais antiga a data, mais: PETR4 em 01/06/2015 fechou a R$ 12,37 negociado e vale cerca de R$ 3 na série ajustada. O parâmetro só tem efeito onde existem duas séries (ações :b3, :us e :lse, debêntures, tesouro direto, títulos públicos, securitizados e UCITS); fundos, índices, cripto e futuros têm série única e ignoram o parâmetro. |
link_old_historic | boolean | Não | true | false (padrão): devolve só a série de cotas do identificador pedido. true: quando a subclasse pedida é a continuação direta da série da classe (a primeira cota dela vem até 5 dias depois da última cota da classe), as cotas da classe entram antes das cotas da subclasse — na sobreposição vale a da subclasse — e a série passa a começar na data mais antiga das duas. Por que existe: com a Resolução CVM 175, fundos que já existiam foram divididos em classe e subclasses; a série da subclasse começa na data em que ela foi criada e o histórico anterior ficou guardado na classe. Sem o parâmetro, um fundo de 2015 dividido em 2024 devolve cotas só a partir de 2024. Com true, a série é a mesma que o site da Mais Retorno exibe e a que /stats e /drawdown já usam sempre. Subclasse que não continua a série da classe (uma série nova de FIDC, por exemplo) devolve o mesmo com ou sem o parâmetro. Atenção ao pedir pelo identificador da classe (CNPJ sem o sufixo de subclasse): com true a API escolhe uma subclasse por regra técnica — se a classe não tem cotas, a de histórico mais antigo; se tem, pode trocar pela que cobre o mesmo período com dados mais recentes e emenda no fim a que continua a série. Essa escolha não é a "subclasse principal", cadastro que não existe; num FIDC pode cair na cota subordinada. Peça sempre o identificador da subclasse que o investidor detém; /fund-structure lista todas. Só tem efeito em fundos (:fi); nos demais mercados é ignorado. |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["start_date"] = "2024-01-01" # Data inicial para buscar cotações (formato: YYYY-MM-DD)
params["end_date"] = "2024-12-31" # Data final para buscar cotações (formato: YYYY-MM-DD)
params["adjusted"] = "false" # true (padrão): série ajustada, que reinveste proventos, amortização e juros — é a base correta para calcular rentabilidade, mas é recalculada para trás a cada novo provento, então o valor devolvido para uma data passada muda com o tempo. false: preço efetivamente negociado no dia (o PU, no caso de renda fixa) — preserva o valor observado naquela data e é a base correta para registrar uma transação ou manter marcação a mercado histórica. As duas divergem, e quanto mais antiga a data, mais: PETR4 em 01/06/2015 fechou a R$ 12,37 negociado e vale cerca de R$ 3 na série ajustada. O parâmetro só tem efeito onde existem duas séries (ações :b3, :us e :lse, debêntures, tesouro direto, títulos públicos, securitizados e UCITS); fundos, índices, cripto e futuros têm série única e ignoram o parâmetro.
params["link_old_historic"] = "true" # false (padrão): devolve só a série de cotas do identificador pedido. true: quando a subclasse pedida é a continuação direta da série da classe (a primeira cota dela vem até 5 dias depois da última cota da classe), as cotas da classe entram antes das cotas da subclasse — na sobreposição vale a da subclasse — e a série passa a começar na data mais antiga das duas. Por que existe: com a Resolução CVM 175, fundos que já existiam foram divididos em classe e subclasses; a série da subclasse começa na data em que ela foi criada e o histórico anterior ficou guardado na classe. Sem o parâmetro, um fundo de 2015 dividido em 2024 devolve cotas só a partir de 2024. Com true, a série é a mesma que o site da Mais Retorno exibe e a que /stats e /drawdown já usam sempre. Subclasse que não continua a série da classe (uma série nova de FIDC, por exemplo) devolve o mesmo com ou sem o parâmetro. Atenção ao pedir pelo identificador da classe (CNPJ sem o sufixo de subclasse): com true a API escolhe uma subclasse por regra técnica — se a classe não tem cotas, a de histórico mais antigo; se tem, pode trocar pela que cobre o mesmo período com dados mais recentes e emenda no fim a que continua a série. Essa escolha não é a "subclasse principal", cadastro que não existe; num FIDC pode cair na cota subordinada. Peça sempre o identificador da subclasse que o investidor detém; /fund-structure lista todas. Só tem efeito em fundos (:fi); nos demais mercados é ignorado.
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/quotes/petr4:b3",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("start_date", "2024-01-01"); // Data inicial para buscar cotações (formato: YYYY-MM-DD)
params.set("end_date", "2024-12-31"); // Data final para buscar cotações (formato: YYYY-MM-DD)
params.set("adjusted", "false"); // true (padrão): série ajustada, que reinveste proventos, amortização e juros — é a base correta para calcular rentabilidade, mas é recalculada para trás a cada novo provento, então o valor devolvido para uma data passada muda com o tempo. false: preço efetivamente negociado no dia (o PU, no caso de renda fixa) — preserva o valor observado naquela data e é a base correta para registrar uma transação ou manter marcação a mercado histórica. As duas divergem, e quanto mais antiga a data, mais: PETR4 em 01/06/2015 fechou a R$ 12,37 negociado e vale cerca de R$ 3 na série ajustada. O parâmetro só tem efeito onde existem duas séries (ações :b3, :us e :lse, debêntures, tesouro direto, títulos públicos, securitizados e UCITS); fundos, índices, cripto e futuros têm série única e ignoram o parâmetro.
params.set("link_old_historic", "true"); // false (padrão): devolve só a série de cotas do identificador pedido. true: quando a subclasse pedida é a continuação direta da série da classe (a primeira cota dela vem até 5 dias depois da última cota da classe), as cotas da classe entram antes das cotas da subclasse — na sobreposição vale a da subclasse — e a série passa a começar na data mais antiga das duas. Por que existe: com a Resolução CVM 175, fundos que já existiam foram divididos em classe e subclasses; a série da subclasse começa na data em que ela foi criada e o histórico anterior ficou guardado na classe. Sem o parâmetro, um fundo de 2015 dividido em 2024 devolve cotas só a partir de 2024. Com true, a série é a mesma que o site da Mais Retorno exibe e a que /stats e /drawdown já usam sempre. Subclasse que não continua a série da classe (uma série nova de FIDC, por exemplo) devolve o mesmo com ou sem o parâmetro. Atenção ao pedir pelo identificador da classe (CNPJ sem o sufixo de subclasse): com true a API escolhe uma subclasse por regra técnica — se a classe não tem cotas, a de histórico mais antigo; se tem, pode trocar pela que cobre o mesmo período com dados mais recentes e emenda no fim a que continua a série. Essa escolha não é a "subclasse principal", cadastro que não existe; num FIDC pode cair na cota subordinada. Peça sempre o identificador da subclasse que o investidor detém; /fund-structure lista todas. Só tem efeito em fundos (:fi); nos demais mercados é ignorado.
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/quotes/petr4:b3?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"market": "b3",
"currency": "BRL",
"nicename": "Petrobras PN",
"shortname": "PETR4",
"quotes": [
{
"d": "2024-01-15",
"c": 25.67,
"p": 1500000.5,
"q": 1250
}
]
}4. Stats (Estatísticas)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
details | boolean | Não | - | Incluir detalhes adicionais nas estatísticas |
currency | string | Não | - | Moeda para conversão dos valores |
deflator | string | Não | - | Deflaciona a série pelo índice de inflação (retorno real): ipca ou igpm |
start_date | string | Não | - | Data inicial para filtro (formato: YYYY-MM-DD) |
end_date | string | Não | - | Data final para filtro (formato: YYYY-MM-DD) |
format_decimal | boolean | Não | - | Formatar valores decimais |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
# params["details"] = "..." # Incluir detalhes adicionais nas estatísticas
# params["currency"] = "..." # Moeda para conversão dos valores
# params["deflator"] = "..." # Deflaciona a série pelo índice de inflação (retorno real): ipca ou igpm
# params["start_date"] = "..." # Data inicial para filtro (formato: YYYY-MM-DD)
# params["end_date"] = "..." # Data final para filtro (formato: YYYY-MM-DD)
# params["format_decimal"] = "..." # Formatar valores decimais
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/stats/petr4:b3",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
// params.set("details", "..."); // Incluir detalhes adicionais nas estatísticas
// params.set("currency", "..."); // Moeda para conversão dos valores
// params.set("deflator", "..."); // Deflaciona a série pelo índice de inflação (retorno real): ipca ou igpm
// params.set("start_date", "..."); // Data inicial para filtro (formato: YYYY-MM-DD)
// params.set("end_date", "..."); // Data final para filtro (formato: YYYY-MM-DD)
// params.set("format_decimal", "..."); // Formatar valores decimais
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/stats/petr4:b3?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"stats": {
"best_monthly_return": 0.01177933,
"worst_monthly_return": 0.00360039,
"positive_months": 9,
"negative_months": 0,
"timeframe": {
"last_3_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_6_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_12_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_24_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_36_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_48_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"last_60_months": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"ytd": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"mtd": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
},
"begin": {
"profitability": 0.03048502,
"sharpe_ratio": -85.08822365,
"volatility": 0.00966557
}
},
"first_quote_date": "2024-04-19",
"last_quote_date": "2024-12-18"
},
"nicename": "Petróleo Brasileiro S.A. - Petrobras",
"shortname": "PETR4",
"trading_currency": "BRL",
"years": {
"2024": {
"4": 0.00360039,
"5": 0.01057483,
"year": 0.08725725,
"accrued": 0.08725725
}
}
}5. Drawdown (Quedas)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
start_date | string | Não | 2020-01-01 | Data inicial para o cálculo do drawdown (YYYY-MM-DD) |
end_date | string | Não | 2024-12-31 | Data final para o cálculo do drawdown (YYYY-MM-DD) |
link_old_historic | boolean | Não | false | true (padrão): o drawdown é calculado sobre a mesma série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua. Sempre foi assim nesta rota; o parâmetro existe para pedir o contrário. false: só a série própria do identificador. Só tem efeito em fundos (:fi). |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["start_date"] = "2020-01-01" # Data inicial para o cálculo do drawdown (YYYY-MM-DD)
params["end_date"] = "2024-12-31" # Data final para o cálculo do drawdown (YYYY-MM-DD)
params["link_old_historic"] = "false" # true (padrão): o drawdown é calculado sobre a mesma série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua. Sempre foi assim nesta rota; o parâmetro existe para pedir o contrário. false: só a série própria do identificador. Só tem efeito em fundos (:fi).
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/drawdown/petr4:b3",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("start_date", "2020-01-01"); // Data inicial para o cálculo do drawdown (YYYY-MM-DD)
params.set("end_date", "2024-12-31"); // Data final para o cálculo do drawdown (YYYY-MM-DD)
params.set("link_old_historic", "false"); // true (padrão): o drawdown é calculado sobre a mesma série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua. Sempre foi assim nesta rota; o parâmetro existe para pedir o contrário. false: só a série própria do identificador. Só tem efeito em fundos (:fi).
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/drawdown/petr4:b3?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"nicename": "Verde Master FIM",
"shortname": "verde-fim",
"series": [
{
"d": "2020-03-23",
"dd": -41.29
}
],
"summary": {
"max_drawdown": -41.29,
"max_drawdown_date": "2020-03-23",
"current_drawdown": -11.31,
"range_start": "2015-01-02",
"range_end": "2026-05-26",
"is_full_history": false
}
}6. Available Wallets (Carteiras)
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/available-wallets/3168062000103:fi",
headers={"X-Api-Key": api_key},
)
dados = response.json()
print(dados)const response = await fetch(
"https://data.maisretorno.com/mr-data/v4/api/available-wallets/3168062000103:fi",
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
[
{
"date": "2024-12-31",
"open": true
}
]7. Wallet Detail (Detalhe da Carteira)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
month | number | Não | 12 | Mês para buscar a carteira (1-12) |
year | number | Não | 2024 | Ano para buscar a carteira |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["month"] = "12" # Mês para buscar a carteira (1-12)
params["year"] = "2024" # Ano para buscar a carteira
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/wallet-detail/3168062000103:fi",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("month", "12"); // Mês para buscar a carteira (1-12)
params.set("year", "2024"); // Ano para buscar a carteira
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/wallet-detail/3168062000103:fi?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"reference_month": "2024-12",
"wallet_total": 0,
"classes": [
{
"nicename": "string",
"percentage": 0,
"value": 0,
"assets": [
{
"confidential": "...",
"nicename": "...",
"percentage": "...",
"value": "...",
"class_percentage": "..."
}
]
}
]
}8. Fund Class/Subclass (Classe/Subclasse)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
link_old_historic | boolean | Não | true | false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi). |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["link_old_historic"] = "true" # false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi).
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/fund-class-subclass/38120941000131:fi",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("link_old_historic", "true"); // false (padrão): first_quote e last_quote são o início e o fim da série própria do identificador. true: passam a ser o início e o fim da série que /quotes devolve com link_old_historic=true — o histórico da classe emendado antes da subclasse que a continua e, no identificador da classe, a subclasse que a API escolhe — devolvida em linked_identifier. Use para validar o período antes de pedir as cotas com o mesmo parâmetro; as duas rotas precisam concordar. Só tem efeito em fundos (:fi).
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/fund-class-subclass/38120941000131:fi?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"identifier": "21624757000126-qzwjm1744745214:fi",
"nicename": "KINEA CHRONOS FIF MULTIMERCADO RL",
"quotaholders": 1,
"networth": 85362537.22,
"first_quote": "2025-04-25",
"last_quote": "2026-01-02",
"linked_identifier": "51646633000102-s0000728187:fi",
"class_type": "FIF",
"benchmark": "CDI",
"invests_all_offshore": false,
"long_term_tributation": true,
"investor_type": null,
"pension_fund": false,
"exclusive": false,
"open_condominium": true,
"situation": "Em Funcionamento Normal",
"target_audience": "Público Geral",
"cvm_category": "Multimercado",
"anbima_type": "Estratégia Livre"
}9. Fund Structure (Estrutura do Fundo)
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
page | number | Não | 1 | Página, começando em 1 |
page_size | number | Não | 20 | Linhas por página. Padrão 20, máximo 100. |
# Parâmetros opcionais — inclua apenas os que precisar
params = {}
params["page"] = "1" # Página, começando em 1
params["page_size"] = "20" # Linhas por página. Padrão 20, máximo 100.
response = requests.get(
"https://data.maisretorno.com/mr-data/v4/api/fund-structure/55912292000120:fi",
headers={"X-Api-Key": api_key},
params=params,
)
dados = response.json()
print(dados)// Parâmetros opcionais — inclua apenas os que precisar
const params = new URLSearchParams();
params.set("page", "1"); // Página, começando em 1
params.set("page_size", "20"); // Linhas por página. Padrão 20, máximo 100.
const response = await fetch(
`https://data.maisretorno.com/mr-data/v4/api/fund-structure/55912292000120:fi?${params}`,
{ headers: { "X-Api-Key": api_key } }
);
const dados = await response.json();
console.log(dados);Testar
{
"fund_cnpj": "55912292000120",
"fund_nicename": "FIC FIDC SRM EXODUS",
"total": 9,
"page": 1,
"page_size": 20,
"has_more": false,
"items": [
{
"identifier": "55912292000120-s0000778583:fi",
"nicename": "SÉRIE 1 DA SUBCLASSE COTAS SENIORES",
"level": "subclass",
"class_cnpj": "55912292000120",
"networth": 51618754.54,
"quotaholders": 438,
"has_quotes": true,
"last_quote_date": "2026-08-18"
}
]
}MCP — use a API com Claude, ChatGPT e agentes de IA
Além dos endpoints REST, a Market Data API expõe um servidor MCP (Model Context Protocol): conecte no Claude, no ChatGPT ou em qualquer agente compatível e faça análises em linguagem natural — a IA chama as ferramentas e consome os mesmos créditos do seu plano.
Adicione o conector no seu cliente de IA com a URL https://data.maisretorno.com/mr-data/v4/mcp/oauth e autentique com OAuth: ao conectar, você faz login na sua conta Mais Retorno e pronto — sem api-key, sem configurar headers. O registro do cliente OAuth é automático; não existe Client ID para informar manualmente.
/oauth. A URL /mr-data/v4/mcp (sem o sufixo) é a variante autenticada por api-key, usada por integrações server-side — nela o registro OAuth do conector falha. E, na tela de login, entre com a mesma conta Mais Retorno que assina o plano: se logar com outro e-mail, o conector conecta mas não lista nenhuma ferramenta.Ferramentas disponíveis
| Tool | O que faz |
|---|---|
search_assets | Busca ativos por nome, ticker ou CNPJ |
get_asset_info | Dados cadastrais de um ativo |
get_fund_class_subclass | Classificação CVM de um fundo |
get_available_wallets | Meses de carteira disponíveis de um fundo |
get_quotes | Série histórica de cotações — aceita currency, deflator (ipca/igpm), frequency (mensal/anual) e formato compacto |
get_asset_stats | Rentabilidade, sharpe, volatilidade e outros indicadores — recalculados em outra moeda (currency) ou em termos reais (deflator) |
get_drawdown | Série underwater e drawdown máximo |
get_wallet_detail | Carteira completa de um fundo em um mês |
get_rolling_windows | Retorno anualizado de todas as janelas móveis de N anos + win-rate contra um benchmark — responde "e se eu tivesse entrado em outra data?" |
compare_assets | Compara de 2 a 10 ativos na mesma janela e moeda, com stats e drawdown de todos em uma chamada |
backtest_portfolio | Simula uma carteira com pesos fixos e rebalanceamento (calendário ou banda): curva, CAGR, volatilidade, drawdown máximo |
O custo de cada ferramenta está na seção Créditos — REST e MCP consomem o mesmo saldo do seu plano.
compare_assets, currency e deflator sozinha.Planos e créditos
Cada plano dá direito a um saldo mensal de créditos, e todo consumo sai desse mesmo saldo — não importa se a chamada veio da API REST ou de uma ferramenta do MCP.
| Plano | Créditos/mês | Histórico |
|---|---|---|
| Free | 500 | Último 1 ano |
| Basic | 1.500 | Completo |
| Starter | 5.000 | Completo |
| Growth | 15.000 | Completo |
| Enterprise | Volume contratado | Completo |
O saldo renova automaticamente todo mês no dia âncora da conta (o dia da primeira ativação). Crédito não usado não acumula para o mês seguinte. Preços e assinatura em maisretorno.com/app/meu-perfil/api.
Quanto custa cada operação
O custo é proporcional ao valor entregue: uso simples continua barato, análises ricas consomem mais. Buscar ativos é gratuito. A tabela abaixo é a referência única de preços — cada linha é uma operação, e as colunas mostram como acessá-la em cada canal:
| Operação | Endpoint REST | Tool MCP | Créditos |
|---|---|---|---|
| Buscar ativos | /api/search | search_assets | Grátis |
| Dados cadastrais | /api/asset-info | get_asset_info | 1 |
| Classificação CVM | /api/fund-class-subclass | get_fund_class_subclass | 1 |
| Carteiras disponíveis | /api/available-wallets | get_available_wallets | 1 |
| Cotações | /api/quotes | get_quotes | 1 |
| Estatísticas | /api/stats | get_asset_stats | 5 |
| Drawdown | /api/drawdown | get_drawdown | 5 |
| Carteira detalhada | /api/wallet-detail | get_wallet_detail | 10 |
| Janelas móveis | — | get_rolling_windows | 10 |
| Comparativo (2 a 10 ativos) | — | compare_assets | 25 |
| Backtest de carteira | — | backtest_portfolio | 25 |
GET /api/quotes ou pedindo pro Claude usar get_quotes. Operações marcadas com "—" existem apenas no MCP. O custo independe da janela de datas ou do número de ativos: um compare_assets com 10 ativos custa os mesmos 25 créditos. No plano Free, 500 créditos equivalem a ~100 consultas de estatísticas ou 500 de cotações.429 Too Many Requests (no MCP, a ferramenta responde explicando a situação). O saldo volta na renovação mensal — ou imediatamente com upgrade de plano.O custo de cada endpoint também aparece na sua descrição em Endpoints Disponíveis.
Erros e cache
A API retorna erros no formato padrão:
{
"statusCode": 400,
"message": "Identifier must be in format \"asset:market\" (e.g., \"petr4:b3\")",
"error": "Bad Request"
}| Status | Significado | Quando acontece |
|---|---|---|
200 | Sucesso | Requisição processada corretamente |
400 | Bad Request | Identifier inválido ou parâmetros incorretos |
401 | Unauthorized | API key ausente ou inválida |
403 | Forbidden | API key válida, mas o plano não cobre o recurso solicitado |
404 | Not Found | Ativo não encontrado |
429 | Too Many Requests | Saldo de créditos esgotado — veja Planos e créditos |
500 | Internal Server Error | Erro interno do servidor |
Cache por endpoint
As respostas incluem Cache-Control — respeite o max-age para evitar chamadas (e créditos) desnecessários:
| Endpoint | Cache (max-age) |
|---|---|
/search/{query} | 5 minutos (300s) |
/asset-info/{identifier} | 90 minutos (5400s) |
/quotes/{identifier} | 90 minutos (5400s) |
/stats/{identifier} | 90 minutos (5400s) |
/drawdown/{identifier} | 90 minutos (5400s) |
/available-wallets/{identifier} | 90 minutos (5400s) |
/wallet-detail/{identifier} | 90 minutos (5400s) |
/fund-class-subclass/{identifier} | 90 minutos (5400s) |
/fund-structure/{identifier} | 90 minutos (5400s) |