1. Room Mapping
Vervotech
  • Hotel Mapping
    • Getting Started
    • Access & Onboarding with Vervotech
    • Explore your providers
    • Integration and Go Live
    • Map Providers Content
    • Webhook
    • References
    • FAQ
    • Metadata Content
      • Get Master Hotel Facilities
      • Get Master Hotel Chains
      • Get Master Hotel Brands
      • Get Master Property Types
      • Get All Master Countries
      • Get All Vervotech IDs
    • Mappings
      • Get Mappings
      • Get New Mappings
      • Get Updated Mappings
      • Get Deleted Mappings
      • Get Mapping Statistics
      • Export Mappings File
      • Get Mapping Counts
      • Get Provider Hotel Mappings by Provider ID
      • Get Provider Hotel Mappings by Vervotech ID
    • Curated Content
      • Get Updated Curated Content
      • Get Curated Content by Provider Hotel IDs
      • Get Curated Content by Vervotech IDs
    • Provider Content
      • Get Unmapped Provider Hotels
      • Get Unmapped Provider Hotels V2
      • Create Unmapped Provider Hotels File
      • Get All Provider Names
      • Get Provider Content by Provider Hotel IDs
      • Get Provider Content by Vervotech IDs
    • Location Content
      • Get Location by ID
      • Get All Locations
    • Operational APIs
      • Review Mappings of Booked Hotels by File
      • Review Mappings of Booked Hotels
      • Start Mapping by SFTP Folder
      • Get Mapping History by Run ID
    • Dynamic Mapping APIs
      • Find Match
    • Dual Mapping APIs
      • Overview
      • Get Mappings by Provider Hotel ID
      • Get Mappings with Content by Provider Hotel ID
      • Get Dual Mapping API Statistics
  • Room Mapping
    • Getting Started
    • Choosing Your Integration Path
    • Integration Guidelines and Go Live
    • Preparing Your Request Data
    • Room Name and Description Guidelines
    • Room Mapping Customizations
    • Preparing Your Files
    • How Supplier Content Is Standardised
    • Service Limits
    • References
    • FAQ
    • Mapping API
      • Map Rooms
      • Get Master Room Amenities
      • Get Master Room Attributes
      • Get Provider Names
      • Get All Provider Names
    • Async Room Mapping API
      • Get Async Room Mapping Response
      • Map Large Rooms Async
    • Board Basis Mappings
      • Get All Master Board Basis
      • Map Board Basis
  • Schemas
    • Schemas
    • Response
      • GetMasterHotelBrandsResponse
      • GetMasterPropertyTypesResponse
      • GetMasterCountriesResponse
      • FacilityGroupFixtures
      • GetMasterHotelChainsResponse
    • GetMasterHotelBrandsResponse1
    • GetMasterPropertyTypesResponse2
    • GetMasterCountriesResponse3
    • FacilityGroupFixtures4
    • GetMasterHotelChainsResponse5
    • GetMasterHotelBrandsResponse2
    • GetMasterPropertyTypesResponse3
    • GetMasterCountriesResponse4
    • PropertyContent400Error
    • FacilityGroupFixtures5
    • PropertyContent404Error
    • GetMasterHotelChainsResponse6
    • HotelChain404Error
    • MasterCountry404Error
    • BucketFolderNotFound
    • ProviderNames404Error
    • PropertyType404Error
    • Error401
    • Error403
    • Error426
    • Error500
    • Error503
    • Facility404Error
    • TotalHotelsCount404Error
    • Location404Error
    • Location400Error
    • GetMasterHotelBrandsResponse3
    • GetMasterPropertyTypesResponse4
    • GetMasterCountriesResponse5
    • FacilityGroupFixtures6
    • GetMasterHotelChainsResponse7
    • Status
    • Message
    • StatusCode
    • ResumeKey
    • Tag
    • GetHotelsByLocationIdRes
    • GetHotelsByPolygonRes
    • Unica.Core.Contracts.Models.DownloadStatsStatus
    • Unica.Core.Contracts.Models.HotelsAPI.HotelContentField
    • PropertyTypes
    • schema1
    • schema3
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMappingType
    • Unica.Core.Contracts.Models.ImageSize
    • Unica.DataContracts.Common.DistanceUnit
    • Unica.DataContracts.Common.FeeType
    • Unica.DataContracts.Common.ImageSize
    • Unica.Services.CoreService.Models.GetProviderMappingMappingRq
    • Countries
    • KeyValue
    • ProviderFacility
    • GenericResponse
    • ProviderHotelIdentifier
    • GetUnmappedHotelsResponse
    • GetMasterHotelChainsResponse
    • GetUnmappedHotelsV2Response
    • GetCuratedContentResponse
    • ErrorResponse
    • Bed
    • GetUpdatedCuratedContentResponse
    • ReviewMappingsofBookedHotelsResponse
    • GetProviderMappingResponse
    • GetProviderMappingByProviderResponse
    • GetMappingHistoryByRunIdResponse
    • CategoryRating
    • GetMasterHotelBrandsResponse
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetOSMLocationsRQ
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentByProviderIdsReq
    • GetMasterPropertyTypesResponse
    • GetMasterCountriesResponse
    • Error
    • LocationsRS
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderHotelMappings
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ReviewBookedHotelsReq
    • Unica.Core.Contracts.Models.MasterTags.Tags
    • Unica.Core.Contracts.Models.ProviderHotelIdentifier
    • Unica.DataContracts.Common.CategoryRating
    • Unica.DataContracts.Common.CheckoutInfo
    • Unica.DataContracts.Common.Description
    • Unica.DataContracts.Common.GeoCode
    • Unica.DataContracts.Common.Link
    • Unica.DataContracts.Common.Policy
    • Unica.DataContracts.Common.ReviewDistribution
    • Unica.Core.Contracts.Location.MasterLocationRes
    • GetMappingsCountRes
    • Unica.Core.Contracts.Models.Airport
    • Unica.Core.Contracts.Models.ApiResponse
    • Unica.Core.Contracts.Models.Billing.AccountUsageBalance
    • Unica.Core.Contracts.Models.Billing.BilllingHistory
    • Unica.Core.Contracts.Models.ConnectedLocation
    • Unica.Core.Contracts.Models.Facility
    • AsyncRoomMappingResponse
    • Unica.Core.Contracts.Models.GetAllHotelBrandsRes
    • GetMappingStatisticsResponse
    • Unica.Core.Contracts.Models.GetAllHotelChainsRes
    • Unica.Core.Contracts.Models.GetAllMasterTagsResV3
    • Unica.Core.Contracts.Models.GetMappingHistoryReq
    • Facility
    • NearByLocation
    • TrainStations
    • StartMappingByFtpFolderResponse
    • PointOfInterests
    • ConnectedLocations
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetCuratedContentWithLocationRes
    • Neighbourhoods
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMappingByProviderRes
    • Stadiums
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMasterFacilityGroups
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.MasterFacilityGroups
    • Unica.Core.Contracts.Models.KeyValue
    • Unica.Core.Contracts.Models.Link
    • Unica.Core.Contracts.Models.MappingStatsRes
    • Unica.Core.Contracts.Models.MasterChain.HotelBrand
    • Unica.Core.Contracts.Models.MasterChain.HotelChain
    • Unica.Core.Contracts.Models.Neighbourhood
    • Unica.Core.Contracts.Models.PoI
    • Unica.Core.Contracts.Models.ProviderHotelHistoryRes
    • Unica.Core.Contracts.Models.RoomArea
    • Unica.Core.Contracts.Models.Stadium
    • Unica.Core.Contracts.Models.TrainStation
    • Unica.DataContracts.Common.Facility
    • Unica.DataContracts.Common.Fee
    • Unica.DataContracts.Common.KeyValue
    • Unica.DataContracts.Common.RoomArea
    • Unica.DataContracts.Common.Statistics
    • Unica.Core.Contracts.Location.MasterLocationListRes
    • Unica.Core.Contracts.Models.Bed
    • LocationByPolygonRequest
    • ProviderHotelIdentifiers
    • Unica.Core.Contracts.Models.Billing.UsageBalanceDetails
    • MappedRoomRate
    • HotelProviderIdentifier
    • Unica.Core.Contracts.Models.GetAllCountriesResV3
    • Unica.Core.Contracts.Models.GetAllPropertyTypesRes
    • GuestReview
    • Unica.Core.Contracts.Models.GetMappingsCountRes
    • GetProviderNamesResponse
    • Unica.Core.Contracts.Models.GetProviderMappingStatsRS
    • GetAllVervotechIdsResponse
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.CreateUnmappedProviderHotelsFileReq
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetCuratedContentByVervotechIdsReq
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMappingsRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsReq
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsV2Req
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsV2Res
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUpdatedCuratedContentRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetVervotechIdsRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.HotelProviderIdentifierV3
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderHotelIdsRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMapping
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMappingRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.StartMappingByFtpFolderRes
    • Unica.Core.Contracts.Models.Image
    • Unica.DataContracts.Common.Bed
    • Unica.DataContracts.Common.Contact
    • Unica.DataContracts.Common.Image
    • Unica.DataContracts.Common.PointOfInterest
    • Unica.Host.Web.Controllers.GetProviderNamesRes
    • RoomMappingRequest
    • HotelChains
    • LocationMapping
    • HotelBrands
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentByVervotechIdsReq
    • schema2
    • Unica.Core.Contracts.Models.VerifyMapping
    • Unica.DataContracts.Common.CheckinInfo
    • Unica.DataContracts.Common.GuestReview
    • Unica.DataContracts.Common.UserReview
    • Unica.Services.CoreService.Models.HotelMappingReq
    • HotelMapping
    • NewHotelMapping
    • UpdatedHotelMapping
    • DeletedHotelMapping
    • Unica.Core.Contracts.Models.MasterLocation.LocationMappingRes
    • Unica.Core.Contracts.Models.ProviderHotelHistory
    • Unica.DataContracts.Common.Address
    • Unica.DataContracts.Common.Room
    • ReviewHotels
    • ReviewMappingsofBookedHotelsRequest
    • Unica.Core.Contracts.Models.Billing.BillingEntry
    • GetMasterRoomAmenitiesResponse
    • GetProviderContentResponse
    • GetProviderContentByHotelIdsResponse
    • Room
    • Unica.Core.Contracts.Models.ProviderMappingStats
    • Unica.DataContracts.MasterLocation.MasterLocation
    • Locations
    • Unica.Core.Contracts.Models.Room
    • RoomMappingBody2
    • ProviderMappingsStats
    • GetMasterRoomAttributesResponse
    • FacilityGroupFixtures
    • GetProviderHotelIdsByVervotechIdResponse
    • RoomMappingBody
    • Unica.Core.Contracts.Models.MappingStats
    • MappingsStats
    • HotelsByLocationIdRes
    • UnmappedHotelContent
    • Unica.DataContracts.HotelMappingV3.DTORawMapHotel
    • ProviderRoomContent
    • Unica.DataContracts.HotelMappingV3.ProviderHotel
    • RoomMappingResponse2
    • HotelContent
    • Unica.Core.Contracts.Models.RawMapHotel
    • CuratedHotels
    • CuratedHotelsWithLocationContent
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.CuratedHotelWithLocationMapping
    • Unica.Core.Contracts.Models.DownloadStats
  1. Room Mapping

