Best Time To Book Hotels Booking Timing API

When to book, from observed prices.

Operations 2

GET /api/booking-advice Booking advice for a city and a specific stay #
GET /api/hotel-booking-lead-time Search or read the booking lead-time study #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/besttimetobookhotels-com:besttimetobookhotels-com-booking-timing-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

besttimetobookhotels-com-booking-timing-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Best Time To Book Hotels Public Booking Timing API
  version: 1.0.0
  summary: Read-only JSON access to hotel booking-timing research, last-minute deal history, and agent-readable Markdown.
  description: 'Free, unauthenticated, read-only endpoints backed by the same price-observation

    dataset that powers the site. Every response describes observed historical prices,

    not a forecast for a specific stay.


    There is no API key. Requests are rate limited per client IP (60 requests per

    minute per endpoint); exceeding the limit returns 429 with `Retry-After`.


    Conversational access to the same data is available through the MCP server at

    /api/mcp, described separately by /server.json.'
  contact:
    name: Best Time To Book Hotels
    url: https://www.besttimetobookhotels.com/docs/api
servers:
- url: https://www.besttimetobookhotels.com
security: []
tags:
- name: booking-timing
  description: When to book, from observed prices.
paths:
  /api/booking-advice:
    get:
      tags:
      - booking-timing
      operationId: getBookingAdvice
      summary: Booking advice for a city and a specific stay
      description: 'Combines the city''s current price trend with observed booking-date history for the requested stay. Returns `advice: null` when the stay has too little observed history to say anything.'
      parameters:
      - name: citySlug
        in: query
        required: true
        description: City slug as used on /cities/{citySlug}, e.g. `paris`.
        schema:
          type: string
        example: paris
      - name: countrySlug
        in: query
        required: true
        description: Country slug for the city, e.g. `france`.
        schema:
          type: string
        example: france
      - name: checkIn
        in: query
        required: true
        description: Check-in date.
        schema:
          $ref: '#/components/schemas/IsoDate'
      - name: checkOut
        in: query
        required: false
        description: Check-out date. Dropped when it is not strictly after `checkIn`.
        schema:
          $ref: '#/components/schemas/IsoDate'
      - name: locale
        in: query
        required: false
        description: Locale for generated advice copy. Defaults to `en`.
        schema:
          type: string
          default: en
      responses:
        '200':
          description: Advice for the stay, or `null` when history is too thin.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CachedResponse'
          content:
            application/json:
              schema:
                type: object
                required:
                - advice
                properties:
                  advice:
                    oneOf:
                    - $ref: '#/components/schemas/BookingAdvice'
                    - type: 'null'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
  /api/hotel-booking-lead-time:
    get:
      tags:
      - booking-timing
      operationId: exploreBookingLeadTime
      summary: Search or read the booking lead-time study
      description: Backs the explorer in the booking lead-time guide. Pass exactly one of `q` (typeahead search over cities and hotels) or `id` (a record returned by that search). A `q` shorter than two characters returns an empty suggestion list rather than an error.
      parameters:
      - name: q
        in: query
        required: false
        description: Search text. Mutually exclusive with `id`.
        schema:
          type: string
        example: lisbon
      - name: id
        in: query
        required: false
        description: Record id from a previous search. Mutually exclusive with `q`.
        schema:
          type: string
      responses:
        '200':
          description: Suggestions for `q`, or the single record for `id`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CachedResponse'
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  required:
                  - suggestions
                  properties:
                    suggestions:
                      type: array
                      items:
                        $ref: '#/components/schemas/LeadTimeSuggestion'
                - type: object
                  required:
                  - record
                  properties:
                    record:
                      $ref: '#/components/schemas/LeadTimeRecord'
        '400':
          description: Neither or both of `q` and `id` were supplied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  responses:
    RateLimited:
      description: Per-IP rate limit exceeded.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
        X-RateLimit-Reset:
          description: Unix time in seconds when the current window resets.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: No data matches the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServerError:
      description: The endpoint's data source is unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: Required parameters are missing or malformed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    LeadTimeSuggestion:
      type: object
      required:
      - context
      - id
      - kind
      - label
      properties:
        context:
          type: string
          description: Disambiguating text, e.g. the country.
        id:
          type: string
          description: Pass back as `id` to read the record.
        kind:
          type: string
          enum:
          - city
          - hotel
        label:
          type: string
    IsoDate:
      type: string
      format: date
      pattern: ^\d{4}-\d{2}-\d{2}$
      examples:
      - '2026-09-14'
    LeadTimeRecord:
      type: object
      description: A city or hotel from the booking lead-time study, with its booking-window results.
      required:
      - citySlug
      - countrySlug
      - id
      - kind
      - label
      - windows
      properties:
        id:
          type: string
        kind:
          type: string
          enum:
          - city
          - hotel
        label:
          type: string
        context:
          type: string
        citySlug:
          type: string
        countrySlug:
          type: string
        hotelSlug:
          type: string
          description: Present on hotel records only.
        hotelCount:
          type: integer
          description: Qualifying hotels behind a city record.
        windows:
          type: array
          description: Per booking-window results, keyed by lead-time bucket such as `90+` or `2-7`.
          items:
            type: object
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: string
    BookingAdvice:
      type: object
      description: Advice for one stay. Prices are medians of observed nightly rates in USD.
      required:
      - basis
      - checkIn
      - citySlug
      - confidence
      - countrySlug
      - daysUntilCheckIn
      - recommendation
      - relativeToYear
      - season
      - targetMedianPrice
      - yearlyMedianPrice
      properties:
        basis:
          type: string
          description: Which evidence the recommendation rests on.
        checkIn:
          $ref: '#/components/schemas/IsoDate'
        checkOut:
          $ref: '#/components/schemas/IsoDate'
        citySlug:
          type: string
        countrySlug:
          type: string
        confidence:
          type: string
          enum:
          - high
          - medium
          - low
        daysUntilCheckIn:
          type: integer
        recommendation:
          type: string
          description: The advice verdict, e.g. `book_now` or `wait_until_window`.
        relativeToYear:
          type: string
          description: How the stay's median compares with the yearly median.
        season:
          type: string
        targetMedianPrice:
          type: number
          description: Observed median nightly price for the requested stay, USD.
        yearlyMedianPrice:
          type: number
          description: Observed median nightly price across the year, USD.
        history:
          type: object
          description: Summary of observed booking-date prices for this stay.
        historyTrend:
          type: object
          description: Direction and size of the recent price move.
  headers:
    CachedResponse:
      description: Shared-cache directives for this response.
      schema:
        type: string
externalDocs:
  description: Public API documentation
  url: https://www.besttimetobookhotels.com/docs/api