API pública · v1.0.0 · OpenAPI 3.1.0

A fornada em JSON.

Só leitura, sem cadastro obrigatório e com CORS aberto. Sem chave já responde; com chave o limite sobe de 10 para 60 requisições por minuto.

Visão geral

O Biscoiteiro é um ranking brasileiro de sites onde quem paga mais fica no topo; cada lance derrete até zero em 7 dias. Esta API entrega o mesmo que o site mostra: o ranking de agora, os dados de cada link, a fornada congelada de cada dia e o Hall da Fama.

Tudo é somente leitura (GET) e responde JSON em UTF-8. Toda resposta de sucesso vem no envelope { dados, gerado_em }; todo erro vem como { erro: { codigo, mensagem } }. CORS é aberto: dá para chamar direto do navegador.

Convenções: campos em snake_case e em português; datas em ISO 8601 UTC; dinheiro em centavos inteiros, arredondado para baixo (85714 = R$ 857,14); durações em segundos inteiros. Só aparecem links ativos e só texto que já passou pela moderação.

Estabilidade: a v1 pode ganhar campos novos sem aviso, então ignore o que você não conhece. Nenhum campo existente muda de nome, muda de tipo ou some; isso só numa v2.

Endereço base e arquivo OpenAPI
O quêOnde
Endereço basehttps://biscoiteiro.com.br
Documento OpenAPIhttps://biscoiteiro.com.br/openapi.json
Regras do rankingComo o ranking funciona: lances, decaimento de 7 dias e desempate
Comece por aqui
curl https://biscoiteiro.com.br/api/v1/ranking

Autenticação

A chave é opcional. Sem ela a API responde igual, só com um limite menor. Com ela o limite é seu, e não do IP de onde você chama. A chave tem o formato bsc_... e pode ir de dois jeitos:

Formas de enviar a chave
CabeçalhoComo
AuthorizationChave de API no cabeçalho Authorization: Bearer bsc_.... É a forma recomendada.
X-API-KeyA mesma chave no cabeçalho X-API-Key: bsc_..., para clientes que não deixam mexer no Authorization. Se os dois vierem, vale o Authorization.

Como gerar a sua chave

  1. Entre no painel da sua conta. O login é por link mágico no e-mail, sem senha.
  2. Na parte de chaves de API, crie uma chave e dê um nome que diga onde ela vai ser usada.
  3. Copie na hora. A chave aparece uma vez só: no banco fica apenas o hash dela.
  4. Vazou ou não usa mais? Revogue no mesmo painel. Chave revogada passa a responder 401.
Gerar minha chave

Chave errada não vira requisição anônima: a resposta é 401, para você descobrir o problema no primeiro teste e não quando o limite menor estourar.

Limites

Com chave

60 req/minuto

por chave

Sem chave

10 req/minuto

por IP

A janela é fixa: vira a cada minuto cheio do relógio, e a contagem zera junto. Toda resposta diz quanto ainda cabe. O selo não entra nessa conta.

Cabeçalhos de resposta
CabeçalhoO que diz
X-RateLimit-LimitQuantas requisições cabem na janela de um minuto: 60 com chave, 10 sem.
X-RateLimit-RemainingQuantas ainda cabem na janela atual, já contando esta.
X-RateLimit-ResetEm quantos segundos a janela atual vira e a contagem zera.
Retry-AfterSó no 429: em quantos segundos dá para tentar de novo.
WWW-AuthenticateSó no 401: o esquema de autenticação esperado.

Endpoints

GET/api/v1/ranking

Ranking atual

A fornada de agora, do #1 para baixo: posição, valor efetivo, quando cada link zera e quanto custa passar cada um. O valor efetivo derrete o tempo todo, então a resposta sai de um cache de 5 segundos; gerado_em diz de quando é a foto.

Parâmetros de /api/v1/ranking
ParâmetroOndeTipoDescrição
limitequeryinteiro (padrão 100)Quantos links devolver, a partir do #1. total sempre diz quantos existem no ranking.
curl
curl https://biscoiteiro.com.br/api/v1/ranking
curl com chave
curl "https://biscoiteiro.com.br/api/v1/ranking?limite=10" \
  -H "Authorization: Bearer bsc_SUA_CHAVE"
