Gérer les campagnes d’annonces d’hôtel

Remarque

Cette version bêta de Hotel Price Ads est disponible uniquement pour certains participants. Pour plus d’informations sur la participation au programme de version bêta, contactez votre responsable de compte ou inscrivez-vous ici.

L’API et la documentation sont susceptibles d’être modifiées.

L’API Hôtel vous permet de gérer vos campagnes publicitaires et enchères d’hôtel. Un sous-compte fournit les organization logiques de niveau supérieur de vos annonces de prix d’hôtel. Vous pouvez le considérer comme une campagne d’hébergement (anciennement des campagnes d’hôtel). Vous pouvez avoir un maximum de 75 sous-comptes actifs.

Un sous-compte spécifie le budget quotidien de la campagne, le nombre maximal d’enchères autorisées et les multiplicateurs d’enchères et d’enchères par défaut pour les annonces qui ne spécifient pas d’enchères ou de multiplicateurs.

Remarque

Les campagnes publicitaires d’hôtels mentionnées ici n’ont aucun rapport avec les campagnes dans Microsoft Advertising.

Si vous ne l’avez pas déjà fait, familiarisez-vous avec les rubriques suivantes :

Pour les points de terminaison de l’API Hotel, consultez Points de terminaison.

Pour plus d’informations sur la création de rapports, consultez API Hotel Price Ads Reporting.

Utilisation de sous-comptes

Les sous-comptes sont les organization de niveau supérieur des annonces de prix des hôtels. Le service crée le sous-compte par défaut lorsque vous vous inscrivez à Hotel Price Ads. L’API vous permet d’ajouter des sous-comptes, de répertorier des sous-comptes, d’obtenir un sous-compte spécifique et de mettre à jour un sous-compte.

Voici les modèles REST que vous utilisez pour gérer les sous-comptes.

  • /SubAccountsGET | POST
  • /SubAccounts('{subAccountId}')GET | PATCH

Pour obtenir un exemple qui obtient et met à jour des sous-comptes, consultez exemples de code. (Utilisez le sélecteur de langue dans le volet droit pour afficher l’exemple dans différentes langues.)

Liste des sous-comptes

Pour obtenir la liste des sous-comptes, envoyez la requête suivante.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet CollectionResponse . Le value tableau contient une liste d’objets SubAccount .

HTTP/1.1 200 OK
x-ms-requestid: a21451ae-f86b-4a19-a00e-9265b59a99ec
x-ms-trackingid: 7cd2710c-821a-48e8-99af-efdc05aebe86

{
  "@odata.count":1,
  "value":[
    {
      "Id":"1902000002",
	  "Name":"DefaultSubAccount1",
	  "Status":"Active",
	  "Bid":{
        "@odata.type":"#Model.FixedBid",
		"Amount":2.75
      },
	  "BidMultipliers":[],
	  "DailyBudget":{
        "Amount":125.25
      },
	  "MaximumBid":{
        "Amount":10.0
      }
    }
  ]
}

Mise à jour d’un sous-compte

Le sous-compte spécifie les multiplicateurs d’enchères et d’enchères par défaut à utiliser pour les groupes hôteliers et les hôtels qui ne spécifient pas d’offre ou de multiplicateurs. Le sous-compte spécifie également le budget réparti tout au long de la journée et l’enchère maximale que vous souhaitez que toutes les enchères ne dépassent pas.

Pour plus d’informations sur la plage d’enchères et le budget valides pour votre marché, consultez la table Currency Value dans la rubrique Devises .

Pour suspendre tous les hôtels du sous-compte, définissez la propriété du Bid sous-compte sur un objet PercentageBid et le pourcentage d’enchères sur zéro (0,0).

Si le sous-compte spécifie des multiplicateurs d’enchères et que vous souhaitez les supprimer, définissez BidMultipliers sur un tableau vide (par exemple, « BidMultipliers » :[]).

Pour mettre à jour un sous-compte, envoyez une requête PATCH. Le corps de la requête est un objet SubAccount . Incluez uniquement les propriétés que vous souhaitez mettre à jour. Cet exemple montre la mise à jour des multiplicateurs.

PATCH https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>') HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Content-Type: application/json
Host: <host>
Content-Length: 682

