8 minutes

Découvrez comment utiliser l’API REST Marketo Engage pour automatiser les tâches des opérations marketing. Cet article couvre des cas d’utilisation courants pour les administrateurs de Marketo Engage, notamment la rationalisation de la création de campagnes, l’annulation des modifications de données indésirables et la traduction des informations d’engagement en actions de vente exploitables.

J’ai une formation en mathématiques appliquées et appliquées à l’informatique, ce qui me distingue de la plupart des praticiens de Marketo Engage. Lorsque j’ai commencé à travailler dans le domaine du marketing, j’e me suis rendu compte qu’une grande partie du travail pouvait être automatisée. L’automatisation peut me conduire à être plus efficace dans mon travail et à connaître une croissance de carrière plus rapide. L’utilisation de l’API pour automatiser les opérations quotidiennes me permet de me concentrer sur des sujets plus stratégiques au lieu d’être submergé par des tâches opérationnelles.

Dans cet article, je partage la façon dont j’ai utilisé l’API REST Marketo Engage en présentant trois de mes cas d’utilisation préférés pour démontrer sa puissance. Laissez-moi vous montrer comment l’API REST peut devenir votre allié pour améliorer votre efficacité dans Marketo Engage, ce qui vous laissera plus de temps pour vous concentrer sur les questions stratégiques.

À présent, attachez votre ceinture et préparez-vous à apprendre la façon dont j’utilise l’API REST pour ces scénarios métier.

Cas d’utilisation 1 : rationaliser la création de campagnes

Marketo Engage est un outil puissant qui permet de mettre à l’échelle les opérations marketing, avec des modèles et des jetons qui permettent de rationaliser les processus. Mais soyons réalistes : il reste malgré tout beaucoup de travail manuel à faire. Si vous travaillez dans des opérations marketing, vous passez probablement une grande partie de votre temps à cloner des programmes, mettre à jour des jetons et activer des campagnes intelligentes.

Si vous ne gérez que quelques campagnes par semaine, vous pouvez être en mesure de suivre la cadence. Mais si vous gérez des dizaines, voire des centaines de campagnes, il n’est tout simplement pas pratique de tout faire manuellement. Des erreurs se produisent et il est très difficile d’assurer la cohérence entre les campagnes. C’est là que l’API REST Marketo Engage entre en jeu. À travers l’automatisation de ces tâches répétitives, vous pouvez gagner du temps, réduire les erreurs et maintenir la cohérence de tous vos efforts marketing.

Avec l’API REST, vous pouvez cloner rapidement des programmes entiers tout en conservant la structure et l’uniformité de l’ensemble. Même les utilisateurs et utilisatrices de Marketo Engage les plus expérimentés commettent des erreurs. L’automatisation réduit les risques et contribue à maintenir l’intégrité des données.

Ce processus permet toujours de personnaliser vos campagnes en fonction de vos besoins marketing. L’API REST permet de modifier des éléments clés tels que des jetons, tout en préservant la cohérence de la structure de votre campagne.

Regardez la vidéo de démonstration ci-dessous, où j’explique la façon dont utiliser les exemples de codes fournis et comment les ajuster pour répondre aux besoins de votre organisation.
Recherchez les codes présentés dans la vidéo ci-dessous pour une utilisation hors ligne dans la section « Exemples de codes ».

Cas d’utilisation 2 : annulation des modifications de données indésirables

Imaginez ce scénario : vous êtes déjà submergé de tâches lorsque vos spécialistes marketing vous demandent de manière urgente de charger une liste de prospects dans Marketo Engage. Vous le faites rapidement, pour entendre de vos RDS que les données sont fausses ! Les titres des postes sont incorrects, les anciens prospects ont été remplacés et tout est en désordre.

Il s’agit d’un scénario cauchemardesque pour tout professionnel des opérations marketing. La correction manuelle de ces erreurs peut prendre des heures, voire des jours. Mais ne vous inquiétez pas, l’API REST Marketo Engage dispose d’une solution : une sorte de machine à remonter le temps pour vos données, qui vous permet de suivre et d’annuler facilement les modifications indésirables.

En utilisant l’API REST, vous pouvez extraire un journal des modifications récentes de valeurs de données, identifier les mises à jour incorrectes et restaurer les informations d’origine en quelques étapes seulement. Au lieu de vous démener pour nettoyer le fouillis de données manuellement, vous pouvez automatiser le processus de restauration et vous assurer que votre base de données reste précise et fiable.