Resposta 200 · application/json
{
  "dados": {
    "total": 42,
    "reinando_desde": "2026-09-17T13:05:00.000Z",
    "itens": [
      {
        "posicao": 1,
        "slug": "sualoja-com-br",
        "titulo": "Sua Loja",
        "descricao": "Camisetas que não desbotam, entrega pra todo o Brasil.",
        "dominio": "sualoja.com.br",
        "url": "https://sualoja.com.br",
        "instagram": "sualoja",
        "favicon_url": "https://biscoiteiro.com.br/imagens/favicons/0b9d2f6e-6c1d-4a63-9f39-5d2a0c1e7a11.png",
        "valor_efetivo_centavos": 85714,
        "zera_em": "2026-09-24T13:05:00.000Z",
        "ultimo_lance_em": "2026-09-17T13:05:00.000Z",
        "custo_para_passar_centavos": 85900,
        "cliques": 312,
        "pagina_url": "https://biscoiteiro.com.br/p/sualoja-com-br"
      },
      {
        "posicao": 2,
        "slug": "instagram-fulano",
        "titulo": "@fulano",
        "descricao": null,
        "dominio": "instagram.com",
        "url": "https://instagram.com/fulano",
        "instagram": "fulano",
        "favicon_url": null,
        "valor_efetivo_centavos": 20100,
        "zera_em": "2026-09-25T09:40:12.000Z",
        "ultimo_lance_em": "2026-09-18T09:40:12.000Z",
        "custo_para_passar_centavos": 20200,
        "cliques": 57,
        "pagina_url": "https://biscoiteiro.com.br/p/instagram-fulano"
      }
    ]
  },
  "gerado_em": "2026-09-18T15:00:02.000Z"
}
Campos da resposta (19)
Campos da resposta de /api/v1/ranking
CampoTipoDescrição
dadosobjetoO ranking de agora.
dados.totalinteiroQuantos links estão no ranking agora, independente de limite.
dados.reinando_desdedata-hora | nullDesde quando o #1 atual está no trono. null com o ranking vazio.
dados.itensobjeto[]Do #1 para baixo.
dados.itens[].posicaointeiro1 é o Biscoiteiro-mor.
dados.itens[].slugstringIdentificador público do link.
dados.itens[].titulostringNome do site, já moderado.
dados.itens[].descricaostring | nullDescrição moderada, quando existe.
dados.itens[].dominiostringDomínio sem www.
dados.itens[].urlurlEndereço normalizado do site.
dados.itens[].instagramstring | nullUsuário do Instagram, sem @.
dados.itens[].favicon_urlurl | nullFavicon guardado pelo Biscoiteiro (PNG 64×64).
dados.itens[].valor_efetivo_centavosinteiroSoma dos lances vivos, já derretidos até gerado_em.
dados.itens[].zera_emdata-horaQuando o link sai do ranking se ninguém reforçar.
dados.itens[].ultimo_lance_emdata-horaConfirmação do lance mais recente.
dados.itens[].custo_para_passar_centavosinteiroQuanto um link novo paga agora para ficar logo acima deste: R$ 1 acima do valor efetivo, no mínimo R$ 10.
dados.itens[].cliquesinteiroCliques de saída contados pelo Biscoiteiro (no máximo 1 por IP a cada 24 h).
dados.itens[].pagina_urlurlPágina do link no Biscoiteiro.
gerado_emdata-horaDe quando é a foto do ranking (cache de 5 segundos).

Respostas

  • 200O ranking atual.
  • 400Parâmetro de rota ou de query fora do formato. A mensagem diz qual e por quê.
  • 401Veio uma chave e ela não vale: formato errado, desconhecida ou revogada. A API não cai para o limite anônimo em silêncio; para usar sem chave, não mande o cabeçalho.
  • 429Estourou o limite da janela de um minuto. Espere o Retry-After e tente de novo.
  • 500Falha do nosso lado. Pode tentar de novo.

GET/api/v1/ranking/{data}

Ranking congelado de um dia