{
  "Id":"1902000002",
  "BidMultipliers":[
    { 
	  "Countries":["US"],
	  "Factor":1.1,
	  "@odata.type":"#Model.UserCountryMultiplier"
	},
	{
	  "Sites":["LocalUniversal","MapResults"],
	  "Factor":0.85,
	  "@odata.type":"#Model.SiteMultiplier"
	},
	{
	  "DeviceTypes":["Desktop"],
	  "Factor":0.65,
	  "@odata.type":"#Model.DeviceMultiplier"
	},
	{
	  "MinimumNumberOfNights":5,
	  "Factor":1.3,
	  "@odata.type":"#Model.LengthOfStayMultiplier"
	},
	{
	  "DaysOfWeek":["Thursday","Friday","Saturday"],
	  "Factor":1.2,
	  "@odata.type":"#Model.CheckinDayOfWeekMultiplier"
	},
	{
	  "DaysOfWeek":["Sunday","Monday"],
	  "Factor":0.9,
	  "@odata.type":"#Model.CheckinDayOfWeekMultiplier"
	},
	{
	  "MinimumNumberOfDays":3,
	  "Factor":1.3,
	  "@odata.type":"#Model.AdvanceBookingWindowMultiplier"
	} 
  ]
}

Obtention d’un sous-compte

Pour obtenir un sous-compte spécifique, envoyez la requête suivante. L’ID de sous-compte doit être encapsulé entre guillemets simples, comme indiqué.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>') HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet SubAccount .

HTTP/1.1 200 OK
x-ms-requestid: 58d37dd1-78ae-4ced-91e4-7f57e647ddee
x-ms-trackingid: 5345bf4f-e64a-47a6-8d1e-43cc0231dc1b

{
  "Id":"1902000002",
  "Name":"DefaultSubAccount1",
  "Status":"Active",
  "Bid":{
    "@odata.type":"#Model.FixedBid",
	"Amount":2.75
  },
  "BidMultipliers":[
    {
      "@odata.type":"#Model.DeviceMultiplier",
	  "Factor":0.65,
	  "DeviceTypes":["Desktop"]
    },
	{
      "@odata.type":"#Model.LengthOfStayMultiplier",
	  "Factor":1.3,
	  "MinimumNumberOfNights":5
    },
	{
      "@odata.type":"#Model.UserCountryMultiplier",
	  "Factor":1.1,
	  "Countries":["US"]
    },
	{
      "@odata.type":"#Model.AdvanceBookingWindowMultiplier",
	  "Factor":1.3,
	  "MinimumNumberOfDays":3
    },
	{
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
	  "Factor":0.9,
	  "DaysOfWeek":["Monday","Sunday"]
    },
	{
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
	  "Factor":1.2,
	  "DaysOfWeek":["Thursday","Friday","Saturday"]
    },
	{
      "@odata.type":"#Model.SiteMultiplier",
	  "Factor":0.85,
	  "Sites":["MapResults","LocalUniversal"]
    }
  ],
  "DailyBudget":{
    "Amount":125.25
  },
  "MaximumBid":{
    "Amount":10.0
  },
  "HotelAssociationCount":39540
}

Utilisation de groupes d’hôtels

Les groupes hôteliers sont le deuxième niveau de organization que vous utilisez pour regrouper les hôtels. Lorsque vous créez un sous-compte, le service crée un groupe d’hôtels par défaut sous le sous-compte nommé Ungrouped. L’API vous permet de répertorier, d’obtenir, de mettre à jour et d’ajouter des groupes d’hôtels.

Voici les modèles REST que vous utilisez pour gérer les groupes d’hôtels.

Pour obtenir un exemple qui obtient, ajoute et met à jour des groupes d’hôtels, consultez exemples de code. (Utilisez le sélecteur de langue dans le volet droit pour afficher l’exemple dans différentes langues.)

Liste des groupes d’hôtels

Par défaut, lorsque vous demandez une liste de groupes d’hôtels sous un sous-compte, l’API retourne un maximum de 1 000 groupes. Pour déterminer le nombre total de groupes dans le sous-compte, utilisez le paramètre de requête $count . Pour spécifier le nombre de groupes à retourner, utilisez le paramètre de requête $top . Le nombre maximal de groupes que vous pouvez demander dans un seul appel est de 5 000. Si le sous-compte contient plus de 5 000 groupes, utilisez les paramètres de requête $top et $skip pour parcourir tous les groupes.

Pour obtenir la liste des 1 000 premiers groupes d’hôtels sous un sous-compte, envoyez la requête suivante.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet CollectionResponse . Le value tableau contient une liste d’objets HotelGroup . Cet exemple montre le groupe non groupé par défaut.

HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: f526c0e6-f7d8-48c7-9270-8fb0a0465153
x-ms-trackingid: 21fafae0-4053-46e0-8271-87bc5fce6312

{
  "@odata.count":6,
  "value":[
    {
      "Id":"55113020342274",
      "Name":"UnGrouped",
      "Status":"Active",
      "Bid":{
        "@odata.type":"#Model.FixedBid",
        "Amount":3.0
      },
      "BidSource":"SubAccount",
      "BidMultiplierSource":null,
      "BidMultipliers":[]
    },
	
	. . .
	
    {
      "Id":"55113020351605",
      "Name":"test-2",
      "Status":"Active",
      "Bid":{
        "@odata.type":"#Model.FixedBid",
        "Amount":1.5
      },
      "BidSource":"HotelGroup",
      "BidMultiplierSource":null,
      "BidMultipliers":[]
    }
  ]
}

Ajout d’un groupe d’hôtels

Vous devez créer un groupe d’hôtels si vous souhaitez créer un regroupement logique d’hôtels. Pour spécifier le groupe d’hôtels, utilisez l’objet HotelGroup . Le seul champ obligatoire est Name. Utilisez un nom descriptif qui indique le regroupement. Les champs Bid et BidMultipliers sont facultatifs. Si vous ne les spécifiez pas, le groupe utilise les multiplicateurs d’enchères et d’enchères du sous-compte. Spécifiez-les si vous souhaitez remplacer les valeurs du sous-compte. Vous pouvez spécifier l’enchère, les multiplicateurs ou les deux.

Pour plus d’informations sur la plage d’enchères valide pour votre marché, consultez la table Currency Value dans la rubrique Devises .

L’exemple suivant crée un groupe d’hôtels qui hérite des multiplicateurs d’enchères et d’enchères du sous-compte.

POST https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>
Content-Length: 26

{"Name":"test-3"}

La réponse est un objet AddResponse qui contient l’ID du groupe d’hôtels ajouté.

HTTP/1.1 200 OK
Content-Length: 140
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: 8a2e2026-e170-4607-b4fe-06954a67b80a
x-ms-trackingid: e86fcdbd-613e-44a9-b5fc-528cfa87297a

{
  "value":"55113020351606"
}

Après avoir ajouté un groupe d’hôtels, utilisez le modèle d’association pour ajouter des hôtels au groupe. Pour plus d’informations, consultez Association d’un hôtel à un groupe hôtelier.

Mise à jour d’un groupe hôtelier

Le groupe d’hôtels spécifie les multiplicateurs d’enchères et d’enchères par défaut à utiliser pour les hôtels du groupe. Le groupe les spécifie explicitement ou les hérite du sous-compte auquel il appartient. Vous pouvez utiliser l’API pour mettre à jour les multiplicateurs d’enchères et d’enchères à utiliser pour les hôtels qui ne spécifient pas d’offre ou de multiplicateurs.

Pour plus d’informations sur la plage d’enchères et le budget valides pour votre marché, consultez la table Currency Value dans la rubrique Devises .

Si le sous-compte spécifie une enchère maximale, l’enchère du groupe d’hôtels doit être inférieure à l’enchère maximale du sous-compte.

Pour suspendre tous les hôtels du groupe d’hôtels, définissez la propriété du Bid groupe sur un objet PercentageBid et le pourcentage montant de l’offre sur zéro (0,0).

Si le groupe spécifie une enchère supérieure à zéro, mais que les hôtels du groupe ne servent pas, cela peut être dû au fait que l’offre du sous-compte est égale à zéro.

Pour supprimer l’enchère du groupe d’hôtels, affectez Bid la valeur null (par exemple, « Bid » :null).

Si le groupe d’hôtels spécifie des multiplicateurs d’enchères et que vous souhaitez les supprimer, définissez BidMultipliers sur un tableau vide (par exemple, « BidMultipliers » :[]).

Pour mettre à jour un groupe d’hôtels, envoyez une demande PATCH. Le corps de la requête est un objet HotelGroup . Incluez uniquement les propriétés que vous souhaitez mettre à jour. Cet exemple montre la mise à jour de l’offre et des multiplicateurs.

PATCH https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('<hotelgroupid>') HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Content-Type: application/json
Content-Length: 474
Host: <host>

