Skip to content

Ferramentas para busca de disponibilidade

API Endpoints

DEV: http://localhost:8080

PROD: https://api.theifriend.com

Cenário experiencia sem variação

tool disponibilidade calendario

GET /experiences/{id}/availability/{monthYear}

{monthYear} usado no formato YYYY-MM exemplo 2025-01 para janeiro

Response:

[
  "2025-11-01",
  "2025-11-02",
  "2025-11-03",
  "2025-11-04",
  "2025-11-05",
  "2025-11-06",
  "2025-11-07"
]

tool disponibilidade de horário no dia

GET /experiences/{id}/availability/{day}/hours

Response:

[
  "10:00",
  "14:00",
  "16:00"
]

tool obter valor atualizado dado que tem o dia e horario para o tour

POST /bookings/price

Request body:

{
  "product": "experience",
  "productId": 2,
  "customerId": 7,
  "context": {
    "dates": [
      {
        "day": "2025-11-21",
        "hours": 2,
        "period": "10:00",
        "numAdult": 1,
        "numChild": 0,
        "numHalfPrice": 0,
        "isIfriendCar": true
      }
    ]
  }
}

Response:

{
  "currencyCode": "USD",
  "total": 176,
  "total_per_adult": 176,
  "total_without_tax": 176,
  "total_per_adult_without_tax": 176,
  "down_payment_price": 0,
  "total_down_payment_price": 0,
  "tariff_item": null,
  "taxes": {
    "service": 0
  },
  "affiliate": {
    "comission": null,
    "taxType": null
  },
  "coupon": {
    "code": null,
    "type": null,
    "amount": null,
    "amountCurrencyCode": null
  },
  "contextData": {
    "dates": [
      {
        "day": "2025-11-21",
        "hours": 2,
        "period": "10:00",
        "numAdult": 1,
        "numChild": 0,
        "numHalfPrice": 0,
        "isIfriendCar": true
      }
    ]
  }
}

Cenário experiencia com variação

Para saber se uma experiencia é do tipo que tem variação antes execute a chamada

GET /experiences/{product_id}

Response:

{
  "experienceVariations": [
    "/experience_variations/129363"
  ]
}

Olhe o campo experienceVariations se ele não for vazio é um produto que tem que executar o cenário com variação.

Passo 1. Obter variações na data informada

Se não foi obtida data do contexto não incluir o parâmetro availableAt, nesse caso para saber se uma experiencia é com variação o resultado irá indicar

GET /experience_variations?experience.id=401&availableAt=2025-11-20

Response:

[
  {
    "id": 129363,
    "name": "Tour completo na Catedral da S\u00e9 de S\u00e3o Paulo",
    "description": "De 1-20 pessoas ",
    "mode": "person",
    "type": "shared",
    "experience": "/experiences/401",
    "experienceTariffs": [
      {
        "id": 129573,
        "name": "Tour completo na Catedral da S\u00e9 de S\u00e3o Paulo",
        "experience": "/experiences/401",
        "experienceTariffItems": [
          {
            "id": 392341,
            "dateIni": "2025-10-24T00:00:00+00:00",
            "dateEnd": "2027-12-31T00:00:00+00:00",
            "currencyCode": "BRL",
            "priceNet": "60.00",
            "price": "66.67",
            "experience": "/experiences/401"
          }
        ]
      }
    ],
    "experienceAgePolicies": [
      {
        "id": 335592,
        "name": "Adulto",
        "ageFrom": 11,
        "ageTo": 99,
        "discountPercent": "0.00",
        "experience": "/experiences/401"
      },
      {
        "id": 335593,
        "name": "Beb\u00ea",
        "ageFrom": 0,
        "ageTo": 10,
        "discountPercent": "100.00",
        "experience": "/experiences/401"
      }
    ],
    "sharedMinPax": 1,
    "sharedMaxPax": 20,
    "providerSku": null
  }
]

Passo 2. Mostrar as variações obtidas para o usuário escolher qual gostaria, para calcular os preços das variações use

POST /bookings/price

Request:

{
  "product":"experience",
  "productId":401,
  "customerId":null,
  "context":{
    "dates":[
      {
        "day":"2025-11-20",
        "hours":2,
        "period":"14:00",
        "isIfriendCar":false,
        "participants":{
          "adulto":1,
          "bebê":0
        },
        "date":"2025-11-20T00:00:00.000Z"
      }
    ],
    "variations":[
      {
        "id":129363,
        "quantity":1,
        "name":"Tour completo na Catedral da Sé de São Paulo",
        "agePolicies":[
          {
            "id":335592,
            "name":"Adulto",
            "quantity":1
          }
        ],
        "allowPaxQuantity":true
      }
    ]
  },
  "coupon":null,
  "affiliateId":null,
  "taxType":"gross"
}

Response:

{
    "currencyCode": "USD",
    "total": 13.02,
    "total_per_adult": 13.02,
    "total_without_tax": 13.02,
    "total_per_adult_without_tax": 13.02,
    "down_payment_price": 0,
    "total_down_payment_price": 0,
    "tariff_item": null,
    "taxes": {
        "service": 2.6
    },
    "affiliate": {
        "comission": null,
        "taxType": null
    },
    "coupon": {
        "code": null,
        "type": null,
        "amount": null,
        "amountCurrencyCode": null
    },
    "contextData": {
        "dates": [
            {
                "day": "2025-11-20",
                "hours": 2,
                "period": "14:00",
                "isIfriendCar": false,
                "participants": {
                    "adulto": 1,
                    "beb\u00ea": 0
                },
                "date": "2025-11-20T00:00:00.000Z"
            }
        ],
        "variations": [
            {
                "id": 129363,
                "quantity": 1,
                "name": "Tour completo na Catedral da S\u00e9 de S\u00e3o Paulo",
                "agePolicies": [
                    {
                        "id": 335592,
                        "name": "Adulto",
                        "quantity": 1
                    }
                ],
                "allowPaxQuantity": true,
                "tariff_item": {
                    "id": 392341,
                    "dateIni": "2025-10-24T00:00:00+00:00",
                    "dateEnd": "2027-12-31T00:00:00+00:00",
                    "currencyCode": "BRL",
                    "priceNet": "60.00",
                    "price": "66.67",
                    "experienceTariff": "\/experience_tariffs\/129573",
                    "experience": "\/experiences\/401",
                    "experienceVariation": null,
                    "experienceTransfer": null
                }
            }
        ]
    }
}