A fornada fechada de um dia (o mesmo conteúdo de /ranking/AAAA-MM-DD no site e do carrossel do Instagram), com os números do dia. A data é a de Brasília. Link que saiu do ar depois some da lista, e as posições não são renumeradas: o buraco fica, inclusive no #1 (a lista pode começar no 2).

Parâmetros de /api/v1/ranking/{data}
ParâmetroOndeTipoDescrição
data *rotadataDia da fornada, no calendário de Brasília, no formato AAAA-MM-DD.
curl
curl https://biscoiteiro.com.br/api/v1/ranking/2026-09-17
curl com chave
curl https://biscoiteiro.com.br/api/v1/ranking/2026-09-17 \
  -H "Authorization: Bearer bsc_SUA_CHAVE"
Resposta 200 · application/json
{
  "dados": {
    "data": "2026-09-17",
    "fechada_em": "2026-09-17T23:00:04.000Z",
    "pagina_url": "https://biscoiteiro.com.br/ranking/2026-09-17",
    "itens": [
      {
        "posicao": 1,
        "slug": "sualoja-com-br",
        "titulo": "Sua Loja",
        "dominio": "sualoja.com.br",
        "url": "https://sualoja.com.br",
        "instagram": "sualoja",
        "favicon_url": "https://biscoiteiro.com.br/imagens/favicons/0b9d2f6e-6c1d-4a63-9f39-5d2a0c1e7a11.png",
        "valor_efetivo_centavos": 94100,
        "pagina_url": "https://biscoiteiro.com.br/p/sualoja-com-br"
      },
      {
        "posicao": 2,
        "slug": "meusaas-com-br",
        "titulo": "MeuSaaS",
        "dominio": "meusaas.com.br",
        "url": "https://meusaas.com.br",
        "instagram": null,
        "favicon_url": null,
        "valor_efetivo_centavos": 31250,
        "pagina_url": "https://biscoiteiro.com.br/p/meusaas-com-br"
      }
    ],
    "numeros": {
      "lances_no_dia": 18,
      "trocas_de_trono": 3,
      "maior_lance_centavos": 100000,
      "maior_subida": {
        "slug": "meusaas-com-br",
        "titulo": "MeuSaaS",
        "posicoes": 9
      },
      "reinou_hoje_segundos": 35700
    }
  },
  "gerado_em": "2026-09-18T15:00:02.000Z"
}
Campos da resposta (24)
Campos da resposta de /api/v1/ranking/{data}
CampoTipoDescrição
dadosobjetoA fornada fechada de um dia.
dados.datadataDia da fornada (Brasília).
dados.fechada_emdata-horaInstante em que a fornada foi congelada.
dados.pagina_urlurlPágina do arquivo desse dia no site.
dados.itensobjeto[]Do #1 para baixo, como fechou.
dados.itens[].posicaointeiroPosição no fechamento.
dados.itens[].slugstringIdentificador público do link.
dados.itens[].titulostringNome do site, já moderado.
dados.itens[].dominiostringDomínio sem www.
dados.itens[].urlurlEndereço normalizado do site.
dados.itens[].instagramstring | nullUsuário do Instagram, sem @.
dados.itens[].favicon_urlurl | nullFavicon guardado pelo Biscoiteiro.
dados.itens[].valor_efetivo_centavosinteiroValor efetivo no instante do fechamento.
dados.itens[].pagina_urlurlPágina do link no Biscoiteiro.
dados.numerosobjetoOs números daquele dia, congelados junto com a fornada.
dados.numeros.lances_no_diainteiroLances confirmados naquele dia.
dados.numeros.trocas_de_tronointeiroQuantas vezes o #1 mudou de dono.
dados.numeros.maior_lance_centavosinteiroO maior lance do dia.
dados.numeros.maior_subidaobjeto | nullQuem mais subiu de posição no dia.
dados.numeros.maior_subida.slugstringIdentificador público do link.
dados.numeros.maior_subida.titulostringNome do site, já moderado.
dados.numeros.maior_subida.posicoesinteiroQuantas posições subiu.
dados.numeros.reinou_hoje_segundosinteiroQuanto tempo o #1 do fechamento passou no trono naquele dia. Zero se o #1 daquele dia saiu do ar depois.
gerado_emdata-horaData e hora em ISO 8601, sempre em UTC.

