API de migration vers la prise de décision decisioning-migration-api

Sur cette page : utilisez l’API Decisioning Migration Service pour déplacer les objets de gestion des décisions entre les sandbox avec une analyse des dépendances automatisée et la prise en charge de la restauration, afin que vous puissiez transférer le contenu de prise de décision entre les environnements tout en préservant l’intégrité des données.

L’API Decisioning Migration Service vous permet de migrer des objets de gestion des décisions d’un sandbox à un autre. Le processus de migration s’exécute sous la forme de workflows asynchrones qui incluent l’analyse des dépendances, l’exécution et des fonctionnalités de restauration facultatives.

Cette API vous permet de transférer en toute transparence votre contenu de prise de décision entre les environnements tout en préservant l’intégrité des données et les relations.

Pour en savoir plus sur les avantages et les fonctionnalités de la prise de décision par rapport à la gestion des décisions, consultez cette page.

Fonctionnalités capabilities

L’API Decisioning Migration Service offre les fonctionnalités suivantes :

  • Analyse des dépendances : identifiez toutes les dépendances requises entre les sandbox source et cible, y compris les exigences en matière d’attributs, de segments et de jeux de données.
  • Portée de migration flexible : exécutez les migrations au niveau du sandbox, de l’offre ou de la décision en fonction de vos besoins.
  • Prise en charge de la restauration : rétablissez une migration terminée si des problèmes sont détectés lors de la validation.

Conditions préalables prerequisites

Autorisations nécessaires permissions

Pour utiliser l’API Migration, vous avez besoin des autorisations appropriées dans les sandbox source et cible :

Sandbox source : accès en lecture aux objets de gestion des décisions

Sandbox cible : accès permettant de créer et modifier les objets de prise de décision

Parmi les autorisations standard figurent :

  • Gestion/affichage de la prise de décision
  • Gestion/affichage des décisions
  • Gestion des offres
  • Gestion des stratégies de classement
  • Gestion des campagnes (si vous migrez des artefacts liés aux campagnes)
  • Gestion/affichage des trains de données (si vous créez un flux de données)
  • Gestion/Affichage des schémas
NOTE
Découvrez comment attribuer des autorisations de prise de décision dans cette section. Pour obtenir la liste complète des autorisations, reportez-vous à la page Autorisations intégrées.

Préparer votre sandbox cible target-sandbox-preparation

Avant d’exécuter une migration, vérifiez que votre sandbox cible est correctement configuré :

  • Attributs : vérifiez que les attributs de profil et les attributs de contexte requis existent dans le sandbox cible ou préparez des mappages pour ces derniers.
  • Segments : assurez-vous que les segments requis existent dans le sandbox cible ou prévoyez de les mapper à l’aide de l’espace de noms et de l’identifiant.
  • Jeu de données : identifiez un nom de jeu de données à utiliser pour la migration (dependency.datasetName).
  • Trains de données : décidez si la migration doit créer un train de données (createDataStream).

Pour plus d’informations sur la gestion des sandbox, voir Utiliser et attribuer des sandbox.

NOTE
Le sandbox cible peut être le même que le sandbox source. Le processus de migration gère ce scénario et assure l’intégrité des données, que les objets soient migrés dans le même sandbox ou vers un autre.

Conditions préalables à la migration entre sandbox cross-sandbox-prerequisites

Lorsque le sandbox source ≠ le sandbox cible, les éléments suivants sont requis :

  • Attributs de profil - Doit exister dans le sandbox cible ou avoir des mappages prédéfinis
  • Identifiants de segment - Doivent être précréés dans le sandbox cible avec les anciens→nouveaux mappages d’identifiant
  • Mappage d’identité - Doit être configuré pour une résolution d’identité cohérente

Bases d’API api-basics

URL de base base-url

Utilisez l’URL de base suivante :

  • Production : https://decisioning-migration.adobe.io

Authentification authentication

Toutes les requêtes API nécessitent les en-têtes suivants :

  • Authorization: Bearer <IMS_ACCESS_TOKEN>
  • x-gw-ims-org-id: <IMS_ORG_ID>
  • Content-Type: application/json

Pour obtenir des instructions détaillées sur la configuration de l’authentification, consultez le guide d’authentification de Journey Optimizer.

Workflow de migration migration-workflow

Le processus de migration se compose de deux étapes principales : l’analyse des dépendances et l’exécution de la migration. Pour une migration réussie, procédez comme suit.

Étape 1 : analyser les dépendances analyze-dependencies

Avant la migration, utilisez le workflow de dépendance pour identifier ce qui doit être mappé de la gestion des décisions à la prise de décision dans votre sandbox cible. Cette analyse vous aide à comprendre les relations entre les objets et à préparer les mappages nécessaires.

Créer un workflow de dépendance create-dependency-workflow

Utilisez l’appel API suivant pour créer un workflow d’analyse des dépendances.

Format d’API

POST /workflows/generate-dependencies

Dépendance au niveau du sandbox (à privilégier)

Commencez par une analyse au niveau du sandbox pour obtenir une vue complète de toutes les dépendances :