{
  "Id":"55113020351606",
  "Bid":{
    "Amount":4.75,
    "@odata.type":"#Model.FixedBid"
  },
  "BidMultipliers":[
    {
      "DeviceTypes":["Desktop"],
      "Factor":0.65,
      "@odata.type":"#Model.DeviceMultiplier"
    },
    {
      "MinimumNumberOfNights":7,
      "Factor":1.3,
      "@odata.type":"#Model.LengthOfStayMultiplier"
    },
    {
      "DaysOfWeek":["Thursday","Friday","Saturday"],
      "Factor":1.5,
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier"
    },
    {
      "DaysOfWeek":["Sunday","Monday"],
      "Factor":2.5,
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier"
    }
  ]
}

Obtenir un groupe hôtelier

Pour obtenir un groupe d’hôtels spécifique, envoyez la requête suivante. L’ID du groupe d’hôtels doit être encapsulé entre guillemets simples, comme indiqué.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('<hotelgroupid>') HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet HotelGroup .

HTTP/1.1 200 OK
Content-Length: 813
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: 3be2a39c-723c-41bd-9e74-0a9e44c4fa3c
x-ms-trackingid: e5eba818-2ef7-4fe6-9225-9e2325414e3b

{
  "Id":"55113020351606",
  "Name":"test-2",
  "Status":"Active",
  "Bid":{
    "@odata.type":"#Model.FixedBid",
    "Amount":4.75
  },
  "BidSource":"HotelGroup",
  "BidMultiplierSource":"HotelGroup",
  "BidMultipliers":[
    {
      "@odata.type":"#Model.DeviceMultiplier",
      "Factor":0.65,
      "DeviceTypes":["Desktop"]
    },
    {
      "@odata.type":"#Model.LengthOfStayMultiplier",
      "Factor":1.3,
      "MinimumNumberOfNights":7
    },
    {
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
      "Factor":2.5,
      "DaysOfWeek":["Monday","Sunday"]
    },
    {
      "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
      "Factor":1.5,
      "DaysOfWeek":["Thursday","Friday","Saturday"]
    }
  ],
  "HotelAssociationCount":0
}

Utilisation des hôtels

Les hôtels représentent les hôtels de votre flux d’hôtel. L’API vous permet de répertorier, d’obtenir et de mettre à jour des hôtels. Vous ne pouvez pas utiliser l’API pour ajouter des hôtels ; pour ajouter des hôtels, utilisez le flux Hôtel. Les hôtels sont uniques par sous-compte : plusieurs sous-comptes peuvent ne pas contenir le même hôtel.

Voici les modèles REST que vous utilisez pour gérer les hôtels.

  • /SubAccounts('{subAccountId}')/HotelsGET
  • /SubAccounts('{subAccountId}')/HotelGroups('{hotelGroupId}')/HotelsGET
  • /SubAccounts('{subAccountId}')/HotelGroups('{hotelGroupId}')/Hotels('{hotelId}')GET | PATCH

Pour obtenir un exemple qui obtient et met à jour des hôtels, consultez exemples d’hôtels. (Utilisez le sélecteur de langue dans le volet droit pour afficher l’exemple dans différentes langues.)

Référencement des hôtels

Par défaut, lorsque vous demandez une liste d’hôtels dans un groupe d’hôtels, l’API retourne un maximum de 1 000 hôtels. Pour déterminer le nombre total d’hôtels dans le groupe d’hôtels, utilisez le paramètre de requête $count . Pour spécifier le nombre d’hôtels à retourner, utilisez le paramètre de requête $top . Le nombre maximal d’hôtels que vous pouvez demander en appel unique est de 5 000. Si votre groupe hôtelier contient plus de 5 000 hôtels, utilisez les paramètres de requête $top et $skip pour parcourir les hôtels.

Remarque

Vous devez utiliser les paramètres de requête $top et $skip pour parcourir les hôtels dans une expérience d’interface utilisateur uniquement. Pour obtenir tous vos hôtels, utilisez la fonctionnalité De rapports pour télécharger les hôtels.

  • /SubAccounts('{subAccountId}')/Hotels
  • /SubAccounts('{subaccountid}')/HotelGroups('{hotelgroupid}')/Hotels
  • /SubAccounts('{subAccountId}')/Ungrouped

Pour obtenir les 1 000 premiers hôtels d’un groupe hôtelier, envoyez la demande suivante.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('<hotelgroupid>')/Hotels HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet CollectionResponse . Le value tableau contient une liste d’objets Hotel .