Respostas

  • 200A fornada daquele dia.
  • 400Parâmetro de rota ou de query fora do formato. A mensagem diz qual e por quê.
  • 401Veio uma chave e ela não vale: formato errado, desconhecida ou revogada. A API não cai para o limite anônimo em silêncio; para usar sem chave, não mande o cabeçalho.
  • 404Não há fornada fechada nessa data: o dia ainda não fechou ou é anterior ao lançamento.
  • 429Estourou o limite da janela de um minuto. Espere o Retry-After e tente de novo.
  • 500Falha do nosso lado. Pode tentar de novo.

GET/api/v1/hall-da-fama

Reinados e recordes

Todos os links que já foram #1, ordenados por tempo total no trono, e os três recordes da casa: maior reinado contínuo, maior lance e mais reinados. O reinado em andamento conta até agora. Recorde cujo dono saiu do ar vem null.

curl
curl https://biscoiteiro.com.br/api/v1/hall-da-fama
curl com chave
curl https://biscoiteiro.com.br/api/v1/hall-da-fama \
  -H "Authorization: Bearer bsc_SUA_CHAVE"
Resposta 200 · application/json
{
  "dados": {
    "total": 2,
    "itens": [
      {
        "slug": "sualoja-com-br",
        "titulo": "Sua Loja",
        "dominio": "sualoja.com.br",
        "favicon_url": "https://biscoiteiro.com.br/imagens/favicons/0b9d2f6e-6c1d-4a63-9f39-5d2a0c1e7a11.png",
        "numero_de_reinados": 4,
        "tempo_total_no_trono_segundos": 412380,
        "maior_reinado_continuo_segundos": 187200,
        "maior_lance_centavos": 100000,
        "reinando_agora": true,
        "pagina_url": "https://biscoiteiro.com.br/p/sualoja-com-br"
      },
      {
        "slug": "meusaas-com-br",
        "titulo": "MeuSaaS",
        "dominio": "meusaas.com.br",
        "favicon_url": null,
        "numero_de_reinados": 6,
        "tempo_total_no_trono_segundos": 96400,
        "maior_reinado_continuo_segundos": 40120,
        "maior_lance_centavos": 150000,
        "reinando_agora": false,
        "pagina_url": "https://biscoiteiro.com.br/p/meusaas-com-br"
      }
    ],
    "recordes": {
      "maior_reinado": {
        "slug": "sualoja-com-br",
        "titulo": "Sua Loja",
        "duracao_segundos": 187200
      },
      "maior_lance": {
        "slug": "meusaas-com-br",
        "titulo": "MeuSaaS",
        "valor_centavos": 150000
      },
      "mais_reinados": {
        "slug": "meusaas-com-br",
        "titulo": "MeuSaaS",
        "quantidade": 6
      }
    }
  },
  "gerado_em": "2026-09-18T15:00:02.000Z"
}
Campos da resposta (27)
Campos da resposta de /api/v1/hall-da-fama
CampoTipoDescrição
dadosobjetoTodos que já foram #1 e os recordes da casa.
dados.totalinteiroQuantos links já foram #1.
dados.itensobjeto[]Ordenados por tempo total no trono, do maior para o menor.
dados.itens[].slugstringIdentificador público do link.
dados.itens[].titulostringNome do site, já moderado.
dados.itens[].dominiostringDomínio sem www.
dados.itens[].favicon_urlurl | nullFavicon guardado pelo Biscoiteiro.
dados.itens[].numero_de_reinadosinteiroQuantas vezes tomou o #1.
dados.itens[].tempo_total_no_trono_segundosinteiroSoma de todos os reinados, contando o que está em andamento.
dados.itens[].maior_reinado_continuo_segundosinteiroO reinado mais longo sem perder o trono.
dados.itens[].maior_lance_centavosinteiroO maior lance confirmado do link.
dados.itens[].reinando_agorabooleanotrue para o Biscoiteiro-mor do momento.
dados.itens[].pagina_urlurlPágina do link no Biscoiteiro.
dados.recordesobjetoOs três recordes da casa.
dados.recordes.maior_reinadoobjeto | nullO reinado contínuo mais longo da história.
dados.recordes.maior_reinado.slugstringIdentificador público do link.
dados.recordes.maior_reinado.titulostringNome do site, já moderado.
dados.recordes.maior_reinado.duracao_segundosinteiroDuração do reinado recordista.
dados.recordes.maior_lanceobjeto | nullO maior lance já confirmado.
dados.recordes.maior_lance.slugstringIdentificador público do link.
dados.recordes.maior_lance.titulostringNome do site, já moderado.
dados.recordes.maior_lance.valor_centavosinteiroValor do lance recordista.
dados.recordes.mais_reinadosobjeto | nullQuem mais vezes tomou o trono.
dados.recordes.mais_reinados.slugstringIdentificador público do link.
dados.recordes.mais_reinados.titulostringNome do site, já moderado.
dados.recordes.mais_reinados.quantidadeinteiroNúmero de reinados.
gerado_emdata-horaData e hora em ISO 8601, sempre em UTC.

