---
title: "List automation logs"
method: GET
path: "/v1/comment-automations/{automationId}/logs"
tags: ["Comment Automations"]
---

# List automation logs

`GET /v1/comment-automations/{automationId}/logs`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/comment-automations/{automationId}/logs`
- Auth: HTTP bearer

Paginated list of every comment that triggered this automation, with send status and commenter info.

## Path parameters

- `automationId` string, required

## Query parameters

- `status` 'pending' | 'sent' | 'failed' | 'skipped' | 'gated'
- `limit` integer
- `skip` integer

## Response `200`

Trigger logs with pagination

- object
  - `success` boolean
  - `logs` CommentAutomationLog[]
    - `id` string
    - `commentId` string
    - `commenterId` string
    - `commenterName` string, nullable
    - `commenterUsername` string, nullable
    - `commentText` string, nullable
    - `source` 'comment' | 'live_comment' | 'story_reply' | 'story_mention' | 'dm' | 'null', nullable: Which door triggered this send. Null on rows written before this field existed (all of those are comment-triggered).
    - `status` 'pending' | 'sent' | 'failed' | 'skipped' | 'gated': DM outcome. 'pending' = the automation has a dmDelaySeconds and the response is queued but not sent yet. 'gated' = the follow-gate confirmation DM went out and we are waiting for the tap; it flips to 'sent' or 'skipped' when they tap. 'skipped' also covers repeatPolicy, cooldown and dedupeSameTextHours suppressions, with the reason in error.
    - `audienceOutcome` 'passed' | 'blocked' | 'gate_sent' | 'gate_passed' | 'gate_failed' | 'null', nullable: How the audience rule resolved. Null on automations without one.
    - `gateButtonStatus` 'delivered' | 'rejected' | 'omitted' | 'null', nullable: Whether the follow-gate button reached the commenter: 'rejected' = Meta refused the gate DM, 'omitted' = the prompt went out as plain text because it was over 640 characters. Null when no gate DM was sent.
    - `commenterIsFollower` boolean, nullable: Follow relationship at decision time. Null when Instagram would not tell us (the commenter never messaged the account).
    - `commenterFollowerCount` integer, nullable
    - `gateResolvedAt` string, date-time, nullable: When the follow-gate tap was claimed.
    - `error` string, nullable: DM error message when status is failed, or the reason when it is skipped.
    - `platformError` object, nullable: Platform error codes of the failed DM (Meta `code` and `error_subcode`), when the platform sent them. Null on successful rows and on rows written before this field existed.
      - `code` integer
      - `subcode` integer
    - `privateReplyConsumed` boolean, nullable: True when the failed send spent the comment's single private reply (Instagram subcode 1545133 or 2534023, or Meta code 10900 on Instagram and Facebook), the same rule as `details.privateReplyConsumed` on the private-reply endpoint. Null on direct DMs and on rows written before this field existed.
    - `commentReplyStatus` 'pending' | 'sent' | 'failed' | 'skipped' | 'null', nullable: Outcome of the optional public reply on the triggering comment. With publicReplyPolicy after_dm, 'skipped' if no commentReply was configured or if the DM failed (the public reply is not attempted in that case).
    - `commentReplyError` string, nullable: Public-reply error message if commentReplyStatus is failed
    - `publicReplyPostedAt` string, date-time, nullable: When the public reply was posted. Null when it was not.
    - `likeSkipped` string, nullable: Why actions.likeComment did not like the comment. Null when it did or was not configured.
    - `hideSkipped` string, nullable: Why actions.hideComment did not hide the comment. Null when it did or was not configured.
    - `mediaError` string, nullable: Why the dmMedia follow-up was not delivered. The DM itself still counts as sent.
    - `nextDueAt` string, date-time, nullable: When the next queued send fires. Present only while something is still pending.
    - `clickedAt` string, date-time, nullable: This recipient's first click on a tracked link (what uniqueClicks counts).
    - `clickCount` integer: This recipient's total clicks on tracked links.
    - `createdAt` string, date-time
  - `pagination` object
    - `total` integer
    - `limit` integer
    - `skip` integer
    - `hasMore` boolean
  - `misses` object: Comments that reached this automation but matched none of its keywords. These produce no log entry, so this is the only signal that a keyword is catching nothing. Retained for a short window, then dropped.
    - `total` integer: Number of non-matching comments in the retention window
    - `retentionDays` integer: How many days of non-matching comments the total covers
    - `samples` object[]: A few of the most recent non-matching comments, for diagnosing a keyword setup.
      - `commentText` string
      - `commenterName` string
      - `excludedBy` string: Set when an exclusion keyword vetoed an otherwise matching comment
      - `at` string, date-time

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `404`: Resource not found

## Changes

- **2026-10-06** `698fd1d46648`: 12 breaking, 6 warning, 9 info
  - the response property `logs/items/audienceOutcome` became nullable for the status `200`
  - the response property `logs/items/commentReplyError` became nullable for the status `200`
  - the response property `logs/items/commentReplyStatus` became nullable for the status `200`
  - the response property `logs/items/commentText` became nullable for the status `200`
  - …23 more
- **2026-10-06** `f8c8f34fb41a`: 2 warning
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `400`
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `401`
- **2026-10-02** `d556591af3f6`: 8 info
  - added the optional property `code` to the response with the `401` status
  - added the optional property `details` to the response with the `401` status
  - added the optional property `docUrl` to the response with the `400` status
  - added the optional property `docUrl` to the response with the `401` status
  - …4 more
- **2026-09-30** `16a7b9d5373e`: 1 info
  - removed the `platform` enum value from the `details/budgetScope` response property for the response status `400`
- …earlier changes not shown

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/comment-automations/:automationId/logs/get.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
