---
title: "Exact sent message copy (grouped by creator)"
method: GET
path: "/automations/{automation_id}/sent-messages"
tags: ["Automations"]
---

# Exact sent message copy (grouped by creator)

`GET /automations/{automation_id}/sent-messages`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/automations/{automation_id}/sent-messages`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

What this automation actually sent, with honest coverage semantics:

* **`dm_sent`** — the exact rendered DM text per creator (placeholders substituted at send time), grouped by creator, most recently messaged first. Filter with `creator_handle`; page depth with `creator_limit` / `messages_per_creator`.
* **`tc_sent`** — Target-Collab invitation batches (who was invited, when, status) plus the invite template. TikTok TC invites are sent from the template and the per-creator rendered text is not stored — `exact_copy: false` and `coverage_note` state this explicitly. When the automation is a campaign's TC automation, `campaign` carries the link.

Hybrid automations (Message + TC) populate both sections. Empty sections carry an explicit `message` instead of blank lists. Read-only. Requires a single shop.

## Path parameters

- `automation_id` integer, required

## Query parameters

- `creator_limit` integer
- `messages_per_creator` integer
- `creator_handle` string, nullable

## Response `200`

Successful Response

- AutomationSentMessagesResponse: Exact sent copy for one automation, grouped by creator (DM) and invitation batch (TC), with the campaign link where one exists.
  - `automation_id` integer, required
  - `automation_name` string, nullable
  - `automation_type` string, nullable
  - `template` AutomationMessagesTemplateResponse, required: Message templates configured on one automation (CORE-5593). This is the *configured* copy — placeholders like ``{{creators username}}`` or ``{creator_name}`` are not substituted. For the exact per-creator text that was actually sent, use ``GET /automations/{id}/sent-messages``.
    - `automation_id` integer, required
    - `automation_name` string, nullable
    - `automation_type` string, nullable
    - `tc_invite_message` string, nullable: config.TARGET_COLLAB_MESSAGE — TC invite template (TC types only)
    - `message_sequence` unknown[]: config.addons — ordered DM sequence; array order is send order
      - unknown
    - `follow_up_steps` unknown[]
      - unknown
    - `ai_custom_qa` unknown[]
      - unknown
    - `personalization` AutomationPersonalizationConfig: CORE-4857 — the AI-personalization config on a DM automation, read back. Projected from ``config.PERSONALIZATION`` (the block the send engine reads). Present only when personalization was configured — via the portal composer or via ``POST /automations/dm`` with a ``personalization`` object. ``null`` on automations that don't use it. Product/offer strings are the fixed values the brand approved; the Content/Product-Discussion blocks are AI-generated per creator at send time and so aren't stored here.
      - `enabled` boolean: Whether the send engine personalizes this automation's DM.
      - `tone` union: AI rewrite tone (engaging | bold | inspirational).
        - 'engaging' | 'bold' | 'inspirational'
        - string
      - `fallback_message` string, nullable: Sent verbatim (name/product blocks filled) to creators with too little signal to personalize.
      - `offer_discussion` string, nullable: [Offer Discussion] block value.
      - `product_description` string, nullable: [Product Description] block value.
      - `product_selling_points` string, nullable: [Product Selling Points] block value.
      - `word_counts` object, nullable: Approximate per-AI-block word-count targets, e.g. {"content_discussion": 25, "product_discussion": 20}. Null uses the brevity default.
      - `name_source` string, nullable: Which name fills the creator-name token (CORE-7779): first_name (the shipping first name on the creator's last order) or display_name (their TikTok display name). Null on automations that never set it -- same as first_name.
  - `dm_sent` SentDmSection, required
    - `exact_copy` true: True — DM copy is the rendered per-creator sent text
    - `groups` SentDmGroup[]
      - `creator_name` string, nullable
      - `creator_id` string, nullable
      - `last_sent_at` string, nullable
      - `messages` SentDmMessage[]
        - `content` string, required: Exact rendered text as sent (placeholders substituted)
        - `sent_at` string, nullable
        - `status` string, nullable: Send-log role, e.g. BOT_INITIAL_MESSAGE / follow-up statuses
    - `creators_returned` integer, required
    - `total_creators` integer, required
    - `total_messages` integer, required
    - `message` string, nullable: Explicit empty state when nothing was sent
  - `tc_sent` SentTcSection, required
    - `exact_copy` false: False — TC per-creator rendered copy is not stored; template is the sent copy
    - `coverage_note` string, required
    - `template_text` string, nullable
    - `placeholders_present` boolean
    - `invitations` TcInvitationBatch[]
      - `sent_at` string, nullable
      - `status` string, nullable
      - `creator_count` integer, required
      - `creators` string[]
      - `creators_truncated` boolean
      - `expiration_date` string, nullable
    - `invitations_returned` integer, required
    - `total_invitations` integer, required: Batches with a sent status (NEW_INVITATION / EDITED_INVITATION); excludes skipped/failed.
    - `total_creators_invited` integer, required: Creators across sent-status batches only. See status_breakdown for skipped/failed.
    - `status_breakdown` object: Batch count per target_collabs status across ALL rows (sent, skipped=PREVIOUS_INVITATION, INVALID_CREATORS, etc.).
    - `campaign` TcCampaignLink
      - `campaign_id` integer, required
      - `campaign_name` string, nullable
    - `message` string, nullable: Explicit empty state when nothing was sent
  - `message` string, nullable: Explicit empty state when the automation has sent nothing at all

## Other responses

- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-09-19** `291230805105`: 2 info
  - api operation id `automation_sent_messages_automations__automation_id__sent_messages_get` removed and replaced with `automation_sent_messages`
  - added `subschema #1` to the `template/personalization/anyOf[subschema #1: AutomationPersonalizationConfig]/tone` response property `anyOf` list for the response status `200`
- **2026-09-10** `7dad11366a32`: 1 info
  - added the optional property `template/personalization/anyOf[subschema #1: AutomationPersonalizationConfig]/name_source` to the response with the `200` status

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/automations/:automation_id/sent-messages/get.md)

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) - [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/63ce74b30b5a?raw)
