Pular para o conteúdo principal

Experience Webhook

Última atualização Há 9 meses

Pré-requisitos

Antes de criar o webhook na sua aplicação deve ter um endpoint que possa ser acedido pelo TourOS.
O endpoint deve ser do método POST e deve aceitar JSON como formato de entrada.
O seu endpoint também deverá estar preparado para verificar a autenticidade do webhook via um token que deverá ser verificado e que encontrará ao criar o webhook no TourOS.

Estrutura do Payload

Payload experience.created, experience.updated

{
   "id":"01KFDATY7SG552YSM40TQ6GQ4Z",
   "type":"experience.updated",
   "version":"2025-10-06",
   "created_at":"2026-01-20T09:12:40+00:00",
   "data":{
      "experience": {
        "id": 1,
        "status": "active",
        "type": {
          "id": 1,
          "name": "Tours"
        },
        "ref": "PVZ-BEIRAMAR-EXP",
        "title": "Passeio à Beira-Mar na Póvoa de Varzim – Natureza, Relaxamento e Aventura",
        "introduction": "<p>Descubra a beleza da P&oacute;voa de Varzim com um passeio &agrave; beira-mar repleto de experi&ecirc;ncias &uacute;nicas! Caminhe ao longo da costa, respire o ar fresco do oceano e aproveite atividades como ciclismo, yoga na praia ou at&eacute; mesmo um emocionante passeio de stand-up paddle. Relaxe, divirta-se e sinta a energia do mar num cen&aacute;rio deslumbrante!</p>",
        "highlights": "<p class=\"\" data-start=\"0\" data-end=\"152\">🌊 <strong data-start=\"3\" data-end=\"30\">Paisagens Deslumbrantes</strong> &ndash; Desfrute de um passeio &agrave; beira-mar com vistas incr&iacute;veis do Oceano Atl&acirc;ntico e das praias douradas da P&oacute;voa de Varzim.</p>\r\n<p class=\"\" data-start=\"154\" data-end=\"315\">🚴 <strong data-start=\"157\" data-end=\"182\">Atividades para Todos</strong> &ndash; Escolha entre caminhadas relaxantes, passeios de bicicleta pela orla, yoga na praia ou aventuras aqu&aacute;ticas como stand-up paddle.</p>\r\n<p class=\"\" data-start=\"317\" data-end=\"473\">🌅 <strong data-start=\"320\" data-end=\"346\">Momentos Inesquec&iacute;veis</strong> &ndash; Sinta a brisa do mar, aproveite o p&ocirc;r do sol espetacular e conecte-se com a natureza num ambiente tranquilo e revigorante.</p>\r\n<p class=\"\" data-start=\"475\" data-end=\"625\">🍽️ <strong data-start=\"479\" data-end=\"510\">Experi&ecirc;ncia Local Aut&ecirc;ntica</strong> &ndash; Termine o passeio com uma degusta&ccedil;&atilde;o de iguarias t&iacute;picas num caf&eacute; &agrave; beira-mar, saboreando a gastronomia local.</p>\r\n<p class=\"\" data-start=\"627\" data-end=\"757\">📸 <strong data-start=\"630\" data-end=\"665\">Perfeito para Registar Mem&oacute;rias</strong> &ndash; Cen&aacute;rios incr&iacute;veis para fotografias inesquec&iacute;veis, seja em fam&iacute;lia, com amigos ou a dois!</p>",
        "description": "<article class=\"w-full text-token-text-primary\" dir=\"auto\" data-testid=\"conversation-turn-12\" data-scroll-anchor=\"true\">\r\n<div class=\"text-base my-auto mx-auto py-5 px-6\">\r\n<div class=\"mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl lg:max-w-[40rem] xl:max-w-[48rem] group/turn-messages focus-visible:outline-none\" tabindex=\"-1\">\r\n<div class=\"group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4\">\r\n<div class=\"relative flex-col gap-1 md:gap-3\">\r\n<div class=\"flex max-w-full flex-col flex-grow\">\r\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"92b2aba0-741b-4d07-940c-a4b7378ff3db\" data-message-model-slug=\"gpt-4o\">\r\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\r\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\r\n<p class=\"\" data-start=\"0\" data-end=\"132\">Prepare-se para uma experi&ecirc;ncia inesquec&iacute;vel &agrave; beira-mar na P&oacute;voa de Varzim, onde o oceano Atl&acirc;ntico ser&aacute; o seu cen&aacute;rio principal!</p>\r\n<p class=\"\" data-start=\"134\" data-end=\"450\">A aventura come&ccedil;a com um passeio tranquilo ao longo da marginal, onde poder&aacute; sentir a brisa fresca do mar e admirar as deslumbrantes vistas costeiras. Durante o percurso, ter&aacute; a op&ccedil;&atilde;o de caminhar, pedalar ou at&eacute; mesmo experimentar um passeio de stand-up paddle para uma perspetiva &uacute;nica da cidade a partir da &aacute;gua.</p>\r\n<p class=\"\" data-start=\"452\" data-end=\"731\">Se preferir um momento de relaxamento, poder&aacute; participar numa sess&atilde;o revigorante de yoga na praia, ideal para renovar energias ao som das ondas. Haver&aacute; tamb&eacute;m tempo para explorar os ic&oacute;nicos molhes da P&oacute;voa, onde pescadores locais mant&ecirc;m vivas as tradi&ccedil;&otilde;es mar&iacute;timas da regi&atilde;o.</p>\r\n<p class=\"\" data-start=\"733\" data-end=\"947\">Para tornar a experi&ecirc;ncia ainda mais especial, o passeio inclui uma pausa num caf&eacute; &agrave; beira-mar, onde poder&aacute; saborear iguarias t&iacute;picas como as famosas rabanadas poveiras ou um caf&eacute; acompanhado de um doce regional.</p>\r\n<p class=\"\" data-start=\"949\" data-end=\"1197\">Quer esteja &agrave; procura de aventura, tranquilidade ou apenas um momento especial junto ao mar, esta experi&ecirc;ncia foi criada para proporcionar momentos &uacute;nicos e memor&aacute;veis. Traga o seu esp&iacute;rito de descoberta e venha viver a ess&ecirc;ncia da P&oacute;voa de Varzim!</p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n<div class=\"mt-3 w-full empty:hidden\">&nbsp;</div>\r\n</div>\r\n<div class=\"absolute\">&nbsp;</div>\r\n</div>\r\n</div>\r\n</div>\r\n</article>",
        "isOnRequest": false,
        "regions": [
          {
            "id": 1,
            "name": "Douro",
            "slug": "portugal-douro",
            "country": {
              "id": "PT",
              "name": "Portugal"
            }
          },
          {
            "id": 2,
            "name": "Guimarães",
            "slug": "portugal-guimaraes",
            "country": {
              "id": "PT",
              "name": "Portugal"
            }
          }
        ],
        "address": "Avenida De Londres, 4835-066 Guimarães, Braga, Portugal",
        "inclusions": "<p>✔ Passeio guiado &agrave; beira-mar com vistas incr&iacute;veis da costa da P&oacute;voa de Varzim.<br data-start=\"78\" data-end=\"81\">✔ Escolha entre caminhada, passeio de bicicleta ou stand-up paddle.<br data-start=\"148\" data-end=\"151\">✔ Sess&atilde;o opcional de yoga na praia para relaxamento e bem-estar.<br data-start=\"215\" data-end=\"218\">✔ Paragem num caf&eacute; &agrave; beira-mar com degusta&ccedil;&atilde;o de iguarias locais.<br data-start=\"283\" data-end=\"286\">✔ Acompanhamento por um guia experiente para uma experi&ecirc;ncia aut&ecirc;ntica e envolvente.</p>",
        "exclusions": "<p>❌ Transporte de e para o ponto de encontro (dispon&iacute;vel mediante pedido com custo adicional).<br data-start=\"92\" data-end=\"95\">❌ Despesas pessoais, como compras ou consumos extra no caf&eacute;.<br data-start=\"155\" data-end=\"158\">❌ Equipamento extra para atividades espec&iacute;ficas (ex.: roupa de banho para stand-up paddle).<br data-start=\"249\" data-end=\"252\">❌ Seguro pessoal para atividades aqu&aacute;ticas (recomenda-se seguro de lazer ou viagem).<br data-start=\"336\" data-end=\"339\">❌ Atividades opcionais fora do itiner&aacute;rio programado.</p>",
        "guide": {
          "type": "staff_interaction",
          "guide": [
            "tour-guide",
            "host-or-greeter",
            "instructor",
            "driver"
          ]
        },
        "cancellationPolicy": [
          {
            "time": {
              "amount": 15,
              "unit": "weeks"
            },
            "percentage": 15
          }
        ],
        "itinerary": [
          {
            "time": "10:00",
            "title": "Comer bola de berlim",
            "description": "<p>Comer bolas de berlim na praia</p>",
            "address": null,
            "latitude": null,
            "longitude": null,
            "duration": {
              "amount": 5,
              "type": "minutes"
            }
          },
          {
            "time": "11:00",
            "title": "Apanha de conchas",
            "description": "<p>Apanha de conchas na praia.</p>",
            "address": null,
            "latitude": null,
            "longitude": null,
            "duration": {
              "amount": 1,
              "type": "hours"
            }
          },
          {
            "time": "11:10",
            "title": "Apanhar caranguejos",
            "description": "<p>Apanhar caranguejos nas rochas</p>",
            "address": null,
            "latitude": null,
            "longitude": null,
            "duration": {
              "amount": 1,
              "type": "hours"
            }
          }
        ],
        "extra": {
          "additionalInformation": "<article class=\"w-full text-token-text-primary\" dir=\"auto\" data-testid=\"conversation-turn-18\" data-scroll-anchor=\"true\">\r\n<div class=\"text-base my-auto mx-auto py-5 px-6\">\r\n<div class=\"mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl lg:max-w-[40rem] xl:max-w-[48rem] group/turn-messages focus-visible:outline-none\" tabindex=\"-1\">\r\n<div class=\"group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4\">\r\n<div class=\"relative flex-col gap-1 md:gap-3\">\r\n<div class=\"flex max-w-full flex-col flex-grow\">\r\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"b7326434-32bd-49c4-9640-fd8ea2e4a262\" data-message-model-slug=\"gpt-4o\">\r\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\r\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\r\n<p class=\"\" data-start=\"0\" data-end=\"496\"><strong data-start=\"46\" data-end=\"70\">N&iacute;vel de dificuldade</strong>: F&aacute;cil, adequado para todas as idades.<br data-start=\"109\" data-end=\"112\">🔹 <strong data-start=\"115\" data-end=\"130\">O que levar</strong>: Roupa confort&aacute;vel, protetor solar, chap&eacute;u e, se optar por atividades aqu&aacute;ticas, toalha e muda de roupa.<br data-start=\"235\" data-end=\"238\">🔹 <strong data-start=\"241\" data-end=\"251\">Idioma</strong>: Experi&ecirc;ncia dispon&iacute;vel em portugu&ecirc;s e ingl&ecirc;s.<br data-start=\"298\" data-end=\"301\">🔹 <strong data-start=\"304\" data-end=\"332\">Pol&iacute;tica de cancelamento</strong>: Cancelamento gratuito at&eacute; 24 horas antes da atividade.<br data-start=\"388\" data-end=\"391\">🔹 <strong data-start=\"394\" data-end=\"422\">Condi&ccedil;&otilde;es meteorol&oacute;gicas</strong>: Em caso de mau tempo, a experi&ecirc;ncia poder&aacute; ser remarcada ou reembolsada.</p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n<div class=\"mt-3 w-full empty:hidden\">&nbsp;</div>\r\n</div>\r\n<div class=\"absolute\">&nbsp;</div>\r\n</div>\r\n</div>\r\n</div>\r\n</article>",
          "sustainability": null,
          "accessibility": {
            "text": null,
            "wheelchairAccessible": false
          },
          "faqs": []
        },
        "meta": {
          "slug": "passeio-povoa",
          "title": "passeio-povoa",
          "description": "Viva uma experiência única à beira-mar na Póvoa de Varzim!",
          "keywords": [
            "passeio",
            "povoa"
          ],
          "image": "https://touros-ems.test/storage/experiences/seo/Captura de ecrã 2025-04-29 163816.png"
        },
        "options": [
          {
            "id": 40,
            "languages": [
              "en"
            ],
            "pickup": {
              "enabled": false,
              "type": null,
              "pickups": null
            },
            "arrival": {
              "amount": 0,
              "unit": "minutes"
            },
            "duration": {
              "type": "fixed",
              "amount": 2,
              "unit": "hours"
            },
            "startTimes": [
              {
                "start": "00:00:00",
                "end": null
              }
            ]
          },
          {
            "id": 41,
            "languages": [
              "pt"
            ],
            "pickup": {
              "enabled": true,
              "type": "location",
              "pickups": [
                {
                  "id": "10ef6158-dfbf-48ba-a8f3-e5d7e7559359",
                  "localType": "bus_or_train_station",
                  "address": "R. da Restauração 210",
                  "postalCode": "4710-428",
                  "city": "Braga",
                  "district": null,
                  "countryId": "PT",
                  "latitude": 41.55150272,
                  "longitude": -8.41488337,
                  "createdAt": "2025-11-27T12:22:18.000000Z",
                  "updatedAt": "2025-11-27T12:22:18.000000Z"
                },
                {
                  "id": "1432f3df-4af8-474a-ba5c-6e27e59c9bb0",
                  "localType": "other",
                  "address": "Rua Do Colégio Militar",
                  "postalCode": "4400-420",
                  "city": "Vila Nova de Gaia",
                  "district": "Porto",
                  "countryId": "PT",
                  "latitude": null,
                  "longitude": null,
                  "createdAt": "2024-11-29T18:10:11.000000Z",
                  "updatedAt": "2024-11-29T18:10:11.000000Z"
                }
              ]
            },
            "arrival": {
              "amount": 0,
              "unit": "minutes"
            },
            "duration": {
              "type": "fixed",
              "amount": 45,
              "unit": "minutes"
            },
            "startTimes": [
              {
                "start": "13:00:00",
                "end": null
              },
              {
                "start": "18:00:00",
                "end": null
              },
              {
                "start": "21:00:00",
                "end": null
              },
              {
                "start": "22:00:00",
                "end": null
              }
            ]
          },
          {
            "id": 62,
            "languages": [
              "de"
            ],
            "pickup": {
              "enabled": true,
              "type": "zone",
              "pickups": [
                {
                  "id": "41037f0c-65cf-4ad4-993c-a01477fe2c05",
                  "internalName": "Guimarães",
                  "address": "Rua Colégio Militar",
                  "postalCode": "4835-039",
                  "city": "Guimarães",
                  "district": "Braga",
                  "countryId": "PT",
                  "latitude": 41.438109,
                  "longitude": -8.299976,
                  "radius": "5.50",
                  "createdAt": "2025-01-14T12:14:26.000000Z",
                  "updatedAt": "2025-09-03T16:41:56.000000Z"
                }
              ]
            },
            "arrival": {
              "amount": 30,
              "unit": "minutes"
            },
            "duration": {
              "type": "fixed",
              "amount": 45,
              "unit": "minutes"
            },
            "startTimes": [
              {
                "start": "13:00:00",
                "end": null
              },
              {
                "start": "18:00:00",
                "end": null
              },
              {
                "start": "21:00:00",
                "end": null
              },
              {
                "start": "22:00:00",
                "end": null
              }
            ]
          }
        ],
        "prices": {
          "price": 30,
          "special": null,
          "currency": "EUR"
        },
        "images": [
          {
            "width": 720,
            "height": 600,
            "extension": "jpg",
            "filetype": "image/jpeg",
            "size": 298758,
            "filename": "1743092059_snack-enologo-notaprovas-1.jpg",
            "url": "https://touros-ems.test/storage/experiences/1743092059_snack-enologo-notaprovas-1.jpg",
            "alt": null
          },
          {
            "width": 2048,
            "height": 2048,
            "extension": "jpg",
            "filetype": "image/jpeg",
            "size": 449633,
            "filename": "1743092064_photo-2mb.jpg",
            "url": "https://touros-ems.test/storage/experiences/1743092064_photo-2mb.jpg",
            "alt": null
          },
          {
            "width": 720,
            "height": 600,
            "extension": "jpg",
            "filetype": "image/jpeg",
            "size": 298758,
            "filename": "1743092097_snack-enologo-notaprovas-1.jpg",
            "url": "https://touros-ems.test/storage/experiences/1743092097_snack-enologo-notaprovas-1.jpg",
            "alt": null
          },
          {
            "width": 2048,
            "height": 2048,
            "extension": "jpg",
            "filetype": "image/jpeg",
            "size": 449633,
            "filename": "1743092124_photo-2mb.jpg",
            "url": "https://touros-ems.test/storage/experiences/1743092124_photo-2mb.jpg",
            "alt": null
          }
        ],
        "videos": []
      }
   }
}

