---
title: "Preview the personalized message a single creator would receive"
method: POST
path: "/personalization/preview"
tags: ["Personalization"]
---

# Preview the personalized message a single creator would receive

`POST /personalization/preview`

Generate the AI personalization blocks for one creator and return the fully assembled message — exactly what a send with the same configuration would ship. When the creator has too little signal to personalize, the brand `fallback_message` is returned instead (`is_fallback: true`).

Content Discussion and Product Discussion are AI-generated from the creator's own signals; Product Description / Selling Points / Offer are the fixed strings you pass in (resolve product blocks first via `POST /personalization/product-blocks`). Region and brand name are taken from the shop (brand name defaults to the shop name).

API previews are stateless: nothing is stored, and a later send generates its own copy (or reuses a lock approved in the Reacher portal composer). Generation endpoints share a separate quota (20/min, 500/hr per key). Requires a single shop.

## Request body

- PersonalizationPreviewRequest — POST /personalization/preview request body. Generates the AI personalization blocks for one creator and returns the assembled message (or the brand fallback when the creator has too little signal). Product blocks and the offer are passed in pre-resolved, so what you preview is exactly what a send with the same config would ship.
  - `creator` PersonalizationPreviewCreator, required — The single creator to generate a preview for.
    - `creator_id` string, required — TikTok creator id (as returned by GET /automations/{id}/creators).
    - `creator_handle` string, required — TikTok handle without the @.
    - `creator_first_name` string — Optional known first name; the engine resolves the real one when omitted.
  - `message_body` string, required — The DM template with [Block] tokens (mirrors the automation's CREATOR_MESSAGE).
  - `tone` 'engaging' | 'bold' | 'inspirational'
  - `fallback_message` string, required — Sent (name/product blocks filled) when the creator has too little signal to personalize. Required — matches the DM config contract: personalization must always have a safe fallback, so a low-signal preview never returns an empty message.
  - `brand_name` string — Brand display name used in the copy. Defaults to the shop name when omitted.
  - `product_description` string — Pre-resolved [Product Description]. Get it from POST /personalization/product-blocks.
  - `product_selling_points` string — Pre-resolved [Product Selling Points]. Get it from POST /personalization/product-blocks.
  - `offer_discussion` string — [Offer Discussion] block value — the brand's offer text.
  - `word_counts` object, nullable — Optional approximate word-count target per AI block, e.g. {"content_discussion": 25, "product_discussion": 20}. Only content_discussion and product_discussion are honored; clamped server-side. Null uses the brevity default.

## Response `200`

Successful Response

- PersonalizationPreviewResponse — The message a single creator would receive if this automation sent now.
  - `creator_id` string, required
  - `message` string, required — The fully assembled message this creator would receive.
  - `is_fallback` boolean, required — True when the creator had too little signal to personalize, so the brand fallback message was used instead of AI-generated blocks.
  - `blocks_used` string[] — Which [Block] tokens were filled (e.g. content_discussion, product_discussion, product_description, offer_discussion).

## Other responses

- `422` — Validation Error

---

[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-service-production.skmtc.workers.dev/v1/apis/reacherapp/reacher-data-api/revisions/5eefff009b5b/schema)
