{"openapi":"3.1.0","info":{"title":"Resos (BYOK) API","version":"0.1.0","description":"Resos (BYOK) lets an AI assistant read your own Resos data through the Resos API with a key you supply (Resos API key (Settings, API integration)). Read-only: 10 tools (healthcheck, list_bookings, get_booking, list_customers, list_tables, list_opening_hours, list_custom_fields, list_guest_feedback, get_available_dates, get_available_times). The BYOK key travels with each request, is used for that...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-resos.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-resos/docs"},"termsOfService":"https://connectorbay.com/byok-resos/terms"},"servers":[{"url":"https://byok-resos.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-resos/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/healthcheck":{"post":{"operationId":"healthcheck","summary":"Check that the Resos API key works and get the id of the restaurant it belongs to. Use for \"Is my Resos API key working\"","description":"Check that the Resos API key works and get the id of the restaurant it belongs to. Use for \"Is my Resos API key working\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"healthcheckArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_bookings":{"post":{"operationId":"list_bookings","summary":"List bookings in a date range with time, party size, status, source, tables and guest name, but no email or phone. Page ","description":"List bookings in a date range with time, party size, status, source, tables and guest name, but no email or phone. Page with skip and limit (100 at most). Use for \"What bookings do I have in Resos tonight\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"from_date_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the date range (inclusive), ISO 8601 date-time such as 2026-11-05T00:00:00Z.","title":"From Date Time"},"to_date_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the date range (inclusive), ISO 8601 date-time.","title":"To Date Time"},"only_confirmed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for approved, arrived, seated and left bookings only.","title":"Only Confirmed"},"sort":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Sort as field:direction where direction is 1 (up) or -1 (down), for example dateTime:1.","title":"Sort"},"skip":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Skip"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records to return (1 to 100).","title":"Limit"},"custom_query":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Flexible filter: comma separated field:value (equals), field>value, field<value or field;value (contains), for example people>4,status:approved.","title":"Custom Query"}},"title":"list_bookingsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_booking":{"post":{"operationId":"get_booking","summary":"Get one booking with time, party size, status, source, tables, opening hours and payment type and status, without guest ","description":"Get one booking with time, party size, status, source, tables, opening hours and payment type and status, without guest email or phone. Use for \"Show Resos booking Jf8kuy3gjy5EmAjC4\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Id of the record (the _id field in the list answer).","maxLength":40,"title":"Id","type":"string"}},"required":["id"],"title":"get_bookingArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_customers":{"post":{"operationId":"list_customers","summary":"List guest profiles with name, number of bookings, tags and newsletter consent, without email, phone, address or notes. ","description":"List guest profiles with name, number of bookings, tags and newsletter consent, without email, phone, address or notes. Page with skip and limit. Use for \"Who are my most frequent guests in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"skip":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Skip"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records to return (1 to 100).","title":"Limit"},"custom_query":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Flexible filter: comma separated field:value (equals), field>value, field<value or field;value (contains), for example people>4,status:approved.","title":"Custom Query"}},"title":"list_customersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tables":{"post":{"operationId":"list_tables","summary":"List the seating areas with their tables, whether they can be booked and booked online, and the booking priority. Use fo","description":"List the seating areas with their tables, whether they can be booked and booked online, and the booking priority. Use for \"What tables and areas do I have in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_tablesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_opening_hours":{"post":{"operationId":"list_opening_hours","summary":"List opening hours and special days with open and close times, booking limits and waitlist setting. Use for \"What are my","description":"List opening hours and special days with open and close times, booking limits and waitlist setting. Use for \"What are my opening hours in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only this opening hour mode, such as restaurant or shop.","title":"Type"},"show_deleted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include deleted opening hours.","title":"Show Deleted"},"only_special":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True for date-specific special opening hours only.","title":"Only Special"}},"title":"list_opening_hoursArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_custom_fields":{"post":{"operationId":"list_custom_fields","summary":"List the custom booking form fields with name, label, type and whether they are required or internal. Use for \"Which cus","description":"List the custom booking form fields with name, label, type and whether they are required or internal. Use for \"Which custom fields does my Resos booking form have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_custom_fieldsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_guest_feedback":{"post":{"operationId":"list_guest_feedback","summary":"List guest feedback with ratings for food, service, value and atmosphere, recommendation and comment. Page with skip and","description":"List guest feedback with ratings for food, service, value and atmosphere, recommendation and comment. Page with skip and limit. Use for \"What feedback have guests left in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"from_date_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the date range (inclusive), ISO 8601 date-time such as 2026-11-05T00:00:00Z.","title":"From Date Time"},"to_date_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the date range (inclusive), ISO 8601 date-time.","title":"To Date Time"},"only_submitted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for feedback the guest actually submitted.","title":"Only Submitted"},"skip":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Skip"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records to return (1 to 100).","title":"Limit"},"custom_query":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Flexible filter: comma separated field:value (equals), field>value, field<value or field;value (contains), for example people>4,status:approved.","title":"Custom Query"}},"title":"list_guest_feedbackArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_available_dates":{"post":{"operationId":"get_available_dates","summary":"List the dates on which bookings can be made, between two dates (default the next 30 days). Use for \"On which dates can ","description":"List the dates on which bookings can be made, between two dates (default the next 30 days). Use for \"On which dates can guests book at my restaurant in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"from_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"First date, as YYYY-MM-DD (default today).","title":"From Date"},"to_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Last date, as YYYY-MM-DD (default 30 days after the first).","title":"To Date"}},"title":"get_available_datesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_available_times":{"post":{"operationId":"get_available_times","summary":"List the booking times available for a party size on a date. Use for \"What times are free for 4 people on 2026-11-05 in ","description":"List the booking times available for a party size on a date. Use for \"What times are free for 4 people on 2026-11-05 in Resos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"people":{"description":"Number of guests.","maximum":200,"minimum":1,"title":"People","type":"integer"},"date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Day to check, as YYYY-MM-DD (default today).","title":"Date"},"area_id":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only this seating area id.","title":"Area Id"},"only_bookable_online":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True (default) to count only areas bookable online.","title":"Only Bookable Online"}},"required":["people"],"title":"get_available_timesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}