Dans la vidéo ci-dessous, découvrons comment utiliser l’API REST pour inverser les imports de données erronées et maintenir votre instance Marketo Engage propre et exempte d’erreurs.
NOTE
Cette méthode ne peut couvrir que des cas simples de réversion des données. S’il existe de nombreuses modifications à prendre en compte, une logique plus sophistiquée sera nécessaire pour choisir la bonne valeur vers laquelle revenir.
Recherchez les codes présentés dans la vidéo ci-dessous pour une utilisation hors ligne dans la section « Exemples de codes ».

Cas d’utilisation 3 : traduire les informations en actions de vente

Pour les équipes commerciales, le contexte est primordial, en particulier lorsqu’il s’agit de comprendre pourquoi un prospect est devenu un lead qualifié en marketing (MQL). Mais trop souvent, les données sous-jacentes à cette qualification sont enfouies dans plusieurs couches de mesures d’engagement, ce qui fait que les représentants commerciaux mettent beaucoup de temps à rassembler par eux-mêmes l’histoire d’une personne.

C’est là que l’automatisation entre en jeu. En intégrant Marketo Engage à l’IA, vous pouvez transformer les données d’engagement en informations claires et exploitables qui aident les équipes commerciales à se concentrer sur ce qui compte vraiment : conclure des affaires.

À l’aide de l’API REST Marketo Engage, vous pouvez extraire les activités d’engagement récentes, les traiter via l’IA générative afin de générer un résumé concis et renvoyer ce résumé dans Marketo Engage pour plus de visibilité. Cela signifie que les représentants commerciaux n’ont plus à passer en revue les journaux d’activité d’une personne pour comprendre comment un prospect est devenu un MQL. Au lieu de cela, ils obtiennent une explication simple, générée par l’IA, du parcours du prospect. Le résumé comprend les produits ou services qui ont suscité l’intérêt et les principales mesures prises par les clients avec votre marque.

En donnant aux vendeurs un accès instantané à ces informations dans Salesforce, ils peuvent aborder les conversations en toute confiance, personnaliser leur portée et, finalement, conclure plus d’offres plus rapidement.

Ce cas d’utilisation est destiné à utiliser l’API REST lorsqu’un prospect devient MQL. Par conséquent, elle ne fonctionne que pour un seul prospect à la fois. Si vous envisagez d’appliquer cette méthode à un plus grand lot de prospects, l’API en bloc serait plus adaptée.

Examinons la vidéo ci-dessous pour voir comment cette configuration fonctionne en pratique.
IMPORTANT
Avant d’envoyer les données d’une personne vers un modèle linguistique étendu (LLM), consultez les ressources de conformité de votre entreprise afin de garantir la conformité aux lois et réglementations en vigueur.
Recherchez les codes présentés dans la vidéo ci-dessous pour une utilisation hors ligne dans la section « Exemples de codes ».

Points clés à retenir

Voilà qui résume la façon dont rationaliser vos tâches d’opérations marketing avec les API REST Marketo Engage.

J’ai présenté trois puissants cas d’utilisation pour lesquels vous pouvez utiliser les API REST :

  1. Automatisation du clonage des campagnes pour réduire le travail manuel et assurer la cohérence.
  2. Suivi et rétablissement des modifications de données indésirables pour gagner des heures de nettoyage.
  3. Fournir aux équipes commerciales des informations instantanées sur les MQL pour permettre des conversations de suivi plus efficaces.

Ces techniques d’automatisation ne se limitent pas à gagner du temps : elles permettent d’assurer la précision, de maintenir l’intégrité des données et de permettre aux équipes marketing et commerciales de travailler plus intelligemment.

Comme il peut être très difficile d’entrevoir autant de possibilités avec l’API REST, j’ai quelques conseils à vous donner :

Si vous avez trouvé cet article utile, veillez à consulter Adobe Experience League pour obtenir plus d’informations de la part de pairs et ainsi que des bonnes pratiques. Merci d’avoir lu, et bonne automatisation !

Exemple de code

Rationaliser la création de campagnes

