Search V2 API
Preferred Search Flow¶
- List level —
GET /api/v2/search(called without thepackagesparameter) to retrieve a destination / multi-property overview and decide which property to drill into. - Detailed property level —
GET /api/v2/properties/{id}/packagesto fetch full room and package details for the selected property.
This 2-step search returns mapped rooms, named according to Evocative static content, and is the recommended, load-optimal integration. Keeping the overview call lightweight (no packages parameter) minimizes payload size and traffic. This flow is only allowed for the direct integrations that serve the results directly to the end user. Not allowed for the aggregators or resellers.
If the 2-step flow is not feasible for your use case, the single-request batch endpoint GET /api/v2/properties/packages is a 1-step search that returns unmapped rooms. It is convenient but heavier, it terms of traffic, — it produces substantially more traffic — so use it only as a fallback and keep batches to ≤100 hotels per request.
Aggregators & Resellers
Aggregators and resellers MUST only use the GET /api/v2/properties/packages endpoint. The GET /api/v2/properties/{id}/packages endpoint is only intended for direct integrations that serve the results directly to the end user.
Rate & Room Semantics¶
| Topic | Behavior |
|---|---|
| Room names & categories | Not taken from the hotel's own website categories. In the 2-step search they follow Evocative static content (mapped); in the 1-step batch search they are unmapped (supplier-provided). |
| Rate name language | For most properties room/rate names are in English. Some properties expose names in their local language, in which case the package name is non-English. |
| Market Price | Available only for endpoints that return mapped rates (the 2-step search), surfaced via the marketPrice field. Not available for unmapped (1-step) results. |
| Rack price | Not provided. |
| On-request rates | Not supplied. All returned rates are immediate-confirmation rates, so there is nothing to disable. |
| Allotment / remaining rooms | No parameter indicates the number of remaining rooms at the same conditions and price. |
Limits & Constraints¶
Evocative does not impose explicit limits on the following — they are constrained only by the downstream supplier/hotel. If a requested value is not supported downstream, that property simply returns no results (no specific error is raised).
| Constraint | Evocative limit |
|---|---|
Hotels per batch request (GET /api/v2/properties/packages) | No hard limit; 100 hotels per request is recommended. |
| Rooms per reservation | No explicit limit. |
| Occupancy per room (adults, children, adults + children) | No explicit limit. |
| Length of stay | No explicit limit. |
| Booking window (time between booking creation and check-in) | No explicit limit. |
| Children ages | Integers 1–17 (see Occupancy Format below). |
GET /api/v2/search¶
Search for available properties with minimal static information and rate summaries. This is a lazy-load endpoint that returns properties with pricing information. The endpoint should be polled until the isDone field in the response is set to true. Use this endpoint when searching for a large number of properties to only see the lowest rates we offer. To fetch detailed data for a property, see the Packages Endpoint
Authentication: Required (X-Api-Key)
Query Parameters:
Required Parameters¶
| Parameter | Type | Description |
|---|---|---|
checkIn | string (YYYY-MM-DD) | Check-in date. Example: 2025-10-06 |
checkOut | string (YYYY-MM-DD) | Check-out date. Must be after checkIn. Example: 2025-10-07 |
occupancies | string | Occupancy information for all rooms. See Occupancy Format below |
residency | string | Guest residency country code (ISO-3166-1 alpha-2). Example: FR |
eager | boolean | If set to true, response will only be returned when the search has fully completed |
Occupancy Format¶
The occupancies parameter uses a semicolon-separated format for multiple rooms:
{ADULT_COUNT_0}-{CHILDREN_AGE_0},{CHILDREN_AGE_1};{ADULT_COUNT_1}-{CHILDREN_AGE_1_0},{CHILDREN_AGE_1_1}
- Each room is separated by
; - Format for each room:
{adults}-{childAge1},{childAge2} - If no children, use
{adults}-(trailing dash required)
Examples:
# Room 1: 2 adults, no children
# Room 2: 2 adults, children ages 5 and 4
2-;2-5,4
# Single room: 2 adults, 1 child age 8
2-8
# Single room: 3 adults, no children
3-
Children ages
Children ages are passed as integers (in occupancies here, and in rooms[].occupancy.childrenAges at the book step). Supported ages are 1–17. There is no sub-division into categories such as babies, infants, toddlers, or teens, and no automatic conversion of children to adults based on a hotel's own age policy. If the supplied occupancy is not accepted by a hotel, that property simply returns no results.
Residency
There are no residency restrictions on the Evocative side — any valid residency country code is accepted. Availability and pricing for a given residency still depend on the downstream supplier.
Filter Parameters¶
| Parameter | Type | Description |
|---|---|---|
longitude | number | Longitude for geo-based search. Requires latitude and radius. Example: 2.3522 |
latitude | number | Latitude for geo-based search. Requires longitude and radius. Example: 48.8566 |
radius | number | Radius in meters. Requires longitude and latitude. Example: 5000 |
city | string | City name filter |
country | string | Country code (ISO-3166-1 alpha-2). Example: FR |
name | string | Property name filter (partial match) |
propertyTypes | string[] | Property type filter. Use enum values from Property Types table. Example: propertyTypes=Hotel&propertyTypes=Resort |
stars | integer[] | Star rating filter (0-5). Example: stars=4&stars=5 |
amenityTypes | string[] | Amenity type filter. Use enum values from Amenity Types table. Example: amenityTypes=WiFi&amenityTypes=SwimmingPool |
minPrice | number | Minimum total price filter (in USD) |
maxPrice | number | Maximum total price filter (in USD) |
ids | string[] | List of property evocativeId values to filter by. Example: ids=R:123&ids=R:456. Support for deprecated numeric IDs may be removed in the future. |
Sort Parameters¶
| Parameter | Type | Description |
|---|---|---|
sortBy | string | Sort criteria. Options: price, discount, distance, rating, rank (default: price) |
sortDirection | string | Sort direction. Options: asc, ascending, desc, descending (default: asc) |
Pagination Parameters¶
| Parameter | Type | Description |
|---|---|---|
limit | integer | Number of results per page (default: 100) |
offset | integer | Number of results to skip (default: 0) |
Optional Parameters¶
| Parameter | Type | Description |
|---|---|---|
packages | integer | Number of cheapest packages to include for each property in the response (max: 10). If omitted or 0, the packages field is not returned |
supplierTimeout | number | Maximum time in seconds allowed for each supplier to respond. Partial results from faster suppliers are still returned if a supplier exceeds this timeout |
Example Request:
curl -H "X-Api-Key: YOUR_KEY" \
"<BASE_URL>/api/v2/search?checkIn=2026-10-06&checkOut=2026-10-07&occupancies=2-&residency=FR&country=FR&city=Paris&limit=20&packages=2"
Responses:
- 200 OK: JSON search results
- 400 Bad Request: Invalid query parameters (e.g., missing required parameters, invalid date range, invalid occupancy format)
- 401 Unauthorized: Invalid/missing API key
- 429 Too Many Requests: Rate limit exceeded
- 502 Bad Gateway: Upstream service failure
Response Schema (200 OK):
| Field | Type | Description |
|---|---|---|
isDone | boolean | Indicates if the search processing is complete. Poll until isDone = true to get all results |
total | integer | Total number of matching properties |
limit | integer | Number of results per page |
offset | integer | Number of results skipped |
properties | array | Array of property objects with minimal information |
properties[].id | string | DEPRECATED, use evocativeId instead. This value will be removed in future API updates |
properties[].evocativeId | string | Unique property identifier |
properties[].name | string | Property name |
properties[].price | number | Minimum total price (in USD) |
properties[].discount | integer | Maximum discount percentage |
properties[].isDone | boolean | Indicates if rate loading is complete for this property |
properties[].packages | array/undefined | Cheapest packages for this property. Only present when packages query parameter > 0 |
properties[].packages[].room | object | Room information |
properties[].packages[].room.id | string | Room identifier |
properties[].packages[].room.name | string | Room name |
properties[].packages[].package | object | Package/quote details |
properties[].packages[].package.id | string | Package identifier |
properties[].packages[].package.boardType | string | Board/meal plan. See Board Types table in packages endpoint |
properties[].packages[].package.totalPrice | object | |
properties[].packages[].package.totalPrice.amount | number | Total amount |
properties[].packages[].package.totalPrice.currency | string | Currency code |
properties[].packages[].package.marketPrice | object/null | Market price for comparison (if available) |
properties[].packages[].package.marketPrice.amount | number | Market price amount |
properties[].packages[].package.marketPrice.currency | string | Currency code |
properties[].packages[].package.recommendedSalePrice | object/null | The recommended sale price for the package. Can be null or contain a value. Represents the minimum price that must be paid for this package. Must be respected when provided |
properties[].packages[].package.recommendedSalePrice.amount | number | Recommended sale price amount |
properties[].packages[].package.recommendedSalePrice.currency | string | Currency code |
properties[].packages[].package.discountPercentage | integer/null | Discount percentage compared to market price |
properties[].packages[].package.taxesAndFees | array | Taxes and mandatory fees |
properties[].packages[].package.taxesAndFees[].currency | string | Currency code |
properties[].packages[].package.taxesAndFees[].title | string | Fee or tax name |
properties[].packages[].package.taxesAndFees[].isIncludedInPrice | boolean | Whether the amount is included in totalPrice |
properties[].packages[].package.taxesAndFees[].isMandatory | boolean | |
properties[].packages[].package.taxesAndFees[].value | number | Amount of the tax/fee |
properties[].packages[].package.cancellationPolicy | object | Cancellation summary |
properties[].packages[].package.cancellationPolicy.isRefundable | boolean | Indicates whether the package is refundable |
properties[].packages[].package.cancellationPolicy.fullRefundability | object/null | Window for full refund (if refundable) |
properties[].packages[].package.cancellationPolicy.fullRefundability.from | string | Earliest date/time for full refund |
properties[].packages[].package.cancellationPolicy.fullRefundability.to | string | Last date/time for full refund |
!!! IMPORTANT: polling is required.
This endpoint uses lazy loading for rates. response.isDone = true indicates that the search has fully completedd for all of the properties. properties[].isDone = true indicates that the search has completed for that specific property. The recommended polling interval is 2 seconds.
Example Response:
{
"isDone": false,
"total": 150,
"limit": 20,
"offset": 0,
"properties": [
{
"id": "12345",
"evocativeId": "R:54321",
"name": "Grand Hotel Paris",
"price": 245.50,
"discount": 15,
"isDone": true,
"packages": [
{
"room": {
"id": "room-001",
"name": "Deluxe Room"
},
"package": {
"id": "eyJTZWFyY2giOns...",
"boardType": "Breakfast",
"totalPrice": {
"amount": 245.50,
"currency": "USD"
},
"marketPrice": {
"amount": 289.00,
"currency": "USD"
},
"recommendedSalePrice": {
"amount": 255.00,
"currency": "USD"
},
"discountPercentage": 15,
"taxesAndFees": [
{
"currency": "USD",
"title": "City tax",
"isIncludedInPrice": false,
"isMandatory": true,
"value": 12.50
}
],
"cancellationPolicy": {
"isRefundable": true,
"fullRefundability": {
"from": "2026-10-01T00:00:00Z",
"to": "2026-10-04T23:59:59Z"
}
}
}
},
{
"room": {
"id": "room-002",
"name": "Standard Room"
},
"package": {
"id": "eyJTZWFyY2giOnt...",
"boardType": "None",
"totalPrice": {
"amount": 260.00,
"currency": "USD"
},
"marketPrice": null,
"recommendedSalePrice": null,
"discountPercentage": null,
"taxesAndFees": [],
"cancellationPolicy": {
"isRefundable": false,
"fullRefundability": null
}
}
}
]
},
{
"id": "67890",
"evocativeId": "R:609876",
"name": "Luxury Resort",
"price": 320.00,
"discount": 20,
"isDone": false,
"packages": [
{
"room": {
"id": "room-010",
"name": "Superior Suite"
},
"package": {
"id": "eyJTZWFyY2giOnx...",
"boardType": "None",
"totalPrice": {
"amount": 320.00,
"currency": "USD"
},
"marketPrice": {
"amount": 400.00,
"currency": "USD"
},
"recommendedSalePrice": {
"amount": 340.00,
"currency": "USD"
},
"discountPercentage": 20,
"taxesAndFees": [],
"cancellationPolicy": {
"isRefundable": true,
"fullRefundability": {
"from": "2026-10-01T00:00:00Z",
"to": "2026-10-05T23:59:59Z"
}
}
}
}
]
}
]
}
GET /api/v2/properties/{id}/packages¶
Retrieve available rooms and quote packages for a specific property. This endpoint shares the same search parameters as GET /api/v2/search but scopes the results to a single property and returns the full package payload (taxes, fees, and cancellation details) per room.
Authentication: Required (X-Api-Key)
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Property identifier. Use the evocativeId value. Support for deprecated numeric IDs may be removed in the future. |
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
checkIn | string (YYYY-MM-DD) | Check-in date. Example: 2025-10-06 |
checkOut | string (YYYY-MM-DD) | Check-out date. Must be after checkIn. Example: 2025-10-07 |
occupancies | string | Occupancy information for all rooms. See Occupancy Format above |
residency | string | Guest residency country code (ISO-3166-1 alpha-2). Example: FR |
eager | boolean | If set to true, response will only be returned when the search has fully completed |
supplierTimeout | integer | Maximum time in seconds per supplier. See GET /api/v2/search Optional Parameters for details |
Responses:
- 200 OK: JSON packages list
- 400 Bad Request: Missing or invalid query parameters (e.g., invalid occupancy string)
- 404 Bad Request: Property not found
- 401 Unauthorized: Invalid/missing API key
- 429 Too Many Requests: Rate limit exceeded
- 502 Bad Gateway: Upstream service failure
Response Schema (200 OK):
| Field | Type | Description |
|---|---|---|
isDone | boolean | Indicates if package loading is complete |
hotel | object | Basic property information |
hotel.id | string | DEPRECATED, use evocativeId instead. This value will be removed in future API updates |
hotel.evocativeId | string | Unique property identifier |
hotel.name | string | Property name |
rooms | array | |
rooms[].id | string | Room identifier |
rooms[].name | string | Room name |
rooms[].packages | array | Available packages/quotes for this room |
rooms[].packages[].id | string | |
rooms[].packages[].boardType | string | Board/meal plan. See Board Types table below |
rooms[].packages[].totalPrice | object | |
rooms[].packages[].totalPrice.amount | number | Total amount |
rooms[].packages[].totalPrice.currency | string | |
rooms[].packages[].recommendedSalePrice | object/null | The recommended sale price for the package. Can be null or contain a value. Represents the minimum price that must be paid for this package. Must be respected when provided |
rooms[].packages[].recommendedSalePrice.amount | number | Recommended sale price amount |
rooms[].packages[].recommendedSalePrice.currency | string | Currency code |
rooms[].packages[].taxesAndFees | array | Taxes and mandatory fees |
rooms[].packages[].taxesAndFees[].currency | string | Currency code |
rooms[].packages[].taxesAndFees[].title | string | Fee or tax name |
rooms[].packages[].taxesAndFees[].isIncludedInPrice | boolean | Whether the amount is included in totalPrice |
rooms[].packages[].taxesAndFees[].isMandatory | boolean | |
rooms[].packages[].taxesAndFees[].value | number | Amount of the tax/fee |
rooms[].packages[].cancellationPolicy | object | Cancellation summary |
rooms[].packages[].cancellationPolicy.isRefundable | boolean | Indicates whether the package is refundable |
rooms[].packages[].cancellationPolicy.fullRefundability | object/null | Window for full refund (if refundable) |
rooms[].packages[].cancellationPolicy.fullRefundability.from | string | Earliest date/time for full refund |
rooms[].packages[].cancellationPolicy.fullRefundability.to | string | Last date/time for full refund |
Boarding Types
| Board Type |
|---|
| None |
| Breakfast |
| Lunch |
| Dinner |
| FullBoard |
| HalfBoard |
| AllInclusive |
!!! IMPORTANT: polling is required.
This endpoint uses lazy loading for rates. response.isDone = true indicates that the search has completed. The recommended polling interval is 2 seconds.
Example Request:
curl -H "X-Api-Key: YOUR_KEY" \
"<BASE_URL>/api/v2/properties/R:5234099/packages?checkIn=2026-10-06&checkOut=2026-10-07&occupancies=2-;2-&residency=FR"
Example Response:
{
"isDone": true,
"hotel": {
"id": "12345",
"evocativeId": "R:54321",
"name": "Grand Hotel Paris"
},
"rooms": [
{
"id": "room-001",
"name": "Deluxe Room",
"packages": [
{
"id": "eyJTZWFyY2giOns...",
"boardType": "Breakfast",
"totalPrice": {
"amount": 512.35,
"currency": "USD"
},
"recommendedSalePrice": {
"amount": 530.00,
"currency": "USD"
},
"taxesAndFees": [
{
"currency": "USD",
"title": "City tax",
"isIncludedInPrice": false,
"isMandatory": true,
"value": 12.5
}
],
"cancellationPolicy": {
"isRefundable": true,
"fullRefundability": {
"from": "2025-10-01T00:00:00Z",
"to": "2025-10-04T23:59:59Z"
}
}
}
]
}
]
}
GET /api/v2/properties/packages¶
This is a batch version of the GET /api/v2/properties/{id}/packages that allows fetching packages for multiple properties at once. !!! IMPORTANT: This endpoint is optimized for performance and returns only unmapped packages.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
properties | string[] | Array of property evocativeId values. Example: R:5234099,R:2059144. Up to 100 properties per request is recommended. Support for deprecated numeric IDs may be removed in the future. |
checkIn | string (YYYY-MM-DD) | Check-in date. Example: 2025-10-06 |
checkOut | string (YYYY-MM-DD) | Check-out date. Must be after checkIn. Example: 2025-10-07 |
occupancies | string | Occupancy information for all rooms. See Occupancy Format above |
residency | string | Guest residency country code (ISO-3166-1 alpha-2). Example: FR |
eager | boolean | If set to true, response will only be returned when the search has fully completed |
supplierTimeout | integer | Maximum time in seconds per supplier. See GET /api/v2/search Optional Parameters for details |
Responses
The response is an array of objects with the same schema as GET /api/v2/properties/{id}/packages response.
Common Use Cases¶
Search with filters¶
curl -H "X-Api-Key: YOUR_KEY" \
"<BASE_URL>/api/v2/search?checkIn=2025-10-06&checkOut=2025-10-07&occupancies=2-&residency=FR&country=FR&stars=4&stars=5&minPrice=100&maxPrice=500&sortBy=price&sortDirection=asc&limit=20"