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:

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).

1

Gere sua api_key

Acesse maisretorno.com/app/meu-perfil/api e gere sua api_key. O formato é mr_xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Importante: a chave em texto plano é exibida apenas no momento da geração — o servidor armazena somente o hash. Salve em local seguro (variável de ambiente ou gerenciador de segredos). Se perder, gere uma nova no portal — a anterior será invalidada automaticamente.
2

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
Browser/Playground: o CORS do servidor libera apenas o header Authorization, então chamadas a partir de SPA, extensão ou playground precisam usar Authorization: Bearer. Para backends Python/Node, prefira X-Api-Key.
Dica: Cole sua api_key no campo acima para que ela seja usada automaticamente nos playgrounds desta página (que usam Authorization: Bearer pela restrição de CORS).

Identificadores de Ativos

Todos os endpoints usam um identifier no formato ativo:mercado:

Ações, BDRs, ETFs, FIIs
petr4:b3
ticker:b3
Fundos de Investimento
38000706000126:fi
cnpj:fi
Subclasses de Fundos
10338491000139-s0000255564:fi
cnpj-subclasse_id:fi
Ações e ETFs - EUA
aapl.us:us
ticker.us:us
Ações e ETFs - Londres
bp.lse:lse
ticker.lse:lse
Criptomoedas
btc:cc
ticker:cc
Índices
cdi:idx
ticker:idx
Tesouro Direto
tesouro-selic-18-06-2008:td
slug:td
Títulos Públicos
ntn-r2-15-02-2004-brstncntr084:tp
slug:tp
Dica: Use o endpoint de Search para encontrar o identifier de qualquer ativo.

Endpoints Disponíveis

Base URL: https://data.maisretorno.com/mr-data/v4/api

#EndpointRotaDescrição
1Search (Busca)GET /search/{query}Busca ativos por termo, com filtros opcionais
2Asset 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.
3Quotes (Cotações)GET /quotes/{identifier}Busca cotações históricas de um ativo.
4Stats (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.
5Drawdown (Quedas)GET /drawdown/{identifier}Retorna a série temporal de drawdown desde o último topo dentro do range + summary com max e current.
6Available Wallets (Carteiras)GET /available-wallets/{identifier}Retorna as datas das carteiras disponíveis para um fundo específico
7Wallet Detail (Detalhe da Carteira)GET /wallet-detail/{identifier}Retorna os detalhes completos da carteira de um fundo em um mês/ano específico
8Fund Class/Subclass (Classe/Subclasse)GET /fund-class-subclass/{identifier}Retorna informações detalhadas de uma classe ou subclasse de fundo
9Fund 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)

GET/search/{query}Grátis
Busca ativos por termo, com filtros opcionais

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
has_quotesbooleanNãotrueFiltrar 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

GET https://data.maisretorno.com/mr-data/v4/api/search/petrobras?has_quotes=true
[
  {
    "identifier": "string",
    "nicename": "string",
    "type": "string",
    "has_quotes": true
  }
]

2. Asset Info (Info do Ativo)

