Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1 +1 @@
* @engine-public/partner-api-maintainers
* @engine-public/partner-api-maintainers @HotelEngine/partner-api-approvers
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ This API is ideal for businesses looking to:
* **Build a brand-new travel product** that leverages Engine's extensive hotel inventory.

To begin integrating, please [review our documentation](https://engine-public.github.io/engine-partner-api).
Once you're ready, contact partnerships@engine.com to discuss a partnership agreement, gain access to your sandbox environment, and start the development process.
Once youre ready, please complete this [form](https://forms.gle/ir8fFYLaTkSwkih1A) and contact [partnerships@engine.com](mailto:partnerships@engine.com) to discuss a partnership agreement, gain access to your sandbox environment, and start the development process.

_Note: Engine reviews requests as they are submitted, and our team will work with you to align on development timelines._

2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@ afterEvaluate {
val mdlNoBareUrls = "MD034"
val mdlLinkImageReferenceDefinitions = "MD053"
val mdlBlanksAroundTables = "MD058"
val mdlTableColumnStyle = "MD060"

val runMarkdownLinterOnStaticMarkdown = tasks.register<Exec>("runMarkdownLinterOnStaticMarkdown") {
group = "formatting"
Expand Down Expand Up @@ -609,6 +610,7 @@ afterEvaluate {
mdlNoBareUrls,
mdlNoDuplicateHeading,
mdlBlanksAroundTables,
mdlTableColumnStyle,
"--",
*appendFootersToGeneratedMarkdown.get().outputs.files.map { it.absolutePath }.toTypedArray()
)
Expand Down
2 changes: 1 addition & 1 deletion common/src/main/proto/engine/common/v1/amenities.proto
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,4 @@ enum AmenityAvailability {
// The amenity is not included, but may be purchased directly from the hotel, airline, car rental vendor, etc.
// For example, a seat upgrade or breakfast vouchers.
AMENITY_AVAILABILITY_VIA_VENDOR = 3;
}
}
62 changes: 62 additions & 0 deletions common/src/main/proto/engine/common/v1/contact.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//
// Copyright 2025 HotelEngine, Inc., d/b/a Engine
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package engine.common.v1;

option go_package = "engine.com/engine-partner-api/common/v1";
option java_package = "com.engine.common.v1";
option java_multiple_files = true;

import 'protoc-gen-openapiv2/options/annotations.proto';

// Describes the type of an email contact.
enum EmailType {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = {
title: "Common_EmailType_v1"
};

// Unspecified email type.
EMAIL_TYPE_UNSPECIFIED = 0;

// General contact email.
EMAIL_TYPE_GENERAL = 1;

// Billing-related email.
EMAIL_TYPE_BILLING = 2;

// Reservations and booking email.
EMAIL_TYPE_RESERVATIONS = 3;

// Customer support email.
EMAIL_TYPE_SUPPORT = 4;
}

// Contact email information.
message ContactEmail {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Common_ContactEmail_v1"
}
};

// The email address.
string email_address = 1;

// Optional type of email contact.
optional EmailType email_type = 2;
}
43 changes: 43 additions & 0 deletions common/src/main/proto/engine/common/v1/image.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// Copyright 2025 HotelEngine, Inc., d/b/a Engine
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package engine.common.v1;

option go_package = "engine.com/engine-partner-api/common/v1";
option java_package = "com.engine.common.v1";
option java_multiple_files = true;

import 'protoc-gen-openapiv2/options/annotations.proto';

//
// Represents an [Image] with optional metadata.
//
message Image {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Common_Image_v1"
}
};

//
// The URI of the [Image].
// For example, "https://example.com/image.jpg"
//
string uri = 1;
}

18 changes: 17 additions & 1 deletion common/src/main/proto/engine/common/v1/loyalty.proto
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,20 @@ message LodgingLoyaltyProgramIdentifier {

// The identifier provided to the travel by the program administrator.
string member_id = 1;
}
}

//
// Represents a single loyalty rewards program.
//
message LoyaltyRewardsProgram {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Common_LoyaltyRewardsProgram_v1"
}
};

//
// Name of the loyalty reward program.
//
string name = 2;
}
49 changes: 49 additions & 0 deletions common/src/main/proto/engine/common/v1/media.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//
// Copyright 2025 HotelEngine, Inc., d/b/a Engine
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package engine.common.v1;

option go_package = "engine.com/engine-partner-api/common/v1";
option java_package = "com.engine.common.v1";
option java_multiple_files = true;

import "engine/common/v1/image.proto";
import 'protoc-gen-openapiv2/options/annotations.proto';

