# OTI recorded hotel price query guide

OTI's hotel price comparison is separate from its hotel–creator collaboration service. These public read-only endpoints need no login, API key or JavaScript. This document describes capability, not current source availability; use the API response to establish which records are available.

The public hotel-price pilot currently covers three hotels in Da Nang, Vietnam, on collected Friday stays: 2 adults, 0 children, 1 room, 1 night, USD, KR market. This is not coverage of every hotel or date. Check the public catalog and API for currently available records.

## Read records

- [OpenAPI contract](https://opentoinfluencer.com/compare/openapi.json)
- [Browse collected Da Nang dates](https://opentoinfluencer.com/api/price-search?destination=da-nang)
- [Filter recorded offers](https://opentoinfluencer.com/api/price-search?destination=da-nang&adults=2&children=0&rooms=1&currency=USD&breakfast=included&cancellation=free_cancel&maxTotal=150)
- [HTML query guide](https://opentoinfluencer.com/compare/api)
- [Price-condition reading guide](https://opentoinfluencer.com/compare/guides/price-conditions)
- [Breakfast and free-cancellation recorded comparisons](https://opentoinfluencer.com/compare/da-nang/breakfast-free-cancellation)

Use GET /api/price-search. destination is required (for example da-nang). Omit both checkin and checkout to browse collected dates. For a requested stay, supply both as YYYY-MM-DD; checkin must be in the next 90 days by Korea Standard Time, with checkout exactly one day later. A valid future date may have no observations. Never silently replace the user's dates or occupancy to obtain a price.

Optional filters: breakfast=included, cancellation=free_cancel, maxTotal=USD amount, hotelId=an ID returned by the service. maxTotal applies only to rows with confirmed included tax. A free_cancel label does not establish a verified cancellation cutoff or timezone; inspect cancelUntil and disclose unknowns. Unsupported occupancy, room count, currency or stay length returns 422; malformed or invalid queries return 400. See OpenAPI for all parameter constraints.

## Pagination and interpretation

Unknown conditions remain available when no optional filters are applied. comparable is a legacy tax-price eligibility flag, not same-room or same-condition verification. Never infer breakfast exclusion from not_shown or non-refundable from unknown. Free-cancellation dates do not establish the exact deadline, timezone or penalty. roomCoverage, partialRoomGroups and rowsTruncated describe collection/display limits, not complete inventory. roomCoverage=null means unknown or legacy metadata not reported. For compatibility, rowsTruncated=false also means not reported by the producer; it never confirms that all matching rows were returned.

The API returns at most six hotels per page and up to 30 matching rows per hotel/stay date after filtering. Follow the returned next URL, preserving conditions, even if the current page has no matching observations. A null next ends hotel pagination. For each hotel/stay, follow dates[].nextOffersUrl to access remaining saved matching rows. offerPage.totalRows counts saved rows before filters, matchingRows after filters, offset and returnedRows locate this page. These counts do not measure supplier inventory. A null nextOffersUrl ends that offer list. Keep the supplied hotel, stay and filter context; HTTP409 page_expired provides restart when the successful observation or cursor context changes. Restart that list rather than combining different observations. Do not enumerate every possible date or hotel to crawl the dataset.

When the latest successful observation has seller summaries only, dates[].previousRooms may contain a separate earlier room observation from the same hotel, stay and collection conditions within 28 days. Its prices and terms belong together at previousRooms.rowsObservedAt; never attach them to current prices. It is always historical=true and stale=true, excluded from current representative prices and room selection. The same filters apply independently, with its own offerPage (room rows only, excluding summaries) and nextOffersUrl. Following that URL advances previousRooms while the current rows restart on their first page. Replacement of either observation expires historical cursors. Missing previousRooms does not prove no historical inventory existed.

- state=no_observations means no matching current recorded observations on this page, even when previousRooms has matches; never sold out.
- responseAsOf is the UTC request-processing time, not a price collection timestamp.
- For each date, read rowsObservedAt (fallback observedAt), observationAgeSeconds and stale. A low age does not guarantee live availability; stale may also reflect collection status.
- Each row describes a seller and room. Keep priceUsd, taxStatus, breakfast, refundable and cancelUntil with it. Unknown tax, breakfast or cancellation terms must remain unknown. Do not compare different rooms as identical products or infer mandatory on-site fees, actual rate occupancy, member/app eligibility or final payable totals.
- Read the response usage policy. Respect 429 and its Retry-After seconds; 404 indicates unavailable publication/host, and 503 indicates temporary source failure. None proves that a hotel has no rooms.

## Return a link to the traveler

Use hotels[].comparisonUrl for a hotel-specific link, or the top-level comparisonUrl for the full comparison. These URLs preserve accepted dates, occupancy and filters; hotel links remove pagination. Do not invent booking URLs. Selecting a recorded room only displays its conditions; it does not reserve, lock a quote or accept payment. OTI's comparison pilot is not a lowest-price guarantee.

## Location context

- [Da Nang location and transport guide](https://opentoinfluencer.com/compare/guides/da-nang-location-transport): Sourced editorial context, separate from price observations. Read the source-check date and unresolved address notice; it does not provide live transport quotes.

## Service overview

- [OTI service overview](https://opentoinfluencer.com/llms.txt)
- [Public comparison catalog](https://opentoinfluencer.com/compare)