HTTP/1.1 200 OK
Content-Length: 1611
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: d836f741-8083-4d54-b49e-e1f14287b944
x-ms-trackingid: 3787a393-eca3-4ad0-be3d-dd4c7ae08906

{
  "@odata.count":2,
  "value":[
    {
      "Id":"55113020344013",
      "Name":"Contoso Inn Singer",
      "PartnerHotelId":"942909",
      "Status":"Active",
      "CountryCode":"US",
      "Bid":{
        "@odata.type":"#Model.FixedBid",
        "Amount":2.75
      },
      "BidSource":"HotelGroup",
      "BidMultiplierSource":"HotelGroup",
      "BidMultipliers":[
        {
          "@odata.type":"#Model.DeviceMultiplier",
          "Factor":2.65,
          "DeviceTypes":["Desktop"]
        },
        {
          "@odata.type":"#Model.LengthOfStayMultiplier",
          "Factor":1.3,
          "MinimumNumberOfNights":8
        },
        {
          "@odata.type":"#Model.UserCountryMultiplier",
          "Factor":1.1,
          "Countries":["US"]
        },
        {
          "@odata.type":"#Model.AdvanceBookingWindowMultiplier",
          "Factor":1.3,
          "MinimumNumberOfDays":3
        },
        {
          "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
          "Factor":0.9,
          "DaysOfWeek":["Monday","Sunday"]
        },
        {
          "@odata.type":"#Model.CheckinDayOfWeekMultiplier",
          "Factor":1.2,
          "DaysOfWeek":["Thursday","Friday","Saturday"]
        },
        {
          "@odata.type":"#Model.SiteMultiplier",
          "Factor":0.85,"Sites":["MapResults","LocalUniversal"]
        }
      ]
    },
    {
      "Id":"55113020351595",
      "Name":"Contoso Inn Casino Center",
      "PartnerHotelId":"60278",
      "Status":"Active",
      "CountryCode":"US",
      "Bid":{
        "@odata.type":"#Model.FixedBid",
        "Amount":2.75
      },
      "BidSource":"HotelGroup",
      "BidMultiplierSource":null,
      "BidMultipliers":[]
    }
  ]
}

Mise à jour d’un hôtel

L’hôtel spécifie les multiplicateurs d’enchères et d’enchères à utiliser pour les annonces de prix d’hôtel. L’hôtel les spécifie explicitement ou les hérite du groupe d’hôtels ou du sous-compte, dans cet ordre. Vous pouvez utiliser l’API pour mettre à jour les multiplicateurs d’enchères et d’enchères à utiliser pour l’annonce de l’hôtel.

Pour plus d’informations sur la plage d’enchères valide pour votre marché, consultez la table Currency Value dans la rubrique Devises .

Si le sous-compte spécifie une enchère maximale, l’offre de l’hôtel doit être inférieure à l’enchère maximale du sous-compte.

Pour suspendre un hôtel, définissez sa Bid propriété sur un objet PercentageBid et le pourcentage d’enchères sur zéro (0,0).

Si l’hôtel spécifie une enchère supérieure à zéro mais qu’elle ne sert pas, cela peut être dû au fait que l’enchère du groupe d’hôtels ou du sous-compte auquel il appartient est égale à zéro.

Pour supprimer l’offre d’un hôtel, définissez sa Bid sur null (par exemple, « Bid » :null).

Si l’hôtel spécifie des multiplicateurs d’enchères et que vous souhaitez les supprimer, définissez BidMultipliers sur un tableau vide (par exemple, « BidMultipliers » :[]).

Pour mettre à jour un hôtel, envoyez une demande PATCH . La demande peut spécifier l’ID que Microsoft a attribué à l’hôtel ou l’ID attribué par l’annonceur à l’hôtel. Si vous spécifiez l’ID affecté par l’annonceur, la requête doit définir le paramètre de requête PartnerHotelId sur true.

Le corps de la demande est un objet Hotel . Incluez uniquement les propriétés que vous souhaitez mettre à jour. Cet exemple montre la mise à jour des multiplicateurs.

{
  "BidMultipliers":[
    {
      "Countries":["US"],
      "Factor":1.1,
      "@odata.type":"#Model.UserCountryMultiplier"
    },
    {
      "DeviceTypes":["Desktop"],
      "Factor":2.65,
      "@odata.type":"#Model.DeviceMultiplier"
    }
  ]
}

Obtenir un hôtel