// A media item for visual or marketing context.
message MediaItem {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Common_MediaItem_v1"
}
};

// Media content reference.
oneof media_type {
// An [Image] this media item represents
.engine.common.v1.Image image = 2;
}

// A description of this media item
// Example: "A large restaurant"
optional string description = 20;

// Tags categorizing the content of this media item
// Example: ["outdoor", "pool"]
repeated string tags = 21;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//
// Copyright 2025 HotelEngine, Inc., d/b/a Engine
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package engine.content.v1.lodging;

option go_package = "engine.com/engine-partner-api/v1/content";
option java_package = "com.engine.content.v1.lodging";
option java_multiple_files = true;

import 'protoc-gen-openapiv2/options/annotations.proto';

// Enumerates possible lodging amenities
enum LodgingAmenityCode {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = {
title: "Content_LodgingAmenityCode_v1"
};

UNKNOWN = 0;
AIR_CONDITIONING = 1;
DINING = 2;
DRY_CLEANING = 3;
ELECTRIC_VEHICLE_CHARGING = 4;
FITNESS_CENTER = 5;
FREE_AIRPORT_SHUTTLE = 6;
FREE_BREAKFAST = 7;
FREE_PARKING = 8;
FULL_KITCHEN = 9;
HIGH_SPEED_INTERNET = 10;
KITCHENETTE = 11;
MEETING_SPACE = 12;
PET_FRIENDLY = 13;
SPA = 14;
SWIMMING_POOL = 15;
TRUCK_PARKING = 16;
}
102 changes: 102 additions & 0 deletions content/src/main/proto/engine/content/v1/lodging/property.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,14 @@ option go_package = "engine.com/engine-partner-api/v1/content";
option java_package = "com.engine.content.v1.lodging";
option java_multiple_files = true;

import "engine/common/v1/amenities.proto";
import "engine/common/v1/contact.proto";
import "engine/common/v1/geo.proto";
import "engine/common/v1/image.proto";
import "engine/common/v1/loyalty.proto";
import "engine/common/v1/media.proto";
import "engine/common/v1/postal_address.proto";
import "engine/content/v1/lodging/lodging_amenity_code.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

//
Expand Down Expand Up @@ -72,4 +78,100 @@ message Property {
// See https://en.wikipedia.org/wiki/E.164
//
optional string phone_number = 51;

//
// Contact email addresses for this property.
// May include general contact, billing, or reservation emails.
//
repeated .engine.common.v1.ContactEmail emails = 61;

//
// Star rating for this property.
// Represents the official star rating classification system.
// See https://en.wikipedia.org/wiki/Hotel_rating
// Examples: "4", "5", "3.5"
//
optional string star_rating = 71;

//
// Property amenities for this [Property].
// List of amenity names describing features and services available to guests.
// Examples: "Free WiFi", "Pool", "Fitness Center", "Free Breakfast"
//
repeated .engine.content.v1.lodging.PropertyAmenity amenities = 81;

//
// Media items for property gallery.
// Collection of media URIs for detailed property viewing and marketing.
//
repeated .engine.common.v1.MediaItem media_items = 91;

//
// External catalog identifiers for this property.
// Used for integration with external booking systems.
//
.engine.content.v1.lodging.ExternalCatalogIdentifiers catalog = 101;

//
// Check-in time in local time HH:MM 24-hour format (e.g., "15:00") for the [Property].
//
optional string check_in_time = 102;

//
// Check-out time in local time HH:MM 24-hour format (e.g., "11:00") for the [Property].
//
optional string check_out_time = 103;

//
// The loyalty rewards program associated with the [Property].
//
optional .engine.common.v1.LoyaltyRewardsProgram loyalty_rewards_program = 104;

//
// The time zone for the [Property] in the IANA format.
// See https://www.iana.org/time-zones
// Examples: "America/Denver", "Atlantic/Madeira"
//
optional string time_zone = 105;
}



//
// [Property] amenity containing name for property features and services.
//
message PropertyAmenity {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Content_PropertyAmenity_v1"
}
};

//
// Amenity name describing a [Property] feature or service.
// Examples: "Free WiFi", "Free Breakfast"
//
string amenity_name = 1;

//
// Amenity code, providing an easily machine readable representation of a [Property] feature or
// service, if mapped.
//
optional .engine.content.v1.lodging.LodgingAmenityCode amenity_code = 2;
}

//
// External catalog identifiers for property mapping.
//
message ExternalCatalogIdentifiers {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Content_ExternalCatalogIdentifiers_v1"
}
};

//
// GIATA identifier for this property.
//
optional string giata_identifier = 1;
}
Loading
Loading