Documentação da API

API REST em JSON, só de leitura, com respostas e erros em português. Autenticação pelo header X-API-Key. Ainda não tem key? Gere uma grátis. A especificação completa, em OpenAPI 3.1, está em /openapi.json: é o mesmo arquivo de onde esta página tira endpoints, parâmetros, campos e erros.

Quickstart

Base URL:

https://medicamentos.api.br

Buscar medicamentos por nome:

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=losartana&porPagina=3"

Cada item da busca traz o registro ANVISA. Com ele você pede o detalhe, com os preços CMED (/api/v1/medicamentos/{registro}), e, nos planos Pro e Business, a bula.

Autenticação

Toda requisição deve enviar a key (32 caracteres hexadecimais) no header X-API-Key. A key é gerada na sua conta (/conta) depois que você confirma o e-mail, e aparece uma única vez: guarde-a assim que gerar. Uma conta pode ter várias keys, que dividem a mesma cota.

X-API-Key: SUA_KEY

Toda resposta a uma requisição que a sua key e o seu plano aceitam traz os headers X-RateLimit-Limit e X-RateLimit-Remaining: o limite principal do plano (o primeiro valor da coluna Limite, na tabela de limites mais abaixo) e o saldo que resta depois de gastar a requisição. Quando o plano tem limite diário e mensal, o que estourar primeiro bloqueia. O 400 de validação não consome cota e mostra o saldo de antes. O 404 de um registro, código de barras, princípio ativo ou bula que não existe consome: a consulta foi feita. Os headers não saem no 401, no 403 nem no 405. No 429 descrevem o limite que estourou, com X-RateLimit-Remaining: 0.

A ordem de toda rota é: identificar a key (401), conferir o plano (403), validar os parâmetros (400), contar a cota (429) e só então consultar o catálogo. Por isso uma key Free que pede um endpoint Pro com parâmetro inválido recebe 403, não 400.

Convenções

Registro ANVISA

Em todo endpoint que recebe um registro vale o mesmo formato: os 9 dígitos do registro (100430911), os 13 impressos na embalagem (vale pelos 9 primeiros; o resto não é conferido) ou qualquer um dos dois com pontuação (1.0043.0911). Qualquer outra coisa é 400 parametro_invalido, com a mesma mensagem em todos os endpoints. A resposta traz sempre o registro de 9 dígitos. Um registro de 13 dígitos que não começa por um registro existente é 404, nunca outro medicamento.

Código de barras

O endpoint de EAN aceita EAN-8, UPC-A (12 dígitos), EAN-13 e GTIN-14 (o EAN-13 com um zero à esquerda é o mesmo produto). O dígito verificador é conferido, e zeros ou o mesmo dígito repetido não são um código: tudo isso é 400 ean_invalido. Um código válido que nenhum registro usa é 404 ean_nao_encontrado. Um exemplo real, que consta na lista CMED: 7891317427542 (losartana potássica, registro 100430911).

Valores ausentes

Valor que não existe é sempre null: nunca texto vazio, 0 nem "nan". Cliente deve ignorar campos que não conhece: as respostas só ganham campos.

Paginação

As listas aceitam pagina (a partir de 1) e porPagina (de 1 a 100; padrão 20) e respondem com total, pagina, totalPaginas e porPagina. Um valor fora do intervalo é 400, nunca aparado em silêncio. A ordem é estável: nenhum registro se repete nem se perde entre as páginas. Uma página além do fim devolve a lista vazia e o mesmo total.

Preços CMED

O detalhe do medicamento traz, em cmed, a lista CMED vigente (cmed.vigencia é a data a partir da qual ela vale) e, para cada apresentação do registro, os preços de cada regime de ICMS: o PF (preço fábrica, pf), o PMC (preço máximo ao consumidor, pmc) e o PMVG (preço máximo de venda ao governo, pmvg). Só entram as apresentações do registro consultado. ?icms=18 (ou ?regime=18%) devolve só aquele regime e reduz muito o corpo. pmc é null onde a lista não o publica, como nas apresentações de restrição hospitalar. O pmvg só é o limite legal nas vendas ao governo onde capNovo é true; nas demais vale o pf. isento marca a apresentação isenta de ICMS.

Situação do registro

A busca e a lista de medicamentos de um princípio ativo devolvem só registros ativos; situacao=inativo ou situacao=todos mostram os demais. Um registro inativo (a ANVISA não o lista mais como ativo, mas a lista CMED ainda o traz) e um removido (saiu das duas) continuam respondendo no detalhe, e situacao diz o que são.

Escopo dos dados

Só entram medicamentos com número de registro na ANVISA, e os preços são os da lista CMED vigente, com a data em cmed.vigencia. Um registro que saiu da lista CMED continua no catálogo, com cmed.apresentacoes vazio.

HTTP

A API é só de leitura: GET, HEAD e OPTIONS (o CORS está aberto, então dá para chamá-la do navegador). Qualquer outro método é 405, com o header Allow. Toda resposta traz Cache-Control: no-store: não a guarde em cache compartilhado. O caminho antigo /v1/... responde 404 com a URL nova no campo novaUrl.

Endpoints

GET /api/v1/medicamentos Free+

Buscar medicamentos por nome

Busca pelo nome comercial ou pelo princípio ativo, sem diferenciar maiúsculas, acentos nem espaços repetidos: dipirona acha NOVALGINA, e analgésico e analgesico são o mesmo termo. Todas as palavras do termo precisam aparecer. A ordem é por relevância (nome igual ao termo, nome que começa com ele, todas as palavras inteiras no nome, palavras dentro do nome, só pelo princípio ativo) e, dentro de cada grau, por nome e registro: a paginação é estável, nenhum registro repete nem se perde entre as páginas. Sem situacao, só registros ativos. Os itens não trazem preços; para os preços use o detalhe do registro.

Parâmetros

  • nome query · obrigatório · texto de 2 a 100 caracteres

    Termo de busca: nome comercial ou princípio ativo. De 2 a 100 caracteres (o mínimo vale depois de tirar acentos e espaços repetidos), sem byte NUL, uma vez só.

  • pagina query · opcional · inteiro de 1 a 1.000.000; padrão 1

    A página do resultado: inteiro de 1 a 1.000.000, só dígitos. Começa em 1.

  • porPagina query · opcional · inteiro de 1 a 100; padrão 20

    Itens por página: inteiro de 1 a 100, só dígitos. Nunca é aparado em silêncio: fora do intervalo é 400.

  • situacao query · opcional · ativo | inativo | todos; padrão ativo

    Situação do registro: ativo, inativo ou todos. Sem o parâmetro, só os ativos.

Exemplo de resposta

Busca por nome, com 2 itens por página

200 GET /api/v1/medicamentos?nome=losartana&porPagina=2 key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=losartana&porPagina=2"
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
Content-Type: application/json; charset=utf-8