Pour obtenir un hôtel spécifique, envoyez la requête suivante. L’ID d’hôtel doit être placé entre guillemets simples, comme indiqué.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('<hotelgroupid>')/Hotels('<hotelid>') HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet Hotel .

HTTP/1.1 200 OK
Content-Length: 1122
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: a9a591c2-01c1-4e1c-8a6a-5cdece574460
x-ms-trackingid: ceb70eb3-36ca-4b99-a5f7-b1a04de1e4ae

{
  "Id":"55113020344013",
  "Name":"Contoso Inn Singer",
  "PartnerHotelId":"942909",
  "Status":"Active",
  "CountryCode":"US",
  "Bid":{
    "@odata.type":"#Model.FixedBid",
    "Amount":3.0
  },
  "BidSource":"SubAccount",
  "BidSource":"Hotel",
  "BidMultipliers":[
    {
      "@odata.type":"#Model.DeviceMultiplier",
      "Factor":2.65,
      "DeviceTypes":["Desktop"]
    },
    {
      "@odata.type":"#Model.UserCountryMultiplier",
      "Factor":1.1,
      "Countries":["US"]
    }
  ]
}

Multiplicateurs de la durée de séjour et de la fenêtre de réservation avancée

La description de LengthOfStayMultiplier indique que Bing applique le multiplicateur si l’utilisateur reste le nombre de nuits spécifié ou plus. Et la description de AdvanceBookingWindowMultiplier indique également que Bing applique le multiplicateur si la réservation a lieu à l’avance le nombre de jours spécifié ou plus. La partie clé de la description est l’expression , ou plus.

Si vous spécifiez plusieurs de ces multiplicateurs, la combinaison de facteur et de jours/nuits doit être unique. sinon, l’appel échoue avec une erreur DuplicateValues. Dans l’exemple LengthOfStayMultiplier suivant, le facteur pour chaque entrée est 1. Étant donné que l’entrée pour 6 nuits s’applique aux séjours de 6 nuits ou plus, la deuxième entrée pour 8 nuits est un doublon. Pour corriger cette erreur, supprimez simplement l’entrée pour 8 nuits ou fournissez une valeur de facteur différente.

  {
      "MinimumNumberOfNights": 8,
      "Factor": "1",
      "@odata.type": "#Model.LengthOfStayMultiplier"
    },
    {
      "MinimumNumberOfNights": 6,
      "Factor": "1",
      "@odata.type": "#Model.LengthOfStayMultiplier"
  }

Association d’un hôtel à un groupe hôtelier

Lorsque vous importez votre fichier de flux d’hôtel, les hôtels sont placés dans le groupe d’hôtels non groupé , qui est le groupe d’hôtels par défaut. Un hôtel peut être associé à un seul groupe hôtelier. Si vous créez un groupe d’hôtels pour organiser logiquement vos hôtels, vous souhaiterez déplacer les hôtels du groupe d’hôtels non groupé vers le nouveau groupe que vous avez créé. Pour associer un hôtel à un nouveau groupe d’hôtels, utilisez le modèle Associer . Lorsque vous associez un hôtel à un nouveau groupe d’hôtels, le service supprime l’association précédente.

L’exemple POST suivant montre comment spécifier l’association. Le corps de la requête est un objet AssociationCollection . La collection peut contenir un maximum de 500 objets HotelAssociation .

POST https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/Associate HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Content-Type: application/json
Host: <host>
Content-Length: 169

{
  "HotelAssociations":[
    {
      "HotelGroupId":"55113020351226",
      "HotelId":"55113020351595"
    },
    {
      "HotelGroupId":"55113020351226",
      "HotelId":"55113020344013"
    }
  ]
}

La méthode Associate doit toujours retourner la réussite. Si une ou plusieurs associations échouent, la réponse contient l’association d’entrée des associations ayant échoué et la raison de l’échec.

La réponse contient un objet CollectionResponse . Si toutes les associations ont réussi, le value tableau est vide. Sinon, value contient un objet HotelAssociation pour chaque association ayant échoué. Le champ de l’association Errors contient les raisons de l’échec.

HTTP/1.1 200 OK
Content-Length: 770
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: 574fe6c6-503d-427d-8921-a259f76de0ed
x-ms-trackingid: a5f2510e-709a-4370-876e-bfb05ef2b8df

