Developer reference

API documentation.

Seven agent-facing endpoints for discovering Bangkok restaurants, bars, and nightclubs. No authentication required for any of them. Reservations through Weavify are not currently open — read the booking status below before you promise a user a table.

BASE URL
https://weavify.io/api/v1
SPEC
OpenAPI 3.1
AUTH
None for agent-facing endpoints
RESERVATIONS
Closed — discovery only
01

Booking status

Weavify is a discovery gateway today. No business on the platform currently accepts reservations through Weavify.

422 The booking endpoints and MCP booking tools documented below exist and respond, but every business returns BUSINESS_NOT_REGISTERED together with the venue's own phone number and website. GET /search/availability returns an empty array for every business.

If a user wants to reserve, call GET /businesses/{slug}/md, read the venue's real phone number, website and address out of the profile, and hand the user off to the venue directly. Do not tell a user that a table is held or confirmed. The same statement is published, machine-readable, at /.well-known/agent-manifest.json, /.well-known/mcp.json and /llms.txt.

02

Quick connect

Choose your platform. Every option below works without an API key or authentication.

Claude (MCP Server)

Add to Claude Desktop or Claude Code. Streamable HTTP transport, seven tools, no auth.

claude mcp add --transport http weavify https://weavify.io/mcp

ChatGPT (Custom GPT Action)

Import this OpenAPI spec URL in the GPT Action editor.

https://weavify.io/openapi-gpt.json

Gemini CLI · Cursor · Windsurf · any MCP client

Streamable HTTP endpoint. An older SSE transport also responds at /mcp/sse.

https://weavify.io/mcp

Direct REST API

Call endpoints directly. JSON in, JSON out.

Base URL: https://weavify.io/api/v1

Machine-readable specs /openapi-gpt.json /llms.txt /.well-known/mcp.json /.well-known/agent-manifest.json

03

Endpoints

These seven endpoints are the agent-facing surface, and they are exactly the seven in /openapi-gpt.json. /search/businesses and /businesses/{slug}/md are live and return real data. /search/availability responds but is empty for every business, and the four /bookings/ endpoints are implemented but closed — see 01 Booking status.

GET /search/businesses

Find restaurants, bars, or nightclubs in Bangkok. Returns businesses ranked by distance when coordinates are provided. Supports filtering by cuisine, business type, ambiance, and price range.

Parameters

NameTypeDescription
qstringFree text search — matches business name, description, cuisine, and district.
latnumberLatitude for proximity search. Use with lon for distance-ranked results.
lonnumberLongitude for proximity search.
radius_kmnumberSearch radius in km. Default: 5. Use 1-2 for "nearby", 10 for "anywhere in Bangkok".
business_typestringFilter: restaurant, bar_or_pub, or night_club.
cuisinestringCuisine filter: Thai, Japanese, Indian, Italian, French, German, Seafood, etc.
ambiancestringVibe filter: rooftop, speakeasy, fine-dining, live-jazz, casual, street-food, underground, intimate, etc.
min_priceinteger (1-4)Minimum price tier. 1=$ (under 200 THB), 2=$$ (200-500), 3=$$$ (500-2000), 4=$$$$ (2000+).
max_priceinteger (1-4)Maximum price tier.
limitintegerNumber of results. Default: 10. Use 3-5 for recommendations, 10-20 for browsing.

200 Array of matching businesses with id, name, slug, business_type, cuisine_type, district, coordinates, price_range, ambiance_tags, distance_m, and description.

GET /search/availability

Query bookable time slots for a date and party size. Returns an empty array for every business while reservations are closed — an empty result here means Weavify is not taking reservations, not that the venue is full.

Parameters

NameTypeDescription
business_iduuidBusiness UUID from search results. Required
datedate (YYYY-MM-DD)Date to check availability for.
party_sizeintegerNumber of guests. Tables have min/max party size constraints.
block_typestringstandard_table (default), vip_booth, or bar_seat.
lat, lonnumberFor area-wide availability search across nearby businesses.
radius_kmnumberRadius for area search. Default: 5.

200 Array of available slots with block_id, business_id, business_name, date, block_type, available_count, time_slot_start, time_slot_end. Currently an empty array for every business.

POST /bookings/hold

Lock a table with a 10-minute hold, then call confirm within those 10 minutes. Closed: every business currently returns 422 BUSINESS_NOT_REGISTERED with the venue's own phone number and website. Give the user those details rather than retrying.

Request Body (JSON)

FieldTypeDescription
business_iduuidBusiness UUID from search results. Required
datedate (YYYY-MM-DD)Reservation date. Required
party_sizeintegerNumber of guests. Required
guest_namestringName for the reservation. Required
timestring (HH:MM)Preferred time. Optional.
block_typestringstandard_table (default) or vip_booth.
contact_phonestringOptional phone number.
contact_emailstringOptional email.