{
  "total": 71,
  "pagina": 1,
  "totalPaginas": 36,
  "porPagina": 2,
  "resultados": [
    {
      "registro": "900000111",
      "nome": "LOSARTANA POTÁSSICA",
      "fabricante": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "principioAtivo": "LOSARTANA POTÁSSICA",
      "principioAtivoSlug": "losartana",
      "classeTerapeutica": "ANTI-HIPERTENSIVOS",
      "categoria": "ANTI-HIPERTENSIVOS",
      "classificacao": "generico",
      "situacao": "ativo"
    },
    {
      "registro": "900000112",
      "nome": "LOSARTANA POTÁSSICA",
      "fabricante": "BETA INDÚSTRIA QUÍMICA E FARMACÊUTICA LTDA",
      "principioAtivo": "LOSARTANA POTÁSSICA",
      "principioAtivoSlug": "losartana",
      "classeTerapeutica": "ANTI-HIPERTENSIVOS",
      "categoria": "ANTI-HIPERTENSIVOS",
      "classificacao": "generico",
      "situacao": "ativo"
    }
  ]
}
Campos da resposta (200): 14
CampoTipoDescrição
total inteiro Quantos itens casam, em todas as páginas. Vale também para uma página além do fim.
pagina inteiro A página devolvida: a pedida.
totalPaginas inteiro Quantas páginas há; no mínimo 1, mesmo sem resultado.
porPagina inteiro Itens por página.
resultados lista de objetos Os medicamentos da página, por relevância.
resultados[].registro texto Registro ANVISA, 9 dígitos.
resultados[].nome texto Nome comercial, como a ANVISA o registra.
resultados[].fabricante texto ou null Detentor do registro.
resultados[].principioAtivo texto ou null O princípio ativo como o registro o escreve, com sal e hidratação (LOSARTANA POTÁSSICA). Para a substância-base, veja principioAtivoSlug.
resultados[].principioAtivoSlug texto ou null Slug do princípio ativo (a substância-base, sem sal nem hidratação): o do primeiro componente nas associações. É o que /api/v1/principios-ativos/{slug} recebe.
resultados[].classeTerapeutica texto ou null Classe terapêutica da lista CMED (ANTI-HIPERTENSIVOS). Não é a categoria regulatória.
resultados[].categoria texto ou null obsoleto Obsoleto: o mesmo valor de classeTerapeutica (a categoria regulatória está em categoriaRegulatoria, no detalhe). Use classeTerapeutica.
resultados[].classificacao texto ou null O que o medicamento é em relação ao de referência: referencia, generico, similar, notificado... Serve para comparar genéricos.
resultados[].situacao texto ou null ativo, inativo (a ANVISA não o lista mais como ativo, mas a lista CMED ainda o traz) ou removido (saiu das duas).

Erros deste endpoint

  • 400 parametro_invalido: um parâmetro ausente, repetido, fora do intervalo ou mal formado (a mensagem diz qual). Não consome cota; o saldo atual vai nos headers (menos no % mal formado da URL, recusado antes de a key ser lida). Também é 400 o corpo_invalido (corpo JSON malformado), que sai do parse do corpo, antes de qualquer rota e de a key ser lida: para ele os headers X-RateLimit-* não são garantidos.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

GET /api/v1/medicamentos/{registro} Free+

Detalhe de um medicamento, com os preços CMED

O medicamento pelo registro ANVISA, com os dados do catálogo e os preços da lista CMED vigente, só das apresentações deste registro. O objeto cmed traz todos os regimes de ICMS que a lista publica; ?icms=18 devolve só o regime pedido e reduz o corpo. precosCMED é a mesma informação em lista plana, mantida por compatibilidade (obsoleta). Responde também para registro inativo ou removido: situacao diz o que ele é.

Parâmetros

  • registro caminho · obrigatório · texto

    Registro ANVISA: os 9 dígitos do registro, os 13 impressos na embalagem (vale pelos 9 primeiros; os 4 finais, a apresentação e o controle, não são conferidos) ou qualquer um dos dois com pontuação (1.0043.0911, 1-0043-0911). Qualquer outro formato é parametro_invalido. A resposta traz sempre o registro de 9 dígitos.

  • icms query · opcional · texto

    Filtra os preços por um regime de ICMS: a alíquota (18, 17,5, 12 ALC) ou sem-impostos. Sem o parâmetro vêm todos os regimes que a lista CMED publica. Reduz muito o corpo.

  • regime query · opcional · texto

    O mesmo parâmetro que icms, com outro nome (regime=18%). Se os dois forem enviados, precisam concordar.

Exemplo de resposta

Detalhe de um registro, só com o regime de ICMS pedido

200 GET /api/v1/medicamentos/900000111?icms=18 key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000111?icms=18"
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
Content-Type: application/json; charset=utf-8

{
  "registro": "900000111",
  "nome": "LOSARTANA POTÁSSICA",
  "fabricante": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
  "principioAtivo": "LOSARTANA POTÁSSICA",
  "principiosAtivos": [
    {
      "nome": "losartana",
      "slug": "losartana"
    }
  ],
  "principioAtivoSlug": "losartana",
  "classeTerapeutica": "ANTI-HIPERTENSIVOS",
  "categoria": "ANTI-HIPERTENSIVOS",
  "categoriaRegulatoria": "generico",
  "classificacao": "generico",
  "situacao": "ativo",
  "validadeRegistro": "2031-04",
  "cmed": {
    "vigencia": "2026-09-24",
    "apresentacoes": [
      {
        "codigoGgrem": "790000011100001",
        "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
        "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
        "ean": [
          "7890000000048"
        ],
        "isento": false,
        "capNovo": false,
        "precos": [
          {
            "regime": "18%",
            "pf": 14.39,
            "pmc": 19.14,
            "pmvg": 11.29
          }
        ]
      }
    ]
  },
  "precosCMED": [
    {
      "uf": "Nacional",
      "regime": "18%",
      "pf": 14.39,
      "pmc": 19.14,
      "pmvg": 11.29,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    }
  ]
}
Mais exemplos: 1

Detalhe de um registro, com todos os regimes de ICMS

200 GET /api/v1/medicamentos/900000111 key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000111"
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
Content-Type: application/json; charset=utf-8