curl --request POST \
  --url "https://decisioning-migration.adobe.io/workflows/generate-dependencies?request-level=sandbox" \
  --header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
  --header "x-gw-ims-org-id: <IMS_ORG_ID>" \
  --header "Content-Type: application/json" \
  --data '{
    "imsOrgId": "<IMS_ORG_ID>",
    "sourceSandboxDetails": { "sandboxName": "<SOURCE_SANDBOX_NAME>" },
    "targetSandboxDetails": { "sandboxName": "<TARGET_SANDBOX_NAME>" }
  }'

Dépendance au niveau de l’offre

Pour analyser les dépendances uniquement pour des offres spécifiques, appelez le même point d’entrée avec request-level=offer dans la chaîne de requête et fournissez un tableau offersList dans le corps avec les identifiants d’offre que vous souhaitez analyser.

Dépendance au niveau de la décision

Pour analyser les dépendances uniquement pour des décisions spécifiques, utilisez request-level=decision dans la chaîne de requête et fournissez un tableau decisionsList dans le corps avec les identifiants de décision à analyser.

Vérifier le statut du workflow de dépendance poll-dependency-status

Interrogez le workflow de dépendance pour vérifier quand l’analyse est terminée.

Format d’API

GET /workflows/generate-dependencies/{id}

Requête

curl --request GET \
  --url "https://decisioning-migration.adobe.io/workflows/generate-dependencies/<WORKFLOW_ID>" \
  --header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
  --header "x-gw-ims-org-id: <IMS_ORG_ID>"

Lorsque le champ status affiche Completed, l’analyse des dépendances est prête. Utilisez le résultat du workflow pour créer vos mappages de dépendance de migration :

  • profileAttributes : mappe les attributs de profil source aux attributs de profil cible.
  • contextAttributes : mappe les attributs de contexte source aux attributs de contexte cible.
  • segments - Mappe chaque clé de segment source à un identifiant de segment cible ({namespace, id})
  • datasetName - Jeu de données d’événement d’expérience cible utilisé pour la migration. Il doit être associé à un flux de données activé pour les appels Journey Optimizer Edge (Web SDK) ; son schéma est utilisé pour ajouter les attributs de contexte migrés.

Vous indiquez ces mappages dans l’objet dependency de la demande de migration à l’étape 2.

Étape 2 : exécuter la migration execute-migration

Une fois que vous avez analysé les dépendances et préparé vos mappages, vous pouvez exécuter la migration.

Créer un workflow de migration create-migration-workflow

Utilisez les mappages de dépendance de l’étape 1 pour configurer et exécuter votre migration.

Format d’API

POST /workflows/migration

Migration au niveau des sandbox

Pour migrer tous les objets de prise de décision d’un sandbox à un autre :

curl --request POST \
  --url 'https://decisioning-migration.adobe.io/workflows/migration?request-level=sandbox' \
  --header 'Authorization: Bearer <IMS_ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --header 'x-gw-ims-org-id: <IMS_ORG_ID>' \
  --data '{
    "imsOrgId": "<IMS_ORG_ID>",
    "sourceSandboxDetails": { "sandboxName": "<SOURCE_SANDBOX_NAME>" },
    "targetSandboxDetails": { "sandboxName": "<TARGET_SANDBOX_NAME>" },
    "createDataStream": true,
    "dependency": {
      "profileAttributes": {
        "sourceAttr1": "targetAttr1"
      },
      "segments": {
        "sourceSegmentKey1": {
          "namespace": "<TARGET_SEGMENT_NAMESPACE>",
          "id": "<TARGET_SEGMENT_ID>"
        }
      },
      "contextAttributes": {
        "sourceCtx1": "targetCtx1"
      },
      "datasetName": "<TARGET_DATASET_NAME>"
    }
  }'

Migration au niveau des offres

Pour migrer des offres spécifiques uniquement, utilisez request-level=offer dans la chaîne de requête et ajoutez un tableau offersList au corps :

"offersList": ["offer-id-1", "offer-id-2"]

Migration au niveau des décisions

Pour migrer des décisions spécifiques uniquement, utilisez request-level=decision dans la chaîne de requête et ajoutez un tableau decisionsList au corps :

"decisionsList": ["decision-id-1", "decision-id-2"]

Champs de demande

  • request-level (requête) - Portée de la migration : sandbox, offer ou decision.
  • imsOrgId (obligatoire) - Votre ID d’organisation IMS.
  • sourceSandboxDetails.sandboxName (obligatoire) : sandbox Source contenant les entités de gestion des décisions.
  • targetSandboxDetails.sandboxName (obligatoire) : sandbox cible dans lequel les entités de prise de décision sont créées.
  • dependency.datasetName (obligatoire) - Jeu de données d’événement d’expérience cible. Il doit être associé à un flux de données activé pour les appels Journey Optimizer Edge (Web SDK) ; son schéma est utilisé pour ajouter les attributs de contexte migrés.
  • createDataStream - true crée un flux de données compatible avec Journey Optimizer ; false réutilise celui déjà associé au jeu de données dans dependency.datasetName.
  • dependency.profileAttributes - Mappage des attributs de profil source → cible.
  • dependency.contextAttributes - Mappage des attributs de contexte source → cible.
  • dependency.segments - Mappage de la clé du segment source → du segment cible ({namespace, id}).
  • offersList[] / decisionsList[] - ID de l’offre ou de la décision à migrer ; requis lorsque request-level est offer ou decision, respectivement.

