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

# List automation logs

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

## Request

- Base URL: `https://apihub.co.il`
- URL: `https://apihub.co.il/v1/messaging/comment-automations/{automationId}/logs`
- Auth: HTTP bearer

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

**Billing:** Read (free unless it says otherwise) · **Rate limit:** 120/min

## Path parameters

- `automationId` string, required

## Query parameters

- `skip` integer
- `limit` integer
- `status` 'pending' | 'sent' | 'failed' | 'skipped' | 'gated': Filter by result status

## Headers

- `Idempotency-Key` string
- `X-Tag` string

## Response `200`

Completed

- object
  - `id` string: Execution id — stable across internal retries; use it with GET /v1/executions/{id}
  - `status` 'pending' | 'processing' | 'completed' | 'partial' | 'failed' | 'cancelled' | 'timeout'
  - `operation` string
  - `tag` string, nullable: Your X-Tag, if sent
  - `created_at` string, date-time
  - `completed_at` string, date-time, nullable
  - `output` object: Operation result (see each operation). While a Studio render is processing: `stage` (queued · transcribing · downloading · preparing · cleaning_voice · mixing_audio · rendering · finishing), `phase` (the engine's: download · prepare · voice · audio · encode · qa · upload, or null), `progress` (a percent, 0–100) and `progress_fraction` (0–1), `eta_seconds` (seconds left, never below 0) and `estimate_seconds`
    - `logs` object[]
      - `id` string
      - `error` string, nullable: DM error message when status is failed, or the reason when it is skipped.
      - `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.
      - `clickedAt` string, date-time, nullable: This recipient's first click on a tracked link (what uniqueClicks counts).
      - `commentId` string
      - `createdAt` string, date-time
      - `nextDueAt` string, date-time, nullable: When the next queued send fires. Present only while something is still pending.
      - `clickCount` integer: This recipient's total clicks on tracked links.
      - `mediaError` string, nullable: Why the dmMedia follow-up was not delivered. The DM itself still counts as sent.
      - `commentText` string, nullable
      - `commenterId` string
      - `hideSkipped` string, nullable: Why actions.hideComment did not hide the comment. Null when it did or was not configured.
      - `likeSkipped` string, nullable: Why actions.likeComment did not like the comment. Null when it did or was not configured.
      - `commenterName` string, nullable
      - `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
      - `gateResolvedAt` string, date-time, nullable: When the follow-gate tap was claimed.
      - `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.
      - `commentReplyError` string, nullable: Public-reply error message if commentReplyStatus is failed
      - `commenterUsername` string, nullable
      - `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).
      - `commenterIsFollower` boolean, nullable: Follow relationship at decision time. Null when Instagram would not tell us (the commenter never messaged the account).
      - `publicReplyPostedAt` string, date-time, nullable: When the public reply was posted. Null when it was not.
      - `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.
      - `commenterFollowerCount` integer, nullable
    - `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
      - `samples` object[]: A few of the most recent non-matching comments, for diagnosing a keyword setup.
        - `at` string, date-time
        - `excludedBy` string: Set when an exclusion keyword vetoed an otherwise matching comment
        - `commentText` string
        - `commenterName` string
      - `retentionDays` integer: How many days of non-matching comments the total covers
    - `success` boolean
    - `pagination` object
      - `skip` integer
      - `limit` integer
      - `total` integer
      - `hasMore` boolean
  - `error` string, nullable
  - `usage` object
    - `credits_charged` number, nullable
    - `credits_reserved` number
    - `estimated_credits` number
    - `cost_source` 'provider_reported' | 'calculated' | 'estimated' | 'null', nullable
    - `provider_usage` object, nullable: Normalised consumption, e.g. { VIDEO_SECOND: 22.4 }
  - `balance` object
    - `available` number
    - `reserved` number

## Other responses

- `400`: Invalid input
- `402`: Insufficient credits / project budget
- `404`: Resource not found (or not yours)
- `429`: Rate limited
- `503`: Service temporarily paused

---

[API](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai.md) · [All operations](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/revisions/a8caa42835ce?raw)