{
  "registro": "900000111",
  "nome": "LOSARTANA POTÁSSICA",
  "fabricante": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
  "principioAtivo": "LOSARTANA POTÁSSICA",
  "principiosAtivos": [
    {
      "nome": "losartana",
      "slug": "losartana"
    }
  ],
  "principioAtivoSlug": "losartana",
  "classeTerapeutica": "ANTI-HIPERTENSIVOS",
  "categoria": "ANTI-HIPERTENSIVOS",
  "categoriaRegulatoria": "generico",
  "classificacao": "generico",
  "situacao": "ativo",
  "validadeRegistro": "2031-04",
  "cmed": {
    "vigencia": "2026-09-24",
    "apresentacoes": [
      {
        "codigoGgrem": "790000011100001",
        "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
        "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
        "ean": [
          "7890000000048"
        ],
        "isento": false,
        "capNovo": false,
        "precos": [
          {
            "regime": "0%",
            "pf": 11.8,
            "pmc": 15.69,
            "pmvg": 9.26
          },
          {
            "regime": "12%",
            "pf": 13.41,
            "pmc": 17.84,
            "pmvg": 10.52
          },
          {
            "regime": "12% ALC",
            "pf": 12.07,
            "pmc": 16.05,
            "pmvg": 9.47
          },
          {
            "regime": "17%",
            "pf": 14.22,
            "pmc": 18.91,
            "pmvg": 11.16
          },
          {
            "regime": "17,5%",
            "pf": 14.3,
            "pmc": 19.02,
            "pmvg": 11.22
          },
          {
            "regime": "18%",
            "pf": 14.39,
            "pmc": 19.14,
            "pmvg": 11.29
          },
          {
            "regime": "18% ALC",
            "pf": 12.95,
            "pmc": 17.22,
            "pmvg": 10.16
          },
          {
            "regime": "sem-impostos",
            "pf": 11.45,
            "pmc": 15.23,
            "pmvg": 8.98
          }
        ]
      }
    ]
  },
  "precosCMED": [
    {
      "uf": "Nacional",
      "regime": "0%",
      "pf": 11.8,
      "pmc": 15.69,
      "pmvg": 9.26,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    },
    {
      "uf": "Nacional",
      "regime": "12%",
      "pf": 13.41,
      "pmc": 17.84,
      "pmvg": 10.52,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    },
    {
      "uf": "Nacional",
      "regime": "17%",
      "pf": 14.22,
      "pmc": 18.91,
      "pmvg": 11.16,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    },
    {
      "uf": "Nacional",
      "regime": "17,5%",
      "pf": 14.3,
      "pmc": 19.02,
      "pmvg": 11.22,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    },
    {
      "uf": "Nacional",
      "regime": "18%",
      "pf": 14.39,
      "pmc": 19.14,
      "pmvg": 11.29,
      "referencia": "2026-09-24",
      "laboratorio": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011100001",
      "ean": [
        "7890000000048"
      ],
      "isento": false,
      "capNovo": false
    }
  ]
}
Campos da resposta (200): 42
CampoTipoDescrição
registro texto Registro ANVISA, 9 dígitos (sempre, qualquer que seja o formato do pedido).
nome texto Nome comercial, como a ANVISA o registra.
fabricante texto ou null Detentor do registro.
principioAtivo texto ou null O princípio ativo como o registro o escreve, com sal e hidratação (LOSARTANA POTÁSSICA).
principiosAtivos lista de objetos Os princípios ativos (substância-base, sem sal nem hidratação) na ordem em que o ativo é escrito no registro: uma associação tem mais de um. Vazio quando o catálogo ainda não os calculou.
principiosAtivos[].nome texto O nome para exibir, com acento.
principiosAtivos[].slug texto O slug canônico.
principioAtivoSlug texto ou null O slug do primeiro princípio ativo: o do primeiro componente nas associações.
classeTerapeutica texto ou null Classe terapêutica da lista CMED (ANTI-HIPERTENSIVOS).
categoria texto ou null obsoleto Obsoleto: o mesmo valor de classeTerapeutica. Antes era descrita como categoria regulatória, mas sempre foi a classe terapêutica. Use classeTerapeutica.
categoriaRegulatoria texto ou null A categoria regulatória na ANVISA: generico, similar, novo, biologico, especifico, fitoterapico...
classificacao texto ou null referencia, generico, similar, notificado... Serve para comparar genéricos.
situacao texto ou null ativo, inativo (a ANVISA não o lista mais como ativo, mas a lista CMED ainda o traz) ou removido (saiu das duas).
validadeRegistro texto ou null Vencimento do registro, no formato AAAA-MM (a precisão é mensal). null quando a ANVISA não informa.
cmed objeto Os preços da lista CMED vigente, por apresentação do registro e por regime de ICMS.
cmed.vigencia texto ou null A data a partir da qual a lista CMED vigente vale (ISO). É a lista mais recente que a API carregou.
cmed.apresentacoes lista de objetos As apresentações do registro na lista CMED, por laboratório, apresentação e GGREM. Só as deste registro: nunca as de outro laboratório.
cmed.apresentacoes[].codigoGgrem texto Código GGREM da apresentação na lista CMED, 15 dígitos: a chave da apresentação.
cmed.apresentacoes[].laboratorio texto Laboratório, como a lista CMED o escreve.
cmed.apresentacoes[].apresentacao texto Dosagem e embalagem, como a lista CMED as escreve.
cmed.apresentacoes[].ean lista de textos Os códigos de barras da apresentação (até 3, só dígitos). Vazio quando a lista não traz nenhum.
cmed.apresentacoes[].isento booleano A apresentação é isenta de ICMS (coluna ICMS 0% da lista): os preços saem marcados com asterisco na lista CMED.
cmed.apresentacoes[].capNovo booleano ou null true quando o item é do Anexo I da Resolução CTE-CMED nº 1/2026: só então o pmvg é o limite legal nas vendas ao governo. null quando a lista não diz.
cmed.apresentacoes[].precos lista de objetos Os preços da vigência, um por regime, em ordem de regime. Com icms, só o regime pedido (vazio se a apresentação não tem preço nele).
cmed.apresentacoes[].precos[].regime texto O regime de ICMS: sem-impostos, 0%, 12%, 12% ALC, 17%, 17,5%, 18%, 18% ALC... (ALC: Áreas de Livre Comércio). Os regimes são os que a lista CMED publica.
cmed.apresentacoes[].precos[].pf número ou null Preço fábrica, em reais.
cmed.apresentacoes[].precos[].pmc número ou null Preço máximo ao consumidor, em reais. null quando a lista não publica PMC, como nas apresentações de restrição hospitalar.
cmed.apresentacoes[].precos[].pmvg número ou null Preço máximo de venda ao governo, em reais. Só é o limite legal onde capNovo da apresentação é true; nas demais vale o pf. null quando a lista não publica.
precosCMED lista de objetos obsoleto Obsoleto: os mesmos preços de cmed em lista plana (só os regimes principais, uma linha por apresentação e regime). Use cmed.
precosCMED[].uf "Nacional" Legado: a lista CMED é por regime de ICMS, não por UF; o valor é sempre Nacional.
precosCMED[].regime texto O regime de ICMS (só os principais: sem os ALC e sem sem-impostos).
precosCMED[].pf número Preço fábrica, em reais.
precosCMED[].pmc número ou null Preço máximo ao consumidor, em reais.
precosCMED[].pmvg número ou null Preço máximo de venda ao governo, em reais (veja capNovo).
precosCMED[].referencia texto ou null A vigência da lista CMED (cmed.vigencia).
precosCMED[].laboratorio texto Laboratório.
precosCMED[].apresentacao texto Dosagem e embalagem.
precosCMED[].matchConfidence "alta" Legado: o preço é ligado ao registro de forma exata, então é sempre alta.
precosCMED[].codigoGgrem texto Código GGREM da apresentação.
precosCMED[].ean lista de textos Os códigos de barras da apresentação.
precosCMED[].isento booleano O preço vem com asterisco na lista CMED (isenção de ICMS possível).
precosCMED[].capNovo booleano ou null Veja cmed.apresentacoes[].capNovo.

Erros deste endpoint

  • 400 parametro_invalido: um parâmetro ausente, repetido, fora do intervalo ou mal formado (a mensagem diz qual). Não consome cota; o saldo atual vai nos headers (menos no % mal formado da URL, recusado antes de a key ser lida). Também é 400 o corpo_invalido (corpo JSON malformado), que sai do parse do corpo, antes de qualquer rota e de a key ser lida: para ele os headers X-RateLimit-* não são garantidos.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 404 nao_encontrado: nenhum medicamento tem esse registro. A requisição gasta cota: a consulta foi feita.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

GET /api/v1/medicamentos/{registro}/bula Pro+

Bula do medicamento, em seções

A bula do Bulário Eletrônico da ANVISA, em seções e em JSON (não PDF), com o texto integral de cada seção. Só responde 200 quando há ao menos uma seção real: secoesAusentes lista as que a extração não encontrou, e a classe terapêutica nunca aparece no lugar de «para que serve». Sem nenhuma seção real a resposta é 404 bula_nao_encontrada, e se o PDF existe mas a extração falhou o corpo diz isso (extracaoFalhou) e aponta a bula oficial (urlBulaOficial). Planos Pro e Business.

Parâmetros

  • registro caminho · obrigatório · texto

    Registro ANVISA: os 9 dígitos do registro, os 13 impressos na embalagem (vale pelos 9 primeiros; os 4 finais, a apresentação e o controle, não são conferidos) ou qualquer um dos dois com pontuação (1.0043.0911, 1-0043-0911). Qualquer outro formato é parametro_invalido. A resposta traz sempre o registro de 9 dígitos.

Exemplo de resposta

Bula completa