Surveiller le statut de la migration poll-migration-status

Interrogez le workflow de migration pour suivre sa progression.

Format d’API

GET /workflows/migration/{id}

Requête

curl --request GET \
  --url "https://decisioning-migration.adobe.io/workflows/migration/<WORKFLOW_ID>" \
  --header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
  --header "x-gw-ims-org-id: <IMS_ORG_ID>"

Résultats de la migration

Lorsque le champ status affiche Completed, la migration a réussi. Le workflow result comprend :

  • Mappages des objets migrés
  • Tous les avertissements rencontrés lors de la migration

Lorsque le champ status affiche Failed, consultez le tableau errors[] et le champ result.error pour en savoir plus sur le problème.

Chaque workflow (dépendance, migration et restauration) renvoie les mêmes champs de ressource :

  • id - Identifiant du workflow (UUID) ; interroge son statut avec le GET /{id} correspondant.
  • status - État du cycle de vie : New, Running, Completed ou Failed.
  • result - Présent sur les Completed ; sortie du workflow (par exemple, les mappages des objets migrés et les avertissements éventuels).
  • erreurs[] - Présent sur le Failed ; détails structurés de l’erreur (voir également result.error).
  • _links.self - URL de la ressource de workflow.

Valider la migration validate-migration

Une fois la migration terminée, vérifiez que tous les objets ont été migrés correctement.

Liste de contrôle de validation validation-checklist

  1. Segments : vérifiez que tous les segments référencés se résolvent correctement dans le sandbox cible en fonction de vos mappages.

  2. Attributs : vérifiez que tous les attributs de profil et les attributs de contexte existent dans le sandbox cible et sont correctement mappés.

  3. Objets de prise de décision : examinez les objets migrés dans l’interface d’utilisation de Journey Optimizer :

    • Offres (éléments de décision)
    • Règles d’éligibilité
    • Formules de classement
    • Stratégies de sélection
    • Politiques de décision
  4. Test du train de données : si un flux de données a été créé, testez la diffusion au moment de l’exécution à l’aide de l’API Edge Interact.

Exemple test-runtime-delivery

Si votre migration a créé un train de données, vous pouvez tester la diffusion de l’offre à l’aide de l’exemple suivant :

curl --request POST \
  --url "https://edge.adobedc.net/ee/or2/v1/interact?configId=<DATASTREAM_ID>" \
  --header "Content-Type: application/json" \
  --header "x-request-id: <uuid>" \
  --data '{ "events": [ ... ] }'

Restaurer une migration rollback

Si vous rencontrez des problèmes lors de la validation, vous pouvez annuler une migration terminée afin de restaurer le sandbox cible à son état précédent.

Créer un workflow de restauration create-rollback-workflow

Lancez une restauration en créant un workflow de restauration qui fait référence à la migration que vous souhaitez annuler.

Format d’API

POST /workflows/rollback

Requête

curl --request POST \
  --url "https://decisioning-migration.adobe.io/workflows/rollback" \
  --header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
  --header "x-gw-ims-org-id: <IMS_ORG_ID>" \
  --header "Content-Type: application/json" \
  --data '{ "rollbackWorkflowId": "<MIGRATION_WORKFLOW_ID>" }'

Remplacez <MIGRATION_WORKFLOW_ID> par l’identifiant du workflow de migration que vous souhaitez restaurer.

Surveiller le statut de la restauration poll-rollback-status

Interrogez le workflow de restauration pour suivre sa progression.

Format d’API

GET /workflows/rollback/{rollbackWorkflowId}

Requête

curl --request GET \
  --url "https://decisioning-migration.adobe.io/workflows/rollback/<ROLLBACK_WORKFLOW_ID>" \
  --header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
  --header "x-gw-ims-org-id: <IMS_ORG_ID>"

Gérer des workflows simultanés handle-concurrency

L’API Migration n’autorise l’exécution que d’un seul workflow à la fois par organisation. Si vous tentez de créer un workflow alors qu’un autre est en cours, vous recevrez une réponse d’erreur 409 de conflit (« Un workflow est déjà en cours… »).

Dans ce cas, attendez que le workflow en cours soit terminé ou récupérez l’ID du workflow et interrogez son statut. Une fois le workflow en cours terminé, vous pouvez en créer un nouveau.

Portée et couverture de la migration migration-scope

Comprendre la portée de la migration vous aide à planifier et à valider votre transition de la gestion des décisions à la prise de décision. Cette section décrit ce qui est couvert par le processus de migration et ce qui nécessite une action manuelle.

Portée : éléments couverts in-scope