Preparing Your Request Data

Mapping quality is bounded by the quality of what you send. The service standardises supplier room names into structured attributes and then groups rooms that describe the same thing, so every field you supply is evidence, and every field you omit is evidence the service has to infer or do without.
This section covers what is required, what is silently ignored, and what materially improves your results.

Required and optional fields#

FieldRequiredNotes
roomRatesYesMust contain at least one room.
indexYesMust be unique within the request. Results are returned against this value.
roomNameYesThe supplier room name, as the supplier gave it to you.
providerYesMust be a name from the master provider list, and your account must be entitled to it.
providerHotelIdYesThe supplier's own identifier for the property.
codeNoNot rejected when missing, but strongly recommended. Send the room code, not the rate plan code.
descriptionNoFrequently carries bedding, view and occupancy detail that the room name omits.
beds, view, boardBasis, refundabilityNoUsed as supporting evidence where present.
attributesNoStructured room features. See the value rules below.

Send supplier room names unmodified#

Send the room name exactly as the supplier gave it to you. Cleaning, title casing, truncating or reordering the name before you send it removes the very signals the service uses. Abbreviations, punctuation, duplicated whitespace, embedded HTML and common misspellings are already handled for you.

Attribute values are matched against a fixed set#

Attribute keys are matched case insensitively, so HasBalcony and hasbalcony behave identically. Attribute values are not free text. Only four values are recognised, case insensitively:
Value sentEffect
Yes or AllowedThe attribute is applied.
No or NotAllowedThe negative form of the attribute is applied, where one exists.
Anything elseSilently ignored.
This is the most common source of quietly missing attributes. true, 1, Y, enabled and an empty string all fall into the last row. They are not rejected and no warning is returned. They simply have no effect, and the room is mapped as though you had never sent the attribute at all.
The value is not trimmed either, so "Yes " with a trailing space falls into the same last row. Trim your values before you send them.
Not every attribute has a negative form. Where one does not exist, a No value is ignored rather than rejected. Negative forms are also less complete than positive ones, and a few are spelled differently from their positive counterpart, so verify that a No value has taken effect rather than assuming it. Use the master room attributes endpoint for the list of keys that are recognised, bearing in mind that it returns the master list with any attributes your account ignores already removed.

