8 minutos

Aprenda a utilizar la API REST de Marketo Engage para automatizar las tareas de operaciones de marketing. En este artículo, se describen casos de uso comunes para los administradores de Marketo Engage, incluidas la optimización de la creación de campañas, la reversión de cambios de datos no deseados y la conversión de la información de participación extraída en acciones de ventas procesables.

Tengo experiencia en Matemáticas aplicadas y computacionales, lo que me diferencia de la mayoría de los profesionales de Marketo Engage. Cuando empecé a trabajar en operaciones de marketing, me di cuenta de que gran parte del trabajo se podía automatizar. La automatización me permite ser más eficaz en mi trabajo y tener un crecimiento profesional más rápido. El uso de la API para automatizar las operaciones diarias me permite centrarme en iniciativas más estratégicas, en lugar de tener que dedicarme a las rutinarias tareas operativas.

En este artículo, se describe el uso de la API REST de Marketo Engage y se presentan tres de mis casos de uso favoritos para demostrar su potencia. Permítanme mostrarles cómo la API REST puede convertirse en la mejor aliada para mejorar su eficacia en Marketo Engage, lo que les permitirá tener más tiempo para centrarse en asuntos estratégicos.

Abróchense los cinturones y prepárense para ver cómo utilizo la API REST en estos escenarios comerciales.

Caso de uso 1: Optimizar la creación de campañas

Marketo Engage es una potente herramienta para escalar las operaciones de marketing, con plantillas y tokens que permiten optimizar los procesos. Pero seamos sinceros, aún implica mucho trabajo manual. Si trabaja en operaciones de marketing, probablemente dedique una gran cantidad de tiempo a clonar programas, actualizar tokens y activar campañas inteligentes.

Si gestiona solo unas pocas campañas a la semana, es posible que pueda seguir el ritmo. Pero si gestiona docenas o incluso cientos de campañas, hacer todo manualmente no resulta práctico. Surgen errores y garantizar la coherencia de las campañas se convierte en un auténtico desafío. Aquí es donde entra en acción la API REST de Marketo Engage. Al automatizar las tareas repetitivas, puede ahorrar tiempo, reducir los errores y mantener la coherencia en todos los esfuerzos de marketing.

Con la API REST, puede clonar rápidamente programas enteros manteniendo todo estructurado y uniforme. Incluso los profesionales de Marketo Engage con más experiencia cometen errores. La automatización minimiza el riesgo y ayuda a mantener la integridad de los datos.

Este proceso aún permite personalizar las campañas para adaptarlas a sus necesidades de marketing. La API REST permite modificar elementos clave como los tokens, manteniendo en todo momento la coherencia de la estructura de la campaña.

Vea el siguiente vídeo de demostración, donde explico cómo utilizar los códigos de muestra proporcionados y ajustarlos según las necesidades de su organización.
Busque los códigos mostrados en el siguiente vídeo para su uso sin conexión en la sección "Códigos de muestra".

Caso de uso 2: Revertir cambios de datos no deseados

Supongamos este escenario: está hasta arriba de tareas cuando sus expertos en marketing solicitan urgentemente que cargue una lista de posibles clientes en Marketo Engage. Lo consigue hacer rápidamente y no tarda en oír a sus SDR diciendo que los datos están mal. Los cargos indicados no son correctos, los posibles clientes antiguos se han sobrescrito y todo es un desastre.

Este es un escenario de pesadilla para cualquier profesional de operaciones de marketing. La corrección manual de estos errores puede tardar horas, si no días. Pero no se preocupe, la API REST de Marketo Engage tiene una solución: es como una máquina del tiempo para sus datos, ya que permite rastrear y revertir cambios no deseados sin esfuerzo.

Con la API REST, puede extraer un registro de los cambios recientes en el valor de los datos, identificar las actualizaciones incorrectas y restaurar la información original en solo unos pasos. En lugar de tener que limpiar los errores de datos manualmente, puede automatizar el proceso de reversión y asegurarse de que la base de datos siga siendo precisa y fiable.