GET/asset-info/{identifier}1 crédito
Retorna informações cadastrais completas de um ativo (CNPJ, setor, segmento, etc). O formato da resposta varia de acordo com o tipo de ativo.

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
link_old_historicbooleanNãotruefalse (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

GET https://data.maisretorno.com/mr-data/v4/api/asset-info/petr4%3Ab3?link_old_historic=true
{
  "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)

GET/quotes/{identifier}1 crédito
Busca cotações históricas de um ativo.

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
start_datestringNão2024-01-01Data inicial para buscar cotações (formato: YYYY-MM-DD)
end_datestringNão2024-12-31Data final para buscar cotações (formato: YYYY-MM-DD)
adjustedbooleanNãofalsetrue (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_historicbooleanNãotruefalse (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

GET https://data.maisretorno.com/mr-data/v4/api/quotes/petr4%3Ab3?start_date=2024-01-01&end_date=2024-12-31&adjusted=false&link_old_historic=true
{
  "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)

GET/stats/{identifier}5 créditos
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.

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
detailsbooleanNão-Incluir detalhes adicionais nas estatísticas
currencystringNão-Moeda para conversão dos valores
deflatorstringNão-Deflaciona a série pelo índice de inflação (retorno real): ipca ou igpm
start_datestringNão-Data inicial para filtro (formato: YYYY-MM-DD)
end_datestringNão-Data final para filtro (formato: YYYY-MM-DD)
format_decimalbooleanNã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

GET https://data.maisretorno.com/mr-data/v4/api/stats/petr4%3Ab3
{
  "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)

GET/drawdown/{identifier}5 créditos
Retorna a série temporal de drawdown desde o último topo dentro do range + summary com max e current.

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
start_datestringNão2020-01-01Data inicial para o cálculo do drawdown (YYYY-MM-DD)
end_datestringNão2024-12-31Data final para o cálculo do drawdown (YYYY-MM-DD)
link_old_historicbooleanNãofalsetrue (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

GET https://data.maisretorno.com/mr-data/v4/api/drawdown/petr4%3Ab3?start_date=2020-01-01&end_date=2024-12-31&link_old_historic=false
{
  "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)

GET/available-wallets/{identifier}1 crédito
Retorna as datas das carteiras disponíveis para um fundo específico
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

GET https://data.maisretorno.com/mr-data/v4/api/available-wallets/3168062000103%3Afi
[
  {
    "date": "2024-12-31",
    "open": true
  }
]

7. Wallet Detail (Detalhe da Carteira)

GET/wallet-detail/{identifier}10 créditos
Retorna os detalhes completos da carteira de um fundo em um mês/ano específico

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
monthnumberNão12Mês para buscar a carteira (1-12)
yearnumberNão2024Ano 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

GET https://data.maisretorno.com/mr-data/v4/api/wallet-detail/3168062000103%3Afi?month=12&year=2024
{
  "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)

GET/fund-class-subclass/{identifier}1 crédito
Retorna informações detalhadas de uma classe ou subclasse de fundo

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
link_old_historicbooleanNãotruefalse (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

GET https://data.maisretorno.com/mr-data/v4/api/fund-class-subclass/38120941000131%3Afi?link_old_historic=true
{
  "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)

GET/fund-structure/{identifier}1 crédito
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.

Parâmetros de Query

ParâmetroTipoObrigatórioExemploDescrição
pagenumberNão1Página, começando em 1
page_sizenumberNão20Linhas 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

GET https://data.maisretorno.com/mr-data/v4/api/fund-structure/55912292000120%3Afi?page=1&page_size=20
{
  "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.

Use a URL terminada em /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

ToolO que faz
search_assetsBusca ativos por nome, ticker ou CNPJ
get_asset_infoDados cadastrais de um ativo
get_fund_class_subclassClassificação CVM de um fundo
get_available_walletsMeses de carteira disponíveis de um fundo
get_quotesSérie histórica de cotações — aceita currency, deflator (ipca/igpm), frequency (mensal/anual) e formato compacto
get_asset_statsRentabilidade, sharpe, volatilidade e outros indicadores — recalculados em outra moeda (currency) ou em termos reais (deflator)
get_drawdownSérie underwater e drawdown máximo
get_wallet_detailCarteira completa de um fundo em um mês
get_rolling_windowsRetorno 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_assetsCompara de 2 a 10 ativos na mesma janela e moeda, com stats e drawdown de todos em uma chamada
backtest_portfolioSimula 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.

Exemplo: conecte o MCP e pergunte à IA: "Compare o S&P 500 Total Return em reais com o CDI e 110% do CDI desde 2010, e me diga o retorno real descontando o IPCA" — ela combina 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.

PlanoCréditos/mêsHistórico
Free500Último 1 ano
Basic1.500Completo
Starter5.000Completo
Growth15.000Completo
EnterpriseVolume contratadoCompleto

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çãoEndpoint RESTTool MCPCréditos
Buscar ativos/api/searchsearch_assetsGrátis
Dados cadastrais/api/asset-infoget_asset_info1
Classificação CVM/api/fund-class-subclassget_fund_class_subclass1
Carteiras disponíveis/api/available-walletsget_available_wallets1
Cotações/api/quotesget_quotes1
Estatísticas/api/statsget_asset_stats5
Drawdown/api/drawdownget_drawdown5
Carteira detalhada/api/wallet-detailget_wallet_detail10
Janelas móveisget_rolling_windows10
Comparativo (2 a 10 ativos)compare_assets25
Backtest de carteirabacktest_portfolio25
Como ler: uma chamada = um débito, sempre do mesmo saldo do plano. Consultar as cotações da Apple custa 1 crédito, seja via 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.
Saldo esgotado: as chamadas passam a retornar 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"
}
StatusSignificadoQuando acontece
200SucessoRequisição processada corretamente
400Bad RequestIdentifier inválido ou parâmetros incorretos
401UnauthorizedAPI key ausente ou inválida
403ForbiddenAPI key válida, mas o plano não cobre o recurso solicitado
404Not FoundAtivo não encontrado
429Too Many RequestsSaldo de créditos esgotado — veja Planos e créditos
500Internal Server ErrorErro interno do servidor

Cache por endpoint

As respostas incluem Cache-Control — respeite o max-age para evitar chamadas (e créditos) desnecessários:

EndpointCache (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)