Header spelling matters more than it looks#

On the file based path, column headers are matched exactly and letter case matters, so a header that your pipeline has helpfully normalised is read as an empty column rather than reported as an error.
The clearest illustration is on the output side. The occupancy column in the output file is named MappedOcccupancy, with three letter c characters. Any integration that corrects that spelling on ingest, or that assumes the obvious spelling, silently reads an empty column. Match header strings exactly in both directions, and check your header row against the input template linked in the File Based Room Mapping (Offline) section before every upload.

Non-English content#

When non-English text is detected in your room details, the group carries the warning code NON_ENGLISH_CONTENT_DETECTED. Treat that warning as a quality signal rather than noise. Much of the normalisation is skipped for that content and the room category falls back to the room name as a whole, so grouping is markedly less reliable than it is for English content. Send the culture header for one of the supported languages listed on the References page, and review any group that carries this warning.
Two limits are worth knowing. Detection runs on the room name only, not the description, so non-English text confined to a description raises no warning. It also runs only when the request culture is English, so a request already sent under another culture will not raise it either.

What makes a room description strong#

Where several rooms in a group could serve as the reference, the best evidenced room is preferred. The signals below are listed in decreasing order of weight, and they are a good guide to what is worth sourcing from your suppliers:
A room that matches a Vervotech master room, and a master room that has been verified
A clear, non generic room category
Occupancy, both the bed occupancy type and the guest count
Bed types
Room size
View
Bedroom count
Additional room features
A name that can only be resolved to a suspect category counts against a room rather than for it. A bare name such as Standard Room is not itself penalised, but it carries no distinguishing detail, so it gives the service nothing to group on.

Reading the scores#

Two scores are returned per mapped rate. matchScore starts at 100 and subtracts penalties for missing or conflicting evidence. cfs continues from that figure and subtracts a further set of softer penalties, so cfs is always at or below matchScore for the same rate.
Both are clamped at a floor, and the floors differ. matchScore floors at 60. cfs floors at 65 in production. A value at the floor therefore means "at or below that figure" rather than exactly it.
Both floors are configurable and can be set per account, so confirm the values that apply to yours before you tune a threshold against them.
Neither value is a percentage. They are penalty ledgers, not ratios, so do not present them to end users as a confidence percentage.
Previous
Integration Guidelines and Go Live
Next
Room Name and Description Guidelines
Built with