LaFourchette · AsyncAPI Specification

Lafourchette Webhooks

Version

View Spec View on GitHub CompanyConsumerRestaurantReservationsBookingHospitalityPoint-of-SaleReviewsMarketplaceTravel and DiningWebhookFranceAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-17'
method: searched
source: https://docs.thefork.io/B2B-API/event-webhook-flow
spec_type: none
asyncapi_published: false
note: >-
  TheFork runs two distinct push surfaces and publishes no AsyncAPI for either. The B2B webhook flow
  pushes entity-change events to a partner CRM; the POS flow pushes an order-open call to the POS
  vendor's own endpoint. Both are documented in prose with real JSON examples, captured verbatim
  below. Registration is manual on both: there is no subscription API, no event-type filter, no
  signature header and no published retry/backoff schedule — the partner emails TheFork a URL with a
  token embedded in the query string, and that token IS the authentication for B2B events.
surfaces:
- name: B2B entity events
  api: TheFork B2B API
  direction: thefork -> partner
  docs: https://docs.thefork.io/B2B-API/event-webhook-flow
  transport: HTTPS POST
  registration: manual — partner supplies an endpoint URL with a self-generated token in the query string to TheFork
  authentication: shared secret carried as a query-string token on the partner's own URL
  signature: none published
  payload_shape: '{ entityType, eventType, uuid, groupUuid, restaurantUuid?, reservationUuid? }'
  ack_contract: >-
    Respond HTTP 200 with {"data":{}} within a few seconds; TheFork retries automatically on timeout.
    Process asynchronously after acknowledging.
  delivery_semantics: at-least-once (automatic retry on timeout; no published retry schedule or max attempts)
  pattern: >-
    Thin events. The payload carries only the entity UUID and the event type — the partner must call
    the matching B2B GET operation to fetch the changed record.
  events:
  - entity: customer
    event_type: customerCreated
    fields: [entityType, eventType, uuid, groupUuid]
    follow_up_operation: getV1CustomersId
  - entity: customer
    event_type: customerUpdated
    fields: [entityType, eventType, uuid, groupUuid]
    follow_up_operation: getV1CustomersId
  - entity: reservation
    event_type: reservationCreated
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid]
    follow_up_operation: getV1ReservationsId
  - entity: reservation
    event_type: reservationUpdated
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid]
    follow_up_operation: getV1ReservationsId
  - entity: review
    event_type: reviewRatingCreated
    description: a new rating is submitted, with or without a pending comment
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid, reservationUuid]
    follow_up_operation: getV1ReviewsId
  - entity: review
    event_type: reviewCommentPublished
    description: a guest comment is officially published
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid, reservationUuid]
    follow_up_operation: getV1ReviewsId
  - entity: review
    event_type: reviewCommentUnpublished
    description: a published comment goes to moderation or is unpublished
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid, reservationUuid]
    follow_up_operation: getV1ReviewsId
  - entity: review
    event_type: reviewValidityChanged
    description: rare; typically a GDPR data-deletion request
    fields: [entityType, eventType, uuid, groupUuid, restaurantUuid, reservationUuid]
    follow_up_operation: getV1ReviewsId
  example: |
    {
      "entityType": "reservation",
      "eventType": "reservationCreated",
      "uuid": "a288660b-94e9-4702-936f-9c7caec0cdd4",
      "groupUuid": "c1fa3225-690d-4b86-b255-042b3c218b68",
      "restaurantUuid": "565426e9-a7d9-4123-8d9b-94275483fcf9"
    }
- name: POS order-open callback
  api: TheFork POS API v1
  direction: thefork -> POS vendor
  docs: https://docs.thefork.io/POS-API/Flow/create-order
  transport: HTTPS POST to the receiptOpeningUrl registered via postV1Create
  registration: field receiptOpeningUrl on the POST /v1/create request body
  authentication: 'Authorization: Bearer <oauthClientSecret> (secret the POS vendor generates and registers)'
  routing_header: 'CustomerId: TheFork restaurant UUID'
  trigger: a diner is marked ARRIVED or SEATED in TheFork Manager
  payload_shape: a single order object, or an array of order objects
  pattern: >-
    Fat events. Unlike the B2B flow, the POS callback carries the whole order — customer profile with
    allergies, dietary restrictions and seating preferences, meal date and start time, party size,
    reservation status, meal status, offer/preset-menu detail, loyalty amount and prepayment.
  reply_operation: putV1OrdersOrderuuid (POS closes the order back to TheFork with lines, currency and total)
  enums:
    reservationStatus: [RECORDED, CONFIRMED, CANCELED, NO_SHOW, REQUESTED, REFUSED, REJECTED]
    mealStatus: [CONFIRMED, ARRIVED, SEATED, PARTIALLY_ARRIVED, BILL, LEFT]
  deprecated_fields: [customerName, customerUuid, offerName, updatedAt]
gaps:
  asyncapi_document: not published
  event_catalog_page: not published (events documented inline on one page)
  signature_verification: none
  replay_or_backfill: none
  subscription_api: none
x-evidence:
- url: https://docs.thefork.io/B2B-API/event-webhook-flow
  status: 200
- url: https://docs.thefork.io/POS-API/Flow/create-order
  status: 200
- url: https://docs.thefork.io/POS-API/Flow/close-order
  status: 200