{"info":{"title":"B2B-API specifications","version":"1.0.0"},"servers":[{"url":"https://api.thefork.io/manager"}],"openapi":"3.1.0","components":{"schemas":{"oauthTokenRequest":{"type":"object","properties":{"audience":{"type":"string","enum":["https://api.thefork.io"],"description":"Identifier of the API to issue the token for, per the OAuth2 audience parameter."},"grant_type":{"type":"string","enum":["client_credentials"],"description":"OAuth2 grant type used to request the token. Only `client_credentials` is supported."},"client_id":{"type":"string","description":"Client identifier issued to the API consumer, used with `client_secret` to authenticate the request."},"client_secret":{"type":"string","description":"Client secret issued to the API consumer, used with `client_id` to authenticate the request. Kept confidential; never expose it client-side."}},"required":["audience","grant_type","client_id","client_secret"]},"oauthTokenResponse":{"type":"object","properties":{"access_token":{"type":"string","description":"Bearer token to send in the `Authorization` header of subsequent B2B API requests."},"scope":{"type":"string","description":"Space-separated list of the granted scopes, drawn from: `tfm-restaurant`, `tfm-restaurant:availabilities`, `tfm-restaurant:override-availabilities`, `tfm-restaurant:reservations`, `tfm-restaurant:unrestricted-reservations`, `tfm-restaurant:offers`, `tfm-restaurant:customers`, `tfm-restaurant:reviews`, `tfm-restaurant:callCenter`.","example":"tfm-restaurant:customers tfm-restaurant:offers"},"expires_in":{"type":"number","enum":[8600],"description":"Number of seconds the access token remains valid for before a new one must be requested."},"token_type":{"type":"string","enum":["Bearer"],"description":"Type of the token, to prefix the `Authorization` header value with."}},"required":["access_token","scope","expires_in","token_type"]},"oauthTokenUnauthorizedResponse":{"type":"object","properties":{"error":{"type":"string","enum":["access_denied"],"description":"OAuth2 error code. Always `access_denied`, regardless of the underlying cause (invalid `client_id`, invalid `client_secret`, malformed body, etc.), so the response never reveals which part of the credentials was invalid."},"error_description":{"type":"string","enum":["Unauthorized"],"description":"Human-readable description of the error."}},"required":["error","error_description"]},"oauthTokenForbiddenResponse":{"type":"object","properties":{"error":{"type":"string","enum":["access_denied","unauthorized_client"],"description":"OAuth2 error code. `access_denied` is returned when the audience is not an API registered for this client. `unauthorized_client` is returned when the `grant_type` is not allowed for this client."},"error_description":{"type":"string","description":"Human-readable description of the error, naming the invalid `audience` or `grant_type`.","example":"Service not enabled within domain: https://api.thefork.io"},"error_uri":{"type":"string","description":"Link to documentation about client grant types. Only present for the `unauthorized_client` error.","example":"https://auth0.com/docs/clients/client-grant-types"}},"required":["error","error_description"]},"oauthTokenInternalServerErrorResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}},"parameters":{},"securitySchemes":{"oauth2ClientCredentials":{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"https://auth.thefork.io/oauth/token","scopes":{"tfm-restaurant":"Full access.","tfm-restaurant:availabilities":"Read restaurant availabilities, time slots, and accepted party sizes.","tfm-restaurant:override-availabilities":"Override restaurant availability for a given date and time range.","tfm-restaurant:reservations":"Create, update, cancel, and read reservations.","tfm-restaurant:unrestricted-reservations":"Create a reservation without linking it to a published offer or availability slot.","tfm-restaurant:offers":"Read the promotions and preset menus offered by a restaurant.","tfm-restaurant:customers":"Read customer profile data, by id, phone number, or update date range.","tfm-restaurant:reviews":"Read restaurant reviews, and post or update the restaurant reply to a review.","tfm-restaurant:callCenter":"Create and update phone call records for caller ID and call recognition integrations."}}}}}},"paths":{"/oauth/token":{"post":{"operationId":"postOauthToken","tags":["Authentication","-1"],"summary":"Authentication - Get access token","description":"Get access token using the OAuth2 client credentials flow. The token expires after `8600` seconds. Do not request a new one before the current one expires.","servers":[{"url":"https://auth.thefork.io"}],"security":[],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/oauthTokenRequest"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oauthTokenResponse"}}}},"401":{"description":"Error caused by invalid `client_id` or `client_secret`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oauthTokenUnauthorizedResponse"}}}},"403":{"description":"Error caused by the `audience` not being enabled for this client, or the `grant_type` not being allowed for this client.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oauthTokenForbiddenResponse"}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oauthTokenInternalServerErrorResponse"}}}}}}},"/v1/customers":{"get":{"operationId":"getV1Customers","tags":["Data","1"],"deprecated":false,"description":"List customer profiles created or updated between two dates. Returns customer unique identifiers only — fetch each customer's details from `GET /v1/customers/{id}`.","summary":"Data - Get customers list","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant group to restrict the result to. Customer profiles are always scoped to a restaurant group rather than a single restaurant, so there is no equivalent restaurantUuid filter on this endpoint.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the restaurant group to restrict the result to. Customer profiles are always scoped to a restaurant group rather than a single restaurant, so there is no equivalent restaurantUuid filter on this endpoint.","name":"groupUuid","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to customer profiles created or updated on or after this calendar date. Compared as a plain calendar date, with no timezone conversion applied.","example":"2022-01-01"},"required":true,"description":"Restricts the result to customer profiles created or updated on or after this calendar date. Compared as a plain calendar date, with no timezone conversion applied.","name":"startDate","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to customer profiles created or updated on or before this calendar date. Compared as a plain calendar date, with no timezone conversion applied.","example":"2022-09-02"},"required":true,"description":"Restricts the result to customer profiles created or updated on or before this calendar date. Compared as a plain calendar date, with no timezone conversion applied.","name":"endDate","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":10000,"description":"Maximum number of customers to return per page, up to 10000. Defaults to 100 if omitted.","example":100},"required":false,"description":"Maximum number of customers to return per page, up to 10000. Defaults to 100 if omitted.","name":"limit","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","example":1},"required":false,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","name":"page","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afb4"},"description":"Unique identifiers of the matching customer profiles. Fetch each customer's details from `GET /v1/customers/{id}`."},"totalCount":{"type":"number","description":"Total number of customer profiles matching the filters, across all pages.","example":1},"page":{"type":"number","description":"Page number requested for this result set.","example":1},"limit":{"type":"number","description":"Maximum number of customers requested per page for this result set.","example":100}},"required":["data","totalCount","page","limit"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reservations":{"get":{"operationId":"getV1Reservations","tags":["Data","3"],"deprecated":false,"description":"List reservations within a date range, matched on either their last-updated date (default) or their meal date depending on filterBy. Returns reservation unique identifiers only — fetch each reservation's details from `GET /v1/reservations/{id}`.","summary":"Data - Get reservations list","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant group to restrict the result to. Required when restaurantUuid is not provided; matches reservations across every restaurant in the group.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":false,"description":"Unique identifier of the restaurant group to restrict the result to. Required when restaurantUuid is not provided; matches reservations across every restaurant in the group.","name":"groupUuid","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to restrict the result to. Required when groupUuid is not provided.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":false,"description":"Unique identifier of the restaurant to restrict the result to. Required when groupUuid is not provided.","name":"restaurantUuid","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to reservations on or after this calendar date, inclusive. Matched against the field named by filterBy, from the start of that day in the server's timezone (UTC in this deployment).","example":"2022-01-01"},"required":true,"description":"Restricts the result to reservations on or after this calendar date, inclusive. Matched against the field named by filterBy, from the start of that day in the server's timezone (UTC in this deployment).","name":"startDate","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to reservations on or before this calendar date, inclusive. Matched against the field named by filterBy, until the end of that day in the server's timezone (UTC in this deployment).","example":"2022-09-02"},"required":true,"description":"Restricts the result to reservations on or before this calendar date, inclusive. Matched against the field named by filterBy, until the end of that day in the server's timezone (UTC in this deployment).","name":"endDate","in":"query"},{"schema":{"type":"string","enum":["updatedDate","mealDate"],"description":"Which reservation date startDate and endDate filter on. `updatedDate` filters on when the reservation record was last updated; `mealDate` filters on when the meal takes place. Defaults to `updatedDate` if omitted.","example":"mealDate"},"required":false,"description":"Which reservation date startDate and endDate filter on. `updatedDate` filters on when the reservation record was last updated; `mealDate` filters on when the meal takes place. Defaults to `updatedDate` if omitted.","name":"filterBy","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":10000,"description":"Maximum number of reservations to return per page, up to 10000. Defaults to 100 if omitted.","example":100},"required":false,"description":"Maximum number of reservations to return per page, up to 10000. Defaults to 100 if omitted.","name":"limit","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","example":1},"required":false,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","name":"page","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afb4"},"description":"Unique identifiers of the matching reservations. Fetch each reservation's details from `GET /v1/reservations/{id}`."},"totalCount":{"type":"number","description":"Total number of reservations matching the filters, across all pages.","example":1},"page":{"type":"number","description":"Page number of this result set.","example":1},"limit":{"type":"number","description":"Maximum number of reservations returned per page in this result set.","example":100}},"required":["data","totalCount","page","limit"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reviews":{"get":{"operationId":"getV1Reviews","tags":["Review flow","13"],"deprecated":false,"description":"List valid, published reviews whose meal took place between two dates. Returns review unique identifiers only — fetch each review's details from `GET /v1/reviews/{id}`.","summary":"Review flow - Get reviews list","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to list reviews for.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the restaurant to list reviews for.","name":"restaurantUuid","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to reviews whose meal date is on or after this calendar date. Interpreted as UTC midnight, not the restaurant's local timezone.","example":"2022-01-01"},"required":true,"description":"Restricts the result to reviews whose meal date is on or after this calendar date. Interpreted as UTC midnight, not the restaurant's local timezone.","name":"startDate","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to reviews whose meal date is on or before this calendar date. Must be later than startDate. Interpreted as UTC midnight, not the restaurant's local timezone.","example":"2022-09-02"},"required":true,"description":"Restricts the result to reviews whose meal date is on or before this calendar date. Must be later than startDate. Interpreted as UTC midnight, not the restaurant's local timezone.","name":"endDate","in":"query"},{"schema":{"type":"boolean","description":"Restricts the result to reviews that include a written customer comment.","example":false},"required":false,"description":"Restricts the result to reviews that include a written customer comment.","name":"withCommentOnly","in":"query"},{"schema":{"type":"integer","minimum":1,"exclusiveMinimum":false,"maximum":100,"default":50,"description":"Maximum number of reviews to return per page, up to 100. Defaults to 50 if omitted.","example":50},"required":false,"description":"Maximum number of reviews to return per page, up to 100. Defaults to 50 if omitted.","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":1,"exclusiveMinimum":false,"default":1,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","example":1},"required":false,"description":"Page number to return, starting at 1. Defaults to 1 if omitted.","name":"page","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afb4"},"description":"Unique identifiers of the matching reviews. Fetch each review's details from `GET /v1/reviews/{id}`."},"hasNext":{"type":"boolean","description":"Whether more reviews are available on a subsequent page.","example":true}},"required":["data","hasNext"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/customers/{id}":{"get":{"operationId":"getV1CustomersId","tags":["Data","2"],"deprecated":false,"description":"Retrieve the customer profile for a given customer's unique identifier.","summary":"Data - Get customer details","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the customer profile to retrieve.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the customer profile to retrieve.","name":"id","in":"path"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"customerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the customer profile.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"email":{"type":"string","nullable":true,"format":"email","description":"Email address of the diner.","example":"john@example.com"},"firstName":{"type":"string","nullable":true,"description":"First name of the diner.","example":"John"},"lastName":{"type":"string","nullable":true,"description":"Last name of the diner.","example":"Doe"},"phone":{"type":"string","nullable":true,"description":"Phone number of the diner, as stored on their TheFork Manager profile. Not guaranteed to be in E.164 format.","example":"+33612345678"},"birthDate":{"type":"string","nullable":true,"format":"date","description":"Date of birth of the diner, as a calendar date.","example":"1997-12-02"},"locale":{"type":"string","nullable":true,"description":"Locale of the diner, typically formatted as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code.","example":"fr_FR"},"civility":{"type":"string","nullable":true,"description":"Salutation used to address the diner (e.g. mr, mrs).","enum":["mr","mrs","ms","mr_and_mrs","mx","doctor","professor","counsel","ambassador","madam_ambassador","president","madam_president","magister","chef","lord","prince","princess","count","countess","duke","duchess","sir","lady","highness","baron","baroness","company"],"example":"mr"},"rank":{"type":"string","nullable":true,"description":"Loyalty tier manually assigned to the customer by the restaurant group. Setting it to `caution` automatically adds the `caution` tag to the customer.","enum":["gold","silver","bronze","caution"],"example":"gold"},"computedRank":{"type":"string","nullable":true,"description":"Loyalty tier automatically computed from the customer's booking history against thresholds configured by the restaurant group.","example":"gold"},"isVip":{"type":"boolean","description":"Whether the restaurant has manually flagged this diner as VIP.","example":true},"address":{"type":"string","nullable":true,"description":"Postal address of the diner, as free text.","example":"12 rue de la Paix, 75002 Paris"},"allergiesAndIntolerances":{"type":"array","nullable":true,"items":{"type":"string","example":"seafood"},"description":"Allergies and intolerances recorded for the diner, as restaurant-defined tags. Always sent in English.","example":["seafood","gluten"]},"dietaryRestrictions":{"type":"array","nullable":true,"items":{"type":"string","example":"gluten_free"},"description":"Dietary restrictions recorded for the diner, as restaurant-defined tags."},"spendingBehaviour":{"type":"array","nullable":true,"items":{"type":"string","example":"promo_seeker"},"description":"Spending-behaviour tags recorded for the diner (e.g. promotion-seeking), as defined by the restaurant group."},"customerRelationship":{"type":"array","nullable":true,"items":{"type":"string","example":"employee"},"description":"Tags describing the diner's relationship to the restaurant (e.g. employee), as defined by the restaurant group."},"riskLevel":{"type":"array","nullable":true,"items":{"type":"string","example":"caution"},"description":"Risk-level tags recorded for the diner (e.g. flagged for prior no-shows), as defined by the restaurant group."},"otherTags":{"type":"array","nullable":true,"items":{"type":"string","example":"wine_lover"},"description":"Tags recorded for the diner that do not fall under the categories above, including any of the restaurant group's custom tags."},"favFood":{"type":"string","nullable":true,"description":"Favourite food noted for the diner, as free text.","example":"Burger"},"favDrinks":{"type":"string","nullable":true,"description":"Favourite drinks noted for the diner, as free text.","example":"Punk IPA"},"favSeating":{"type":"string","nullable":true,"description":"Preferred seating noted for the diner, as a comma-separated list when multiple preferences are recorded.","example":"Terrace"},"notes":{"type":"string","nullable":true,"description":"Free-text notes about the diner, for restaurant staff.","example":"Prefers a quiet table."},"originRestaurantUuid":{"type":"string","nullable":true,"description":"Unique identifier of the restaurant where this customer profile was first created during their first visit.","example":"ddc14c13-98ce-4ece-9c82-98f84050f6f5"},"originRestaurantName":{"type":"string","nullable":true,"description":"Name of the restaurant where this customer profile was first created during their first visit.","example":"Le Petit Bistro"},"creationDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the customer profile was created, in ISO 8601 format.","example":"2022-09-02T10:15:00.000Z"},"lastUpdateDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the customer profile was last updated, in ISO 8601 format.","example":"2022-09-30T08:42:00.000Z"},"isPromoter":{"type":"boolean","description":"Whether the diner is flagged as a promoter — typically a third party, such as a concierge, who refers other guests to the restaurant.","example":false},"secondaryPhone":{"type":"string","nullable":true,"description":"Secondary phone number of the diner, as stored on their TheFork Manager profile. Not guaranteed to be in E.164 format.","example":"+33698765432"},"country":{"type":"string","nullable":true,"description":"ISO 3166-1 alpha-2 country code of the diner's address.","example":"FR"},"city":{"type":"string","nullable":true,"description":"City of the diner's address.","example":"Paris"},"zipcode":{"type":"string","nullable":true,"description":"Postal code of the diner's address.","example":"75001"},"optins":{"type":"object","properties":{"restaurantNewsletter":{"type":"boolean","default":false,"description":"Whether the diner has opted in to marketing communications by email during the reservation process. Opt-in is registered at the restaurant group level, so it also covers other restaurants in the same group. Setting this to true subscribes the diner; setting it to false has no effect and never unsubscribes them — this field cannot be used to withdraw consent.","example":true}},"default":{"restaurantNewsletter":false},"additionalProperties":false},"customFields":{"type":"array","nullable":true,"items":{"type":"object","properties":{"labelUuid":{"type":"string","format":"uuid","description":"Unique identifier of the custom field definition, as configured by the restaurant group.","example":"55749b38-b822-4ece-b976-65a1458c6d47"},"label":{"type":"string","description":"Display label of the custom field, as configured by the restaurant group.","example":"Regular lunch customer"},"type":{"type":"string","enum":["boolean","string","integer"],"description":"Data type of the custom field's value."},"value":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"number"},{"type":"string","enum":[""]}],"description":"Value entered for this custom field, in the type given by the field's `type`.","example":true},"valueUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the selected answer, when the custom field is a fixed list of choices. Null when the field is free text or numeric.","example":"ada0f099-4e3d-47da-addd-1d449082fc34"}},"required":["labelUuid","label","type","value"],"additionalProperties":false},"description":"Restaurant-configured custom fields captured on this customer profile, together with the diner's answers."}},"required":["email","firstName","lastName","locale","notes","creationDate","lastUpdateDate"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["CUSTOMER_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reservations/{id}":{"get":{"operationId":"getV1ReservationsId","tags":["Data","4"],"deprecated":false,"description":"Retrieve the details of a reservation for a given reservation's unique identifier.","summary":"Data - Get reservation details","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the reservation to retrieve.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the reservation to retrieve.","name":"id","in":"path"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reservationUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant the reservation was made at.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the meal, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-03T18:10:17+01:00"},"mealStatus":{"type":"string","nullable":true,"description":"Diner's progress through the meal once seated. One of: `PARTIALLY_ARRIVED` (some guests in the party have arrived), `ARRIVED` (the diner has checked in), `SEATED` (the party has been seated at a table), `BILL` (the bill has been requested), `LEFT` (the party has left the restaurant). These statuses do not represent a fixed sequence — a reservation is not guaranteed to go through all of them, or in this order.","enum":["PARTIALLY_ARRIVED","ARRIVED","SEATED","BILL","LEFT"],"example":"ARRIVED"},"partySize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of guests the reservation is for.","example":2},"status":{"type":"string","description":"Current status of the reservation. One of: `RECORDED` (confirmed — the most common status), `CANCELED` (canceled by the diner or the restaurant), `NO_SHOW` (the diner did not show up for a confirmed reservation), `REQUESTED` (awaiting a decision from the restaurant, for on-request bookings or the waitlist — not yet confirmed), `REFUSED` (a requested reservation that the restaurant declined).","enum":["RECORDED","CANCELED","NO_SHOW","REQUESTED","REFUSED"],"example":"RECORDED"},"offerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the offer the reservation was booked against. Null when the reservation was made without an offer.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customerNote":{"type":"string","nullable":true,"description":"Special request entered by the diner when making the reservation, such as a dietary requirement or an occasion. May exceed the 1000-character limit enforced at creation time if it was edited afterwards.","example":"note by the customer"},"restaurantNote":{"type":"string","nullable":true,"description":"Internal note about the reservation, intended for restaurant staff — for example a seating preference or service instruction.","example":"note by the restaurant"},"customerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the customer profile linked to this reservation. Null when the reservation has no linked customer, for example a walk-in.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customFields":{"type":"array","nullable":true,"items":{"type":"object","properties":{"labelUuid":{"type":"string","format":"uuid","description":"Unique identifier of the custom field definition, as configured by the restaurant group.","example":"55749b38-b822-4ece-b976-65a1458c6d47"},"label":{"type":"string","description":"Display label of the custom field, as configured by the restaurant group.","example":"Regular lunch customer"},"type":{"type":"string","enum":["boolean","string","integer"],"description":"Data type of the custom field's value."},"value":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"number"}],"description":"Value entered for this custom field, in the type given by the field's `type`.","example":true},"valueUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the selected answer, when the custom field is a fixed list of choices. Null when the field is free text or numeric.","example":"ada0f099-4e3d-47da-addd-1d449082fc34"}},"required":["labelUuid","label","type","value"],"additionalProperties":false},"description":"Restaurant-configured custom fields captured on this reservation, together with the diner's answers."},"offerDetails":{"type":"object","nullable":true,"properties":{"offerType":{"type":"string","enum":["promotion","presetMenu"],"description":"Type of offer the reservation was booked against. One of: `promotion` (a percentage discount off à la carte pricing) or `presetMenu` (a fixed menu the diner commits to at booking).","example":"promotion"},"name":{"type":"object","nullable":true,"properties":{},"additionalProperties":{"nullable":true},"description":"Name of the offer, as a map of locale to translated text (e.g. `{ \"fr_FR\": \"Menu du jour\" }`).","example":{"fr_FR":"Menu du jour"}},"discountPercentage":{"type":"number","nullable":true,"description":"Percentage discount off à la carte pricing, e.g. 30 means 30% off. Only present when offerType is `promotion`.","example":30},"presetMenuType":{"type":"string","nullable":true,"enum":["generic","group","of_the_day","brunch","experience","mastercard",null],"description":"Category of the preset menu. One of: `generic` (no special category), `brunch` (a brunch menu), `group` (designed for large-party bookings), `of_the_day` (a daily-changing menu), `mastercard` (restricted to Mastercard cardholders — triggers card-brand validation at payment), `experience` (a newer, unified category that generic, brunch, group and of_the_day are being migrated into). Only present when offerType is `presetMenu`.","example":"generic"},"price":{"type":"number","nullable":true,"description":"Price of the experience, in the major unit of `currency` (e.g. euros, not cents). Only present when offerType is `presetMenu`.","example":35},"currency":{"type":"string","nullable":true,"description":"ISO 4217 currency code of `price`, taken from the restaurant's configured currency rather than the offer itself.","example":"EUR"}},"required":["offerType"],"additionalProperties":false,"description":"Details of the offer the reservation was booked against. Null when the reservation was made without an offer."},"utmTrackingInformation":{"type":"array","nullable":true,"items":{"type":"object","properties":{"key":{"type":"string","description":"Name of the UTM parameter.","enum":["utm_source","utm_medium","utm_campaign"],"example":"utm_source"},"value":{"type":"string","description":"Value captured for this UTM parameter at booking time.","example":"google"}},"required":["key","value"],"additionalProperties":false},"description":"Marketing attribution parameters captured when the reservation was booked online, limited to utm_source, utm_medium and utm_campaign."},"billAmount":{"type":"object","nullable":true,"properties":{"totalPrice":{"type":"number","description":"Total amount billed, in the major unit of `currency` (e.g. euros, not cents).","example":45.5},"currency":{"type":"string","description":"ISO 4217 currency code of `totalPrice`.","example":"EUR"}},"required":["totalPrice","currency"],"additionalProperties":false,"description":"Amount billed for this reservation, from the linked point-of-sale order. Null when no POS order is linked to the reservation, or when it could not be retrieved."},"reservationChannel":{"type":"string","enum":["TripAdvisor","Michelin","Booking Module","Offline","TheFork","Walk-in","Google","Cross Sell","TheFork Manager API"],"description":"How the reservation was booked. One of: `TheFork` (TheFork's own marketplace or apps), `Booking Module` (the restaurant's own booking widget), `TheFork Manager API` (booked by a partner through this B2B API), `Offline` (entered manually by restaurant staff), `Walk-in` (a guest seated without a prior booking), `Cross Sell` (booked on the booking module but coming from another venue of the group), `Google` (booked via Google Reserve), `TripAdvisor` (booked via TripAdvisor), `Michelin` (booked via the Michelin Guide).","example":"TheFork"},"createdAt":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the reservation record was created, in ISO 8601 format.","example":"2022-09-02T10:15:00.000Z"},"updatedAt":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the reservation record was last updated, in ISO 8601 format.","example":"2022-09-30T08:42:00.000Z"}},"required":["reservationUuid","restaurantUuid","mealDate","partySize","status","reservationChannel","createdAt"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESERVATION_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}},"patch":{"operationId":"patchV1ReservationsId","tags":["Booking flow","11"],"deprecated":false,"description":"Update the details of a reservation for a given reservation's unique identifier. Optional fields omitted from the request are left unchanged.","summary":"Booking flow - Update Reservation","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the reservation to update.","example":"cf5946cc-bde0-4cb1-bca5-7b59f66a5c94"},"required":true,"description":"Unique identifier of the reservation to update.","name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"New date and time of the meal, in ISO 8601 format. If the value has no UTC offset, it is interpreted in the restaurant's local timezone.","example":"2022-01-03T18:10:17+01:00"},"partySize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"New number of guests the reservation is for.","example":2},"restaurantNote":{"type":"string","nullable":true,"maxLength":3000,"description":"Internal note for the restaurant staff. Replaces the existing note; send null to clear it.","example":"Table by the window, high chair needed"}},"required":["mealDate","partySize"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reservationUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant the reservation was made at.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the meal, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-03T18:10:17+01:00"},"mealStatus":{"type":"string","nullable":true,"description":"Diner's progress through the meal once seated. One of: `PARTIALLY_ARRIVED` (some guests in the party have arrived), `ARRIVED` (the diner has checked in), `SEATED` (the party has been seated at a table), `BILL` (the bill has been requested), `LEFT` (the party has left the restaurant). These statuses do not represent a fixed sequence — a reservation is not guaranteed to go through all of them, or in this order.","enum":["PARTIALLY_ARRIVED","ARRIVED","SEATED","BILL","LEFT"],"example":"ARRIVED"},"partySize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of guests the reservation is for.","example":2},"status":{"type":"string","description":"Current status of the reservation. One of: `RECORDED` (confirmed — the most common status), `CANCELED` (canceled by the diner or the restaurant), `NO_SHOW` (the diner did not show up for a confirmed reservation), `REQUESTED` (awaiting a decision from the restaurant, for on-request bookings or the waitlist — not yet confirmed), `REFUSED` (a requested reservation that the restaurant declined).","enum":["RECORDED","CANCELED","NO_SHOW","REQUESTED","REFUSED"],"example":"RECORDED"},"offerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the offer the reservation was booked against. Null when the reservation was made without an offer.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customerNote":{"type":"string","nullable":true,"description":"Special request entered by the diner when making the reservation, such as a dietary requirement or an occasion. May exceed the 1000-character limit enforced at creation time if it was edited afterwards.","example":"note by the customer"},"restaurantNote":{"type":"string","nullable":true,"description":"Internal note about the reservation, intended for restaurant staff — for example a seating preference or service instruction.","example":"note by the restaurant"},"customer":{"type":"object","nullable":true,"properties":{"customerUuid":{"type":"string","format":"uuid","description":"Unique identifier of the customer profile linked to this reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"email":{"type":"string","nullable":true,"format":"email","description":"Email address of the diner.","example":"john@example.com"},"firstName":{"type":"string","nullable":true,"description":"First name of the diner.","example":"John"},"lastName":{"type":"string","nullable":true,"description":"Last name of the diner.","example":"Doe"},"phone":{"type":"string","nullable":true,"description":"Phone number of the diner, as stored on their TheFork Manager profile. Not guaranteed to be in E.164 format.","example":"+33612345678"},"locale":{"type":"string","nullable":true,"pattern":"^([a-z]{2,3})(?:_([A-Z]{2}))?$","description":"Locale of the diner, as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code.","example":"fr_FR"},"civility":{"type":"string","nullable":true,"description":"Salutation used to address the diner (e.g. mr, mrs).","enum":["mr","mrs","ms","mr_and_mrs","mx","doctor","professor","counsel","ambassador","madam_ambassador","president","madam_president","magister","chef","lord","prince","princess","count","countess","duke","duchess","sir","lady","highness","baron","baroness","company"],"example":"mr"},"optins":{"type":"object","properties":{"restaurantNewsletter":{"type":"boolean","default":false,"description":"Whether the diner has opted in to marketing communications by email during the reservation process. Opt-in is registered at the restaurant group level, so it also covers other restaurants in the same group. Setting this to true subscribes the diner; setting it to false has no effect and never unsubscribes them — this field cannot be used to withdraw consent.","example":true}},"default":{"restaurantNewsletter":false},"additionalProperties":false}},"required":["customerUuid","email","firstName","lastName","phone","locale","civility"],"additionalProperties":false}},"required":["reservationUuid","restaurantUuid","mealDate","partySize","status","customer"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","enum":["NO_AVAILABILITY","PAYMENT_GUARANTEE_NOT_SUPPORTED"]},{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}]}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESERVATION_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"409":{"description":"Error caused by a request that conflicts with the current state of a resource.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["DOUBLE_BOOKING"]}},"required":["code"]},"error":{"type":"string","enum":["Conflict"]},"statusCode":{"type":"number","enum":[409]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reviews/{id}":{"get":{"operationId":"getV1ReviewsId","tags":["Review flow","14"],"deprecated":false,"description":"Retrieve the details of a review for a given review's unique identifier.","summary":"Review flow - Get review details","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the review to retrieve.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the review to retrieve.","name":"id","in":"path"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reviewUuid":{"type":"string","format":"uuid","description":"Unique identifier of the review.","example":"6f5fdab1-c91a-11ef-8d9e-0e8af7bd4d53"},"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reviewed restaurant.","example":"084c0650-9b8e-4357-bebe-5fad1c069051"},"isValid":{"type":"boolean","description":"Whether the review counts towards the restaurant's public rating and review list. Invalid reviews (for example, detected as fraudulent) are excluded from `GET /v1/reviews` but are still returned by this endpoint.","example":false},"createdTs":{"type":"string","format":"date-time","description":"Date and time when the review was created, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"updatedTs":{"type":"string","format":"date-time","description":"Date and time when the review was last updated, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"reservation":{"type":"object","properties":{"reservationUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the reservation the review was submitted for. Null when the review is not linked to a reservation.","example":"772decf1-8f6f-4676-af3d-823413203fc2"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the meal took place, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T11:30:00.000Z"}},"required":["reservationUuid","mealDate"],"additionalProperties":false,"description":"Details of the reservation for which this review was submitted."},"customer":{"type":"object","properties":{"customerUuid":{"type":"string","format":"uuid","description":"Unique identifier of the customer profile who submitted this review.","example":"d839a3e5-7d20-467d-90d8-4c1f5e303d36"},"firstName":{"type":"string","nullable":true,"description":"First name of the customer.","example":"John"},"lastName":{"type":"string","nullable":true,"description":"Last name of the customer.","example":"Doe"}},"required":["customerUuid","firstName","lastName"],"additionalProperties":false,"description":"Details of the customer who submitted this review."},"dinerRating":{"type":"object","properties":{"globalRating":{"type":"number","nullable":true,"minimum":0,"maximum":10,"description":"Overall rating given by the diner.","example":8},"ambienceRating":{"type":"integer","nullable":true,"minimum":0,"maximum":10,"description":"Rating given by the diner for the restaurant's ambience.","example":8},"foodQualityRating":{"type":"integer","nullable":true,"minimum":0,"maximum":10,"description":"Rating given by the diner for food quality.","example":8},"serviceRating":{"type":"integer","nullable":true,"minimum":0,"maximum":10,"description":"Rating given by the diner for service quality.","example":8},"priceEvaluation":{"type":"string","nullable":true,"description":"Diner's evaluation of the price level.","enum":["VERY_CHEAP","CHEAP","AVERAGE","EXPENSIVE","VERY_EXPENSIVE"],"example":"CHEAP"},"waitingTimeEvaluation":{"type":"string","nullable":true,"description":"Diner's evaluation of the waiting time.","enum":["VERY_FAST","FAST","AVERAGE","SLOW","VERY_SLOW"],"example":"FAST"},"noiseLevelEvaluation":{"type":"string","nullable":true,"description":"Diner's evaluation of the noise level.","enum":["VERY_QUIET","QUIET","MODERATE","LOUD","VERY_LOUD"],"example":"QUIET"}},"required":["globalRating","ambienceRating","foodQualityRating","serviceRating","priceEvaluation","waitingTimeEvaluation","noiseLevelEvaluation"],"additionalProperties":false,"description":"Detailed ratings provided by the diner, in addition to the overall rating."},"comment":{"type":"object","nullable":true,"properties":{"content":{"type":"string","minLength":1,"description":"Text of the comment, as written by its author. May include escape sequences.","example":"Great food and service!"},"language":{"type":"string","nullable":true,"pattern":"^[a-z]{2,3}$","description":"ISO 639-1 language code the comment was written in.","example":"en"},"publicationStatus":{"type":"string","description":"Moderation outcome for the comment. One of: `NOT_REVIEWED` (awaiting moderation), `PUBLISHED` (visible on the restaurant page), `WAITING_REFORMULATE` (returned to its author for rewrite), `REJECTED` (refused).","enum":["NOT_REVIEWED","REJECTED","PUBLISHED","WAITING_REFORMULATE","ARCHIVED","DELETED","UNDER_TRANSLATION"],"example":"PUBLISHED"},"createdTs":{"type":"string","format":"date-time","description":"Date and time when the comment was created, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"updatedTs":{"type":"string","format":"date-time","description":"Date and time when the comment was last updated, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"publishedTs":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the comment was published, in ISO 8601 format, in UTC or with a UTC offset. Null while the comment has not yet passed moderation.","example":"2025-01-02T15:08:58.208Z"},"moderationReason":{"type":"string","nullable":true,"description":"Reason a moderator assigned this publication status to the diner's comment. The prefix indicates the outcome: `PUBLISH_*` (published, with a caveat), `REFORMULATE_*` (returned to the diner for rewrite), `REJECT_*` (refused). Null while the comment has not been moderated.","enum":["PUBLISH_BOOKING_NOT_TAKEN_INTO_ACCOUNT","PUBLISH_GENERIC_TEMPLATE_PUBLISH","PUBLISH_OFFER_NOT_APPLIED","PUBLISH_OFFER_PARTIALLY_APPLIED","PUBLISH_REPORT_ISSUE_R_PAGE","PUBLISH_YUMS_DISCOUNT_NOT_APPLIED","REFORMULATE_CAPITAL_LETTERS","REFORMULATE_COMPARE_RS","REFORMULATE_DISCRIMINATORY","REFORMULATE_FOOD_POISONING","REFORMULATE_GENERIC_TEMPLATE_REFORMULATE","REFORMULATE_INCOHERENT_NOTATION","REFORMULATE_IRRELEVANT_CONTENT","REFORMULATE_LINKS_PERSONAL_DATA","REFORMULATE_OFFENSIVE_LANGUAGE","REFORMULATE_OFFER_NOT_APPLIED","REFORMULATE_OFFER_REFUSED_JUSTLY_BOOKING","REFORMULATE_OFFER_REFUSED_JUSTLY_CONDITIONS","REFORMULATE_SERIOUS_DAMAGING_ACCUSATIONS","REFORMULATE_SIMILAR_REVIEWS","REFORMULATE_THE_FORK_PAY_NOT_AVAILABLE","REFORMULATE_UNFINISHED_REVIEW","REFORMULATE_USER_REQUEST_TO_MODIFY_REVIEW","REFORMULATE_USER_REVIEWING_ANOTHER_R","REFORMULATE_VIOLENT_CONTENT","REJECT_CONFLICT_OF_INTERESTS_OR_FRAUD","REJECT_CUSTOMER_NOT_FOLLOW_MODERATION_RULES","REJECT_DISCOUNT_APPLIED_R_PROVIDED_PROOF","REJECT_GENERIC_TEMPLATE_REJECT","REJECT_REFORMULATION_PERIOD_ENDED","REJECT_RESTAURANT_CLOSED","REJECT_RESTAURANT_CLOSED_NO_COMPENSATION","REJECT_USER_CANCELLATION","REJECT_USER_NOT_PRESENT_IN_R","REJECT_USER_REQUEST_TO_REMOVE_REVIEW","REJECT_VIOLATION_ARTICLE_252"],"example":"REFORMULATE_CAPITAL_LETTERS"}},"required":["content","language","publicationStatus","createdTs","updatedTs","publishedTs","moderationReason"],"additionalProperties":false,"description":"Free-text comment left by the diner about their experience. Null when the diner left no comment."},"experienceDetail":{"type":"object","nullable":true,"properties":{"occasion":{"type":"string","nullable":true,"description":"Occasion for the dining experience, as selected by the diner.","enum":["BUSINESS","FRIENDS","ROMANTIC","FAMILY","ALONE"],"example":"ROMANTIC"}},"required":["occasion"],"additionalProperties":false,"description":"Additional details about the dining experience, as reported by the diner."},"restaurantReply":{"type":"object","nullable":true,"properties":{"content":{"type":"string","minLength":1,"description":"Text of the comment, as written by its author. May include escape sequences.","example":"Great food and service!"},"language":{"type":"string","nullable":true,"pattern":"^[a-z]{2,3}$","description":"ISO 639-1 language code the comment was written in.","example":"en"},"publicationStatus":{"type":"string","description":"Moderation outcome for the comment. One of: `NOT_REVIEWED` (awaiting moderation), `PUBLISHED` (visible on the restaurant page), `WAITING_REFORMULATE` (returned to its author for rewrite), `REJECTED` (refused).","enum":["NOT_REVIEWED","REJECTED","PUBLISHED","WAITING_REFORMULATE","ARCHIVED","DELETED","UNDER_TRANSLATION"],"example":"PUBLISHED"},"createdTs":{"type":"string","format":"date-time","description":"Date and time when the comment was created, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"updatedTs":{"type":"string","format":"date-time","description":"Date and time when the comment was last updated, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"publishedTs":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the comment was published, in ISO 8601 format, in UTC or with a UTC offset. Null while the comment has not yet passed moderation.","example":"2025-01-02T15:08:58.208Z"},"moderationReason":{"type":"string","nullable":true,"description":"Reason a moderator assigned this publication status to the restaurant's reply. The prefix indicates the outcome: `REFORMULATE_REPLY_*` (returned to the restaurant for rewrite), `REJECT_REPLY_*` (refused). Null while the reply has not been moderated.","enum":["REFORMULATE_REPLY_IRRELEVANT_CONTENT","REFORMULATE_REPLY_PROFANITY","REFORMULATE_REPLY_INCORRECT_INFORMATION","REFORMULATE_REPLY_SPAM","REFORMULATE_REPLY_THREATENING_LANGUAGE","REFORMULATE_REPLY_CONFIDENTIAL_TF_INFO","REFORMULATE_REPLY_PRIVATE_DATA","REFORMULATE_REPLY_INAPROPRIATE_CONTENT","REFORMULATE_REPLY_NOT_COMPLIANT","REFORMULATE_REPLY_VIOLENCE","REFORMULATE_REPLY_DISCRIMINATORY","REFORMULATE_REPLY_RESTAURANT_REQUEST","REFORMULATE_REPLY_HARASSMENT_LANGUAGE","REFORMULATE_REPLY_INAUTHENTIC","REFORMULATE_REPLY_ALL_CAPS_UNINTELLIGIBLE_NON_ORIGINAL_CONTENT","REJECT_REPLY_NOT_COMPLIANT","REJECT_REPLY_REFORMULATION_PERIOD_ENDED","REJECT_REPLY_RESTAURANT_REQUEST"],"example":"REFORMULATE_REPLY_SPAM"}},"required":["content","language","publicationStatus","createdTs","updatedTs","publishedTs","moderationReason"],"additionalProperties":false,"description":"Restaurant's reply to the diner's comment. Null when the restaurant has not replied, or when the comment has no published content to reply to."}},"required":["reviewUuid","restaurantUuid","isValid","createdTs","updatedTs","reservation","customer","dinerRating","comment","experienceDetail","restaurantReply"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["REVIEW_NOT_FOUND","CUSTOMER_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/timeslots":{"get":{"operationId":"getV1RestaurantsIdTimeslots","tags":["Booking flow","9"],"deprecated":false,"description":"List the bookable timeslots for a restaurant on a given date, including their payment guarantee requirements.","summary":"Booking flow - Get timeslots","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to list timeslots for.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to list timeslots for.","name":"id","in":"path"},{"schema":{"type":"string","format":"date","description":"Restricts the result to timeslots on this calendar date, interpreted in the restaurant's local timezone.","example":"2022-01-01"},"required":true,"description":"Restricts the result to timeslots on this calendar date, interpreted in the restaurant's local timezone.","name":"date","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the offer that returned timeslots must be bookable against. Omit to also include timeslots available for normal stock, with no offer.","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"},"required":false,"description":"Unique identifier of the offer that returned timeslots must be bookable against. Omit to also include timeslots available for normal stock, with no offer.","name":"offerUuid","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Restricts the result to timeslots that can accommodate this many guests.","example":2},"required":false,"description":"Restricts the result to timeslots that can accommodate this many guests.","name":"partySize","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"datetime":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the timeslot, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-01T12:30:00+01:00"},"offers":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"},"description":"Unique identifiers of the offers bookable at this timeslot."},"hasNormalStock":{"type":"boolean","description":"Whether this timeslot has availability for a reservation made without any offer.","example":true},"hasPaymentGuaranteeRequirement":{"type":"boolean","description":"Whether a payment guarantee is required to book this timeslot. True when at least one offer, or the normal stock, is protected by a guarantee requirement — see guaranteeRequirementList for details.","example":true},"guaranteeRequirementList":{"type":"array","items":{"type":"object","properties":{"guaranteeType":{"type":"string","enum":["imprint","prepayment"],"description":"Type of payment guarantee required. One of: `imprint` (the diner's card is saved with no funds held; if the diner no-shows, the restaurant can attempt to charge it afterwards, which may fail if funds are insufficient) or `prepayment` (the full guarantee amount is charged to the diner's card immediately at booking; cancelling within the notice period defined by minimumCancellationHours triggers a refund).","example":"imprint"},"amount":{"type":"integer","minimum":0,"description":"Amount of the payment guarantee, expressed in the restaurant's currency.","example":10},"minimumCancellationHours":{"type":"integer","description":"Minimum notice, in hours before the meal, required to cancel the reservation without breaching the guarantee. Cancelling with less notice may result in a no-show charge attempt (imprint) or a forfeited prepayment (prepayment), depending on guaranteeType.","example":24},"minimumPartySize":{"type":"integer","description":"Smallest party size this guarantee requirement applies to. `0` means it applies to every party size.","example":2},"offerUuid":{"type":"string","format":"uuid","description":"Unique identifier of the offer this guarantee requirement applies to. Absent when the requirement protects normal stock rather than a specific offer.","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"}},"required":["guaranteeType","amount","minimumCancellationHours","minimumPartySize"],"additionalProperties":false},"description":"Payment guarantee policies protecting this timeslot. Contains at least one entry when hasPaymentGuaranteeRequirement is true."}},"required":["datetime","hasNormalStock","hasPaymentGuaranteeRequirement","guaranteeRequirementList"],"additionalProperties":false}}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/offers":{"get":{"operationId":"getV1RestaurantsIdOffers","tags":["Booking flow","7"],"deprecated":false,"description":"List the bookable experiences published to TheFork's booking widget for a restaurant. Promotions are not included — an offerUuid referenced elsewhere as a promotion cannot be resolved through this endpoint.","summary":"Booking flow - Get offers","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to list experiences for.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to list experiences for.","name":"id","in":"path"},{"schema":{"type":"string","pattern":"^([a-z]{2,3})(?:_([A-Z]{2}))?$","description":"Locale to translate each experience's name and description into, as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code. Falls back to English, then to any available language, when no translation exists for the requested locale.","example":"fr_FR"},"required":true,"description":"Locale to translate each experience's name and description into, as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code. Falls back to English, then to any available language, when no translation exists for the requested locale.","name":"locale","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","description":"Unique identifier of the experience.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"name":{"type":"string","nullable":true,"description":"Name of the experience, translated into the requested locale.","example":"4 hands dinner"},"description":{"type":"string","nullable":true,"description":"Description of the experience, translated into the requested locale.","example":"Exclusive four-hands dinner by two Michelin-starred chefs · Six-course gastronomic menu including amuses and finger food"},"price":{"type":"number","nullable":true,"description":"Price of the experience, in the major unit of the restaurant's currency (e.g. euros, not cents). Optional, since not every experience has a fixed menu price — for example a 'Karaoke Tuesday' event.","example":10}},"required":["uuid"],"additionalProperties":false}}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/availabilities":{"get":{"operationId":"getV1RestaurantsIdAvailabilities","tags":["Booking flow","5"],"deprecated":false,"description":"List the dates with availability for a restaurant within a date range, optionally restricted to a specific offer or party size.","summary":"Booking flow - Get availabilities","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to list availability for.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to list availability for.","name":"id","in":"path"},{"schema":{"type":"string","format":"date","description":"Restricts the result to availability on or after this calendar date, interpreted in the restaurant's local timezone.","example":"2022-01-01"},"required":true,"description":"Restricts the result to availability on or after this calendar date, interpreted in the restaurant's local timezone.","name":"startDate","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the offer that returned dates must be bookable against. Omit to also include dates available for normal stock, with no offer.","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"},"required":false,"description":"Unique identifier of the offer that returned dates must be bookable against. Omit to also include dates available for normal stock, with no offer.","name":"offerUuid","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to availability on or before this calendar date, interpreted in the restaurant's local timezone.","example":"2022-09-02"},"required":true,"description":"Restricts the result to availability on or before this calendar date, interpreted in the restaurant's local timezone.","name":"endDate","in":"query"},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Restricts the result to dates with availability for this many guests.","example":2},"required":false,"description":"Restricts the result to dates with availability for this many guests.","name":"partySize","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"Calendar date with availability, in the restaurant's local timezone.","example":"2022-01-01"},"offerList":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"},"description":"Unique identifiers of the offers bookable on this date."},"hasNormalStock":{"type":"boolean","description":"Whether this date has availability for a reservation made without any offer.","example":true}},"required":["date","hasNormalStock"],"additionalProperties":false}}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/partySizes":{"get":{"operationId":"getV1RestaurantsIdPartySizes","tags":["Booking flow","8"],"deprecated":false,"description":"List the party sizes with availability for a restaurant within a date range.","summary":"Booking flow - Get party size","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to list bookable party sizes for.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to list bookable party sizes for.","name":"id","in":"path"},{"schema":{"type":"string","format":"date","description":"Restricts the result to availability on or after this calendar date, interpreted in the restaurant's local timezone.","example":"2022-01-01"},"required":true,"description":"Restricts the result to availability on or after this calendar date, interpreted in the restaurant's local timezone.","name":"startDate","in":"query"},{"schema":{"type":"string","format":"date","description":"Restricts the result to availability on or before this calendar date, interpreted in the restaurant's local timezone.","example":"2022-09-02"},"required":true,"description":"Restricts the result to availability on or before this calendar date, interpreted in the restaurant's local timezone.","name":"endDate","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the offer that returned party sizes must be bookable against. Omit to also include party sizes available for normal stock, with no offer.","example":"a114c986-9d5b-4c34-a86b-427137dae3d4"},"required":false,"description":"Unique identifier of the offer that returned party sizes must be bookable against. Omit to also include party sizes available for normal stock, with no offer.","name":"offerUuid","in":"query"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"}}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/customers/phone/{phoneNumber}":{"get":{"operationId":"getV1RestaurantsIdCustomersPhonePhoneNumber","tags":["Phone","17"],"deprecated":false,"description":"Retrieve the customer profile matching a phone number at a restaurant, along with the customer's upcoming reservations there.","summary":"Phone - Find customer by phone number","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to search within.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the restaurant to search within.","name":"id","in":"path"},{"schema":{"type":"string","format":"phone","pattern":"^\\+[1-9]\\d{1,14}$","description":"Phone number to search for, in E.164 format. Matched by exact string equality against the customer's phone number on file — no partial or fuzzy matching is performed.","example":"+33612345678"},"required":true,"description":"Phone number to search for, in E.164 format. Matched by exact string equality against the customer's phone number on file — no partial or fuzzy matching is performed.","name":"phoneNumber","in":"path"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"customerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the customer profile.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"firstName":{"type":"string","nullable":true,"description":"First name of the diner.","example":"John"},"lastName":{"type":"string","nullable":true,"description":"Last name of the diner.","example":"Doe"},"phone":{"type":"string","description":"Phone number of the diner, as stored on their TheFork Manager profile. Not guaranteed to be in E.164 format.","example":"+33612345678"},"email":{"type":"string","nullable":true,"format":"email","description":"Email address of the diner.","example":"john@example.com"},"nextReservationsList":{"type":"array","items":{"type":"object","properties":{"reservationUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the meal, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-03T18:10:17+01:00"},"status":{"type":"string","description":"Current status of the reservation. One of: `RECORDED` (confirmed — the most common status), `CANCELED` (canceled by the diner or the restaurant), `NO_SHOW` (the diner did not show up for a confirmed reservation), `REQUESTED` (awaiting a decision from the restaurant, for on-request bookings or the waitlist — not yet confirmed), `REFUSED` (a requested reservation that the restaurant declined).","enum":["RECORDED","CANCELED","NO_SHOW","REQUESTED","REFUSED"],"example":"RECORDED"}},"required":["reservationUuid","mealDate","status"],"additionalProperties":false},"description":"Upcoming reservations for this diner at this restaurant, from now onward, ordered by meal date ascending."}},"required":["customerUuid","phone","nextReservationsList"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["PHONE_NUMBER_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/callCenter/callRecognitions":{"post":{"operationId":"postV1CallCenterCallRecognitions","tags":["Phone","16"],"deprecated":false,"description":"Report a call event from a telephony partner: create a new call record, update an ongoing call's status, or mark a call as finished, depending on callCurrentStatus.","summary":"Phone - Post Caller ID details","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"callId":{"type":"string","format":"uuid","description":"Unique identifier of the phone call, assigned by the telephony partner. Must be provided consistently across the incoming, answered and ended events for the same call — it is the only key used to match a status update to the call it belongs to.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"callCallerId":{"type":"string","description":"Caller's phone number in local format, as dialled locally rather than E.164. Compare with callPhoneNumber, which is in E.164 format.","example":"0601020304"},"callCallerIdValidPhone":{"type":"boolean","description":"Whether the telephony partner validated callCallerId as a well-formed phone number.","example":true},"callPhoneNumber":{"type":"string","format":"phone","pattern":"^\\+[1-9]\\d{1,14}$","description":"Caller's phone number, in E.164 format, used to look up the caller's customer profile for this restaurant. Although marked optional, the request is rejected when it is omitted.","example":"+33601020304"},"callCurrentStatus":{"type":"string","enum":["SONNERIE","DECROCHE","RACCROCHE","ABANDON","incoming","missed","answered","ended"],"description":"Current status of the call. Accepts both a legacy French vocabulary and its English equivalent: `SONNERIE` / `incoming` (the call is ringing), `DECROCHE` / `answered` (the call was picked up), `RACCROCHE` / `ended` (the call ended normally), `ABANDON` / `missed` (the caller hung up before the call was answered).","example":"SONNERIE"},"callDateMillis":{"type":"string","description":"Unix timestamp in milliseconds, as a decimal string, marking when this call event occurred.","example":"1686073178976"},"theForkID":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant matching the dialled number (the toPhoneNumber on the telephony partner's side). Despite its name, this is TheFork's own unique identifier for the restaurant, not the partner's unique identifier.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"sendAllEvents":{"type":"boolean","description":"Whether to forward the initial call status when creating a new call record. Only affects the incoming event — it is not a general flag to receive every subsequent status update.","example":false}},"required":["callCallerId","callCallerIdValidPhone","callCurrentStatus","callDateMillis","theForkID"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"number","description":"Status code returned by the internal call-processing pipeline.","example":200}},"additionalProperties":{"nullable":true}}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/reservations":{"post":{"operationId":"postV1RestaurantsIdReservations","tags":["Booking flow","10"],"deprecated":false,"description":"Create a reservation at a restaurant, including the meal date, party size, and diner information.","summary":"Booking flow - Create reservation","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to create the reservation at.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to create the reservation at.","name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mealDate":{"type":"string","format":"date-time","description":"Date and time of the meal to book, in ISO 8601 format. If the value has no UTC offset, it is interpreted in the restaurant's local timezone. Must not be in the past at the time of the request.","example":"2026-09-15T19:30:00+02:00"},"partySize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of guests to book the reservation for.","example":2},"offerUuid":{"type":"string","format":"uuid","description":"Unique identifier of the offer to book the reservation against. Omit to book against normal stock, with no offer.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customerNote":{"type":"string","nullable":true,"maxLength":1000,"description":"Special request entered by the diner when making the reservation, such as a dietary requirement or an occasion.","example":"note by the customer"},"restaurantNote":{"type":"string","nullable":true,"maxLength":1000,"description":"Internal note about the reservation, intended for restaurant staff — for example a seating preference or service instruction. Limited to 1000 characters here; `GET /v1/reservations/{id}` may return a longer note if it was later edited elsewhere, up to 3000 characters.","example":"note by the restaurant"},"customer":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"Email address of the diner.","example":"john@example.com"},"firstName":{"type":"string","description":"First name of the diner.","example":"John"},"lastName":{"type":"string","description":"Last name of the diner.","example":"Doe"},"phone":{"type":"string","format":"phone","pattern":"^\\+[1-9]\\d{1,14}$","description":"Phone number in E.164 format: a leading + followed by the country code and subscriber number, with no spaces or separators.","example":"+33612345678"},"locale":{"type":"string","pattern":"^([a-z]{2,3})(?:_([A-Z]{2}))?$","description":"Locale of the diner, as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code.","example":"fr_FR"},"civility":{"type":"string","enum":["mr","mrs","ms","mr_and_mrs","mx","doctor","professor","counsel","ambassador","madam_ambassador","president","madam_president","magister","chef","lord","prince","princess","count","countess","duke","duchess","sir","lady","highness","baron","baroness","company"],"description":"Salutation used to address the diner.","example":"mr"},"optins":{"type":"object","properties":{"restaurantNewsletter":{"type":"boolean","default":false,"description":"Whether to opt the diner in to marketing communications by email during the reservation process. Opt-in is registered at the restaurant group level, so it also covers other restaurants in the same group. Setting this to true subscribes the diner; setting it to false has no effect and never unsubscribes them — this field cannot be used to withdraw consent.","example":true}},"default":{"restaurantNewsletter":false},"additionalProperties":false}},"required":["email","firstName","lastName","locale","civility"],"additionalProperties":false,"description":"Diner information used to create or link the customer profile for this reservation."}},"required":["mealDate","partySize","customer"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reservationUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant the reservation was made at.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the meal, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-03T18:10:17+01:00"},"mealStatus":{"type":"string","nullable":true,"description":"Diner's progress through the meal once seated. One of: `PARTIALLY_ARRIVED` (some guests in the party have arrived), `ARRIVED` (the diner has checked in), `SEATED` (the party has been seated at a table), `BILL` (the bill has been requested), `LEFT` (the party has left the restaurant). These statuses do not represent a fixed sequence — a reservation is not guaranteed to go through all of them, or in this order.","enum":["PARTIALLY_ARRIVED","ARRIVED","SEATED","BILL","LEFT"],"example":"ARRIVED"},"partySize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of guests the reservation is for.","example":2},"status":{"type":"string","description":"Current status of the reservation. One of: `RECORDED` (confirmed — the most common status), `CANCELED` (canceled by the diner or the restaurant), `NO_SHOW` (the diner did not show up for a confirmed reservation), `REQUESTED` (awaiting a decision from the restaurant, for on-request bookings or the waitlist — not yet confirmed), `REFUSED` (a requested reservation that the restaurant declined).","enum":["RECORDED","CANCELED","NO_SHOW","REQUESTED","REFUSED"],"example":"RECORDED"},"offerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the offer the reservation was booked against. Null when the reservation was made without an offer.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customerNote":{"type":"string","nullable":true,"description":"Special request entered by the diner when making the reservation, such as a dietary requirement or an occasion. May exceed the 1000-character limit enforced at creation time if it was edited afterwards.","example":"note by the customer"},"restaurantNote":{"type":"string","nullable":true,"description":"Internal note about the reservation, intended for restaurant staff — for example a seating preference or service instruction.","example":"note by the restaurant"},"customer":{"type":"object","nullable":true,"properties":{"customerUuid":{"type":"string","format":"uuid","description":"Unique identifier of the customer profile linked to this reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"email":{"type":"string","nullable":true,"format":"email","description":"Email address of the diner.","example":"john@example.com"},"firstName":{"type":"string","nullable":true,"description":"First name of the diner.","example":"John"},"lastName":{"type":"string","nullable":true,"description":"Last name of the diner.","example":"Doe"},"phone":{"type":"string","nullable":true,"description":"Phone number of the diner, as stored on their TheFork Manager profile. Not guaranteed to be in E.164 format.","example":"+33612345678"},"locale":{"type":"string","nullable":true,"pattern":"^([a-z]{2,3})(?:_([A-Z]{2}))?$","description":"Locale of the diner, as ll or ll_CC — a lowercase ISO 639-1 language code, optionally followed by an underscore and an uppercase ISO 3166-1 alpha-2 country code.","example":"fr_FR"},"civility":{"type":"string","nullable":true,"description":"Salutation used to address the diner (e.g. mr, mrs).","enum":["mr","mrs","ms","mr_and_mrs","mx","doctor","professor","counsel","ambassador","madam_ambassador","president","madam_president","magister","chef","lord","prince","princess","count","countess","duke","duchess","sir","lady","highness","baron","baroness","company"],"example":"mr"},"optins":{"type":"object","properties":{"restaurantNewsletter":{"type":"boolean","default":false,"description":"Whether the diner has opted in to marketing communications by email during the reservation process. Opt-in is registered at the restaurant group level, so it also covers other restaurants in the same group. Setting this to true subscribes the diner; setting it to false has no effect and never unsubscribes them — this field cannot be used to withdraw consent.","example":true}},"default":{"restaurantNewsletter":false},"additionalProperties":false}},"required":["customerUuid","email","firstName","lastName","phone","locale","civility"],"additionalProperties":false}},"required":["reservationUuid","restaurantUuid","mealDate","partySize","status","customer"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","enum":["NO_AVAILABILITY","PAYMENT_GUARANTEE_NOT_SUPPORTED"]},{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}]}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"409":{"description":"Error caused by a request that conflicts with the current state of a resource.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["DOUBLE_BOOKING"]}},"required":["code"]},"error":{"type":"string","enum":["Conflict"]},"statusCode":{"type":"number","enum":[409]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/integrationStatus":{"patch":{"operationId":"patchV1IntegrationStatus","tags":["Phone","18"],"deprecated":false,"description":"Report a telephony-hardware onboarding milestone for a restaurant. Reaching the final milestone additionally grants the calling phone partner ongoing access to the restaurant's group.","summary":"Phone - Update integration status","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to update the integration status for.","example":"cf5946cc-bde0-4cb1-bca5-7b59f66a5c94"},"status":{"type":"string","enum":["LeadReceived","DiscoveryOngoing","TypeformSent","FailedDiscovery","HardwareInTransit","FailedDelivery","HardwareToBeInstalled","FailedInstallation","InstallationCompleted"],"description":"Stage of the telephony-hardware onboarding to report. `TypeformSent` is treated the same as `DiscoveryOngoing`. Setting this to `InstallationCompleted` additionally links the calling phone partner to the restaurant's group, granting it ongoing access to the group's restaurants.","example":"LeadReceived"}},"required":["restaurantUuid","status"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code confirming the integration status update was applied.","example":200}},"required":["statusCode"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reservations/{id}/cancel":{"patch":{"operationId":"patchV1ReservationsIdCancel","tags":["Booking flow","12"],"deprecated":false,"description":"Cancel a reservation. The cancellation reason and source are always recorded as restaurant-initiated ('OTHER_REASON'), regardless of who requested it through this API. Returns 409 when the reservation has already been canceled.","summary":"Booking flow - Cancel reservation","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the reservation to cancel.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the reservation to cancel.","name":"id","in":"path"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reservationUuid":{"type":"string","format":"uuid","description":"Unique identifier of the reservation.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant the reservation was made at.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"mealDate":{"type":"string","nullable":true,"format":"date-time","description":"Date and time of the meal, in ISO 8601 format with the restaurant's UTC offset (yyyy-MM-ddTHH:mm:ss±HH:mm). Expressed in the restaurant's local timezone, not UTC.","example":"2022-01-03T18:10:17+01:00"},"partySize":{"type":"integer","minimum":1,"exclusiveMinimum":true,"description":"Number of guests the reservation was for.","example":2},"status":{"type":"string","description":"Current status of the reservation. `CANCELED` after a successful cancellation. One of: `RECORDED` (confirmed — the most common status), `CANCELED` (canceled by the diner or the restaurant), `NO_SHOW` (the diner did not show up for a confirmed reservation), `REQUESTED` (awaiting a decision from the restaurant, for on-request bookings or the waitlist — not yet confirmed), `REFUSED` (a requested reservation that the restaurant declined).","enum":["RECORDED","CANCELED","NO_SHOW","REQUESTED","REFUSED"],"example":"CANCELED"},"offerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the offer the reservation was booked against. Null when the reservation was made without an offer.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customerNote":{"type":"string","nullable":true,"description":"Special request entered by the diner when making the reservation, such as a dietary requirement or an occasion. May exceed the 1000-character limit enforced at creation time if it was edited afterwards.","example":"note by the customer"},"customerUuid":{"type":"string","nullable":true,"format":"uuid","description":"Unique identifier of the customer profile linked to this reservation. Null when the reservation has no linked customer, for example a walk-in.","example":"3fa85f64-5717-4562-b3fc-2c963f66afb3"}},"required":["reservationUuid","restaurantUuid","mealDate","partySize","status"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","enum":["CANCELLATION_ERROR"]},{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}]}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESERVATION_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"409":{"description":"Error caused by a request that conflicts with the current state of a resource.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["DOUBLE_CANCELLATION"]}},"required":["code"]},"error":{"type":"string","enum":["Conflict"]},"statusCode":{"type":"number","enum":[409]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/reviews/{id}/reply":{"put":{"operationId":"putV1ReviewsIdReply","tags":["Review flow","15"],"deprecated":false,"description":"Create or update the restaurant's reply to a review's published comment. The reply re-enters moderation and is not published immediately.","summary":"Review flow - Upsert review reply","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the review to update.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"required":true,"description":"Unique identifier of the review to update.","name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"description":"Text of the comment, as written by its author. May include escape sequences.","example":"Great food and service!"},"language":{"type":"string","nullable":true,"pattern":"^[a-z]{2,3}$","description":"ISO 639-1 language code the comment was written in.","example":"en"}},"required":["content","language"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"reviewUuid":{"type":"string","format":"uuid","description":"Unique identifier of the review.","example":"6f5fdab1-c91a-11ef-8d9e-0e8af7bd4d53"},"restaurantReply":{"type":"object","nullable":true,"properties":{"content":{"type":"string","minLength":1,"description":"Text of the comment, as written by its author. May include escape sequences.","example":"Great food and service!"},"language":{"type":"string","nullable":true,"pattern":"^[a-z]{2,3}$","description":"ISO 639-1 language code the comment was written in.","example":"en"},"publicationStatus":{"type":"string","description":"Moderation outcome for the comment. One of: `NOT_REVIEWED` (awaiting moderation), `PUBLISHED` (visible on the restaurant page), `WAITING_REFORMULATE` (returned to its author for rewrite), `REJECTED` (refused).","enum":["NOT_REVIEWED","REJECTED","PUBLISHED","WAITING_REFORMULATE","ARCHIVED","DELETED","UNDER_TRANSLATION"],"example":"PUBLISHED"},"createdTs":{"type":"string","format":"date-time","description":"Date and time when the comment was created, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"updatedTs":{"type":"string","format":"date-time","description":"Date and time when the comment was last updated, in ISO 8601 format, in UTC or with a UTC offset.","example":"2025-01-02T15:01:24.898Z"},"publishedTs":{"type":"string","nullable":true,"format":"date-time","description":"Date and time when the comment was published, in ISO 8601 format, in UTC or with a UTC offset. Null while the comment has not yet passed moderation.","example":"2025-01-02T15:08:58.208Z"},"moderationReason":{"type":"string","nullable":true,"description":"Reason a moderator assigned this publication status to the restaurant's reply. The prefix indicates the outcome: `REFORMULATE_REPLY_*` (returned to the restaurant for rewrite), `REJECT_REPLY_*` (refused). Null while the reply has not been moderated.","enum":["REFORMULATE_REPLY_IRRELEVANT_CONTENT","REFORMULATE_REPLY_PROFANITY","REFORMULATE_REPLY_INCORRECT_INFORMATION","REFORMULATE_REPLY_SPAM","REFORMULATE_REPLY_THREATENING_LANGUAGE","REFORMULATE_REPLY_CONFIDENTIAL_TF_INFO","REFORMULATE_REPLY_PRIVATE_DATA","REFORMULATE_REPLY_INAPROPRIATE_CONTENT","REFORMULATE_REPLY_NOT_COMPLIANT","REFORMULATE_REPLY_VIOLENCE","REFORMULATE_REPLY_DISCRIMINATORY","REFORMULATE_REPLY_RESTAURANT_REQUEST","REFORMULATE_REPLY_HARASSMENT_LANGUAGE","REFORMULATE_REPLY_INAUTHENTIC","REFORMULATE_REPLY_ALL_CAPS_UNINTELLIGIBLE_NON_ORIGINAL_CONTENT","REJECT_REPLY_NOT_COMPLIANT","REJECT_REPLY_REFORMULATION_PERIOD_ENDED","REJECT_REPLY_RESTAURANT_REQUEST"],"example":"REFORMULATE_REPLY_SPAM"}},"required":["content","language","publicationStatus","createdTs","updatedTs","publishedTs","moderationReason"],"additionalProperties":false,"description":"Restaurant's reply to the diner's comment. Null when the restaurant has not replied, or when the comment has no published content to reply to."}},"required":["reviewUuid","restaurantReply"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","enum":["REVIEW_HAS_NO_PUBLISHED_COMMENT"]},{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}]}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["REVIEW_NOT_FOUND","CUSTOMER_NOT_FOUND","RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}},"/v1/restaurants/{id}/availabilities/override":{"put":{"operationId":"putV1RestaurantsIdAvailabilitiesOverride","tags":["Booking flow","6"],"deprecated":false,"description":"Open or close a restaurant's online availability for a date and time range, by writing an exception to the underlying meal service's online pacing. Returns 200 without making any change when no meal service covers the requested time range.","summary":"Booking flow - Override availabilities","parameters":[{"schema":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant to override availability for.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"required":true,"description":"Unique identifier of the restaurant to override availability for.","name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"Calendar date to override availability for, interpreted in the restaurant's local timezone.","example":"2026-06-01"},"startTime":{"type":"string","description":"Wall-clock time of the first timeslot to open or close, in the restaurant's local timezone (HH:mm, inclusive).","example":"19:00"},"endTime":{"type":"string","description":"Wall-clock time of the last timeslot to open or close, in the restaurant's local timezone (HH:mm, inclusive). If omitted, applies only to startTime. The affected interval is [startTime, endTime + slot spacing), so the slot starting at endTime is included.","example":"21:30"},"isOpen":{"type":"boolean","default":false,"description":"Whether the targeted timeslots are opened (true) or closed (false) to online booking. Closing sets online pacing to 0 for those slots; opening restores the service default. Defaults to false (close) if omitted.","example":false}},"required":["date","startTime"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"restaurantUuid":{"type":"string","format":"uuid","description":"Unique identifier of the restaurant the override was applied to.","example":"c564869f-225a-4cb6-b124-2214a6216ec1"},"date":{"type":"string","format":"date","description":"Calendar date the override was applied to, in the restaurant's local timezone.","example":"2026-06-01"},"startTime":{"type":"string","description":"Wall-clock time of the first affected timeslot, in the restaurant's local timezone (HH:mm).","example":"19:00"},"endTime":{"type":"string","description":"Wall-clock time of the last affected timeslot, in the restaurant's local timezone (HH:mm).","example":"21:30"},"isOpen":{"type":"boolean","description":"Whether the targeted timeslots were opened (true) or closed (false) to online booking.","example":false}},"required":["restaurantUuid","date","startTime","endTime","isOpen"],"additionalProperties":false}}}},"400":{"description":"Error caused by the client app. Returned when the request is malformed, or a field does not respect the expected format.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","pattern":"^INVALID_[A-Z0-9_]+$"}},"required":["code"]},"error":{"type":"string","enum":["Bad Request"]},"statusCode":{"type":"number","enum":[400]}},"required":["data","error","statusCode"]}}}},"401":{"description":"Error caused by an invalid or expired access token. May also be returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":[""]}},"required":["code"]},"error":{"type":"string","enum":["Unauthorized"]},"statusCode":{"type":"number","enum":[401]}},"required":["data","error","statusCode"]},{"type":"object","properties":{"message":{"type":"string","enum":["Unauthorized"]}},"required":["message"]}]}}}},"403":{"description":"Error caused by a client app missing the required scope for this endpoint. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Forbidden"]}},"required":["message"]}}}},"404":{"description":"Error caused by a reference to a resource that does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["RESTAURANT_NOT_FOUND"]}},"required":["code"]},"error":{"type":"string","enum":["Not Found"]},"statusCode":{"type":"number","enum":[404]}},"required":["data","error","statusCode"]}}}},"429":{"description":"Error caused by too many requests sent in a given amount of time. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Too Many Requests"]}},"required":["message"]}}}},"500":{"description":"Unexpected error on the server side. This may be due to a software fault.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"code":{"type":"string","enum":["INTERNAL_SERVER_ERROR"]}},"required":["code"]},"error":{"type":"string","enum":["Internal Server Error"]},"statusCode":{"type":"number","enum":[500]}},"required":["data","error","statusCode"]}}}},"503":{"description":"Error caused by the service being temporarily unavailable. Returned by the API gateway, before the request reaches this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","enum":["Service Unavailable"]}},"required":["message"]}}}}}}}},"security":[{"oauth2ClientCredentials":[]}]}