200 GET /api/v1/medicamentos/900000111/bula key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000111/bula"
HTTP/1.1 200 OK
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "registro": "900000111",
  "secoes": {
    "paraQueServe": "Tratamento da hipertensão arterial e redução do risco de acidente vascular cerebral.",
    "comoTomar": "Dose inicial usual: 50 mg uma vez ao dia, com ou sem alimentos.",
    "contraindicacoes": "Gravidez; alergia à losartana potássica; uso com alisquireno em diabéticos.",
    "efeitosColaterais": "Tontura, cansaço e aumento do potássio no sangue.",
    "composicao": "Cada comprimido revestido contém 50 mg de losartana potássica.",
    "precaucoes": "Pacientes com função renal reduzida precisam de acompanhamento."
  },
  "secoesAusentes": [],
  "extracaoFalhou": false,
  "atualizadoEm": "2026-09-25T03:00:00.000Z",
  "urlBulaOficial": "https://consultas.anvisa.gov.br/#/bulario/q/?numeroRegistro=900000111",
  "bula": {
    "paraQueServe": "Tratamento da hipertensão arterial e redução do risco de acidente vascular cerebral.",
    "comoTomar": "Dose inicial usual: 50 mg uma vez ao dia, com ou sem alimentos.",
    "contraindicacoes": "Gravidez; alergia à losartana potássica; uso com alisquireno em diabéticos.",
    "efeitosColaterais": "Tontura, cansaço e aumento do potássio no sangue.",
    "composicao": "Cada comprimido revestido contém 50 mg de losartana potássica.",
    "precaucoes": "Pacientes com função renal reduzida precisam de acompanhamento.",
    "extracaoFalhou": false
  }
}
Mais exemplos: 2

Bula incompleta: secoesAusentes lista o que não foi encontrado

200 GET /api/v1/medicamentos/900000122/bula key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000122/bula"
HTTP/1.1 200 OK
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "registro": "900000122",
  "secoes": {
    "paraQueServe": "Tratamento de úlceras no estômago e no duodeno.",
    "comoTomar": "Tomar 1 cápsula de 40 mg ao dia, em jejum.",
    "contraindicacoes": null,
    "efeitosColaterais": null,
    "composicao": null,
    "precaucoes": null
  },
  "secoesAusentes": [
    "contraindicacoes",
    "efeitosColaterais",
    "composicao",
    "precaucoes"
  ],
  "extracaoFalhou": false,
  "atualizadoEm": "2026-09-25T03:00:00.000Z",
  "urlBulaOficial": "https://consultas.anvisa.gov.br/#/bulario/q/?numeroRegistro=900000122",
  "bula": {
    "paraQueServe": "Tratamento de úlceras no estômago e no duodeno.",
    "comoTomar": "Tomar 1 cápsula de 40 mg ao dia, em jejum.",
    "contraindicacoes": null,
    "efeitosColaterais": null,
    "composicao": null,
    "precaucoes": null,
    "extracaoFalhou": false
  }
}

Sem nenhuma seção real: 404, com a extração que falhou

404 GET /api/v1/medicamentos/900000151/bula key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000151/bula"
HTTP/1.1 404 Not Found
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "erro": "bula_nao_encontrada",
  "mensagem": "Não há texto de bula disponível para este registro: a extração automática do PDF não reconheceu nenhuma seção. Consulte a bula oficial no Bulário da ANVISA (urlBulaOficial).",
  "extracaoFalhou": true,
  "urlBulaOficial": "https://consultas.anvisa.gov.br/#/bulario/q/?numeroRegistro=900000151"
}
Campos da resposta (200): 20
CampoTipoDescrição
registro texto Registro ANVISA, 9 dígitos.
secoes objeto As seis seções, com o texto integral; null na que a extração não encontrou.
secoes.paraQueServe texto ou null Para que este medicamento é indicado. Nunca a classe terapêutica no lugar da indicação.
secoes.comoTomar texto ou null Como usar: dose, via e frequência.
secoes.contraindicacoes texto ou null Quando não usar.
secoes.efeitosColaterais texto ou null Reações adversas. O texto sai integral, sem corte.
secoes.composicao texto ou null Composição.
secoes.precaucoes texto ou null Advertências e precauções.
secoesAusentes lista de textos As chaves das seções que não foram encontradas: um registro com a bula incompleta é 200 com esta lista, não 404.
extracaoFalhou booleano true quando o PDF da bula abriu mas a extração automática não reconheceu as seções: falha de extração, não ausência de bula publicada. Se não sobrou nenhuma seção real, a resposta é 404 com extracaoFalhou: true no corpo.
atualizadoEm texto ou null Quando o texto da bula foi extraído do PDF da ANVISA (nas linhas mais antigas, quando foi gravado), em ISO 8601 (UTC).
urlBulaOficial texto A busca do Bulário Eletrônico da ANVISA por este registro: a bula oficial, para conferir o texto.
bula objeto obsoleto Obsoleto: as mesmas seções de secoes com o extracaoFalhou dentro, o formato de antes. Use secoes.
bula.paraQueServe texto ou null
bula.comoTomar texto ou null
bula.contraindicacoes texto ou null
bula.efeitosColaterais texto ou null
bula.composicao texto ou null
bula.precaucoes texto ou null
bula.extracaoFalhou booleano

Erros deste endpoint

  • 400 parametro_invalido: um parâmetro ausente, repetido, fora do intervalo ou mal formado (a mensagem diz qual). Não consome cota; o saldo atual vai nos headers (menos no % mal formado da URL, recusado antes de a key ser lida). Também é 400 o corpo_invalido (corpo JSON malformado), que sai do parse do corpo, antes de qualquer rota e de a key ser lida: para ele os headers X-RateLimit-* não são garantidos.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 403 tier_insuficiente: o endpoint exige um plano maior que o da key. Vem antes da validação dos parâmetros e não consome cota.
  • 404 bula_nao_encontrada: o registro não tem nenhuma seção real de bula. Com extracaoFalhou: true o PDF existe e a extração automática não reconheceu nenhuma seção (não é o mesmo que sem bula publicada). A requisição gasta cota.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

GET /api/v1/principios-ativos Pro+

Listar princípios ativos

Os princípios ativos (a substância-base, sem sal nem hidratação: losartana, não losartana potássica) que têm ao menos um medicamento ativo, em ordem alfabética do slug, com a quantidade de medicamentos ativos de cada um. busca filtra pelo slug, sem acento nem caixa; todas as palavras precisam aparecer. O slug daqui é o que /api/v1/principios-ativos/{slug} recebe. Planos Pro e Business.

Parâmetros

  • busca query · opcional · texto de 2 a 100 caracteres

    Filtra os princípios ativos pelo slug: todas as palavras precisam aparecer. De 2 a 100 caracteres. Sem ele, a lista vem inteira.

  • pagina query · opcional · inteiro de 1 a 1.000.000; padrão 1

    A página do resultado: inteiro de 1 a 1.000.000, só dígitos. Começa em 1.

  • porPagina query · opcional · inteiro de 1 a 100; padrão 20

    Itens por página: inteiro de 1 a 100, só dígitos. Nunca é aparado em silêncio: fora do intervalo é 400.

Exemplo de resposta

Lista de princípios ativos, com busca