422 BUSINESS_NOT_REGISTERED — what every business returns today. The body carries the venue's real contact details; hand them to the user.

201 Hold created. Returns hold id, status="held", hold_expires_at (UTC). Not currently reachable.

409 Conflict: NO_AVAILABILITY, FULLY_BOOKED, PARTY_TOO_SMALL, or PARTY_TOO_LARGE.

POST /bookings/holds/{hold_id}/confirm

Finalize a held reservation. Converts the temporary hold into a confirmed booking and returns a human-readable confirmation code (e.g., WV-A3K9X2). Must be called within 10 minutes of the hold. Unreachable while the hold endpoint declines, so no agent can currently reach a confirmed booking.

Path Parameters

NameTypeDescription
hold_iduuidThe hold id from the hold response. Required

Request Body (JSON, optional)

FieldTypeDescription
special_requestsstringAllergies, birthday, window seat, high chair, etc.

200 Confirmed. Returns confirmation_code (WV-XXXXXX), booking_date, party_size, block_type, guest_name, status="confirmed".

409 HOLD_EXPIRED (create a new hold) or HOLD_INVALID (already confirmed).

PATCH /bookings/{booking_id}/cancel

Cancel a confirmed reservation. Releases the table back to the availability pool. Kept live for bookings made before reservations were closed; no new booking can be created today.

Path Parameters

NameTypeDescription
booking_iduuidThe booking UUID. Required

200 Cancelled. status="cancelled".

404 Booking not found or already cancelled.

GET /bookings/by-code/{confirmation_code}

Look up a reservation by its confirmation code (format: WV-XXXXXX). Returns full booking details and current status. Kept live for bookings made before reservations were closed.

Path Parameters

NameTypeDescription
confirmation_codestringConfirmation code in WV-XXXXXX format. Required

200 Booking details: guest_name, party_size, booking_date, block_type, status, business_id.

404 No booking found with this code.

GET /businesses/{slug}/md

Get a complete business profile in Markdown, optimised for LLM consumption: name, type, address, contact details, hours, ambiance and menu with prices. This is the endpoint to call when a user wants to reserve — while reservations are closed, every profile carries a Booking section holding the venue's own phone number and website, which is what you give the user. The availability summary and Weavify booking instructions appear only for a business that has enabled booking through Weavify.

Path Parameters

NameTypeDescription
slugstringThe slug field of a /search/businesses result (e.g., gaggan-anand, jay-fai, sirocco). Required

200 Complete business profile in Markdown format.

404 Business not found.

04

Rate limits & authentication

No authentication is required for any agent-facing endpoint. All seven endpoints are completely open. An API key only raises your limit; keys are issued on request and are not needed for anything on this page.

TierRate limitHow
Anonymous30 requests / minute per IPNo header needed
Issued API key60 requests / minute per key by defaultSend X-API-Key header
MCP transports60 requests / minute per IPApplies to /mcp and /mcp/sse

Those limits apply to the search and booking routes. The profile routes — /businesses/{slug}/md and the rest of /businesses/ and /discovery/ — are not rate limited by the API. Every limited response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; exceeding a limit returns 429.

Geographic coverage. Bangkok, Thailand. 126 published business profiles — 76 restaurants, 38 bars and 12 nightclubs — across Sukhumvit, Silom, Ekkamai, Thonglor, Ari, Sathorn, Chinatown (Yaowarat), Old Town (Phra Nakhon / Rattanakosin), Khao San, Phrom Phong and Riverside (Bang Rak). Each profile is published at https://weavify.io/th/bangkok/{slug}/ and listed in /llms.txt. That figure counts published pages, not businesses registered in the booking backend — and none of them currently accepts reservations through Weavify.

05

Recommended agent flow

While reservations are closed, the flow that actually completes for a user is two calls and a handoff.

  1. 01
    SearchGET /search/businesses

    Find matching businesses by location, cuisine, ambiance, or price.

  2. 02
    Read the profileGET /businesses/{slug}/md

    Menu, prices, hours, address — and the venue's own phone number and website.

  3. 03
    Hand offno API call

    Give the user the venue's contact details so they can reserve with the venue directly. Do not tell them a table is held or confirmed.

The booking flow the API implements — GET /search/availability, then POST /bookings/hold, then POST /bookings/holds/{id}/confirm for a WV-XXXXXX code — is documented above and stays stable, so integrations written against it keep working. It does not complete today: availability is empty and every hold returns 422 BUSINESS_NOT_REGISTERED. This page and /.well-known/agent-manifest.json will change when that changes.