L’API de migration gère les éléments et fonctionnalités suivants :

  • Cas d’utilisation - Seuls les cas d’utilisation de prise de décision entrante/Edge sont concernés. Les migrations de canaux sortants ou OD dans Journey Optimizer Email sont prises en charge, mais nécessitent des mises à jour manuelles.
  • Campagnes d’expérience basées sur du code - Créées automatiquement pendant la migration, une campagne par portée de décision migrée dans votre sandbox cible.
  • Configuration/surface de canal - Configurations/surfaces de canal créées par emplacement de gestion des décisions, assurant le routage correct des réponses de prise de décision.
  • Types de contenu des offres - Les offres ne sont migrées que si leur type de contenu est JSON ou Texte. D’autres types de contenu nécessitent une recréation manuelle.
  • Caractéristiques de l’offre - Conservées dans le groupe de champs offer_item_custom_attributes du schéma « Éléments d’offre personnalisés - Prise de décision basée sur l’expérience », tout en conservant des métadonnées personnalisées.
  • Attributs de contexte - Ajout au schéma d’événement d’expérience dans le groupe de champs custom_context_attributes pour le suivi et la personnalisation.
  • Portées des décisions - Une portée de décision de gestion des décisions correspond à une stratégie de sélection + une politique de décision + une campagne dans la prise de décision, ce qui garantit une hiérarchie d’entités appropriée.
  • Règles d’éligibilité API uniquement - Les règles d’éligibilité créées via l’API uniquement (et non dans l’interface utilisateur de gestion des décisions) sont migrées et restent API uniquement dans Decisioning. Les règles créées par l’interface utilisateur sont également migrées.

Hors-champ : ce qui n’est pas couvert ou nécessite une action manuelle. out-of-scope

Les éléments suivants nécessitent une action manuelle ou ne sont pas pris en charge par l’outil de migration :

  • Emplacements Decisioning - Aucun emplacement n’est créé par l’outil de migration. Vous devez les créer manuellement dans la prise de décision avant ou après la migration en fonction de votre architecture.
  • Limitation au niveau de l’emplacement - La limitation de la fréquence au niveau de l’emplacement n’est pas migrée.
  • Contenu d’offre non JSON/texte - Les offres avec des types de contenu autres que JSON ou Texte (par exemple, HTML, images) ne sont PAS migrées et nécessitent une recréation manuelle dans la prise de décision.
  • Attributs de profil et segments - Les attributs de profil et les appartenances aux segments NE sont JAMAIS créés ni modifiés par l’outil de migration. Ils doivent déjà exister dans votre sandbox cible avant d’exécuter la migration.
  • Mappage des identifiants de segment - Les identifiants de segment doivent être précréés dans le sandbox cible. Vous devez fournir un ancien→nouveau mappage d’ID dans la requête de l’API de migration pour la résolution de segment.
  • Modifications du code de collecte de données - Les modifications du code de suivi des événements côté client et côté serveur ne sont PAS automatisées. Votre équipe d’implémentation doit mettre à jour la collecte d’événements pour utiliser les formats de requête/réponse de prise de décision et les schémas d’événement de prise de décision.

Référence de mappage d’entités entity-mapping

Lors de la migration de la gestion des décisions vers la prise de décision, les entités sont mappées conformément au tableau suivant. Les mappages incluent les entités Decisioning principales et les entités associées supplémentaires créées ou utilisées lors de la migration.

Mappage de la gestion des décisions avec l’entité de prise de décision

Entité de gestion des décisions
Entité de prise de décision
Entités Supplémentaires
Décision
Stratégie de sélection
Collection D’Articles, Règle D’Éligibilité, Formule De Classement
Politique de décision
Nombre D’Articles, Stratégies De Sélection, Article D’Offre De Secours
Campagne d’expérience basée sur le code
Politique de décision, contenu, configuration des canaux, fragments de Journey Optimizer
Emplacement
Configuration des canaux
Collection
Collection d’articles
Balises unifiées, éléments d’offre
Qualificateur de collection
Balises unifiées
Règle
Règle de prise de décision
Formule De Classement
Formule De Classement De Prise De Décision
Offre
Article de l’offre
Règle d’éligibilité, Fragments Journey Optimizer, Balises unifiées, Capping de la fréquence
Schéma d’élément d’offre
Fragments de Journey Optimizer

Conventions de dénomination

Le processus de migration applique les conventions de nommage à l’aide du préfixe ExD_ pour garantir la cohérence et éviter les conflits de nommage.

Objet Source
Modèle de nom de la gestion des décisions
Modèle de nom de prise de décision
Offre
<offerName>
ExD_<offerName>
Règle d’éligibilité
<ruleName>
ExD_<ruleName>
Formule De Classement
<formulaName>
ExD_<formulaName>
Collection
<collectionName>
ExD_<collectionName>_<placementName>
Stratégie de sélection des → de décision
<decisionName>
ExD_<decisionName>_selection_strategy_<index>
Politique de décision →
<decisionName>
ExD_<decisionName>_<placementName>
Fragment de Journey Optimizer
<offerName>
ExD_<offerName>_<placementName>_<index>
Placer → surface
<placementName>
ExD_<placementName> (espaces/points convertis en traits de soulignement)
Balise unifiée
<sourceName>, <targetName>
ExDMigration_<sourceName>_<targetName>
Campagne CBE
<decisionName>, <placementName>
Campaign for <decisionName> : <placementName>

Attributs supplémentaires

Attribut Source
Emplacement cible
Attributs d’offre
Champ « migratedofferattributes » dans le schéma d’élément d’offre personnalisé
Attributs de contexte
le champ « migratedcontextattributes » dans le schéma associé au jeu de données fourni lors de la migration

Modèle de requête et de réponse request-response-model

Lors de la migration de la gestion des décisions vers la prise de décision, le code de votre application doit être mis à jour pour utiliser les nouveaux formats de requête et de réponse. Les deux systèmes utilisent le point d’entrée Edge Network, mais avec des structures de payload et des noms de champ différents.