200 GET /api/v1/principios-ativos?busca=losartana key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/principios-ativos?busca=losartana"
HTTP/1.1 200 OK
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "total": 1,
  "pagina": 1,
  "totalPaginas": 1,
  "porPagina": 20,
  "resultados": [
    {
      "slug": "losartana",
      "nome": "losartana",
      "total": 71
    }
  ]
}
Campos da resposta (200): 8
CampoTipoDescrição
total inteiro Quantos itens casam, em todas as páginas. Vale também para uma página além do fim.
pagina inteiro A página devolvida: a pedida.
totalPaginas inteiro Quantas páginas há; no mínimo 1, mesmo sem resultado.
porPagina inteiro Itens por página.
resultados lista de objetos Os princípios ativos da página, em ordem alfabética do slug.
resultados[].slug texto O slug canônico, para /api/v1/principios-ativos/{slug}.
resultados[].nome texto O nome para exibir, com acento.
resultados[].total inteiro Quantos medicamentos ativos contêm o princípio ativo.

Erros deste endpoint

  • 400 parametro_invalido: um parâmetro ausente, repetido, fora do intervalo ou mal formado (a mensagem diz qual). Não consome cota; o saldo atual vai nos headers (menos no % mal formado da URL, recusado antes de a key ser lida). Também é 400 o corpo_invalido (corpo JSON malformado), que sai do parse do corpo, antes de qualquer rota e de a key ser lida: para ele os headers X-RateLimit-* não são garantidos.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 403 tier_insuficiente: o endpoint exige um plano maior que o da key. Vem antes da validação dos parâmetros e não consome cota.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

GET /api/v1/principios-ativos/{slug} Pro+

Medicamentos de um princípio ativo

Todos os medicamentos que contêm o princípio ativo, paginados, por nome e registro: ideal para comparar genéricos (classificacao). O slug aceita maiúsculas, acento e o alias antigo (dipirona-monoidratada resolve para dipirona; uma associação como losartana-potassica-hidroclorotiazida, para o primeiro componente, losartana), e a resposta traz o slug canônico em slug. Sem situacao, só registros ativos. Um slug que não existe é 404 com sugestoes. Planos Pro e Business.

Parâmetros

  • slug caminho · obrigatório · texto de até 120 caracteres

    O princípio ativo: o slug canônico (losartana) ou um alias antigo (losartana-potassica), sem diferenciar maiúsculas nem acentos. Até 120 caracteres.

  • situacao query · opcional · ativo | inativo | todos; padrão ativo

    Situação do registro: ativo, inativo ou todos. Sem o parâmetro, só os ativos.

  • pagina query · opcional · inteiro de 1 a 1.000.000; padrão 1

    A página do resultado: inteiro de 1 a 1.000.000, só dígitos. Começa em 1.

  • porPagina query · opcional · inteiro de 1 a 100; padrão 20

    Itens por página: inteiro de 1 a 100, só dígitos. Nunca é aparado em silêncio: fora do intervalo é 400.

Exemplo de resposta

Medicamentos de um princípio ativo, com 2 itens por página

200 GET /api/v1/principios-ativos/losartana?porPagina=2 key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/principios-ativos/losartana?porPagina=2"
HTTP/1.1 200 OK
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "principioAtivo": "losartana",
  "slug": "losartana",
  "nome": "losartana",
  "total": 71,
  "pagina": 1,
  "totalPaginas": 36,
  "porPagina": 2,
  "medicamentos": [
    {
      "registro": "900000114",
      "nome": "COZAAR",
      "fabricante": "GAMA FARMACÊUTICA DO BRASIL LTDA",
      "principioAtivo": "LOSARTANA POTÁSSICA",
      "principioAtivoSlug": "losartana",
      "classeTerapeutica": "ANTI-HIPERTENSIVOS",
      "categoria": "ANTI-HIPERTENSIVOS",
      "classificacao": "referencia",
      "situacao": "ativo"
    },
    {
      "registro": "900000111",
      "nome": "LOSARTANA POTÁSSICA",
      "fabricante": "ALFA LABORATÓRIO FARMACÊUTICO S.A.",
      "principioAtivo": "LOSARTANA POTÁSSICA",
      "principioAtivoSlug": "losartana",
      "classeTerapeutica": "ANTI-HIPERTENSIVOS",
      "categoria": "ANTI-HIPERTENSIVOS",
      "classificacao": "generico",
      "situacao": "ativo"
    }
  ]
}
Mais exemplos: 1

Slug que não existe: 404 com sugestões

404 GET /api/v1/principios-ativos/losartan key Pro

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/principios-ativos/losartan"
HTTP/1.1 404 Not Found
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
Content-Type: application/json; charset=utf-8

{
  "erro": "principio_ativo_nao_encontrado",
  "mensagem": "Nenhum princípio ativo encontrado para \"losartan\". Veja os slugs em /api/v1/principios-ativos?busca=losartan e as sugestões.",
  "sugestoes": [
    "losartana"
  ]
}
Campos da resposta (200): 17
CampoTipoDescrição
total inteiro Quantos itens casam, em todas as páginas. Vale também para uma página além do fim.
pagina inteiro A página devolvida: a pedida.
totalPaginas inteiro Quantas páginas há; no mínimo 1, mesmo sem resultado.
porPagina inteiro Itens por página.
principioAtivo texto O nome do princípio ativo (o mesmo de nome; o campo existe desde a primeira versão).
slug texto O slug canônico, mesmo quando o pedido usou um alias antigo ou outra grafia.
nome texto O nome para exibir, com acento.
medicamentos lista de objetos Os medicamentos da página, por nome e registro.
medicamentos[].registro texto Registro ANVISA, 9 dígitos.
medicamentos[].nome texto Nome comercial, como a ANVISA o registra.
medicamentos[].fabricante texto ou null Detentor do registro.
medicamentos[].principioAtivo texto ou null O princípio ativo como o registro o escreve, com sal e hidratação (LOSARTANA POTÁSSICA). Para a substância-base, veja principioAtivoSlug.
medicamentos[].principioAtivoSlug texto ou null Slug do princípio ativo (a substância-base, sem sal nem hidratação): o do primeiro componente nas associações. É o que /api/v1/principios-ativos/{slug} recebe.
medicamentos[].classeTerapeutica texto ou null Classe terapêutica da lista CMED (ANTI-HIPERTENSIVOS). Não é a categoria regulatória.
medicamentos[].categoria texto ou null obsoleto Obsoleto: o mesmo valor de classeTerapeutica (a categoria regulatória está em categoriaRegulatoria, no detalhe). Use classeTerapeutica.
medicamentos[].classificacao texto ou null O que o medicamento é em relação ao de referência: referencia, generico, similar, notificado... Serve para comparar genéricos.
medicamentos[].situacao texto ou null ativo, inativo (a ANVISA não o lista mais como ativo, mas a lista CMED ainda o traz) ou removido (saiu das duas).

Erros deste endpoint

  • 400 parametro_invalido: um parâmetro ausente, repetido, fora do intervalo ou mal formado (a mensagem diz qual). Não consome cota; o saldo atual vai nos headers (menos no % mal formado da URL, recusado antes de a key ser lida). Também é 400 o corpo_invalido (corpo JSON malformado), que sai do parse do corpo, antes de qualquer rota e de a key ser lida: para ele os headers X-RateLimit-* não são garantidos.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 403 tier_insuficiente: o endpoint exige um plano maior que o da key. Vem antes da validação dos parâmetros e não consome cota.
  • 404 principio_ativo_nao_encontrado: o slug não é de nenhum princípio ativo. O corpo traz sugestoes (até 5 slugs parecidos, ou vazio). A requisição gasta cota.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

GET /api/v1/ean/{codigo} Free+

Medicamento pelo código de barras