Payload experience.deleted

{
  "id": "01KFDATY7SG552YSM40TQ6GQ4Z",
  "type": "experience.deleted",
  "version": "2025-10-06",
  "created_at": "2026-01-20T09:12:40+00:00",
  "data": {
    "experience": {
      "id": 1,
      "ref": "PVZ-BEIRAMAR-EXP"
    }
  }
}

Campos do Payload

Campo

Tipo

Descrição

id

string

ID do registo da chamada no TourOS

type

string

Tipo/Evento da chamada (experience.created, experience.updated, experience.deleted)

version

string

Versão da API (que pode ser alterado no webhook do TourOS)

created_at

string

Data e Hora da criação do pedido

data

objeto

Dados do webhook

experience

objeto

Dados da experiência do TourOS. A estrutura é igual ao que pode ser encontrado na documentação do endpoint da API.


Configuração no TourOS

Agora vamos configurar o TourOS para enviar as informações para o URL da sua plataforma.

  1. Aceda à sua conta TourOS

  2. Clique no seu Avatar (canto inferior esquerdo) e selecione Configurações

  3. No menu, navegue até Ligações e selecione Webhooks

  4. Clique em Criar Webhook

  5. No campo URL, cole o link para o endpoint da sua plataforma

  6. No campo Versão da API seleciona sempre a versão mais recente da lista

  7. Na seleção de Eventos, escolha as opções que pretende utilizar dentro da categoria Experiência:

    • Experiência criada

    • Experiência atualizada

    • Experiência apagada

  8. Clique em Adicionar.

  9. Após guardar, abra novamente o Webhook que acabou de criar e copie a Secret Key (o código que começa por whsec_...).


Finalizar a ligação

Para terminar deve adicionar a Secret Key que recebeu e validar com ele no seu endpoint. Pode guardar o token em variáveis de ambiente mas evitar expor no código da sua plataforma.

Isso foi útil?