Demande Edge de gestion des décisions (actuelle) dm-request

La requête Edge de gestion des décisions actuelle suit cette structure :

Point d’entrée:

POST https://edge.adobedc.net/ee/v2/interact

En-têtes:
​- Authorization: Bearer <IMS_ACCESS_TOKEN>
​- x-api-key: <API_KEY> (à partir de Developer Console)
​- x-gw-ims-org-id: <IMS_ORG_ID> (format : {ORG_ID}@AdobeOrg)
​- x-request-id: <UNIQUE_REQUEST_ID> (pour le suivi et la déduplication)
​- Content-Type: application/vnd.adobe.xdm+json; schema="…/decision-request;version=1.0"
​- Accept: application/vnd.adobe.xdm+json; schema="…/decision-response;version=1.0"
​- x-sandbox-name: <SANDBOX_NAME> (par exemple, prod, dev)

Paramètres du corps de la requête :
​- xdm:dryRun (true/false) - Tester les requêtes sans créer de rapports polluants
​- xdm:propositionRequests[] - Tableau de requêtes de décision :
​- activityId - Identifiant de l’activité de décision
​- placementId - Identifiant d’emplacement
​- itemCount - Nombre maximal d’offres à renvoyer
​- xdm:profiles[].xdm:identityMap - Mappage d’identité (e-mail, ECID, etc.)
​- xdm:validateContextData - Indicateur de validation des données contextuelles strictes
​- xdm:responseFormat.xdm:includeContent - Inclure le contenu réel par rapport aux ID uniquement

Exemple de corps de requête :

{
  "xdm": {
    "dryRun": false,
    "propositionRequests": [
      { "activityId": "<ACTIVITY_ID>", "placementId": "<PLACEMENT_ID>", "itemCount": 3 }
    ],
    "profiles": [
      { "identityMap": { "ECID": [ { "id": "<ECID>", "primary": true } ] } }
    ],
    "validateContextData": true,
    "responseFormat": { "includeContent": true }
  }
}
NOTE
Pour obtenir la référence complète de la requête/réponse de gestion des décisions (OD), consultez API Edge Decisioning (la variante Web SDK/Edge, qui utilise des decisionScopes codées en base64 comportant des activityId et des placementId).

Requête D’Edge De Prise De Décision (Après La Migration) decisioning-request

Après la migration, utilisez le format de requête Decisioning via le même point d’entrée Edge Network.

Point d’entrée:

POST https://edge.adobedc.net/ee/v2/interact

Champs de demande de clé :
​- query.identity.fetch - Tableau des types d’identité à résoudre (par exemple, ["ECID"])
​- event.xdm.environment.type - Type d’environnement : "browser", "app" ou "server"
​- event.xdm.environment.browserDetails - Métadonnées du navigateur (viewportWidth, viewportHeight, userAgent)
​- event.xdm.identityMap - Mappage d’identité identique à la gestion des décisions
​- event.xdm.timestamp - Horodatage ISO 8601
​- query.personalization.surfaces - Tableau de surfaces cibles (par exemple, ["web://site.com/homepage"]) - remplace decisionScope
​- query.personalization.schemas - Schémas de contenu à renvoyer (par exemple, ["json-content-item", "html-content-item"])
​- data.__adobe.ajo.allowDuplicateDecisionItems - Contrôle de déduplication (par défaut, true ; définissez false pour qu’un élément admissible pour plusieurs surfaces soit renvoyé une seule fois, les autres surfaces recevant un élément de secours/vide). Remplace le allowDuplicatePropositions Gestion des décisions .
​- data.__adobe.ajo.dryRun - Indicateur de test ; supprime les événements de commentaires pour les compteurs de reporting et de limitation. Remplace le xdm:dryRun Gestion des décisions . À supprimer avant la production.

Exemple de corps de requête (côté serveur) :

{
  "events": [
    {
      "query": {
        "identity": { "fetch": ["ECID"] },
        "personalization": {
          "surfaces": ["web://my-web/IP_NLI_HP_GET_LOAN_WIDGET"],
          "schemas": [
            "https://ns.adobe.com/personalization/json-content-item",
            "https://ns.adobe.com/personalization/html-content-item"
          ]
        }
      },
      "xdm": {
        "eventType": "decisioning.propositionFetch",
        "environment": {
          "type": "browser",
          "browserDetails": { "viewportWidth": 1280, "viewportHeight": 900, "userAgent": "<USER_AGENT>" }
        },
        "identityMap": {
          "ECID": [ { "id": "<ECID>", "authenticatedState": "ambiguous", "primary": true } ]
        },
        "timestamp": "2025-09-08T12:00:00.000Z"
      },
      "data": {
        "__adobe": { "ajo": { "allowDuplicateDecisionItems": false } }
      }
    }
  ],
  "meta": {
    "state": {
      "domain": "my-web",
      "cookiesEnabled": true,
      "entries": [
        { "key": "kndctr_<ORG>_AdobeOrg_identity", "value": "<identity-cookie>" },
        { "key": "kndctr_<ORG>_AdobeOrg_cluster", "value": "<cluster-cookie>" }
      ]
    }
  }
}
NOTE
Pour consulter la référence complète de Journey Optimizer Decisioning Web SDK/Edge, voir Expérience basée sur le code : implémentations de prise de décision.

