---
title: "Send photos of a bar's menu"
method: POST
path: "/api/v1/menu-photos"
tags: ["public"]
---

# Send photos of a bar's menu

`POST /api/v1/menu-photos`

## Request

- Base URL: `https://cervejabarata.com.br`
- URL: `https://cervejabarata.com.br/api/v1/menu-photos`
- Auth: none declared

Up to 3 JPEG photos of a listed bar's menu (data URIs, the body at most about 2.2 MB). Answers at once; Workers AI then reads the beer prices into drafts for the AI reviewer, and the photos are not kept. Behind Turnstile and a daily cap per address; a contact, if any, is kept encrypted and deleted after 90 days.

## Request body

- MenuPhotoUpload
  - `city` string, required
  - `venue` string, required: The bar's slug in that city
  - `images` string[], required
  - `contact` string: Phone or email, only to ask about these prices; deleted after 90 days
  - `is_owner` boolean: Sent by the bar's owner or manager
  - `ref` string: The bar's own link token (?ref= on the page, from GET /api/admin/venues/{id}/menu-link): a valid one makes the upload trusted, so its prices inside the hard bounds are approved at once
  - `consent` boolean: LGPD consent: required with a contact
  - `turnstile` string, required: Cloudflare Turnstile token

## Response `202`

Received: the prices are read in the background

- Received
  - `status` 'received' | 'duplicate', required: duplicate: the same thing from the same address is already waiting for review

## Other responses

- `400`: Invalid request
- `403`: The Turnstile check failed
- `413`: The photos are too large
- `422`: Unknown city or bar
- `429`: Too many from this address today
- `503`: Closed: not configured yet, or degraded mode

---

[API](https://skmtc.dev/cervejabarata/apis/cerveja-barata-public-api.md) · [All operations](https://skmtc.dev/cervejabarata/apis/cerveja-barata-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cervejabarata/apis/cerveja-barata-public-api/revisions/19a783be3c18?raw)