import requests
import pandas as pd
import json
import urllib.parse
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
def get_access_token():
    global client_id
    global client_secret
    global MUNCHKIN
    params={'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret}
    headers={'Accept-Encoding': 'gzip'}
    url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token"
    response=requests.get(url=url,params=params,headers=headers)
    data=response.json()
    return data['access_token']
5
5-7
templateID=5200
folderName="Active Webinars"
programName="WB-2025-02-20-Test"
eventName="Webinar Test"
eventDate="2025-02-20"
18
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/byName.json"
token=get_access_token()
params={"name": folderName,
        "type": "Folder",
        "Content-Type": "application/x-www-form-urlencoded"}
headers={'Authorization': 'Bearer ' + token}
response=requests.get(url=url,params=params, headers=headers)
data=response.json()
print(data)
folderID=data['result'][0]["id"]
23

url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/program/

↪"+str(templateID)+"/clone.json"

token=get_access_token()

params={"Content-Type": "application/x-www-form-urlencoded"}

headers={'Authorization': 'Bearer ' + token}

body="name="+programName+"&folder={'id':"+str(folderID)+",'type':'Folder'}" url=url+"?"+body

response=requests.post(url=url,params=params,headers=headers)

data=response.json()

print(data)

programid=data['result'][0]['id']

33
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/smartCampaigns.json"
token=get_access_token()
params={"Content-Type": "application/x-www-form-urlencoded"}
headers={'Authorization': 'Bearer ' + token}
body="folder={'id':"+str(programid)+",'type':'Program'}"
url=url+"?"+body
response=requests.get(url=url, params=params, headers=headers)
data=response.json()
campaigns=[]
for campaign in data['result']:
    campaigns.append(campaign['id'])
print(campaigns)
43
for campaign in campaigns:
    url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/smartCampaign/
    ↪"+str(campaign)+"/activate.json"
    token=get_access_token()
    headers={'Authorization': 'Bearer ' + token}
    response=requests.post(url=url,headers=headers)
    data=response.json()
    print(data)
55
url = "https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/
 ↪"+str(programid)+"/tokens.json"
token=get_access_token()
headers = {
           "Authorization": f"Bearer {token}",
           "Content-Type": "application/x-www-form-urlencoded"}
payload = {
           "name": "Webinar Name",
           "value": eventName,
           "type": "text",
           "folderType": "Program"}
response = requests.post(url, headers=headers, data=payload)
data=response.json()
data
63
url = "https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/
 ↪"+str(programid)+"/tokens.json"
token=get_access_token()
headers = {
           "Authorization": f"Bearer {token}",
           "Content-Type": "application/x-www-form-urlencoded"}
payload = {
           "name": "Webinar Date",
           "value": eventDate,
           "type": "date",
           "folderType": "Program"}
response = requests.post(url, headers=headers, data=payload)
data=response.json()
data
77

Annuler les modifications de données indésirables

import pandas as pd
import csv
import json
import ast
import requests
import math
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
def get_access_token():
    global client_id
    global client_secret
    global MUNCHKIN
    params={'grant_type': 'client_credentials',
            'client_id': client_id,
            'client_secret': client_secret}
    headers={'Accept-Encoding': 'gzip'}
    url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token" response=requests.get(url=url,params=params,headers=headers)
    data=response.json()
    return data['access_token']
7
7-9
sinceDate="2025-04-22T00:00:00-00:00"
field='Job Title'
fieldRest='Title'
listID=299
21
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities/pagingtoken.json"
token=get_access_token()
params={'sinceDatetime':sinceDate}
headers={'Authorization': 'Bearer ' + token,}
response=requests.get(url=url,params=params, headers=headers)
data=response.json()
nextPageToken=data['nextPageToken']
data
25
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities.json"
params={'nextPageToken': nextPageToken,
        'activityTypeIds':[13],
        'listId': listID}
headers={'Authorization': 'Bearer ' + token,}
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
print(data) act=data['result']
while data['moreResult']==True:
      nextPageToken=data['nextPageToken']
      token=get_access_token()
      params={'nextPageToken': nextPageToken,
              'activityTypeIds':[13],
              'listId': listID}
      headers={'Authorization': 'Bearer ' + token}
      response=requests.get(url=url,params=params,headers=headers) data=response.json()
      print(data)
      act=act+(data['result'])
33
df=pd.json_normalize(act)
df=df[df['primaryAttributeValue']==field]
df=df.sort_values('activityDate')
df=df.reset_index()
df=df.drop(columns=['index'])
df
51
df1=pd.json_normalize(df['attributes'])
i=4
while i<len(df1.columns):
      df1=df1.drop(columns=[list(df1.columns)[i]])
      i=i+1
df1.columns=['New_Value','Old_Value','Reason','Source']
df1.New_Value=pd.json_normalize(df1.New_Value)['value']
df1.Old_Value=pd.json_normalize(df1.Old_Value)['value']
df1.Reason=pd.json_normalize(df1.Reason)['value']
df1.Source=pd.json_normalize(df1.Source)['value']
57
df=pd.merge(df,df1,left_index=True, right_index=True)
df=df.drop(columns=['attributes'])
df=df.drop_duplicates(subset='leadId', keep="first")
67
df
70
df.to_excel("dataToCorrect.xlsx")
71
ids=df[df.columns.to_list()[2]].to_list()
camposval=df['Old_Value'].to_list()
for i in range(len(camposval)):
         if camposval[i] == None:
            camposval[i] = 'NULL'
STEP=300
a=math.ceil(len(ids)/STEP)
i=0
while i<a:
     tempids=ids[i*STEP:(i+1)*STEP]
     tempcamposval=camposval[i*STEP:(i+1)*STEP]
     params={'action': 'updateOnly',
             'lookupField': 'id',
             'input':[]}
j=0
while j<len(tempids):
     lead={'id':tempids[j],
           fieldRest:tempcamposval[j]}
     params['input'].append(lead)
     j=j+1
     token=get_access_token()
     url="https://"+MUNCHKIN+".mktorest.com/rest/v1/leads.json"
     headers={'content-type': 'application/json', 'Authorization': 'Bearer ' + token }
     i=i+1
     response=requests.post(url=url,data=json.dumps(params), headers=headers)
     print(response.json()['result'])
72

Traduire les informations en actions de vente

importrequests
import pandas as pd
import json
fromdatetimeimportdatetime, timedelta
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
defget_access_token():
        globalclient_id
        globalclient_secret
        globalMUNCHKIN
        params={'grant_type': 'client_credentials',
                          'client_id': client_id,
                          'client_secret': client_secret}
        headers={'Accept-Encoding': 'gzip'}
        url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token"
        response=requests.get(url=url,params=params,headers=headers)
        data=response.json()
        return data['access_token']
5
5-7
leadid="1007244"
ndays=60
gptAPIKey="Bearer␣
  ↪sk-proj-ne6OZggjgQhQU6XcG0ocHNPNzBvOOULTkk8a-75Y75rHKS-vyztxPYq0OLaFsnhtGivx9bVUNoT3BlbkFJH
fieldName="MktoPersonNotes"
20
today = datetime.today()
sinceDate = today - timedelta(days=ndays)
sinceDate = sinceDate.strftime("%Y-%m-%dT00:00:00")
25
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities/pagingtoken.json"
token=get_access_token()
params={'sinceDatetime': sinceDate}
headers={'Authorization': 'Bearer ' + token}
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
nextPageToken=data['nextPageToken']
28
data
35
access_token=get_access_token()
def get_lead_activities(token, lead_id, firstToken):
    url = f"https://"+MUNCHKIN+".mktorest.com/rest/v1/activities.json"
    params={
             "leadId": lead_id,
             "activityTypeIds": "1,2,3,10,11,34,104",
             "nextPageToken": firstToken
             }
    headers={'Authorization': 'Bearer ' + token}
    activities = []
    more_results = True
    while more_results:
         response = requests.get(url, params=params, headers=headers)
         data = response.json()
         if 'result' in data:
             activities.extend(data['result'])
             more_results = data.get('moreResult', False)
         if more_results:
             params["nextPageToken"] = data['nextPageToken']
    return activities
all_activities = get_lead_activities(access_token, leadid,nextPageToken)
all_activities = str(all_activities).replace('"', "'")
activities=all_activities
activities
36
def send_to_chatgpt(activities):
    url = "https://api.openai.com/v1/chat/completions"
    headers = {
         "Authorization": gptAPIKey,
         "Content-Type": "application/json"
         }
    prompt = """Analyze the following lead activities and explain the␣
↪activities that contributed to this lead being marked as MQL so a␣
↪salesperson knows how they should approach the client, including which␣
↪product or service this lead is most interested in and any other relevant␣
↪insights. Include relevant URLs on form fills:""" +activities+""" – Remember␣
↪this will only be read by a salesperson, so don't use technical␣
↪explanations, just your best summary. Keep your response limited to 100␣
↪words."""
    data = {
         "model": "gpt-4o-mini",
         "messages": [{"role": "user", "content": prompt}],
         "max_tokens": 250
         }
         response = requests.post(url, headers=headers, json=data)
         return response.json()
gpt_response = send_to_chatgpt(activities)['choices'][0]['message']['content']
gpt_response
60
def update_marketo_field(lead_id, field_name, gpt_response):
       access_token=get_access_token()
       url = "https://"+MUNCHKIN+".mktorest.com/rest/v1/leads.json"
       headers = {
               "Content-Type": "application/json",
               'Authorization': 'Bearer ' + token
               }
       payload = {
                "action": "updateOnly",
                "lookupField": "id",
                "input":[
                        {
                         "id": int(lead_id),
                          field_name: gpt_response
                         }
                      ]
                   }
       response = requests.post(url, headers=headers, json=payload)
       return response.json()
update_response = update_marketo_field(leadid, fieldName, gpt_response)
update_response
83