oB A R
— É um bar, mas é teu. —
⌘ API
— compêndio aberto —

A API

Endpoints de leitura. Use como quiser, atribua se publicar.

GET/api/index.json

Discovery — metadados, contagens, esquemas, lista de endpoints.

abrir →
GET/api/drinks.json

Lista completa de cocktails (494 registos).

abrir →
GET/api/ingredients.json

Lista completa de ingredientes (316 registos).

abrir →
GET/api/categories.json

Categorias com rótulos PT-PT (10 registos).

abrir →
GET/images/cocktails/{id}.jpg

Fotografia 768×1024 do cocktail. CORS aberto. Substitua {id} pelo id do cocktail.

exemplo: mojito →
Imagens
Mojito

Cada cocktail tem fotografia em /images/cocktails/{id}.jpg.

O endpoint /api/drinks.json inclui o campo image com o caminho relativo já preenchido.

Resolução 768×1024 (3:4), JPG q88, ~30–80 KB cada. CORS aberto para uso cross-origin.

Esquemas

Drink

{
  "id": "string",
  "name": "string",
  "categories": "string[]",
  "glass": "string",
  "ingredients": "[{id,qty}]",
  "steps": "string[]",
  "image": "string (caminho relativo /images/cocktails/{id}.jpg)"
}

Ingredient

{
  "id": "string",
  "name": "string",
  "kind": "string",
  "parent": "string (optional) — generic ancestor for substitution matching"
}

Category

{
  "id": "string",
  "label": "string"
}
Exemplos
curlobter um cocktail pelo id
curl -s /api/drinks.json \
  | jq '.[] | select(.id=="mojito")'
JavaScriptfetch + filtro por categoria
const res = await fetch('/api/drinks.json')
const drinks = await res.json()
const semAlcool = drinks.filter(d =>
  d.categories.includes('sem-alcool')
)
console.log(semAlcool.length, 'cocktails sem álcool')
Pythonrequests + pesquisa por ingrediente
import requests

drinks = requests.get('/api/drinks.json').json()
com_gin = [d for d in drinks
           if any(i['id'] == 'gin' for i in d['ingredients'])]
print(f'{len(com_gin)} cocktails levam gin')
PHPfile_get_contents + dump de nomes
<?php
$json = file_get_contents('/api/drinks.json');
$drinks = json_decode($json, true);
foreach (array_slice($drinks, 0, 5) as $d) {
    echo $d['name'] . PHP_EOL;
}
HTMLgaleria simples com imagens
<script type="module">
const drinks = await (await fetch(
  '/api/drinks.json'
)).json()
document.body.innerHTML = drinks.slice(0, 12)
  .map(d => `<figure>
    <img src="${d.image}" alt="${d.name}" loading="lazy">
    <figcaption>${d.name}</figcaption>
  </figure>`).join('')
</script>
Limite de uso
  • 60 pedidos por minuto,. Aplica-se à API e ao próprio site (excluem-se assets em cache: /_nuxt/*, imagens, ícones).
  • Excesso → HTTP 429. Resposta inclui cabeçalhos Retry-After: 60, X-RateLimit-Limit: 60, X-RateLimit-Window: 60s.
  • Após exceder: o limite só liberta no minuto seguinte. Pedidos extra continuam a devolver 429 até o limite ser reposto.
  • Estratégia recomendada: descarregar /api/drinks.json uma vez, filtrar em memória.
Notas
  • Apenas leitura. Sem POST/PUT/DELETE. Sem autenticação.
  • CORS aberto. Pode consumir de qualquer origem.
  • Pesquisa é client-side. Descarregue o JSON e filtre. ~340 KB total.
  • Licença: CC-BY-SA-4.0. Atribuição: oBar — compêndio de cocktails.
  • Última actualização: 2026-05-30 · v1.0