8 minutos

Saiba como usar a API REST do Marketo Engage para automatizar tarefas de operações de marketing. Este artigo aborda casos de uso comuns para administradores do Marketo Engage, incluindo a simplificação da criação de campanhas, a reversão de alterações de dados indesejadas e a conversão de insights de engajamento em ações de vendas acionáveis.

Tenho formação em Matemática Aplicada e Computacional, o que me diferencia da maioria dos profissionais do Marketo Engage. Quando comecei a trabalhar em operações de marketing, percebi que grande parte do trabalho poderia ser automatizado. A automação pode me levar a ser mais eficiente no meu trabalho e a ter um crescimento profissional mais rápido. O uso de API para automatizar as operações diárias me permite focar em assuntos mais estratégicos, em vez de ficar sobrecarregado com tarefas operacionais.

Neste artigo, compartilho como usei a API REST do Marketo Engage, apresentando três dos meus casos de uso favoritos para demonstrar seu poder. Vou mostrar como a API REST pode se tornar sua aliada para melhorar sua eficiência no Marketo Engage, permitindo que você tenha mais tempo para se concentrar em questões estratégicas.

Agora, prepare-se para aprender como eu uso a API REST para esses cenários de negócios.

Caso de uso 1: simplificar a criação de campanhas

O Marketo Engage é uma ferramenta poderosa para dimensionar operações de marketing, com modelos e tokens que ajudam a simplificar processos. Mas sejamos realistas: ainda há muito trabalho manual envolvido. Se você trabalha com operações de marketing, provavelmente passa uma parte significativa do tempo clonando programas, atualizando tokens e ativando Campanhas inteligentes.

Se você estiver gerenciando apenas algumas campanhas por semana, talvez consiga acompanhar. Mas se estiver lidando com dezenas ou até centenas de campanhas, fazer tudo manualmente não é prático. Erros acontecem, e garantir a consistência entre as campanhas se torna um verdadeiro desafio. É aqui que entra a API REST do Marketo Engage. Ao automatizar essas tarefas repetitivas, você pode economizar tempo, reduzir erros e manter a consistência em todos os seus esforços de marketing.

Com a API REST, você pode clonar rapidamente programas inteiros, mantendo tudo estruturado e uniforme. Mesmo os profissionais mais experientes do Marketo Engage cometem erros, e a automação minimiza o risco e ajuda a manter a integridade dos dados.

Este processo ainda permite que suas campanhas sejam personalizadas para atender às suas necessidades de marketing. A API REST permite modificar elementos-chave, como tokens, mantendo a estrutura da campanha consistente.

Assista ao vídeo de demonstração abaixo, onde explico como usar os códigos de amostra fornecidos e ajustá-los para atender às necessidades da sua organização.
Encontre os códigos demonstrados no vídeo abaixo para uso offline na seção “Códigos de amostra”.

Caso de uso 2: reverter alterações de dados indesejadas

Imagine o seguinte cenário: você já está sobrecarregado com tarefas quando seus profissionais de marketing solicitam urgentemente que você envie uma lista de leads para o Marketo Engage. Você faz isso rapidamente, mas logo recebe uma notificação dos seus SDRs informando que os dados estão todos errados! Os cargos estão incorretos, leads antigos foram sobrescritos e tudo está uma bagunça.

Esse é um cenário de pesadelo para qualquer profissional de operações de marketing. Corrigir esses erros manualmente pode levar horas, se não dias. Mas não se preocupe, a API REST do Marketo Engage tem a solução: é como uma máquina do tempo para seus dados, permitindo que você rastreie e reverta alterações indesejadas sem esforço.

Ao usar a API REST, você pode obter um registro das alterações recentes nos valores dos dados, identificar atualizações incorretas e restaurar as informações originais em apenas algumas etapas. Em vez de se esforçar para limpar manualmente a bagunça nos dados, você pode automatizar o processo de reversão e garantir que seu banco de dados permaneça preciso e confiável.

No vídeo abaixo, vamos explorar como você pode usar a API REST para reverter importações de dados incorretos e manter sua instância do Marketo Engage limpa e livre de erros.
NOTE
Este método só pode cobrir casos simples de reversão de dados. Se houver muitas alterações a serem consideradas, será necessária uma lógica mais sofisticada para selecionar o valor correto a ser revertido.
Encontre os códigos demonstrados no vídeo abaixo para uso offline na seção “Códigos de amostra”.

Caso de uso 3: converter insights em ações de vendas

Para as equipes de vendas, o contexto é tudo, especialmente quando se trata de entender por que um lead se tornou um Lead qualificado para marketing (MQL). Mas, muitas vezes, os dados por trás dessa qualificação ficam ocultos em camadas de métricas de engajamento, tornando demorado para os representantes de vendas reunirem a história de uma pessoa por conta própria.

É aí que a automação entra em cena para resolver esse problema. Ao integrar o Marketo Engage com IA, você pode transformar dados de engajamento em insights claros e acionáveis que ajudam as equipes de vendas a se concentrar no que realmente importa: fechar negócios.

Usando a API REST do Marketo Engage, você pode extrair atividades recentes de engajamento, processá-las por meio da IA generativa para gerar um resumo conciso e enviar esse resumo de volta ao Marketo Engage para visibilidade. Isso significa que os representantes de vendas não precisam mais vasculhar os registros de atividades de uma pessoa para entender como um lead se tornou um MQL. Em vez disso, eles obtêm uma explicação simples, gerada por IA, sobre a jornada do lead. O resumo inclui os produtos ou serviços nos quais eles demonstraram interesse e quaisquer ações importantes que tenham realizado com sua marca.

Ao conceder à equipe de vendas acesso instantâneo a essas informações no Salesforce, eles podem abordar as conversas com confiança, personalizar o alcance e, por fim, fechar mais negócios com mais rapidez.

Este caso de uso destina-se a utilizar a API REST quando um lead passa para um MQL. Portanto, ele é executado para apenas um lead por vez. Se você estiver pensando em aplicar esse método para um lote maior de leads, a API em massa seria mais adequada.

Vamos nos aprofundar no vídeo abaixo para ver como essa configuração funciona na prática.
IMPORTANT
Antes de enviar os dados de qualquer pessoa para um modelo de linguagem grande (LLM), consulte os recursos de conformidade apropriados em sua organização para garantir a conformidade com as leis e regulamentos relevantes.
Encontre os códigos demonstrados no vídeo abaixo para uso offline na seção “Códigos de amostra”.

Principais conclusões

Essa é a conclusão sobre como otimizar suas tarefas de operações de marketing com as APIs REST do Marketo Engage.

Apresentei três casos de uso importantes em que você pode utilizar as APIs REST:

  1. Automatizar a clonagem de campanhas para reduzir o trabalho manual e garantir a consistência.
  2. Rastrear e reverter alterações indesejadas nos dados para economizar horas de limpeza.
  3. Fornecer às equipes de vendas insights instantâneos sobre MQLs para permitir conversas de acompanhamento mais eficazes.

Essas técnicas de automação não servem apenas para economizar tempo, mas também ajudam a garantir a precisão, manter a integridade dos dados e capacitar as equipes de marketing e vendas a trabalhar de maneira mais inteligente.

Pode ser um pouco assustador ver tantas possibilidades com o uso da API REST, por isso, tenho algumas dicas para você:

Se você achou este artigo útil, não deixe de conferir a Adobe Experience League para obter mais insights de colegas e práticas recomendadas. Obrigado pela leitura e boa automação!

Códigos de exemplo

Simplificar a criação de campanhas

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

Reverter alterações de dados indesejadas

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

Converter insights em ações de vendas

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