Réponse d’Edge à la prise de décision decisioning-response

La réponse Decisioning contient plusieurs descripteurs organisés par type de préoccupation : personalization:decisions (les offres), locationHint:result et state:store (les cookies à conserver).

Structure de réponse :

{
  "requestId": "<REQUEST_ID>",
  "handle": [
    {
      "type": "personalization:decisions",
      "eventIndex": 0,
      "payload": [
        {
          "id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
          "scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
          "scopeDetails": {
            "decisionProvider": "AJO",
            "correlationID": "<CORRELATION_ID>",
            "characteristics": {
              "eventToken": "<base64 message-level event token>",
              "subPropositions": "<base64-encoded array of decision items>"
            },
            "rank": 1,
            "activity": {
              "id": "<campaignId>#<actionId>",
              "priority": 0,
              "matchedSurfaces": ["web://my-web/IP_NLI_HP_GET_LOAN_WIDGET"]
            }
          },
          "items": [
            {
              "id": "36646bab-af1b-44c6-b632-bbfb9c357919",
              "schema": "https://ns.adobe.com/personalization/json-content-item",
              "data": { "content": "{ ...offer JSON... }" }
            }
          ]
        }
      ]
    },
    {
      "type": "locationHint:result",
      "payload": [
        { "scope": "EdgeNetwork", "hint": "ind1", "ttlSeconds": 1800 }
      ]
    },
    {
      "type": "state:store",
      "payload": [
        { "key": "kndctr_<ORG>_AdobeOrg_cluster", "value": "<cluster-cookie>", "maxAge": 1800 },
        { "key": "kndctr_<ORG>_AdobeOrg_identity", "value": "<identity-cookie>", "maxAge": 34128000 }
      ]
    }
  ]
}

Champs de réponse clés :
​- handle[].type - Type de poignée (personalization:decisions, locationHint:result, state:store)
​- payload[].id - Identifiant d’instance de proposition unique - écho sur les événements d’affichage/d’interaction
​- payload[].scope - URI de surface pour lequel la proposition a été résolue
​- payload[].scopeDetails.decisionProvider - Confirme que le moteur est AJO
​- payload[].scopeDetails.correlationID - Lie l’instance de décision à l’événement de diffusion
​- payload[].scopeDetails.rank/payload[].scopeDetails.activity - Classement et métadonnées de campagne/action pour la proposition
​- payload[].scopeDetails.characteristics.eventToken - Jeton de suivi au niveau du message
​- payload[].scopeDetails.characteristics.subPropositions - Tableau des éléments de décision codé en Base64 ; chaque élément comporte son propre token par élément. Ces jetons par élément sont ceux que vous transmettez en propositionAction.tokens sur les événements d’affichage/d’interaction
​- payload[].items[].schema/payload[].items[].data.content - Schéma de contenu et contenu réel de l’offre (JSON/HTML) à rendre
​- Payload state:store - Cookies d’identité et de cluster à conserver et à transférer sur les requêtes suivantes (côté serveur)

La chaîne characteristics.subPropositions base64-decode vers le tableau des éléments servis, chacun avec sa token par élément :

[
  {
    "id": "1ae75277-8832-4c23-bbbc-09f01cfe6c8b",
    "scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
    "scopeDetails": { "decisionProvider": "EXD", "correlationID": "<CORRELATION_ID>-0", "rank": 1 },
    "items": [
      { "id": "dps:<schema>:1be64ff83a612488", "name": "ExD_Personal Loan Offer", "score": 997.0, "token": "CLaefQnVLcLbCtzEXV3Jeg" },
      { "id": "dps:<schema>:1be6516838e1248c", "name": "ExD_Home Loan Offer",     "score": 995.0, "token": "ALlB5KV1B0e+CpHoahi7Ew" },
      { "id": "dps:<schema>:1be650da3cd06e98", "name": "ExD_Auto Loan Offer",     "score": 994.0, "token": "koJTRQcwFkR92AqbZ88ytQ" },
      { "id": "dps:<schema>:1be65612d5a1248d", "name": "ExD_Fallback Offer",      "itemSelection": { "selectionDetail": { "selectionType": "fallback" } }, "token": "GHo4ow7h6iCzBOhYR1+6jg" }
    ]
  }
]

Modèles d’implémentation implementation-patterns

Decisioning prend en charge trois approches d’implémentation :

Implémentation Côté Client (Web SDK/Mobile SDK) client-side

Web SDK ou Mobile SDK gère automatiquement toutes les demandes et la gestion des cookies. Le SDK stocke et transfère des cookies d’identité et de cluster avec chaque requête.

Gestion des cookies : automatique — Web SDK gère les cookies kndctr_<OrgId>_identity et kndctr_<OrgId>_cluster.

Implémentation côté serveur (API Edge Network) server-side

Le serveur d’applications effectue une POST directe vers Edge Network et doit gérer manuellement le transfert des cookies. Le serveur extrait les cookies de navigateur des requêtes entrantes et les transfère à Edge Network via meta.state.entries[], puis renvoie les cookies dans la réponse.