Do código de barras ao medicamento, para PDV de farmácia e conferência do preço máximo no balcão. Confere o dígito verificador e aceita EAN-8, UPC-A (12 dígitos), EAN-13 e GTIN-14 (o EAN-13 com um zero à esquerda é o mesmo produto). A resposta é o detalhe do registro (o mesmo de /api/v1/medicamentos/{registro}, com ?icms=) mais apresentacaoLida, a apresentação que o código identifica, com os preços só dela. Quando o mesmo código consta em mais de um registro ativo, alternativas lista os outros; o principal é o registro ativo.

Parâmetros

  • codigo caminho · obrigatório · texto

    O código de barras: EAN-8, UPC-A (12 dígitos), EAN-13 ou GTIN-14, só números, com o dígito verificador correto.

  • icms query · opcional · texto

    Filtra os preços por um regime de ICMS: a alíquota (18, 17,5, 12 ALC) ou sem-impostos. Sem o parâmetro vêm todos os regimes que a lista CMED publica. Reduz muito o corpo.

  • regime query · opcional · texto

    O mesmo parâmetro que icms, com outro nome (regime=18%). Se os dois forem enviados, precisam concordar.

Exemplo de resposta

Código de barras usado por dois registros ativos: apresentacaoLida e alternativas

200 GET /api/v1/ean/7890000000130?icms=18 key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/ean/7890000000130?icms=18"
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
Content-Type: application/json; charset=utf-8

{
  "registro": "900000112",
  "nome": "LOSARTANA POTÁSSICA",
  "fabricante": "BETA INDÚSTRIA QUÍMICA E FARMACÊUTICA LTDA",
  "principioAtivo": "LOSARTANA POTÁSSICA",
  "principiosAtivos": [
    {
      "nome": "losartana",
      "slug": "losartana"
    }
  ],
  "principioAtivoSlug": "losartana",
  "classeTerapeutica": "ANTI-HIPERTENSIVOS",
  "categoria": "ANTI-HIPERTENSIVOS",
  "categoriaRegulatoria": "generico",
  "classificacao": "generico",
  "situacao": "ativo",
  "validadeRegistro": "2031-05",
  "cmed": {
    "vigencia": "2026-09-24",
    "apresentacoes": [
      {
        "codigoGgrem": "790000011200001",
        "laboratorio": "BETA INDÚSTRIA QUÍMICA E FARMACÊUTICA LTDA",
        "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
        "ean": [
          "7890000000130"
        ],
        "isento": false,
        "capNovo": false,
        "precos": [
          {
            "regime": "18%",
            "pf": 15.12,
            "pmc": 20.11,
            "pmvg": 11.87
          }
        ]
      }
    ]
  },
  "precosCMED": [
    {
      "uf": "Nacional",
      "regime": "18%",
      "pf": 15.12,
      "pmc": 20.11,
      "pmvg": 11.87,
      "referencia": "2026-09-24",
      "laboratorio": "BETA INDÚSTRIA QUÍMICA E FARMACÊUTICA LTDA",
      "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
      "matchConfidence": "alta",
      "codigoGgrem": "790000011200001",
      "ean": [
        "7890000000130"
      ],
      "isento": false,
      "capNovo": false
    }
  ],
  "apresentacaoLida": {
    "ean": "7890000000130",
    "codigoGgrem": "790000011200001",
    "apresentacao": "50 MG COM REV CT BL AL PLAS TRANS X 30",
    "laboratorio": "BETA INDÚSTRIA QUÍMICA E FARMACÊUTICA LTDA",
    "isento": false,
    "capNovo": false,
    "precos": [
      {
        "regime": "18%",
        "pf": 15.12,
        "pmc": 20.11,
        "pmvg": 11.87
      }
    ]
  },
  "alternativas": [
    {
      "registro": "900000113",
      "nome": "LOSARTANA POTÁSSICA",
      "fabricante": "ÔMEGA BIOTECNOLOGIA E SAÚDE LTDA",
      "situacao": "ativo",
      "codigoGgrem": "790000011300001",
      "apresentacao": "100 MG COM REV CT BL AL PLAS TRANS X 30",
      "laboratorio": "ÔMEGA BIOTECNOLOGIA E SAÚDE LTDA"
    }
  ]
}
Campos da resposta (200): 62
CampoTipoDescrição
registro texto Registro ANVISA, 9 dígitos (sempre, qualquer que seja o formato do pedido).
nome texto Nome comercial, como a ANVISA o registra.
fabricante texto ou null Detentor do registro.
principioAtivo texto ou null O princípio ativo como o registro o escreve, com sal e hidratação (LOSARTANA POTÁSSICA).
principiosAtivos lista de objetos Os princípios ativos (substância-base, sem sal nem hidratação) na ordem em que o ativo é escrito no registro: uma associação tem mais de um. Vazio quando o catálogo ainda não os calculou.
principiosAtivos[].nome texto O nome para exibir, com acento.
principiosAtivos[].slug texto O slug canônico.
principioAtivoSlug texto ou null O slug do primeiro princípio ativo: o do primeiro componente nas associações.
classeTerapeutica texto ou null Classe terapêutica da lista CMED (ANTI-HIPERTENSIVOS).
categoria texto ou null obsoleto Obsoleto: o mesmo valor de classeTerapeutica. Antes era descrita como categoria regulatória, mas sempre foi a classe terapêutica. Use classeTerapeutica.
categoriaRegulatoria texto ou null A categoria regulatória na ANVISA: generico, similar, novo, biologico, especifico, fitoterapico...
classificacao texto ou null referencia, generico, similar, notificado... Serve para comparar genéricos.
situacao texto ou null ativo, inativo (a ANVISA não o lista mais como ativo, mas a lista CMED ainda o traz) ou removido (saiu das duas).
validadeRegistro texto ou null Vencimento do registro, no formato AAAA-MM (a precisão é mensal). null quando a ANVISA não informa.
cmed objeto Os preços da lista CMED vigente, por apresentação do registro e por regime de ICMS.
cmed.vigencia texto ou null A data a partir da qual a lista CMED vigente vale (ISO). É a lista mais recente que a API carregou.
cmed.apresentacoes lista de objetos As apresentações do registro na lista CMED, por laboratório, apresentação e GGREM. Só as deste registro: nunca as de outro laboratório.
cmed.apresentacoes[].codigoGgrem texto Código GGREM da apresentação na lista CMED, 15 dígitos: a chave da apresentação.
cmed.apresentacoes[].laboratorio texto Laboratório, como a lista CMED o escreve.
cmed.apresentacoes[].apresentacao texto Dosagem e embalagem, como a lista CMED as escreve.
cmed.apresentacoes[].ean lista de textos Os códigos de barras da apresentação (até 3, só dígitos). Vazio quando a lista não traz nenhum.
cmed.apresentacoes[].isento booleano A apresentação é isenta de ICMS (coluna ICMS 0% da lista): os preços saem marcados com asterisco na lista CMED.
cmed.apresentacoes[].capNovo booleano ou null true quando o item é do Anexo I da Resolução CTE-CMED nº 1/2026: só então o pmvg é o limite legal nas vendas ao governo. null quando a lista não diz.
cmed.apresentacoes[].precos lista de objetos Os preços da vigência, um por regime, em ordem de regime. Com icms, só o regime pedido (vazio se a apresentação não tem preço nele).
cmed.apresentacoes[].precos[].regime texto O regime de ICMS: sem-impostos, 0%, 12%, 12% ALC, 17%, 17,5%, 18%, 18% ALC... (ALC: Áreas de Livre Comércio). Os regimes são os que a lista CMED publica.
cmed.apresentacoes[].precos[].pf número ou null Preço fábrica, em reais.
cmed.apresentacoes[].precos[].pmc número ou null Preço máximo ao consumidor, em reais. null quando a lista não publica PMC, como nas apresentações de restrição hospitalar.
cmed.apresentacoes[].precos[].pmvg número ou null Preço máximo de venda ao governo, em reais. Só é o limite legal onde capNovo da apresentação é true; nas demais vale o pf. null quando a lista não publica.
precosCMED lista de objetos obsoleto Obsoleto: os mesmos preços de cmed em lista plana (só os regimes principais, uma linha por apresentação e regime). Use cmed.
precosCMED[].uf "Nacional" Legado: a lista CMED é por regime de ICMS, não por UF; o valor é sempre Nacional.
precosCMED[].regime texto O regime de ICMS (só os principais: sem os ALC e sem sem-impostos).
precosCMED[].pf número Preço fábrica, em reais.
precosCMED[].pmc número ou null Preço máximo ao consumidor, em reais.
precosCMED[].pmvg número ou null Preço máximo de venda ao governo, em reais (veja capNovo).
precosCMED[].referencia texto ou null A vigência da lista CMED (cmed.vigencia).
precosCMED[].laboratorio texto Laboratório.
precosCMED[].apresentacao texto Dosagem e embalagem.
precosCMED[].matchConfidence "alta" Legado: o preço é ligado ao registro de forma exata, então é sempre alta.
precosCMED[].codigoGgrem texto Código GGREM da apresentação.
precosCMED[].ean lista de textos Os códigos de barras da apresentação.
precosCMED[].isento booleano O preço vem com asterisco na lista CMED (isenção de ICMS possível).
precosCMED[].capNovo booleano ou null Veja cmed.apresentacoes[].capNovo.
apresentacaoLida objeto ou null A apresentação que o código de barras identifica, com os preços só dela. null só quando o código consta apenas no índice antigo.
apresentacaoLida.ean texto O código lido, na grafia canônica (a menor: sem zeros à esquerda a mais).
apresentacaoLida.codigoGgrem texto Código GGREM da apresentação que o código identifica.
apresentacaoLida.apresentacao texto Dosagem e embalagem da apresentação.
apresentacaoLida.laboratorio texto Laboratório da apresentação.
apresentacaoLida.isento booleano A apresentação é isenta de ICMS.
apresentacaoLida.capNovo booleano ou null De que depende o PMVG: veja cmed.apresentacoes[].capNovo.
apresentacaoLida.precos lista de objetos Os preços só desta apresentação (filtrados por icms, se pedido).
apresentacaoLida.precos[].regime texto O regime de ICMS: sem-impostos, 0%, 12%, 12% ALC, 17%, 17,5%, 18%, 18% ALC... (ALC: Áreas de Livre Comércio). Os regimes são os que a lista CMED publica.
apresentacaoLida.precos[].pf número ou null Preço fábrica, em reais.
apresentacaoLida.precos[].pmc número ou null Preço máximo ao consumidor, em reais. null quando a lista não publica PMC, como nas apresentações de restrição hospitalar.
apresentacaoLida.precos[].pmvg número ou null Preço máximo de venda ao governo, em reais. Só é o limite legal onde capNovo da apresentação é true; nas demais vale o pf. null quando a lista não publica.
alternativas lista de objetos Os outros registros ativos que usam o mesmo código (um produto repassado de um laboratório a outro). Vazio no caso comum.
alternativas[].registro texto O outro registro ativo que usa o mesmo código de barras.
alternativas[].nome texto Nome comercial.
alternativas[].fabricante texto ou null Detentor do registro.
alternativas[].situacao texto ou null Sempre ativo: o registro inativo ou removido não é alternativa.
alternativas[].codigoGgrem texto ou null A apresentação desse registro que usa o código. null quando só o índice antigo o conhece.
alternativas[].apresentacao texto ou null Dosagem e embalagem dessa apresentação.
alternativas[].laboratorio texto ou null Laboratório dessa apresentação.

