API & agents

Everything the website does is available to programs and assistants. Ask Claude or ChatGPT to “make me a list of London's best burgers and export it for Google Maps”, and it can do exactly that.

Use it from Claude or ChatGPT (MCP)

Add this as a connector using the streamable HTTP transport, with an API key as the bearer token:

https://haute-food.vercel.app/api/mcp

Tools available:

  • create_liststart a new list
  • get_listpull a list and its places
  • browse_listssearch public lists
  • search_placesfind restaurants to add
  • add_place_to_listadd by name, id or place id
  • update_place_notechange a note
  • remove_place_from_listtake one off
  • reorder_listset the ranking
  • update_listrename, describe, hide
  • delete_listremove it entirely
  • export_listKML, CSV, GeoJSON or GPX

Use it from your own code (REST)

An OpenAPI 3.1 description lives at /api/v1/openapi.json, which can be pasted straight into a ChatGPT custom GPT Action.

# create a list — needs an API key; the response carries the edit token
curl -X POST https://haute-food.vercel.app/api/v1/lists \
  -H "Authorization: Bearer $HAUTE_FOOD_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"title":"London'"'"'s Best Burgers","authorName":"Fim"}'

# add a place — authorised by that list's edit token, not the API key
curl -X POST https://haute-food.vercel.app/api/v1/lists/londons-best-burgers/places \
  -H "Authorization: Bearer $EDIT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"query":"Bleecker Burger","near":"London","note":"Get the double cheeseburger"}'

# export it — public lists need no credential at all
curl https://haute-food.vercel.app/api/v1/lists/londons-best-burgers/export/kml -o burgers.kml

Authorisation

Two different credentials, answering two different questions. They are not interchangeable, and both travel as Authorization: Bearer <value>.

  • An API key (hf_…) says who is calling. Required to create a list, to browse the catalogue, and for every MCP tool.
  • A list's edit token says which list you may change. Returned once when the list is created, and needed for every later edit to it. There are no accounts, so this is the whole per-list authorisation model — it cannot be recovered, so store it.

A key cannot edit someone else's list, and a token cannot reach a key-protected endpoint.

One exemption, and it is narrow: fetching or exporting a single public list by its slug needs no credential, because a shared link has to work for whoever receives it and the download buttons on a shared page use those routes. It does not extend to enumeration — GET /api/v1/lists requires a key. There is no public catalogue endpoint.

About exporting to Google Maps

Google publishes no API for writing places into a user's saved lists, and never has. Anything claiming to “sync a list into Google Maps” is really doing one of two things, and so are we:

  • Import a file into Google My Maps. The KML export is built for this. The map then appears in the Google Maps phone app under Saved → Maps. Limit: 2,000 places per layer.
  • Open each place and save it. Every place in the API carries a googleMapsUrl built from its Google place id, so it opens the exact restaurant rather than a fuzzy search.

For pins that work with no signal, use the GPX export with Organic Maps or OsmAnd — My Maps layers need a connection.