Gestion des cookies : manuelle — Le serveur d’applications doit extraire les cookies de la requête du navigateur, les transférer vers Edge Network dans le corps de la requête et les définir en réponse. Les cookies doivent être explicitement transférés en meta.state.entries pour la cohérence des identités.

Implémentation hybride hybrid

Associe le rendu côté serveur (chargement initial de la page) à SDK côté client (interactions suivantes). Le serveur effectue le rendu du contenu initial via Edge Network, puis Web SDK prend le relais pour les demandes de personnalisation suivantes.

Gestion des cookies : mixte — Côté serveur nécessite un transfert manuel des cookies vers Edge Network ; côté client géré automatiquement par Web SDK. Assurez-vous que les jetons d’identité du rendu côté serveur sont disponibles pour SDK côté client pour une résolution d’identité cohérente.

Suivi des événements et collecte de données event-tracking

Pour attribuer correctement les résultats de la prise de décision, activer le capping de la fréquence et l’optimisation du classement basée sur l’IA dédiée à l’alimentation, vous devez implémenter le suivi des événements à l’aide du schéma d’événement de prise de décision.

Champs d’événement obligatoires event-fields

eventType et _experience.decisioning.propositionEventType sont requis. Si l’un des deux est manquant, le compteur d’affichage/d’interaction correspondant ne s’incrémente pas.

  • eventType - Spécifie la catégorie d’événement :
    ​- decisioning.propositionDisplay — Événement d’impression (offre présentée à l’utilisateur)
    ​- decisioning.propositionInteract — Événement d’interaction (l’utilisateur a cliqué ou a participé à l’offre)

  • _experience.decisioning.propositionEventType - Indique le sous-type d’événement. Incluez exactement une clé de type événement définie sur 1 (chaque valeur est 1 ou 0 ; ne définissez pas plusieurs types d’événements à 1 dans le même objet) :
    ​- { "display": 1 } — Événement d’impression
    ​- { "interact": 1 } — Événement d’interaction
    ​- Si toutes les display/interact/dismiss sont 0 — ou eventType correspond à une valeur autre que decisioning.proposition<Display|Interact|Dismiss> — l’événement est traité comme un événement personnalisé.

  • _experience.decisioning.propositionAction.tokens[] - Jeton(s) par article identifiant le ou les éléments diffusés pour incrémenter les compteurs pour :
    ​- Copiez le token de chaque élément à partir du tableau de subPropositions décodé, pas scopeDetails.characteristics.eventToken, qui est un jeton de niveau message différent.
    ​- Transmettez le jeton tel qu’il a été reçu, sans modification.
    ​- Événements d’interaction : fournissez exactement un jeton (l’élément sur lequel l’utilisateur a cliqué).
    ​- Événements d’affichage : facultatif — fournissez un ou plusieurs jetons pour incrémenter des éléments spécifiques, ou omettez tokens pour incrémenter le compteur pour tous éléments dans subPropositions.

  • _experience.decisioning.propositions[] - Faites écho à la ou aux propositions diffusées, y compris les id, les scope et l’scopeDetails complet de la réponse (qui comporte des characteristics.subPropositions et requiert des decisionProvider). Vous n’avez pas besoin de créer un tableau de items[] explicite.

Schéma Requis schema-requirements

Associez le groupe de champs Prise de décision à votre schéma de jeu de données d’événement avant la migration :

  1. Dans Experience Platform, ouvrez le schéma du jeu de données d’événement
  2. Ajouter le groupe de champs Experience Event - Proposition Details
  3. Assurez-vous que les champs suivants sont mappés :
    ​- _experience.decisioning.* champs
    ​- _experience.decisioning.propositionAction.tokens
    ​- _experience.decisioning.propositionEventType

Gestion des jetons de tracking tracking-token

Le jeton de tracking doit être géré selon ces exigences :

  • Le jeton par élément oriente les compteurs — la ou les valeurs en propositionAction.tokens sont les token de chaque élément diffusé à partir de subPropositions, et non les characteristics.eventToken au niveau du message.
  • Événements d’interaction — Fournissez exactement un jeton (l’élément sur lequel l’utilisateur a cliqué).
  • Afficher les événements : les jetons sont facultatifs ; omettez d’incrémenter tous les éléments dans subPropositions ou fournissez des jetons spécifiques pour incrémenter uniquement ces éléments.
  • Ne pas modifier le jeton — transmettez la valeur telle qu’elle a été reçue ; ne la codez pas, ne l’analysez pas et ne la modifiez pas.

Exemples d’événements de prise de décision event-examples

Chaque exemple fait écho à la proposition diffusée (y compris sa scopeDetails, qui transporte des characteristics.subPropositions) et définit à la fois eventType et propositionEventType. Les compteurs s’incrémentent par rapport aux éléments dans subPropositions ; propositionAction.tokens sélectionne lesquels.

Afficher les événements

Les événements d’affichage informent Decisioning lorsqu’une offre est présentée à un utilisateur. Fournissez le ou les jetons du ou des éléments affichés, ou omettez les tokens pour incrémenter le compteur d’affichage pour tous les éléments de subPropositions :