Respostas

  • 200O Hall da Fama.
  • 401Veio uma chave e ela não vale: formato errado, desconhecida ou revogada. A API não cai para o limite anônimo em silêncio; para usar sem chave, não mande o cabeçalho.
  • 429Estourou o limite da janela de um minuto. Espere o Retry-After e tente de novo.
  • 500Falha do nosso lado. Pode tentar de novo.

Erros

Todo erro tem o mesmo corpo. Programe contra o codigo, que é estável; a mensagem é para gente ler e pode mudar.

Formato do erro
{
  "erro": {
    "codigo": "link_nao_encontrado",
    "mensagem": "Esse link não existe no Biscoiteiro ou não está no ar."
  }
}
Códigos de erro
StatusCódigoQuando
400parametro_invalidoParâmetro de rota ou de query fora do formato. A mensagem diz qual.
401chave_invalidaVeio uma chave malformada ou que não existe.
401chave_revogadaA chave existia e foi revogada no painel.
404link_nao_encontradoNão existe link ativo com esse slug.
404fornada_nao_encontradaNão há fornada fechada nessa data.
404rota_nao_encontradaO caminho não existe na v1.
429limite_excedidoEstourou o limite do minuto. Espere o Retry-After.
500erro_internoFalha do nosso lado. Pode tentar de novo.

Selo

Imagem SVG de 200×56 (vetorial: fica nítida em 2x e em qualquer tamanho) para o dono do link colocar no próprio site, dentro de um link para a página dele no Biscoiteiro. Com o link no ranking o selo diz "Estou no #N do Biscoiteiro"; depois que o link zera, "Já estive no Biscoiteiro". Não pede chave e não conta no limite da API; a imagem fica em cache por 5 minutos, então a posição pode demorar esse tanto para mudar.

no trono
no trono
no ranking
no ranking
depois que zera
depois que zera
?tema=escuro
?tema=escuro
?tema=escuro
?tema=escuro
?tema=escuro
?tema=escuro

Troque SEU-SLUG pelo slug do seu link (o final do endereço da sua página, /p/SEU-SLUG) e cole no seu site. O link de volta é para a sua página no Biscoiteiro, onde quem clicou vê a sua posição e pode tentar te passar.

HTML do selo
<a href="https://biscoiteiro.com.br/p/SEU-SLUG">
  <img src="https://biscoiteiro.com.br/selo/SEU-SLUG.svg"
       alt="Estou no ranking do Biscoiteiro" width="200" height="56" loading="lazy">
</a>
HTML do selo · fundo escuro
<a href="https://biscoiteiro.com.br/p/SEU-SLUG">
  <img src="https://biscoiteiro.com.br/selo/SEU-SLUG.svg?tema=escuro"
       alt="Estou no ranking do Biscoiteiro" width="200" height="56" loading="lazy">
</a>
Parâmetros do selo
ParâmetroOndeDescrição
slugrotaIdentificador do link: o mesmo da URL /p/{slug} no site.
temaqueryescuro troca o fundo para chocolate, para sites de fundo escuro. Qualquer outro valor cai no claro.
Respostas do selo
StatusTipoQuando
200image/svg+xmlO selo em SVG.
404text/plainLink inexistente ou fora do ar, ou caminho sem o sufixo .svg.