Erros deste endpoint

  • 400 ean_invalido: o código não é um EAN-8, UPC-A, EAN-13 ou GTIN-14 válido (dígito verificador, placeholder). parametro_invalido: o icms ou o regime não é uma alíquota. Não consome cota; o saldo atual vai nos headers.
  • 401 nao_autenticado: falta o header X-API-Key. chave_invalida: a key não tem o formato certo, não existe ou foi revogada.
  • 404 ean_nao_encontrado: o código é válido, mas nenhum registro o usa. A requisição gasta cota.
  • 429 limite_excedido: a cota do plano acabou (a diária ou, no Free, a mensal). O corpo diz quando o contador reinicia (reiniciaEm) e para onde ampliar o plano (upgradeUrl). Os headers X-RateLimit-* descrevem o limite que estourou.
  • 500 erro_interno: falha do nosso lado. Tente de novo em instantes.

Códigos de erro

Todo erro é JSON, nunca uma página HTML, no formato { "erro", "mensagem" }: o campo erro é o código para o programa decidir e mensagem é o texto, em português, para pessoas. Alguns erros trazem campos a mais, descritos na tabela. Tome decisões pelo erro, não pelo texto da mensagem.

HTTPCampo erroQuando ocorre
400 parametro_invalido Parâmetro ausente, repetido, fora do intervalo ou mal formado: nome (2 a 100 caracteres, contados sem acento nem espaço repetido), busca, pagina, porPagina, situacao, registro, slug e icms/regime. A mensagem diz qual. Não consome cota. Também é este código o de um % sem dois dígitos hexadecimais na URL, mas esse é recusado antes de a key ser lida: vem sem os headers X-RateLimit-* e até sem key.
400 ean_invalido Código de barras que não é um EAN-8, UPC-A (12 dígitos), EAN-13 ou GTIN-14 válido: só dígitos, com o dígito verificador GS1 correto, e que não seja só zeros nem o mesmo dígito repetido. Não consome cota.
400 corpo_invalido Corpo application/json malformado, em qualquer método (um GET com Content-Type: application/json e corpo quebrado também). A API é só de leitura e não precisa de corpo. O corpo é lido antes de qualquer rota, então este 400 sai antes de a key ser lida: não há garantia dos headers X-RateLimit-* nele (nem de Access-Control-*), mesmo com uma key válida.
401 nao_autenticado Falta o header X-API-Key.
401 chave_invalida Key que não tem 32 caracteres hexadecimais, que não existe ou que foi revogada.
403 tier_insuficiente O endpoint exige um plano maior que o da key (bula e princípios ativos pedem o Pro ou o Business). Vem antes da validação dos parâmetros e não consome cota.
404 nao_encontrado Registro ANVISA que não existe (a consulta foi feita: consome cota) ou caminho de /api/v1 que não existe (não exige key e não consome cota).
404 ean_nao_encontrado Código de barras válido que nenhum registro usa.
404 principio_ativo_nao_encontrado Slug que não é de nenhum princípio ativo, nem canônico nem alias antigo. O corpo traz sugestoes.
404 bula_nao_encontrada O registro não tem nenhuma seção real de bula. Se o PDF existe e a extração falhou, o corpo traz também extracaoFalhou: true e urlBulaOficial.
405 metodo_nao_permitido Método diferente de GET, HEAD e OPTIONS em qualquer caminho de /api/v1. O header Allow lista os aceitos.
413 corpo_muito_grande Corpo JSON acima do limite do servidor (100 kB).
415 requisicao_invalida Outro erro do cliente detectado pelo servidor HTTP, com o status dele; por exemplo 415 para um corpo application/json com um charset que o servidor não lê.
429 limite_excedido Cota do plano esgotada, diária ou mensal. O corpo traz upgradeUrl e reiniciaEm, e o header Retry-After os segundos até o contador reiniciar.
500 erro_interno Falha do nosso lado. A mensagem é fixa; o motivo fica só no log do servidor. Tente de novo em instantes.