{
  "header": {
    "imsOrgId": "YOUR_ORG_ID",
    "sandboxId": "sandbox-id",
    "sandboxName": "sandbox-name",
    "source": { "name": "ajo-inbound" }
  },
  "body": {
    "xdmEntity": {
      "identityMap": {
        "ECID": [ { "id": "ecid-123", "primary": true } ]
      },
      "eventType": "decisioning.propositionDisplay",
      "_experience": {
        "decisioning": {
          "propositionEventType": { "display": 1 },
          "propositionAction": {
            "id": "b96f842b-5dd9-4c55-9dae-647d96250028",
            "tokens": ["CLaefQnVLcLbCtzEXV3Jeg", "ALlB5KV1B0e+CpHoahi7Ew"]
          },
          "propositions": [
            {
              "id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
              "scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
              "scopeDetails": {
                "decisionProvider": "AJO",
                "characteristics": {
                  "eventToken": "<base64 eventToken from response>",
                  "subPropositions": "<base64 subPropositions from response>"
                }
              }
            }
          ]
        }
      }
    }
  }
}

Événements d’interaction (clic)

Les événements d’interaction effectuent le suivi lorsqu’un utilisateur clique ou interagit avec une offre affichée. Vous devez fournir exactement un jeton identifiant l’élément sur lequel l’utilisateur a cliqué :

{
  "header": {
    "imsOrgId": "YOUR_ORG_ID",
    "sandboxId": "sandbox-id",
    "sandboxName": "sandbox-name",
    "source": { "name": "ajo-inbound" }
  },
  "body": {
    "xdmEntity": {
      "identityMap": {
        "ECID": [ { "id": "ecid-123", "primary": true } ]
      },
      "eventType": "decisioning.propositionInteract",
      "_experience": {
        "decisioning": {
          "propositionEventType": { "interact": 1 },
          "propositionAction": {
            "id": "b96f842b-5dd9-4c55-9dae-647d96250028",
            "tokens": ["CLaefQnVLcLbCtzEXV3Jeg"]
          },
          "propositions": [
            {
              "id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
              "scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
              "scopeDetails": {
                "decisionProvider": "AJO",
                "characteristics": {
                  "eventToken": "<base64 eventToken from response>",
                  "subPropositions": "<base64 subPropositions from response>"
                }
              }
            }
          ]
        }
      }
    }
  }
}

Événements personnalisés

Un événement personnalisé utilise un eventType défini par le client (toute valeur autre que decisioning.proposition<Display|Interact|Dismiss>) et définit tous les display/interact/dismiss sur 0 dans propositionEventType (classé comme OTHER). Les événements personnalisés sont décodés comme des événements d’affichage (filtrage multi-jetons) par rapport aux subPropositions et sont évalués via le PQL configuré :

{
  "header": {
    "imsOrgId": "YOUR_ORG_ID",
    "sandboxId": "sandbox-id",
    "sandboxName": "sandbox-name",
    "originalTimestamp": 1700000
  },
  "body": {
    "xdmEntity": {
      "identityMap": {
        "ECID": [ { "id": "ecid-123", "primary": true } ]
      },
      "eventType": "add-to-cart",
      "_experience": {
        "decisioning": {
          "propositionEventType": { "display": 0, "interact": 0, "dismiss": 0 },
          "propositionAction": {
            "id": "b96f842b-5dd9-4c55-9dae-647d96250028",
            "tokens": ["CLaefQnVLcLbCtzEXV3Jeg"]
          },
          "propositions": [
            {
              "id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
              "scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
              "scopeDetails": {
                "decisionProvider": "AJO",
                "characteristics": {
                  "eventToken": "<base64 eventToken from response>",
                  "subPropositions": "<base64 subPropositions from response>"
                }
              }
            }
          ]
        }
      }
    }
  }
}

Ces événements permettent le capping de la fréquence, les rapports prêts à l’emploi et l’optimisation du classement pilotée par l’IA dans la prise de décision. Pour envoyer des événements de proposition avec le SDK Web, consultez Expérience basée sur le code : implémentations de prise de décision.

Processus de migration de bout en bout migration-process

  1. Valider les conditions préalables - Assurez-vous que votre sandbox cible est préparé et que toutes les dépendances préalables sont identifiées et prêtes avant de démarrer la migration (attributs de profil, identifiants de segment, mappage d’identifiants).

  2. Appelez l’API de migration — Exécutez l’API de migration pour migrer les objets de gestion des décisions vers Decisioning à l’aide des conditions préalables et des mappages que vous avez préparés.

  3. Génération d’entités de prise de décision de brouillon : l’outil crée des campagnes, des politiques de décision, des stratégies de sélection, des éléments d’offre, etc. à l’état de brouillon par mappage d’entité. Passez en revue tous les objets Decisioning générés dans le sandbox cible. Vérifiez que les noms, types d’entités et références sont corrects. Aucun élément n’est encore orienté client, la gestion des décisions continue à diffuser le trafic en direct.

  4. Mettre à jour le code client et serveur — Implémentez les modifications de code requises pour utiliser les nouveaux formats de requête/réponse Decisioning et implémentez le suivi d’événement avec les champs requis.

  5. Activer et basculer : activez vos objets de prise de décision (stratégies, politiques, campagnes, surfaces) et déplacez le trafic depuis la gestion des décisions sur votre propre chronologie.

recommendation-more-help
journey-optimizer-help