{
  "value":[
    {
      "HotelId":"55113020351595",
      "HotelName":null,
      "PartnerHotelId":null,
      "HotelGroupId":"55113020351226",
      "HotelGroupName":null,
      "Errors@odata.type":"#Collection(Model.AdsApiError)",
      "Errors":[
        {
          "Code":"<code>","Property":"<propertyname>","Message":"<messagestring>"
        }
      ]
    }
  ]
}

Obtention d’associations d’hôtels

Par défaut, lorsque vous demandez une liste d’associations dans un sous-compte, l’API retourne un maximum de 1 000 associations. Pour déterminer le nombre total d’associations, utilisez le paramètre de requête $count . Pour spécifier le nombre d’associations à retourner, utilisez le paramètre de requête $top . Le nombre maximal d’associations que vous pouvez demander dans un appel unique est de 5 000. Si votre sous-compte contient plus de 5 000 associations, utilisez les paramètres de requête $top et $skip pour parcourir toutes les associations.

Pour obtenir les 1 000 premières associations d’hôtels et de groupes d’hôtels pour un sous-compte, envoyez la requête suivante :

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/Associations HTTP/1.1
Authorization: Bearer <oauthaccesstoken>
Accept: application/json
Host: <host>

La réponse contient un objet CollectionResponse . Le value tableau contient une liste d’objets HotelAsssociation .

HTTP/1.1 200 OK
Content-Length: 6880
Content-Type: application/json; odata.metadata=minimal
x-ms-requestid: 50bb9a63-f324-4c28-84f9-733b24ab3d0f
x-ms-trackingid: 4fa56e03-7e86-4f44-b671-8e00a67c2eed

{
  "@odata.count":39540,
  "value":[
    {
      "HotelId":"55113020342273",
      "HotelName":"Contoso Inn Downtown DC/Convention Center",
      "PartnerHotelId":"99995",
      "HotelGroupId":"55113020342274",
      "HotelGroupName":"UnGrouped"
    },
    {
      "HotelId":"55113020342274",
      "HotelName":"The Contoso Hotel",
      "PartnerHotelId":"999896",
      "HotelGroupId":"55113020342274",
      "HotelGroupName":"UnGrouped"
    },
    
    . . .
    
  ]
}

Filtrage des associations d’hôtels

Pour retourner un sous-ensemble d’associations, utilisez le paramètre de requête OData $filter. Vous pouvez filtrer les associations par HotelId ou PartnerHotelId uniquement. La longueur maximale de l’URL (2 048) détermine le nombre d’ID que vous pouvez spécifier. Si l’URL dépasse 2 048 caractères, la requête retourne 404.

L’exemple suivant montre comment renvoyer les associations d’hôtels spécifiées.

GET https://<host>/Travel/V1/Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/Associations?$filter=HotelId+eq+'55113020342282'+or+HotelId+eq+'55113020344943' HTTP/1.1
Authorization: Bearer <accesstokengoeshere>
Accept: application/json
Host: <host>

Traitement par lots

Pour envoyer plusieurs requêtes dans une seule requête HTTP, utilisez le modèle /$batch . Vous pouvez envoyer un maximum de 500 requêtes dans une seule demande de traitement par lots.

Remarque

Le traitement par lots est pris en charge uniquement pour les mises à jour d’hôtel telles que les modifications d’enchères.

La demande

L’exemple suivant montre un exemple de demande.

POST https://<host>/Travel/V1/$batch HTTP/1.1
Authorization: Bearer <accesstokengoeshere>
Content-Type: multipart/mixed; boundary=batch_086fe0de-9b26-4d4a-a206-6df2013a2816
Host: <host>
Content-Length: 1371

L’en-tête Content-Type doit être défini sur plusieurs parties/mixtes et inclure l’ID de limite. L’ID de limite est opaque et délimite chaque sous-requête dans la demande de lot. L’ID peut être n’importe quelle chaîne unique. Cet exemple utilise, batch_< chaîne unique>, où <chaîne> unique est un GUID.

Le corps de la demande de lot contient plusieurs requêtes individuelles délimitées par l’ID de limite. L’exemple suivant illustre le corps d’une demande de traitement par lots. Veillez à terminer chaque ligne dans le corps de la demande de lot avec CRLF (retour chariot et flux de ligne).

--batch_086fe0de-9b26-4d4a-a206-6df2013a2816
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('<groupid>')/Hotels('<hotelid>') HTTP/1.1
Content-Type: application/json; odata.metadata=minimal
Host: partner.api.sandbox.bingads.microsoft.com

{"Id":"<hotelid>","Bid":{"Amount":1.75,"@odata.type":"#Model.FixedBid"}}

