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.
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
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
| Name | Type | Description |
|---|---|---|
| q | string | Free text search — matches business name, description, cuisine, and district. |
| lat | number | Latitude for proximity search. Use with lon for distance-ranked results. |
| lon | number | Longitude for proximity search. |
| radius_km | number | Search radius in km. Default: 5. Use 1-2 for "nearby", 10 for "anywhere in Bangkok". |
| business_type | string | Filter: restaurant, bar_or_pub, or night_club. |
| cuisine | string | Cuisine filter: Thai, Japanese, Indian, Italian, French, German, Seafood, etc. |
| ambiance | string | Vibe filter: rooftop, speakeasy, fine-dining, live-jazz, casual, street-food, underground, intimate, etc. |
| min_price | integer (1-4) | Minimum price tier. 1=$ (under 200 THB), 2=$$ (200-500), 3=$$$ (500-2000), 4=$$$$ (2000+). |
| max_price | integer (1-4) | Maximum price tier. |
| limit | integer | Number 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
| Name | Type | Description |
|---|---|---|
| business_id | uuid | Business UUID from search results. Required |
| date | date (YYYY-MM-DD) | Date to check availability for. |
| party_size | integer | Number of guests. Tables have min/max party size constraints. |
| block_type | string | standard_table (default), vip_booth, or bar_seat. |
| lat, lon | number | For area-wide availability search across nearby businesses. |
| radius_km | number | Radius 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)
| Field | Type | Description |
|---|---|---|
| business_id | uuid | Business UUID from search results. Required |
| date | date (YYYY-MM-DD) | Reservation date. Required |
| party_size | integer | Number of guests. Required |
| guest_name | string | Name for the reservation. Required |
| time | string (HH:MM) | Preferred time. Optional. |
| block_type | string | standard_table (default) or vip_booth. |
| contact_phone | string | Optional phone number. |
| contact_email | string | Optional 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
| Name | Type | Description |
|---|---|---|
| hold_id | uuid | The hold id from the hold response. Required |
Request Body (JSON, optional)
| Field | Type | Description |
|---|---|---|
| special_requests | string | Allergies, 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
| Name | Type | Description |
|---|---|---|
| booking_id | uuid | The 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
| Name | Type | Description |
|---|---|---|
| confirmation_code | string | Confirmation 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
| Name | Type | Description |
|---|---|---|
| slug | string | The 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.
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.
| Tier | Rate limit | How |
|---|---|---|
| Anonymous | 30 requests / minute per IP | No header needed |
| Issued API key | 60 requests / minute per key by default | Send X-API-Key header |
| MCP transports | 60 requests / minute per IP | Applies 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.
Recommended agent flow
While reservations are closed, the flow that actually completes for a user is two calls and a handoff.
- 01Search
Find matching businesses by location, cuisine, ambiance, or price.
- 02Read the profile
Menu, prices, hours, address — and the venue's own phone number and website.
- 03Hand off
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.