curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25"
curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25&next=eyJ0aW1lIjoiMjAyNi0wNS0xMlQw..."
const API_KEY = "API_KEY";
const id = "auto_9xKp2Lm4nQ";
// Paginate through every page
let next;
do {
const url = new URL(`https://api.ayrshare.com/api/automations/${id}/activity`);
url.searchParams.set("limit", "25");
if (next) url.searchParams.set("next", next);
const res = await fetch(url, {
headers: { "Authorization": `Bearer ${API_KEY}` },
});
const json = await res.json();
console.log(json.activity);
next = json.meta?.pagination?.hasMore ? json.meta.pagination.next : undefined;
} while (next);
import requests
headers = {"Authorization": "Bearer API_KEY"}
automation_id = "auto_9xKp2Lm4nQ"
params = {"limit": 25}
while True:
r = requests.get(
f"https://api.ayrshare.com/api/automations/{automation_id}/activity",
params=params,
headers=headers,
).json()
print(r["activity"])
pagination = r.get("meta", {}).get("pagination", {})
if not pagination.get("hasMore"):
break
params["next"] = pagination["next"]
$id = "auto_9xKp2Lm4nQ";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ayrshare.com/api/automations/" . $id . "/activity?limit=25",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => ["Authorization: Bearer API_KEY"],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
{
"status": "success",
"automationId": "auto_9xKp2Lm4nQ",
"activity": [
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678901234",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841401234567890",
"recipientUsername": "jane_doe",
"eventId": "comment.received:18012345678901234",
"commentId": "18012345678901234",
"platform": "instagram",
"status": "sent",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "sent",
"errorDetails": null,
"messageSource": "template",
"config": { "message": "Hi {{recipient_username}}, here's the link: https://example.com" },
"sent": { "message": "Hi jane_doe, here's the link: https://example.com" },
"completedAt": "2026-05-12T09:14:48.000Z"
}
],
"keyword": "LINK",
"commentText": "Send me the LINK please!",
"created": "2026-05-12T09:14:22.000Z",
"completedAt": "2026-05-12T09:14:48.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678905555",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841405555555555",
"recipientUsername": "late_commenter",
"eventId": "comment.received:18012345678905555",
"commentId": "18012345678905555",
"platform": "instagram",
"status": "failed",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "failed",
"errorDetails": "Cannot send private reply: This comment is no longer eligible for a private reply.",
"completedAt": "2026-05-12T09:12:03.000Z"
}
],
"keyword": "LINK",
"commentText": "LINK please!",
"created": "2026-05-12T09:12:01.000Z",
"completedAt": "2026-05-12T09:12:03.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678900000",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841409876543210",
"recipientUsername": "repeat_user",
"eventId": "comment.received:18012345678900000",
"commentId": "18012345678900000",
"platform": "instagram",
"status": "deduplicated",
"actionResults": [],
"keyword": "LINK",
"commentText": "LINK again please",
"created": "2026-05-12T09:00:11.000Z",
"completedAt": "2026-05-12T09:00:34.000Z"
}
],
"meta": {
"pagination": {
"hasMore": true,
"limit": 25,
"next": "eyJ0aW1lIjoiMjAyNi0wNS0xMlQwOTowMDoxMS4wMDBaIiwiaWQiOiJhdXRvXzl4S3AyTG00blE6dHJnX2ExYjJjMzoxODAxMjM0NTY3ODkwMDAwMCJ9"
}
}
}
{
"status": "error",
"message": "limit must be a positive integer"
}
{
"status": "error",
"message": "'previous' pagination is not supported by this endpoint"
}
{
"action": "automation",
"status": "error",
"code": 469,
"message": "Automation not found"
}
Automations
Obter activity da automação
Log de auditoria paginado por cursor para uma automação
GET
/
automations
/
:id
/
activity
curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25"
curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25&next=eyJ0aW1lIjoiMjAyNi0wNS0xMlQw..."
const API_KEY = "API_KEY";
const id = "auto_9xKp2Lm4nQ";
// Paginate through every page
let next;
do {
const url = new URL(`https://api.ayrshare.com/api/automations/${id}/activity`);
url.searchParams.set("limit", "25");
if (next) url.searchParams.set("next", next);
const res = await fetch(url, {
headers: { "Authorization": `Bearer ${API_KEY}` },
});
const json = await res.json();
console.log(json.activity);
next = json.meta?.pagination?.hasMore ? json.meta.pagination.next : undefined;
} while (next);
import requests
headers = {"Authorization": "Bearer API_KEY"}
automation_id = "auto_9xKp2Lm4nQ"
params = {"limit": 25}
while True:
r = requests.get(
f"https://api.ayrshare.com/api/automations/{automation_id}/activity",
params=params,
headers=headers,
).json()
print(r["activity"])
pagination = r.get("meta", {}).get("pagination", {})
if not pagination.get("hasMore"):
break
params["next"] = pagination["next"]
$id = "auto_9xKp2Lm4nQ";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ayrshare.com/api/automations/" . $id . "/activity?limit=25",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => ["Authorization: Bearer API_KEY"],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
{
"status": "success",
"automationId": "auto_9xKp2Lm4nQ",
"activity": [
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678901234",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841401234567890",
"recipientUsername": "jane_doe",
"eventId": "comment.received:18012345678901234",
"commentId": "18012345678901234",
"platform": "instagram",
"status": "sent",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "sent",
"errorDetails": null,
"messageSource": "template",
"config": { "message": "Hi {{recipient_username}}, here's the link: https://example.com" },
"sent": { "message": "Hi jane_doe, here's the link: https://example.com" },
"completedAt": "2026-05-12T09:14:48.000Z"
}
],
"keyword": "LINK",
"commentText": "Send me the LINK please!",
"created": "2026-05-12T09:14:22.000Z",
"completedAt": "2026-05-12T09:14:48.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678905555",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841405555555555",
"recipientUsername": "late_commenter",
"eventId": "comment.received:18012345678905555",
"commentId": "18012345678905555",
"platform": "instagram",
"status": "failed",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "failed",
"errorDetails": "Cannot send private reply: This comment is no longer eligible for a private reply.",
"completedAt": "2026-05-12T09:12:03.000Z"
}
],
"keyword": "LINK",
"commentText": "LINK please!",
"created": "2026-05-12T09:12:01.000Z",
"completedAt": "2026-05-12T09:12:03.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678900000",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841409876543210",
"recipientUsername": "repeat_user",
"eventId": "comment.received:18012345678900000",
"commentId": "18012345678900000",
"platform": "instagram",
"status": "deduplicated",
"actionResults": [],
"keyword": "LINK",
"commentText": "LINK again please",
"created": "2026-05-12T09:00:11.000Z",
"completedAt": "2026-05-12T09:00:34.000Z"
}
],
"meta": {
"pagination": {
"hasMore": true,
"limit": 25,
"next": "eyJ0aW1lIjoiMjAyNi0wNS0xMlQwOTowMDoxMS4wMDBaIiwiaWQiOiJhdXRvXzl4S3AyTG00blE6dHJnX2ExYjJjMzoxODAxMjM0NTY3ODkwMDAwMCJ9"
}
}
}
{
"status": "error",
"message": "limit must be a positive integer"
}
{
"status": "error",
"message": "'previous' pagination is not supported by this endpoint"
}
{
"action": "automation",
"status": "error",
"code": 469,
"message": "Automation not found"
}
Beta. Consulte a visão geral de Automations para a descrição completa do recurso.
Status da linha de activity
Cada linha tem umstatus de nível superior mais um status por action dentro de actionResults[].
| Status | Quando é registrado |
|---|---|
pending | Linha recém-gravada; o worker ainda não a pegou |
in_flight | O worker está despachando no momento |
sent | Pelo menos uma action foi aceita pela plataforma, e nenhuma teve erro de autenticação. Para send_dm isso significa que a Meta aceitou a mensagem — não que o destinatário a recebeu (veja a nota abaixo) |
failed | Nenhuma action foi aceita, e pelo menos uma foi rejeitada pela plataforma ou não pôde ser executada (e nenhuma teve erro de autenticação). O motivo está em actionResults[].errorDetails |
auth_error | As credenciais do Instagram ou da Página do Facebook, ou as permissões de mensagens da conta não puderam ser usadas — por exemplo, um access token expirado ou revogado, uma seleção ausente de Facebook Page, ou Messaging não ativado para o perfil. A DM não foi reenviada. Falhas de entrega por destinatário são registradas como failed, não aqui |
rate_limited | O cap diário de DMs (por tier ou por perfil) foi atingido. Nenhuma DM foi enviada |
deduplicated | Esta action já foi disparada para este destinatário dentro da sua janela de dedup (padrão de 7 dias, configurável por action) |
skipped | A automação foi suprimida antes do despacho — ela ficou inativa ou foi excluída entre o fan-out e o despacho, não tem actions configuradas, ou o engajamento que a disparou veio da própria conta da automação — mais frequentemente um comentário em sua própria publicação. Nesse último caso nenhuma action é executada: nenhuma DM (uma conta não pode enviar mensagem para si mesma), e tampouco fire_webhook ou send_email. Uma automação que optou por automation.completed ainda recebe esse evento, com este status |
pending e in_flight são transitórios; todos os outros são terminais.
Quando uma automação tem mais de uma action, o status de nível superior é derivado dos resultados por action nesta ordem: auth_error se qualquer action teve erro de autenticação, depois sent se qualquer action foi aceita, depois deduplicated se todas as actions foram deduplicadas, depois skipped se todas as actions foram deliberadamente suprimidas (skipped ou deduplicated), caso contrário failed. Leia actionResults[] para o detalhe por action.
sent confirma que a Meta aceitou a mensagem, não que o destinatário a recebeu. Isso vale para DMs do Instagram e para DMs do Messenger a partir de uma Página do Facebook: a automação registra apenas a aceitação e não acompanha a entrega. O Instagram não expõe nenhum sinal de entrega em nenhuma superfície de API, e se a configuração Message requests do destinatário bloquear estranhos, a Meta aceita o envio e o descarta silenciosamente. Consulte Automation DM Sent but Not Delivered.Campos de resultado por action
Cada entrada emactionResults[] descreve o resultado de uma action:
| Campo | Tipo | Descrição |
|---|---|---|
actionId | string | O ID estável da action dentro da automação |
type | string | O tipo da action (send_dm, fire_webhook, send_email) |
status | string | Status por action, usando o mesmo vocabulário do status da linha acima |
errorDetails | string | null | Motivo da falha legível por humanos quando a action não foi bem-sucedida; null (ou ausente) em caso de sucesso. Para um send_dm rejeitado, traz a mensagem de erro mapeada (por exemplo, a janela de private reply está fechada, ou o comentário já recebeu uma resposta). Uma exceção ao null em caso de sucesso: um send_dm com messageSource: "fallback" fica sent e traz o motivo pelo qual seu callback não foi usado. Um fallback que depois falhou no envio traz o erro de envio seguido desse motivo |
messageSource | string | Apenas send_dm. A partir de qual texto a DM foi construída: template (a message estática), callback (sua messageUrl respondeu e o texto dela foi usado) ou fallback (messageUrl estava definida, mas inutilizável, então message foi usada no lugar, com o motivo em errorDetails). Não diz se a DM foi entregue; status diz. Presente assim que o texto da DM é definido, incluindo envios que falharam depois. Ausente quando a action parou antes disso (uma DM skipped para a sua própria conta, uma action deduplicated ou um erro de configuração failed, como um id de comentário ausente), e para outros tipos de action |
config | object (opcional) | A configuração da action como estava quando este disparo foi executado, por exemplo o template message do send_dm. Permanece a mesma se você editar a automação depois, então cada linha mostra o que estava configurado naquele momento. Ausente em linhas gravadas antes de este campo ser adicionado, e quando foi removido para caber no limite de tamanho (truncated fica então true) |
sent | object (opcional) | O que a action enviou, ou tentou enviar, neste disparo. Registrado assim que a action construiu sua mensagem ou payload, inclusive quando o envio falhou depois: status diz se foi enviado. Ausente quando a action parou antes de enviar, por exemplo um resultado skipped para um comentário da sua própria conta, e para resultados deduplicated. Consulte o que sent contém |
truncated | boolean (opcional) | true quando a entrada foi cortada para caber no seu limite de tamanho: um valor de texto longo foi encurtado, ou config e depois sent foram omitidos por completo. Ausente caso contrário |
completedAt | string | Timestamp ISO 8601 de quando a action foi finalizada |
O que sent contém
| Tipo de action | Campos de sent |
|---|---|
send_dm | message: o texto com o qual a DM foi enviada. Ou seja, o seu template message com os placeholders preenchidos para este destinatário ou, quando messageSource é callback, o texto que a sua messageUrl retornou. fallbackMessage: presente somente quando messageSource é callback; o seu template, preenchido, como teria sido enviado sem o callback |
send_email | to, subject e message: o e-mail como foi enfileirado, com os placeholders preenchidos |
fire_webhook | payload: os campos do evento enviados ao seu webhook. O corpo entregue também carrega os campos padrão de webhook (action, created, hookId, refId, url e timeStamp quando o webhook é assinado). hookId: o id da entrega, presente quando o webhook foi enfileirado |
truncated é definido quando isso acontece. Valores armazenados sob nomes de chave que parecem credenciais, como token, secret, password ou apiKey, são registrados como "[redacted]". A messageUrl de uma action send_dm também é sempre registrada como "[redacted]", porque uma URL pode carregar um segredo no seu caminho ou na query string.
Para automações acionadas por comentário (comment_keyword), a linha também carrega um commentId de nível superior — o ID bruto do comentário do Instagram ao qual a DM foi ancorada. Ele é null para triggers baseados em mensagens (dm_keyword, story_reply, dm_reaction).
As linhas também carregam postId (a publicação em que um comentário de comment_keyword foi deixado) e storyId (o story para story_reply e story_comment). Cada um é null para os outros triggers, e ausente em linhas gravadas antes de esses campos serem adicionados.
Parâmetros de cabeçalho
Parâmetros de caminho
string
obrigatório
O ID da automação retornado por
POST /automations.Parâmetros de query
number
padrão:25
Tamanho da página. Padrão
25, máximo 100. Valores fora de [1, 100] são ajustados; valores não inteiros ou ≤0 retornam HTTP 400.string
Cursor opaco de um
meta.pagination.next de uma resposta anterior. Omita na primeira requisição.Somente avanço — passar ?previous= retorna HTTP 400.Formato da resposta
A resposta envolve a lista de resultados emactivity[] e as informações do cursor em meta.pagination:
{
"status": "success",
"automationId": "auto_9xKp2Lm4nQ",
"activity": [ /* …rows, newest first… */ ],
"meta": {
"pagination": {
"hasMore": true,
"limit": 25,
"next": "eyJ0aW1lIjoiMjAyNi0wNS0xMlQwOTowMDoxMS4wMDBaIiwiaWQiOiJhdXRvXzl4S3AyTG00blE6dHJnX2ExYjJjMzpjb21tZW50X3JlY2VpdmVkOjE4MDEyMzQ1Njc4OTAwMDAwIn0="
}
}
}
meta.pagination.next é um blob opaco codificado em base64 — trate-o como uma caixa preta e passe-o inalterado no ?next= da próxima requisição. meta.pagination.hasMore é true quando existe pelo menos mais uma página.
curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25"
curl \
-H "Authorization: Bearer API_KEY" \
-X GET "https://api.ayrshare.com/api/automations/auto_9xKp2Lm4nQ/activity?limit=25&next=eyJ0aW1lIjoiMjAyNi0wNS0xMlQw..."
const API_KEY = "API_KEY";
const id = "auto_9xKp2Lm4nQ";
// Paginate through every page
let next;
do {
const url = new URL(`https://api.ayrshare.com/api/automations/${id}/activity`);
url.searchParams.set("limit", "25");
if (next) url.searchParams.set("next", next);
const res = await fetch(url, {
headers: { "Authorization": `Bearer ${API_KEY}` },
});
const json = await res.json();
console.log(json.activity);
next = json.meta?.pagination?.hasMore ? json.meta.pagination.next : undefined;
} while (next);
import requests
headers = {"Authorization": "Bearer API_KEY"}
automation_id = "auto_9xKp2Lm4nQ"
params = {"limit": 25}
while True:
r = requests.get(
f"https://api.ayrshare.com/api/automations/{automation_id}/activity",
params=params,
headers=headers,
).json()
print(r["activity"])
pagination = r.get("meta", {}).get("pagination", {})
if not pagination.get("hasMore"):
break
params["next"] = pagination["next"]
$id = "auto_9xKp2Lm4nQ";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ayrshare.com/api/automations/" . $id . "/activity?limit=25",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => ["Authorization: Bearer API_KEY"],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
{
"status": "success",
"automationId": "auto_9xKp2Lm4nQ",
"activity": [
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678901234",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841401234567890",
"recipientUsername": "jane_doe",
"eventId": "comment.received:18012345678901234",
"commentId": "18012345678901234",
"platform": "instagram",
"status": "sent",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "sent",
"errorDetails": null,
"messageSource": "template",
"config": { "message": "Hi {{recipient_username}}, here's the link: https://example.com" },
"sent": { "message": "Hi jane_doe, here's the link: https://example.com" },
"completedAt": "2026-05-12T09:14:48.000Z"
}
],
"keyword": "LINK",
"commentText": "Send me the LINK please!",
"created": "2026-05-12T09:14:22.000Z",
"completedAt": "2026-05-12T09:14:48.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678905555",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841405555555555",
"recipientUsername": "late_commenter",
"eventId": "comment.received:18012345678905555",
"commentId": "18012345678905555",
"platform": "instagram",
"status": "failed",
"actionResults": [
{
"actionId": "act_d4e5f6",
"type": "send_dm",
"status": "failed",
"errorDetails": "Cannot send private reply: This comment is no longer eligible for a private reply.",
"completedAt": "2026-05-12T09:12:03.000Z"
}
],
"keyword": "LINK",
"commentText": "LINK please!",
"created": "2026-05-12T09:12:01.000Z",
"completedAt": "2026-05-12T09:12:03.000Z"
},
{
"id": "auto_9xKp2Lm4nQ:trg_a1b2c3:comment.received:18012345678900000",
"automationId": "auto_9xKp2Lm4nQ",
"triggerId": "trg_a1b2c3",
"triggerType": "comment_keyword",
"recipientId": "17841409876543210",
"recipientUsername": "repeat_user",
"eventId": "comment.received:18012345678900000",
"commentId": "18012345678900000",
"platform": "instagram",
"status": "deduplicated",
"actionResults": [],
"keyword": "LINK",
"commentText": "LINK again please",
"created": "2026-05-12T09:00:11.000Z",
"completedAt": "2026-05-12T09:00:34.000Z"
}
],
"meta": {
"pagination": {
"hasMore": true,
"limit": 25,
"next": "eyJ0aW1lIjoiMjAyNi0wNS0xMlQwOTowMDoxMS4wMDBaIiwiaWQiOiJhdXRvXzl4S3AyTG00blE6dHJnX2ExYjJjMzoxODAxMjM0NTY3ODkwMDAwMCJ9"
}
}
}
{
"status": "error",
"message": "limit must be a positive integer"
}
{
"status": "error",
"message": "'previous' pagination is not supported by this endpoint"
}
{
"action": "automation",
"status": "error",
"code": 469,
"message": "Automation not found"
}