--batch_086fe0de-9b26-4d4a-a206-6df2013a2816
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('groupid>')/Hotels('<hotelid>') HTTP/1.1
Content-Type: application/json; odata.metadata=minimal
Host: partner.api.sandbox.bingads.microsoft.com

{"Id":"<hotelid>","Bid":{"Amount":1.75,"@odata.type":"#Model.FixedBid"}}

--batch_086fe0de-9b26-4d4a-a206-6df2013a2816
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH Customers(<customerid>)/Accounts(<accountid>)/SubAccounts('<subaccountid>')/HotelGroups('groupid>')/Hotels('<hotelid>') HTTP/1.1
Content-Type: application/json; odata.metadata=minimal
Host: partner.api.sandbox.bingads.microsoft.com

{"Id":"<hotelid>","Bid":{"Amount":1.75,"@odata.type":"#Model.FixedBid"}}

--batch_086fe0de-9b26-4d4a-a206-6df2013a2816--

Notez que chaque ID de limite est ajouté avec un tiret double (par exemple, --batch_086fe0de-9b26-4d4a-a206-6df2013a2816). Et l’ID de limite de fin qui suit la dernière requête du lot est entouré de tirets doubles (par exemple, --batch_086fe0de-9b26-4d4a-a206-6df2013a2816--).

Le délimiteur d’ID de limite doit être suivi des en-têtes Content-Type et Content-Transfer-Encoding comme indiqué. Étant donné que vous pouvez uniquement mettre à jour les hôtels, la requête doit utiliser le verbe HTTP PATCH et utiliser le modèle d’hôtel pour identifier l’hôtel à mettre à jour. La requête doit inclure l’en-tête Content-Type et elle doit être définie sur application/json ; odata.metadata=minimal. Le corps de la demande est un objet Hotel . L’objet doit inclure l’ID de l’hôtel et doit inclure uniquement les champs que vous mettez à jour.

La réponse

La réponse est délimitée de la même façon et chaque élément de la réponse correspond directement à chaque élément de la demande. L’en-tête Content-Type de la réponse contient l’ID de limite. Obtenez l’ID et utilisez-le pour analyser chaque élément de réponse.

L’exemple suivant montre la réponse à la requête ci-dessus.

HTTP/1.1 200 OK
Content-Type: multipart/mixed; boundary=batchresponse_d33d1715-3dd3-45aa-80a9-854493c8764e
x-ms-requestid: c0fb9b49-2af0-4b41-bf57-0e4a0f8b55b9
x-ms-trackingid: 8b652a73-1bef-488d-b7d5-f371a31867a4
Date: Tue, 27 Mar 2018 20:30:19 GMT
Content-Length: 512

--batchresponse_d33d1715-3dd3-45aa-80a9-854493c8764e
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 204 No Content


--batchresponse_d33d1715-3dd3-45aa-80a9-854493c8764e
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 204 No Content


--batchresponse_d33d1715-3dd3-45aa-80a9-854493c8764e
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 204 No Content


--batchresponse_d33d1715-3dd3-45aa-80a9-854493c8764e--

Chaque élément de réponse contient un status HTTP. Pour les mises à jour, si la mise à jour réussit, le status est 204. Si la mise à jour échoue (par exemple, l’hôtel est introuvable, une valeur n’est pas valide ou l’objet hôtel est incorrect), le status est 400 et le corps contient une liste d’erreurs. (Une requête peut échouer avec d’autres codes status.)

L’exemple suivant montre un élément de réponse qui contient une erreur. Si une erreur se produit, le corps contient un objet CollectionResponse et chaque élément du value tableau est un objet AdsApiError .

--batchresponse_d0048f4c-8a3f-40aa-9392-718943ecc5f3
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 400 Bad Request
x-ms-requestid: 00b551c2-b552-4cca-9e1b-04e0e5ffb4b7
x-ms-trackingid: ad383e45-4174-43d7-95bc-cca2ac6176e8
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true
OData-Version: 4.0

{
  "@odata.count":1,
  "value":[
    {
      "Code":"EntityDoesNotExist","Property":null,"Message":null
    }
  ]
}
--batchresponse_d0048f4c-8a3f-40aa-9392-718943ecc5f3--

Exemple de code pour le traitement des demandes de traitement par lots

Pour obtenir un exemple de code qui met à jour la tarification des hôtels dans une demande de traitement par lots, consultez Exemple de traitement par lots.