Exemplos

Parâmetro inválido: o 400 não consome cota (o saldo continua o mesmo)

400 GET /api/v1/medicamentos?nome=a key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=a"
HTTP/1.1 400 Bad Request
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 100
Content-Type: application/json; charset=utf-8

{
  "erro": "parametro_invalido",
  "mensagem": "Informe o parâmetro \"nome\" com 2 a 100 caracteres (sem contar acentos nem espaços repetidos), sem byte NUL e uma vez só. Ex.: /api/v1/medicamentos?nome=dipirona"
}

Sem a key

401 GET /api/v1/medicamentos?nome=losartana sem key

curl \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=losartana"
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8

{
  "erro": "nao_autenticado",
  "mensagem": "Informe sua chave de API no header X-API-Key. Crie uma chave gratuita em https://medicamentos.api.br/api."
}

Key Free num endpoint do plano Pro

403 GET /api/v1/medicamentos/900000111/bula key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/900000111/bula"
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8

{
  "erro": "tier_insuficiente",
  "mensagem": "Este endpoint requer o plano \"pro\" ou superior. Seu plano atual é \"free\"."
}

Registro que não existe: o 404 consome cota

404 GET /api/v1/medicamentos/999999999 key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos/999999999"
HTTP/1.1 404 Not Found
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
Content-Type: application/json; charset=utf-8

{
  "erro": "nao_encontrado",
  "mensagem": "Nenhum medicamento encontrado para o registro ANVISA \"999999999\"."
}

Limite diário esgotado (plano Free)

429 GET /api/v1/medicamentos?nome=losartana key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=losartana"
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Retry-After: 49545
Content-Type: application/json; charset=utf-8

{
  "erro": "limite_excedido",
  "mensagem": "Limite diário de 100 requisições do plano \"free\" atingido. O contador reinicia à meia-noite (horário de Brasília). Para ampliar o limite, veja os planos em https://medicamentos.api.br/api/assinar.",
  "upgradeUrl": "https://medicamentos.api.br/api/assinar?tier=pro",
  "reiniciaEm": "2026-10-03T00:00:00-03:00"
}

Limite mensal esgotado (plano Free)

429 GET /api/v1/medicamentos?nome=losartana key Free

curl -H "X-API-Key: SUA_KEY" \
  "https://medicamentos.api.br/api/v1/medicamentos?nome=losartana"
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
Retry-After: 2555145
Content-Type: application/json; charset=utf-8

{
  "erro": "limite_excedido",
  "mensagem": "Limite mensal de 1000 requisições do plano \"free\" atingido. O contador reinicia no dia 1º do próximo mês (horário de Brasília). Para ampliar o limite, veja os planos em https://medicamentos.api.br/api/assinar.",
  "upgradeUrl": "https://medicamentos.api.br/api/assinar?tier=pro",
  "reiniciaEm": "2026-11-01T00:00:00-03:00"
}

Limites por plano

PlanoLimiteInclui
Free 100 req/dia · 1.000 req/mês Busca por nome · Consulta por registro ANVISA, com preços CMED · Busca por código de barras (EAN) · Até 10 API keys por conta, que dividem a mesma cota
Pro 10.000 req/dia Tudo do Free · Consulta por princípio ativo · Bula completa em JSON
Business 100.000 req/dia Tudo do Pro

O contador diário reinicia à meia-noite e o mensal no dia 1º (horário de Brasília). Acompanhe o seu saldo pelos headers X-RateLimit-Limit e X-RateLimit-Remaining. No 429, o header Retry-After diz em quantos segundos tentar de novo, e o corpo traz reiniciaEm (o mesmo instante, em ISO 8601 no horário de Brasília) e upgradeUrl (onde ampliar o plano). Estourou o limite? Veja os planos Pro e Business.

Changelog

As respostas só ganham campos: nada é removido sem aviso. O que for aposentado fica marcado como obsoleto (a palavra aparece na tabela de campos de cada endpoint e como deprecated no OpenAPI) e continua funcionando por um tempo; este registro diz o que mudou e quando.

2026-10-02 — o contrato revisto

Campos e parâmetros novos

  • Detalhe do medicamento: classeTerapeutica, categoriaRegulatoria, classificacao, situacao, validadeRegistro (no formato AAAA-MM), principiosAtivos, principioAtivoSlug (o do primeiro componente, nas associações) e o objeto cmed: a vigência da lista CMED e, por apresentação, codigoGgrem, ean, isento, capNovo e os preços pf, pmc e pmvg de todos os regimes de ICMS. O parâmetro icms (ou regime) filtra o regime.
  • Busca e lista de um princípio ativo: porPagina e situacao como parâmetros, e principioAtivoSlug, classeTerapeutica, classificacao e situacao em cada item.
  • Novo endpoint GET /api/v1/principios-ativos, que lista os princípios ativos (slug, nome, total) e aceita busca.
  • Código de barras: apresentacaoLida (a apresentação que o código identifica, com os preços só dela) e alternativas (os outros registros ativos que usam o mesmo código).
  • Bula: secoes, secoesAusentes, atualizadoEm e urlBulaOficial.
  • 429: upgradeUrl e reiniciaEm.

Obsoletos (continuam funcionando)

  • categoria: o mesmo valor de classeTerapeutica. Era descrita como categoria regulatória, mas sempre foi a classe terapêutica; a categoria regulatória está em categoriaRegulatoria.
  • precosCMED: os mesmos preços de cmed, em lista plana (só os regimes principais). Use cmed. Dentro dele, uf é sempre Nacional (a lista CMED é por regime de ICMS, não por UF) e matchConfidence é sempre alta (o preço é ligado ao registro de forma exata).
  • bula, na resposta da bula: as mesmas seções de secoes. Use secoes.

O que mudou no comportamento

  • Preços: o detalhe passa a trazer só as apresentações do registro consultado (antes vinham linhas de outros laboratórios), com pmc e capNovo. Em precosCMED, a referencia passa a ser a data da vigência (ISO), e não mais um texto como Abril/2026. Texto vazio ou "nan" sai null.
  • Registro: um formato só em todo endpoint (9 dígitos, 13 da embalagem ou pontuado); registro mal formado é sempre parametro_invalido. O código registro_invalido, que a bula devolvia, foi aposentado.
  • Busca: procura também pelo princípio ativo, sem diferenciar maiúsculas nem acentos; ordena por relevância; devolve só registros ativos (situacao=todos traz todos) e pagina sem repetir nem perder registros.
  • Princípio ativo: /api/v1/principios-ativos/{slug} agora é paginado (antes devolvia tudo: siga totalPaginas), devolve todos os medicamentos que contêm a substância-base (antes só os do slug exato: losartana dava 404), aceita o alias antigo do slug e responde 404 principio_ativo_nao_encontrado, com sugestoes, quando o slug não existe. O campo principioAtivo passa a ser o nome do princípio ativo.
  • Código de barras: o 404 é ean_nao_encontrado (era nao_encontrado); dígito verificador errado e placeholder são 400 ean_invalido (o placeholder resolvia para outro medicamento); EAN de 12 e de 14 dígitos válidos passam a valer.
  • Bula: um registro sem nenhuma seção real é 404 bula_nao_encontrada (antes era 200, com a classe terapêutica no lugar de "para que serve"); extracaoFalhou: true no corpo do 404 diz que o PDF existe mas a extração não reconheceu seção alguma.
  • Cota: o 400 de validação não consome mais cota e traz o saldo atual em X-RateLimit-*; a ordem é 401, 403, 400, 429. O 404 de um recurso que não existe continua consumindo.

Pronto para começar?

Gerar API key grátis →