En el siguiente vídeo, vamos a explorar cómo puede utilizar la API REST para revertir las importaciones de datos incorrectas y mantener la instancia de Marketo Engage limpia y libre de errores.
NOTE
Este método solo cubre casos sencillos de reversión de datos. Si hay que tener en cuenta muchos cambios, se necesitará una lógica más sofisticada para elegir el valor correcto al que revertir.
Busque los códigos mostrados en el siguiente vídeo para su uso sin conexión en la sección "Códigos de muestra".

Caso de uso 3: Convertir la información extraída en acciones de ventas

Para los equipos de ventas, el contexto lo es todo, especialmente a la hora de comprender por qué un posible cliente se convierte en un posible cliente cualificado de marketing (MQL). No obstante, con demasiada frecuencia, los datos detrás de esa calificación están enterrados en capas de métricas de participación, lo que hace que los representantes de ventas necesiten mucho tiempo para recopilar la historia de una persona por su cuenta.

Aquí es donde entra en juego la automatización para agilizarlo. Al integrar Marketo Engage con IA, puede transformar los datos de participación en información clara y procesable que ayude a los equipos de ventas a centrarse en lo que realmente importa: cerrar acuerdos.

Con la API REST de Marketo Engage, puede extraer actividades de participación recientes, procesarlas mediante IA generativa para generar un resumen conciso y volver a insertar ese resumen en Marketo Engage para darle visibilidad. Esto significa que los representantes de ventas ya no tienen que revisar los registros de actividad de una persona para comprender cómo un posible cliente se ha convertido en un MQL. En su lugar, recibe una explicación simple generada por IA del recorrido del posible cliente. El resumen incluye en qué productos o servicios han mostrado interés y las acciones clave que han realizado con su marca.

Al proporcionar al equipo de ventas acceso instantáneo a esta información en Salesforce, pueden abordar las conversaciones con confianza, personalizar su alcance y, en última instancia, cerrar más acuerdos en menos tiempo.

Este caso de uso está indicado para utilizar la API REST cuando un posible cliente se convierte en un MQL. Por lo tanto, se ejecuta para un solo posible cliente cada vez. Si desea aplicar este método para un lote más grande de posibles clientes, la API por lotes será la mejor opción.

Vamos a ver el siguiente vídeo para descubrir cómo funciona esta configuración en la práctica.
IMPORTANT
Antes de enviar los datos de cualquier persona a un modelo de lenguaje grande (LLM), consulte los recursos de cumplimiento necesarios en su organización para garantizar el cumplimiento de las leyes y regulaciones relevantes.
Busque los códigos mostrados en el siguiente vídeo para su uso sin conexión en la sección "Códigos de muestra".

Puntos clave

Con esto, finaliza el tema sobre cómo optimizar las tareas de operaciones de marketing con las API REST de Marketo Engage.

He descrito tres casos de uso sólidos en los que se pueden utilizar las API REST:

  1. Automatización de la clonación de campañas para reducir el trabajo manual y garantizar la coherencia.
  2. Rastrear y revertir cambios de datos no deseados para ahorrar horas de tiempo de limpieza.
  3. Proporcionar a los equipos de ventas información instantánea sobre los MQL para permitir conversaciones de seguimiento más eficaces.

Estas técnicas de automatización no se limitan a ahorrar tiempo, sino que ayudan a garantizar la precisión, mantienen la integridad de los datos y permiten que los equipos de marketing y ventas trabajen de forma más inteligente.

Puede ser abrumador ver tantas posibilidades de uso de la API REST, por lo que tengo algunos consejos:

Si le ha resultado útil este artículo, asegúrese de consultar Adobe Experience League para obtener más información y ver prácticas recomendadas de sus homólogos. ¡Gracias por su tiempo y mucha suerte con la automación!

Códigos de muestra

Optimizar la creación de campañas

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

Revertir cambios de datos no deseados

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

Convertir la información extraída en acciones de ventas

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