MCP App Store
by KeenEthics
Business & Operations
Reacher icon

Reacher

by Reacher Platforms, Inc.

Overview

Reacher connects ChatGPT to your TikTok Shop affiliate program. Ask about GMV, creators, videos, samples and campaigns in plain language and get answers from your live Reacher data instead of a dashboard. Find creators across the open TikTok market, see who is actually driving sales, review sample requests and automations, and pull the numbers behind a weekly report — for one shop or all of them. Write actions such as creating an automation or replying to a creator are labelled and confirmed before they run, and money movement is not available through ChatGPT.

Tools

accept_creator_campaigns_campaign_id_creators_creator_id_accept

ChatGPT
Sets the creator's CampaignCreatorMapping.status='active'. Sends an acceptance email + SMS to the creator (fire-and-forget) — these are SKIPPED on X-Dry-Run: true.

account_invoices_account_invoices_get

ChatGPT
Your account's billing history straight from Stripe — settled invoices plus the previewed upcoming charge for each live subscription — newest first. Drafts and voided invoices are excluded: they are not real payment history. Read live from Stripe by customer rather than from Reacher's webhook-populated tables, so it cannot go stale when a webhook is missed. amount is in the minor units of the customer's Stripe billing currency (the currency itself is not carried on this surface). invoice_pdf links are Stripe-hosted and time-limited. Account-scoped: invoices bill the account, not an individual shop, so the result is the same for any x-shop-id.

account_limits_account_limits_get

ChatGPT
The per-category limits actually in force for each of your shops — CRM, automations and email automations — with any support-granted Extra Limits already folded in. This is the resolved number, not the advertised plan number, so a consumer can size a batch before it gets clamped. limits is category → limit type → value; the types are typically default (what a new automation is created with), minimum and maximum (the enforced ceiling). A category missing for a tier means the plan expresses no opinion, not a limit of zero. Covers every shop in x-shop-id — send all for the whole account.

account_subscription_account_subscription_get

ChatGPT
Your account's billable seats with live Stripe billing state, so a consumer can answer "is this account still entitled to the data I'm reading?" without screen-scraping the portal. Each seat carries plan, unit_amount (minor units), status, the live stripe_status, current_period_end, trial_end, cancel_at and access_expires_on — the cancel-grace date after which a canceled seat stops granting access. Only seats linked to shops this key can reach are returned, plus any unassigned seats (which name no shop). Read collection_method and attempt_count before treating past_due as a payment failure: invoice-billed customers sit in past_due legitimately, and attempt_count == 0 means Stripe never attempted a charge. Read-only — plan changes and cancellation are portal-only.

add_creator_to_campaign_campaigns_creators_creator_id_a_7e6403fc

ChatGPT
Adds the creator to a target campaign — purely additive (never removes them from the source campaign). The SOURCE shop is your x-shop-id; the TARGET shop + campaign are in the body. Restrictions: - Region — the target shop must be region-compatible with the source shop. GLOBAL and US are interchangeable; every other region must match exactly. Mismatch → 409. - Same customer — the target shop must belong to your API key's customer (cross-customer target → opaque 404). - No double-add — if the creator is already ACTIVE (or paid/completed) in the target → 409. A passive/terminal-inactive mapping (viewed/pending/invited/applied/removed/rejected/archived/withdrawn) is UPGRADED to active with NO duplicate row (pg_advisory_xact_lock guards it; a paid_at row is never overwritten). Rewards are recomputed server-side from the TARGET campaign. notify (default true) sends the creator an acceptance-style notification — SKIPPED on X-Dry-Run.

affiliate_transactions

ChatGPT
One row per order x SKU from Affiliate Center -> Orders: which creator drove it, through which content (video / LIVE / showcase), under which commission model and rates, and the estimated vs actual commission side by side. Filter by an order-created date window, creator handle, content ID or type, product, SKU, order status or settled state — the same filters as the Affiliate Center UI. Estimated amounts are set when the order is created; actual amounts and `commission_paid_at fill in as TikTok settles, typically weeks later, so recent windows keep moving — read data_status` for freshness. Defaults to the last 30 complete days.

ai_search_capabilities_ai_search_capabilities_get

ChatGPT
Report which AI-search modes are available for your shop's region: { region, modes: { profile, transcript, video, lookalike } }. profile is always true; transcript/video/lookalike auto-enable per region as their data finishes backfilling. Call this BEFORE offering the transcript / video / lookalike search tools so you don't pitch a mode the region can't serve yet. Single shop only.

ai_search_filters

ChatGPT
The filter vocabulary the creator-search tools accept for your shop's region: the allowed values for each categorical filter (categories, gender, ethnicity, age, language, content style, creator_level, community, …) and the numeric slider ranges (gmv, units sold, average views, engagement, post rate, followers). Call this before building filters so you use valid values/spellings; a filter absent here is unavailable/data-empty for the region. Answers 'what filters can I use', 'which creator levels / GMV tiers exist'. For the community/hashtag values specifically, use the hashtag-autocomplete tool.

ai_search_hashtags

ChatGPT
Community/hashtag autocomplete for the community filter: the hashtags creators in your region actually post under, with per-hashtag creator counts. Omit q for the region's top communities; pass q to substring-match (leading '#' optional, case-insensitive). Feed the returned hashtag values into the community filter on creator search for topical targeting (e.g. 'find creators in the fitness community'). Answers 'which communities / hashtags can I target'.

archive_campaign_campaigns__campaign_id__archive_post

ChatGPT
Sets status='archived' — preserves the row in list/detail views but marks it as no longer active.

archive_tracker_campaigns_content_archive_post

ChatGPT
Soft-deletes a CampaignCreatorMapping's content tracker so it no longer surfaces in campaign content lists.

automation_activities_gmv_max_automations_automation_id_759b8597

ChatGPT
Paginated per-event activity log for one automation (campaign boost / cancel events the automation produced), plus an aggregate summary across the full history. Supports the same `status and search` filters the portal does. Single shop only.

automation_create_dm

ChatGPT
Create a Direct Message automation. The mode field selects the variant: - mode='vanilla': just a text message addon in messages[] - mode='with_image': message + image addon (requires image addon in messages[]) - mode='with_product_card': message + product card addon (requires product_card addon) - mode='spark_code': spark code collection form (requires spark_code_form addon + dm_config.spark_code). MESSAGES vs FOLLOW_UPS: messages is the initial outreach (all items dispatched together when the automation engages a creator). follow_ups is a separate optional array of delayed steps (each step has delay_days + 1-5 addons). Multi-touch sequences require both arrays. REQUIRED: schedule, creators_to_include, messages array, shop, idempotency_key.

automation_create_email

ChatGPT
Create an outbound email automation. DIFFERENT recipient model from outreach — use selection_mode: mailing_list (with vault list IDs in mailing_list.lists_selected OR upload emails inline in mailing_list.list_upload_emails) OR selection_mode: filters (creator-search criteria). REQUIRED: email_account_id (an account MAY back several active email automations; reuse deliberately, since each one adds to that inbox's daily send volume and the daily cap is applied per automation), subject, body (HTML or plaintext), selection_mode + matching mailing_list/filters, shop, idempotency_key. NOT SUPPORTED in v1 (extra='forbid' rejects them with 422): schedule, end_date, email_sent_per_day. The underlying email_automations table has no columns for them; timing is governed by portal-level defaults (one cycle per next_run_cycle). v1.1 will add columns + expose these fields. PATCH/start/stop/delete are also unsupported (501 EMAIL_LIFECYCLE_NOT_SUPPORTED) — email lifecycle is portal-only in v1.

automation_create_sample_request

ChatGPT
Auto-approve OR auto-reject incoming TikTok Shop sample requests by performance criteria. Side-effect: backend internally creates a CRM Group from minimum_performance_criteria so creator membership stays dynamic — the new crm_group_id is returned in side_effects. REQUIRED: sample_request.action (approve/reject), products (caps + items OR include_all), minimum_performance_criteria, target_list (vault list IDs — sample_request uses target_list for creator selection, NOT creators_to_include), shop, idempotency_key. If action='reject', also set rejection_reason (NOT_MATCH / OFFLINE / OUT_OF_STOCK / OTHER).

automation_create_target_collab

ChatGPT
Create a Target Collab (TC) invitation automation. Optional follow-up DMs via messages (each step has addons like message text, image, product card). REQUIRED: target_collab.products (≥1 with commission_rate), schedule (≥1 day active), creators_to_include with list_upload OR lists_selected, shop. ALWAYS supply unique idempotency_key (UUID v4). Use dry_run=true to preview. Example: see api-docs/automation-management.md → Target Collab + Message section.

automation_create_tc_cleanup

ChatGPT
Create a TC Cleanup automation — re-targets creators in this shop who received a prior TC invite but didn't accept. Structurally lean: PRODUCTS + creator selection only, no messages / follow_ups. Use invite_start_before_days / invite_expire_after_days to scope which unaccepted invites qualify (e.g. start_before=30 + expire_after=7 = creators whose invite was sent 30+ days ago AND is expiring within 7 days). REQUIRED: products (≥1 with commission_rate), schedule, creators_to_include, shop, idempotency_key. Stamps automation_type='TC Cleanup'.

automation_creators_automations__automation_id__creators_get

ChatGPT
Per-creator outcomes for ONE automation: which creators got an invite/DM submitted, which were skipped (and why), which were previously invited, etc. This is the authoritative per-creator answer to 'what happened to each invite' — backed by the always-present target_collabs / Messages / skipped_creators tables, so it stays populated even after the aggregate creators_reached / skipped counters on the list/detail responses age out (those read from a stats view that only retains recently-active automations). Queued ≠ delivered. An invite_submitted / outreach_sent outcome means Reacher's worker submitted the invite/DM through the same browser-automation path the portal uses. TikTok does not return a per-creator inbox-delivery receipt, so this is the most authoritative delivery signal available — not a confirmed inbox event. Requires a single shop.

automation_delete

ChatGPT
Soft-delete (state=archived). The row stays in the DB for audit. Reversible only by Reacher support. Idempotent at the state level — already-archived returns 200 with already_archived=true. Requires idempotency_key.

automation_detail_automations__automation_id__get

ChatGPT
Full performance breakdown for a single automation. Requires single shop.

automation_detail_gmv_max_automations__automation_id__get

ChatGPT
Detail for one automation: full configuration (conditions, actions, guardrails) plus its 10 most recent runs. Single shop only — automation_ids are scoped per shop.

automation_duplicate

ChatGPT
Create a copy of an existing automation you own — same audience, config, and schedule — as a NEW automation in the STOPPED state. The copy never sends until it is explicitly started in the portal. Requires read_write scope and an Idempotency-Key.

automation_email_capacity_automations_email_capacity_get

ChatGPT
Today's email send capacity for a single shop — the email twin of GET /automations/outreach-capacity — so a consumer can pre-check before queuing email outreach and schedule the remainder for tomorrow. emails_sent_today counts today's sends; daily_limit is the denominator the portal's daily-send bar uses, derived from the shop's effective plan entitlement. tier_limits is that entitlement in full (default / minimum / maximum, Extra Limits grants applied). Note the enforced cap is per email automation, stored on the automation itself and clamped into this range when it is written — so a shop running several automations can exceed daily_limit in aggregate. A null field means the tier expresses no such limit, not zero. Requires a single shop.

automation_filters_automations_filters_get

ChatGPT
Returns the filter options (categories, GMV ranges, follower segments, engagement / view tiers, content-style options, etc.) valid for the given shop region. Use the response to drive filter dropdowns or to validate creators_to_include.filters values before submitting a create request. Region differences: Numeric ranges use the region's currency (`£` for UK, `$` for US, `€` for EU regions, `R$` for BR, etc.). Category lists differ — UK has a smaller category set than US. AI-search filters (face_visibility / content_style / personality_tone / etc.) are only fully populated for US today; other regions surface a subset. Ethnicity filter is available globally regardless of region. Supported regions: US, UK, IE, MX, DE, FR, ES, BR, IT, GLOBAL (alias for US).

automation_messages_automations__automation_id__messages_get

ChatGPT
Message TEMPLATES configured on one automation: TC invite text, ordered DM sequence, follow-ups, AI chatbot Q&A. Placeholders not substituted. For the text actually sent per creator, use the sent-messages tool. Single shop.

automation_metrics_automations__automation_id__metrics_get

ChatGPT
The precomputed performance rollup for ONE automation — the numbers the portal shows above the automation's tabs. `tab_counts carries the creator-tracker, sample-request and video counts (the tracker count already excludes creators on the automation's current omit lists, so it matches the tab it labels). top_line_metrics carries creators_reached, dm_response_count and reply_rate, unique_creators_posted and post_rate, videos_count, total_revenue (GMV), and total views / shares / likes. **Check data_available first.** It is false when the rollup aggregator has not yet computed a row for this automation — the zeros are then 'not computed yet', not 'nothing happened'. top_line_metrics is null for automation types that have no full-funnel view (is_full_view: false`). Single-shop only; the automation must belong to that shop or this returns 404.

automation_outreach_capacity_automations_outreach_capacity_get

ChatGPT
Current outreach send-capacity for a single shop, so callers can pre-check before sending TC invites / DMs and schedule retries when capacity frees. Two independent limits govern outreach: Daily per-shop throttle counted in UTC (resets at 00:00 UTC — see `daily_window_resets_at`). `daily_creators_used` counts actual sends only (skipped/`creator_not_found` invites do not count). The daily ceiling is plan/TikTok-dependent and is not returned as a single number; `daily_limit_throttled` flags when the shop is currently paused by it. TikTok's outreach quota, enforced TikTok-side and read from TikTok's own quota endpoint — see outreach_quota for the consumption, ceiling and refresh instant. It counts connections shop-wide, so it includes outreach not sent through Reacher. Most shops are on a weekly PERIOD quota; some hold a BONUS grant that does not roll, so check outreach_quota.quota_type before calling it weekly. Null when the shop has no synced quota — null means unknown, never zero. weekly_limit_throttled flags when paused by the limit. The daily pool is shared between the automation engine and direct POST /target-collabs invites. Requires a single shop.

automation_runs_gmv_max_automations__automation_id__runs_get

ChatGPT
Full run history for one automation (most recent first), including trigger source, start/finish timestamps, success/failure status, and per-run summary metrics. Single shop only.

automation_sent_messages_automations_automation_id_sent_messages

ChatGPT
Exact SENT message copy for one automation. dm_sent = rendered per-creator DM text grouped by creator (exact copy). tc_sent = TC invitation batches + the template (per-creator TC copy is not stored — coverage_note explains). Use to audit what outreach actually said. Single shop.

automation_start

ChatGPT
Transition to running. Idempotent — already-running returns 200 with the current row. Cannot start an archived automation. Requires idempotency_key.

automation_stats_automations_stats_get

ChatGPT
Shop-level overview of your automations: `total_automations, live_automations, archived_automations, and the split between regular_automations and email_automations, plus three breakdowns — by_type (Target Collab, Message, Email, Sample Request Processing, …), by_status (running / stopped / completed / …) and by_type_and_state (each type split live vs archived) — and an aggregated metrics block rolled up across the shop's automations. This is the portfolio view; use POST /automations/list for the per-automation rows behind it. Pass crm_only=true` to count only automations backed by a CRM group. Single-shop only.

automation_stop

ChatGPT
Transition to stopped. Idempotent — already-stopped returns 200 with the current row. Requires idempotency_key. (No /pause endpoint — pause/stop are functionally identical.)

automation_update

ChatGPT
Partial update across all 4 automation types. Cannot change automation_type, mode, shop, lifecycle state, or system fields — those return 400 listing the offending field. Pass only the fields you want to change (PATCH semantics). dry_run=true to preview. idempotency_key optional but recommended.

automations_gmv_max_automations_get

ChatGPT
List all GMV Max automations configured for the shop, with their current status, trigger frequency, boost window, and last-run summary. Single shop only — automations are per-shop.

automations_list_automations_list_post

ChatGPT
List outreach automations with performance (creators reached, samples, conversion, GMV). Filter by automation_type or status.

campaign_active_exclusion_job

ChatGPT
The bulk-exclusion job still running for this campaign, if any — so a caller that lost the job_id (a reload, a crashed worker) can rejoin it instead of re-uploading. data is null when nothing is running. Read-only.

campaign_bulk_exclude_videos

ChatGPT
Applies a batch of video ids across every campaign the chosen scope resolves to. Returns a job_id IMMEDIATELY — a wide sweep costs one full re-aggregation per campaign and would outlive the request otherwise. Poll GET /campaigns/{campaign_id}/content/exclusions/jobs/{job_id} for progress. The job RE-RESOLVES the targets rather than trusting a preview: minutes can pass between preview and apply, and in that window a creator can be removed or another manager can exclude the same video. Same scope semantics and reason/note rules as the preview and single-exclude calls. Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended job without enqueuing it.

campaign_create_micro_challenge

ChatGPT
Creates a micro-challenge ('weekend blitz') under a parent Leaderboard (contest) campaign — a short scoring window with its own pricing and its own board. Two shapes, discriminated by schedule.mode: `one_off` — an explicit `start_at`/`end_at` window (shop-local); materializes an instance immediately. recurring — a weekly window (start_dow/start_time → end_dow/end_time, day 0 = Monday, shop-local); creates a TEMPLATE that the daily materializer turns into instances. Use POST /micro-challenges/preview-window to see the next window a draft recurring schedule would produce. Rejected when the parent isn't a running contest campaign, when it is itself a micro-challenge (no nesting), or when the parent already has the maximum number of ACTIVE templates (409). Requires read_write scope and an Idempotency-Key; X-Dry-Run: true validates the shop/campaign and echoes the payload without creating anything.

campaign_creators_discord

ChatGPT
For creators linked to your Creator Community campaigns, returns each creator's TikTok handle alongside their linked Discord handle — so you can match Discord server members to the TikTok Shop creators you work with. One row per (campaign, creator): a creator in several of your campaigns appears once per campaign, with campaign_id / campaign_name for context. Discord is creator-provided and optional; by default only creators who have linked a Discord account are returned. Set with_discord_only=false to include creators without one (discord_handle and discord_user_id will be null). By default every currently-linked creator is returned except those rejected / removed / withdrawn from a campaign; pass active_only=true to restrict to creators accepted into a campaign (active or settled). Single shop only.

campaign_delete_micro_challenge_template

ChatGPT
Soft-deletes a recurring template so it stops materializing new windows. Instances it ALREADY produced are untouched — their standings and payouts stand. Ownership is enforced on the full (template, campaign, shop) triple. Requires read_write scope and an Idempotency-Key; X-Dry-Run: true reports what would be deleted without deleting it.

campaign_detail_gmv_max_campaigns__campaign_id__get

ChatGPT
Detail for one campaign: name, status, ad type, budget, ROAS bid, last sync time, plus the campaign's daily metric rows (spend, impressions, clicks, orders, gross_revenue, CPC, CPM, CTR, ROAS). Single shop only — the caller must address the campaign's owning shop via `x-shop-id. For multi-shop callers, use the /campaigns` list endpoint to discover which shop owns a campaign before requesting its detail.

campaign_detail_meta_ads_campaigns__campaign_id__get

ChatGPT
Full detail for one Meta Ads rev-share campaign: its settings plus the creator roster (opt-in status, whitelist grant, resolved TikTok handle/name). Pass the campaign id (UUID) from list_campaigns. Single shop only.

campaign_exclude_videos

ChatGPT
Stop one or more of a campaign's videos from counting toward its results — leaderboard standings, stats and payout eligibility are re-aggregated once for the whole batch before the response returns, so send the entire selection in ONE call rather than one call per video. Every video id must already belong to this campaign (unknown ids → 404). At least one reasons code is required and a note is mandatory when the reason is other, because the reason reaches the creator. Rejected with 409 when the campaign's results are already final, or when it is a LIVE campaign (scored from live sessions, which can't be excluded individually). Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended change without writing.

campaign_exclusion_job_status

ChatGPT
Progress for one bulk-exclusion job: status, campaigns processed vs total, whole-percent progress, exclusions applied, per-campaign errors, and is_terminal. Poll until is_terminal is true. Read-only.

campaign_list_micro_challenges

ChatGPT
The campaign's recurring micro-challenge TEMPLATES (with their schedule, pricing and active/paused status) alongside the INSTANCES already materialized from them plus any one-off windows. Read-only.

campaign_metrics_gmv_max_campaigns__campaign_id__metrics_get

ChatGPT
Daily performance metrics (spend, impressions, clicks, orders, gross_revenue, ROAS, CPC, CPM, CTR) for one campaign over a date range. Date range may not exceed 90 days (inclusive). Defaults to the last 30 days. Multi-shop is supported — when multiple shops are addressed via x-shop-id (a comma-separated list or all), the campaign's owning shop is resolved automatically and metrics are returned for that shop.

campaign_preview_bulk_exclusion

ChatGPT
Dry run for a batch of video ids: resolves which campaigns each id actually appears in and returns the summary — matched, unknown, and skipped-because-ended — WITHOUT writing anything. scope defaults to campaign (act only on this campaign, what a brand expects from a button on one campaign's Content tab). scope: shop is the opt-in that also resolves every OTHER campaign the video appears in — far more destructive, so it is never implied. Always preview a shop-scoped batch before applying it. Read-only, but gated on read_write scope: it is the first step of the bulk-exclusion write flow and reveals exactly what that flow would change. No Idempotency-Key needed (nothing is written).

campaign_preview_micro_challenge_window

ChatGPT
Resolves a draft weekly schedule (start_dow/start_time → end_dow/end_time, day 0 = Monday) against the shop's timezone and returns the next concrete window it would produce — so a caller can confirm the window before creating a template. Shop-scoped, NOT campaign-nested: the create flow has no campaign yet when the schedule is being drafted. The shop comes from x-shop-id; a shop_id in the body is ignored. Writes nothing, but gated on read_write scope as the first step of the micro-challenge create flow. No Idempotency-Key needed.

campaign_restore_videos

ChatGPT
Count one or more previously excluded videos toward the campaign again — the inverse of the exclude call, batched and re-aggregated the same way. Ids that were never excluded are simply no-ops. Same 409 guards apply: a campaign whose results are final, or a LIVE campaign, cannot be changed. Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended change without writing.

campaign_rollups_meta_ads_campaigns__campaign_id__rollups_get

ChatGPT
Leaderboard + summary totals for one Meta Ads campaign: attributed GMV, ad spend, impressions/views, GMV per video, and commission owed — overall and per creator, with each creator's Partnership-ad whitelist status. All metrics are Meta-side (from the attribution ledger); cents are in the ad account's currency (echoed as currency). Use for 'which creators drove the most ad revenue', 'commission owed per creator'. Single shop only.

campaign_update_micro_challenge_template

ChatGPT
Partial update of a RECURRING template — name, window (start_dow/start_time/end_dow/end_time, or an equivalent nested schedule object), pricing, excluded creators, or status: paused to stop it producing new instances. Affects FUTURE instances only: windows already materialized are never rewritten. When a not-yet-started instance exists for the template, it is returned as already_scheduled_instance so the caller can see what the edit did not touch. Ownership is enforced on the full (template, campaign, shop) triple — a template id from another campaign 404s. Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the patch without applying it.

cohort_attribution_cohorts_attribution_get

ChatGPT
First-touch attribution for one cohort: which automations first reached its creators, with each automation's `creators_sourced and share` of the cohort. Single-shop only.

cohort_cell_creators_cohorts_creators_get

ChatGPT
Drill-down for one clicked cell (cohort × offset): the creators it represents. `direction=active returns the creators who qualified at that offset (the cell's numerator); direction=lapsed returns the cohort members who did NOT — the re-engagement target list. Capped at 500 rows (capped` flags truncation). Single-shop only.

cohort_grid_cohorts_grid_get

ChatGPT
The retention grid for one shop: creators grouped by the month they first posted (rows), tracked across month-offsets M0..M6 (columns). Each cell carries raw counts — `posted (creators who posted), gmv_count (creators who drove GMV) and total_videos — so a consumer derives % Posting / % Driving GMV / videos-per-creator itself. Omit product_id` for the latest all-products snapshot, or pass one to live-aggregate that product's cohorts. Single-shop only.

cohort_repost_cohorts_repost_get

ChatGPT
Buckets the shop's recent affiliates by repost recency — actively-reposting / posted-once / lapsed-reposter — over a recency `window_days`. Buckets genuinely shift with the window. Single-shop only.

cohort_segment_cohorts_segment_get

ChatGPT
Resolves a segment — a cohort cell (`source=cohort_cell) or a repost bucket set (source=repost`) — to the underlying creator handles, for exporting or piping into outreach. Single-shop only.

contracts_batch_progress

ChatGPT
Progress for one batch of contracts: total_count / sent_count / failed_count, every envelope in the batch, and a failures list naming the creators whose delivery failed and why. Poll this after a batch is sent from the portal to watch it drain. 404 when the batch does not belong to this shop. Single-shop only.

contracts_download_url

ChatGPT
A short-lived signed URL that downloads the fully-executed PDF (attachment disposition, named after the contract title). Unlike /view-url this never falls back to the unsigned document: 404 until the creator has signed, and 404 when the contract does not belong to this shop. Single-shop only.

contracts_get

ChatGPT
One contract envelope: the campaign and creator it belongs to, the frozen terms the document was rendered from (deliverables, reward structure, usage rights, dates), the signing status, and brand_signed_at / creator_signed_at — null until that party signs. last_error carries the delivery failure reason when status is delivery_failed. 404 when the contract does not belong to this shop. Single-shop only.

contracts_list

ChatGPT
Every contract the shop has generated, newest first. Each row carries the campaign and creator it was sent to, the full terms snapshot the document was rendered from, the signing status and both signature timestamps. Filter by status (draft/sent/active/expired/voided/delivery_failed), by creator_id, by campaign_id, or by expiring_within_days to find active contracts about to lapse. status=expired and expiring_within_days are mutually exclusive — expiry is evaluated lazily against today's date, so asking for both is contradictory. Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.

contracts_list_for_campaign

ChatGPT
Every contract generated for one campaign, newest first — the campaign-scoped view of GET /contracts. Same row shape. 404 when the campaign does not belong to this shop. Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.

contracts_preview_content

ChatGPT
The immutable HTML snapshot of the contract as it was sent for signature, returned as text/html rather than JSON. This is the rendered document body — use it to display or archive the exact terms the creator was shown, without going through a signed URL. Signature blocks are part of the PDF, not this snapshot; fetch the countersigned copy from /download. 404 when the contract does not belong to this shop, or when the document has not been generated yet. Single-shop only.

contracts_templates_list

ChatGPT
The shop's saved contract-clause templates — the reusable clause documents a contract body can be built from. Returns each template's name, clause count and timestamps; the clause bodies themselves are portal-only. Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.

contracts_view_url

ChatGPT
A short-lived signed URL for the contract PDF, for inline rendering. Resolves to the countersigned PDF once the creator has signed, and to the unsigned PDF currently out for signature before that. 404 when the contract does not belong to this shop, or when neither PDF has been generated yet (a draft that was never sent). Single-shop only.

create_automation_gmv_max_automations_post

ChatGPT
Create a new automation that watches the selected campaign(s) and fires creative boosts when its conditions match. Requires `read_write scope. Idempotent via the Idempotency-Key header — replays of the same key + same body return the cached 201 instead of creating a duplicate row. X-Dry-Run: true validates the body and echoes the would-be row without touching the DB. Single shop only — set x-shop-id to the owning shop. Every set_up_creative_boost action requires a total_creative_boost_cost guardrail (lifetime spend cap) — missing one returns 422 TOTAL_BUDGET_CAP_REQUIRED. Each campaign_id can only belong to one active automation at a time — conflicts return 422 CAMPAIGN_ALREADY_ASSIGNED`.

create_campaign_campaigns_post

ChatGPT
Create a Retainer / Challenge / Leaderboard / Live GMV Challenge campaign. X-Dry-Run: true validates the body and echoes what would be submitted without writing any rows. Image fields take HTTPS URL strings — host the image yourself and pass the URL. The 201 response includes an invite_link field — the public URL the caller can share with creators to bring them into the campaign. Subdomain is picked by creator_source: legacy social_army campaigns use https://soco.reacherapp.com; everything else (my_community, etc.) uses https://creator.reacherapp.com. Full pattern: {base}/campaigns/{shop_id}/{uuid_id}. Every campaign endpoint that returns a campaign payload carries the same field — POST, GET list, GET single, GET detail — so callers can lift it directly without constructing the URL themselves.

create_draft_creator_messages_draft_post

ChatGPT
Stage a reply to a creator WITHOUT sending it. Give the creator's handle and exactly one of text (or message), image_url (https) or product_id (from this shop's catalog). Nothing reaches the creator: the draft is saved on the conversation, appears in the Reacher inbox for review, and expires after 30 days. This is step one of replying — show the returned draft to the user, and only after they approve call the send-draft tool with its id. The creator must already have a conversation with the shop (TikTok does not allow cold DMs). Single shop only.

create_gmv_max_campaign

ChatGPT
Create a new GMV Max (TikTok Smart+) campaign on the shop's connected TikTok Business ad account. Requires `read_write scope. Single shop only — set x-shop-id to the owning shop. The canonical body is mapped to TikTok's create payload server-side (daily_budget→budget, target_roas→ROAS bid, product_selection→ALL / CUSTOMIZED_PRODUCTS, etc.). The shop must already be connected to TikTok Business / GMV Max — an unconnected or incomplete connection returns 400 INVALID_REQUEST. Idempotent via the Idempotency-Key header — replays of the same key + same body return the cached 201 without creating a duplicate. X-Dry-Run: true` validates the body + connection and echoes the exact TikTok payload without calling TikTok.

creative_brief_detail_creative_briefs__brief_id__get

ChatGPT
One creative brief in full: the generated document (brief_content) plus its flattened sections, the inspiration videos with their order counts, and the shop's brand colors and logo. Image URLs are re-signed on every read, so use them promptly rather than storing them. Read-only.

creative_brief_generate

ChatGPT
Analyze this product's already-analyzed TikTok videos and generate a creative brief — content angles, unique selling points, filming recommendations, dos/don'ts, and the top inspiration videos — then save it as a drafted brief and return it. Each call is a fresh generation that spends model tokens and creates a new brief row, so Idempotency-Key is required: a retried request replays the first result instead of paying for and storing a duplicate. Send X-Dry-Run: true to validate the product without generating. Returns 404 when the product isn't in this shop, and 422 when the product has no analyzed videos to build a brief from — run video analysis first.

creative_brief_published_url_creative_briefs_published_url_get

ChatGPT
The public URL of this product's published creative brief — the link you share with creators. Returns {"url": null} when the product has no published brief (a drafted or archived brief is not shareable). Read-only.

creative_brief_update

ChatGPT
Replace this brief's editable content — name, description, angles, USPs, filming recommendations, dos/don'ts, inspiration videos — and its status. Set status: published to make it shareable (its URL is then available from GET /creative-briefs/published-url), or archived to retire it. This is a replace: the stored document is rebuilt from the body, so send the whole brief back with your edits, not just changed fields. Two things happen automatically on save: inspiration videos missing key_points get them AI-generated from that video's analysis, and videos missing an orders count have it filled from our attribution data. Idempotency-Key is optional here (a replace is naturally repeatable); X-Dry-Run: true validates without writing.

creative_briefs_list_creative_briefs_get

ChatGPT
Every creative brief in this shop, newest revision per brief, with the product's name and cover image for display. Briefs whose product has no analyzed videos or no catalog imagery are omitted — they cannot render. last_opened_at is the last time the brief was opened in the portal, or null. Read-only.

creative_metrics_gmv_max_campaigns_campaign_id_creative_metrics

ChatGPT
Daily per-creative performance for one campaign, including the video view-rate funnel: 2-second and 6-second view rates plus watch-completion rates (25/50/75/100%), all as percentages (0–100), alongside spend, impressions, clicks, conversions, revenue and ROI. Returns one row per creative per day (raw daily series — aggregate as needed). Optionally narrow to a single creative with material_id. Date range may not exceed 90 days (inclusive); defaults to the last 30 days. Multi-shop is supported — the campaign's owning shop is resolved automatically from x-shop-id.

creatives_gmv_max_creatives_get

ChatGPT
List the synced creatives (videos, spark codes, etc.) attached to a specific GMV Max campaign, with per-creative performance summaries. Single shop only.

creator_detail_creators__creator_handle__get

ChatGPT
Full profile for a single creator: follower count, GMV, groups they belong to, top products, latest 10 videos. Requires single shop (not 'all' or comma-separated).

creator_levels_creators_levels_get

ChatGPT
Creator distribution grouped by GMV tier (L0–L7). Useful for 'how many creators in each level?' or generating segment breakdowns.

creator_products_creators__creator_handle__products_post

ChatGPT
Products a specific creator is affiliated with. Requires single shop.

creator_videos_creators__creator_handle__videos_post

ChatGPT
All videos from a specific creator in your shop. Requires single shop.

creators_list_creators_list_post

ChatGPT
List all affiliate creators in a shop with lifetime GMV, follower count, video count, and status. Supports filters (min_gmv, min_followers, status_filter, product_id) and sorting. Use for 'list my creators', 'creators with >10K followers', 'creators affiliated with product X'.

creators_performance_creators_performance_post

ChatGPT
Top creators by GMV within a date range (NOT lifetime — that's /creators/list). Use for 'top creators last week/month', 'best-performing creators', or any period-based ranking. Defaults to last 30 days.

creators_summary

ChatGPT
Four totals for one shop over a date window: creators added (new_creators), affiliate GMV earned, videos posted, and orders. Use for 'how did we do last month', 'how many creators did we add', or any single-number question about a period. Defaults to the trailing 28 days. NOTE: gmv_generated and video_posts count only the shop's CRM-tracked creators, so they are narrower than gmv and videos_posted on summary_metrics_summary, which cover the whole shop. Don't present the two as the same number or treat a difference between them as an error. Covers the whole shop — there is no filter parameter, so don't reach for this to answer a question about a subset of creators; use creators_performance for ranked per-creator numbers instead. No prior-period comparison is returned: to compute change, call twice with adjacent windows and subtract. Requires a single shop_id. A 503 means the aggregate timed out — wait a few seconds and retry rather than reporting failure.

creators_tier_performance

ChatGPT
The outreach funnel — messages sent, sample requests, samples approved, videos posted — rolled up per creator GMV tier, one block per week. Weeks run Sunday to Saturday and are labelled by the Saturday they end on (week_ending), matching how weekly client reports are cut. A week with no activity is still returned, as zeros. All eight tiers L0-L7 are always present. A creator's tier comes from their ALL-TIME platform-wide GMV — the same basis as the Top Creators level badges — not from the GMV attributed inside the window. The gmv field on each row IS the windowed figure. touches is outreach messages: three DMs to one creator counts three. reached is distinct creators. Single shop only — set x-shop-id to one shop ID.

crm_group_create_from_segment

ChatGPT
Create a reusable CRM Group from a dashboard segment — a GMV tier, an automation, and a date window — then target or exclude it in automations. Use for 'make a group of the L3 creators automation 812 reached last month'. You cannot build a group from arbitrary filter conditions through this API; only these segment dimensions. IMPORTANT: after creating, compare creator_count (what actually went into the group) against handles_resolved (what the segment matched). Only creators with an existing CRM record can be grouped, so DM-only and organic creators drop out and creator_count is often far below handles_resolved — report the group's real size as creator_count, not handles_resolved. dry_run=true checks the segment size and the group-size limit but CANNOT show that drop-off. Membership is a snapshot frozen at creation, NOT live: re-run this tool to refresh it. Reusing an existing group_name overwrites that group and replaces its members. Requires idempotency_key.

crm_group_get

ChatGPT
Get a CRM Group's filter conditions + current creator count. UUIDs come from list_crm_groups. Use the returned crm_group_id when passing exclusions to automations (creators_to_exclude.crm_groups) or as the dynamic backing for sample_request automations.

crm_group_list

ChatGPT
Paginated list of CRM Groups for the shop. Each is a creator cohort the shop can target or exclude in automations. Use to find an existing cohort before building a new one.

crm_roster_content_list

ChatGPT
Every piece of content one creator posted for this shop, per product, with views, likes, comments and paid_orders_count — the attributed-order count TikTok reports for that video. Reads analytics.crm_content_data, the same source behind the portal's expanded creator row. creator_id is required (this is a per-creator drill-down, not a shop-wide content feed — use GET /videos for that); narrow further with product_id. Ordered newest first. Product titles are not returned: the underlying join resolves a single title per creator rather than per product, so it would be wrong on any creator working on more than one. Join product_id against GET /crm/creators for titles. Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.

crm_roster_creator_detail

ChatGPT
The Creator Profile drawer for one roster creator: identity and follower count, top products by GMV, shop performance (total / video / live GMV, units sold, videos and lives posted), affiliate performance (28-day GMV, engagement rate, average views, post rate, brands worked with, PPS score), the current sales-metric cards, and the CRM Groups the creator belongs to. creator_id is the value from GET /crm/creators. The profile is resolved through the creator's handle, so it spans every creator_id the CRM, content and affiliate syncs filed the creator under — a creator whose content landed under a second id still reports their full video GMV here. Inferred demographics (gender, age range, ethnicity, likely location) shown in the portal are omitted. Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.

crm_roster_creator_history

ChatGPT
The audit log of lifecycle changes for one creator on this shop, from customers.crm_creator_status_history — each row is a previous_status → new_status move with the timestamp the sync detected it, plus display labels for both. Use it to measure how long creators sit in a stage, or to reconstruct when a sample was approved, shipped or went unfulfilled. The grain is (creator, product): a creator collaborating on three products has three independent transition chains, so filter by product_id to follow one. Ordered newest first. Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.

crm_roster_list

ChatGPT
The shop's My Creators table: one row per creator (the most recently updated of their creator × product records), carrying the sample / content lifecycle status, lifetime and 28-day GMV, commission, fulfillment, video and live counts, and CRM tags. Filter with any combination of status (repeatable display labels), stage (a canonical funnel stage, which overrides status), product_id, tags (creator carries ANY) and tags_all (carries ALL), plus creator_handle for a case-insensitive handle search. Sort with sort_by / sort_dir; the default is GMV descending. start_date/end_date window the metric columns (video_gmv, total_video_views, videos_posted) — pass both or neither. Status, tags and lifetime gmv are always as-of-now. Set include_products=true to attach each creator's product cards (title, image, status, remaining sample stock). Per-product GMV and the videos themselves are deliberately not attached — they are the two heaviest reads in this surface; fetch them per creator from GET /crm/content. Changed 2026-09: the roster returns every creator filed under this shop. It previously dropped anyone whose row in Reacher's global creator registry had been marked inactive — an outreach-side, cross-shop flag that hid creators this shop had earned GMV from. Expect more rows than before on shops with long CRM histories; no field or filter semantics changed. Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.

crm_tags_add

ChatGPT
Add one or more tags to creators in this shop's CRM roster. Creator IDs are the creator_id values from GET /crm/creators. Re-adding a tag a creator already has is a no-op; creators_updated counts only rows that actually changed. Requires read_write scope and an Idempotency-Key.

crm_tags_remove

ChatGPT
Remove tags from creators in this shop's CRM roster. Pass tags to remove specific tags, or all_tags: true to clear every tag from the named creators. Removing a tag a creator doesn't have is a no-op. Requires read_write scope and an Idempotency-Key.

dashboard_gmv_max_dashboard_get

ChatGPT
Aggregated GMV Max KPIs for a shop over a recent window, with previous-period comparison: spend, revenue, orders, impressions, clicks, ROAS — plus a per-day breakdown for charting. Single shop only (set `x-shop-id` to a specific shop ID). Mirrors the portal Dashboard exactly.

delete_automation_gmv_max_automations__automation_id__delete

ChatGPT
Soft-delete an automation (`status='deleted'`). The row remains in the DB but is excluded from list / detail views. Re-deleting an already-deleted automation is a no-op that still returns 200 (idempotent on the row itself). Pending boost rows queued by this automation are cancelled in the background — best-effort, not awaited here. Single shop only.

delete_campaign_campaigns__campaign_id__delete

ChatGPT
Sets status='deleted'. The row remains in the DB but is hidden from list/detail views. Idempotent.

delete_draft_endpoint_creator_messages_drafts__draft_id__delete

ChatGPT
Discard a staged draft the user decided not to send. Removes only the draft row; nothing is sent or unsent. Use when the user rejects or rewrites a draft (stage a new one afterwards). Single shop only.

discord_channels

ChatGPT
Every text / announcement channel in the shop's connected Discord server, with can_post telling you where the Reacher bot can actually post. Use a channel's id as channel_id when posting. 404 if the shop has not connected Discord. Single shop only.

discord_message_create

ChatGPT
Post a message to a channel immediately, schedule it for later, or start a recurring series (e.g. a weekly announcement). - Now: omit scheduled_for — the response is the final sent / failed record. - Scheduled: set scheduled_for. - Recurring: set scheduled_for (first fire) and recurrence (e.g. {"frequency": "weekly", "end_type": "never"}). Idempotency-Key is required so a retry can't double-post. X-Dry-Run: true validates without posting or scheduling. Attach up to 10 images / files via images (each base64-encoded, ≤ 8MB) — e.g. a video-breakdown image.

discord_message_delete

ChatGPT
Delete a scheduled message (or a whole recurring series by its parent id). An already-sent message can be deleted from the record too; it does not unsend it in Discord. A foreign message id reads as 404. Requires read_write scope. Idempotency-Key is optional (a delete is naturally repeatable); X-Dry-Run: true checks the message exists and is yours without deleting it. Single shop only.

discord_message_detail

ChatGPT
One scheduled or delivered message. For a recurring series' parent, upcoming_occurrences lists the next fire times. A message id that isn't this shop's reads as 404. Single shop only.

discord_messages_list

ChatGPT
Discord messages this shop has scheduled or posted through Reacher, with their engagement (reaction_count, reply_count, audience_count) once delivered. counts totals each tab. Single shop only.

discovery_create_profile

ChatGPT
Create a new creator brief for the shop — a search_query plus optional demographic filters — and resolve it immediately, so the response carries the creator_count it matched. The brief is created with source: user_created and shows up in GET /discovery/profiles right away. The stored title is regenerated from the query and filters rather than kept verbatim, so read it back from the response instead of assuming what you sent. Requires read_write scope and an Idempotency-Key header — a replay of the same key and body returns the original 201 rather than creating a second brief. Single-shop only.

discovery_delete_profile

ChatGPT
Soft-delete one brief. The row is retained and marked deleted, so the profile disappears from GET /discovery/profiles but any Vault list already saved from it is untouched — deleting the brief never deletes creators you saved. Returns 404 if the profile does not exist or belongs to another shop. Requires read_write scope. Single-shop only.

discovery_get_profile

ChatGPT
A single Discovery Agent profile by ID — the same record the list endpoint returns, fetched directly when you already hold the ID. Returns 404 when the profile doesn't exist or belongs to a different shop; a profile is only ever visible to the shop that owns it. Unlike the list endpoint this also returns hidden profiles, so a stored ID keeps resolving after a user hides it in the portal. Single-shop only.

discovery_list_profiles

ChatGPT
Every visible Discovery Agent profile for the shop. A profile is a titled creator brief — a search_query plus optional structured filters (gender, age, ethnicity, region) — that Reacher either generated from the shop's catalog (source = generated) or a user created by hand. Each row carries id (pass it to the creator listing below), title, description, search_query, filters, creator_count (the size of its last resolved match set), hide_unsafe, is_active, last_search_at and the created/updated timestamps. Hidden and deleted profiles are excluded; has_profiles is false for a shop that has never generated any. Single-shop only. Read-only — creating, editing and deleting profiles is not exposed on the public API.

discovery_profile_creators

ChatGPT
Resolve one profile to its matching creators. The profile's search_query and its structured filters are combined into the search that runs, so this returns exactly what the portal shows under that profile. This is a read — POST only because the optional filters payload is a nested object that doesn't survive a query string. Nothing is created or modified. Paginate with page / limit (max 1000 per page); total_creators is the full match count. Sort by any of: relevance_score, follower_count, gmv_num, avg_views, engagement_rate_segment. Supply filters to narrow the set further without editing the profile. Each creator row carries its handle, follower/GMV/engagement metrics, categories, bio and the relevance_score that ordered it. Creator email addresses are omitted, matching the /ai-search surface. Returns 404 when the profile doesn't exist or belongs to a different shop. Single-shop only.

discovery_save_profile_to_list

ChatGPT
Resolve one brief and materialize its entire match set into a named Vault list — the bridge from 'who should I recruit?' to an automation you can actually run, since automations target Vault lists rather than briefs. This is a snapshot: the list holds the creators matching at save time and does not track the brief afterwards. Re-save to refresh. Pass include_emails: true to store the email list alongside the handles, which an email automation needs. Optional filters narrow what gets saved without editing the brief. Every matching creator is saved, not just the first page, so this can take a while on a broad brief. The response reports creators_saved. Requires read_write scope and an Idempotency-Key header. Returns 404 if the profile does not exist or belongs to another shop. Single-shop only.

discovery_update_profile

ChatGPT
Partially update one brief — only the fields you send are changed. Changing search_query or filters re-derives the stored title and re-resolves the match set, and if the brief already backs a Vault list that list is re-synced. Editing a Reacher-generated brief flips its source to user_created; it is then yours and is no longer regenerated. is_deleted is not settable here — use DELETE /discovery/profiles/{profile_id} — so a PATCH can never silently retire a brief. Returns 404 if the profile does not exist or belongs to another shop. Requires read_write scope. Single-shop only.

export_creators_ai_search_export_post

ChatGPT
Export creator PROFILE-search results as CSV (up to 50,000 rows) instead of paging. Pass the same query you'd give the profile-search tool, OR an explicit creator_ids list (not both); omit both to export your region's full browse universe. Returns a CSV attachment; the X-Creator-Row-Count header reports the row count. Single shop only. Only profile-mode results export — transcript / video / lookalike have no CSV export.

funnel_overview_funnel_get

ChatGPT
Affiliate funnel stages: sample requested → approved → posted → unfulfilled → GMV generated → top creators. Use for funnel-shape questions.

funnel_stage_detail

ChatGPT
Everything behind one stage of the affiliate funnel returned by GET /funnel: creator_count and percentage_of_funnel, the insights block (unique creators, total entries, conversion rate from the previous stage with its conversion_label, and median days spent in the status), the CRM group_id / group_filters that define the stage, the automation_templates available for it, and the active_automations currently working it. stage_id accepts the stage keys from the funnel overview — e.g. sample-requested, sample-approved, content-posted, content-unfulfilled, gmv-generated, top-creators. Set include_products=true to also get the per-product breakdown of the stage (one row per product with stage-relevant metrics such as creators_in_stage, gmv_generated, avg_views, avg_gmv, spark_code_collected); metrics that don't apply to the stage come back as null. Products are paginated independently via products_page / products_page_size and can be narrowed with product_ids. Single-shop only. Data covers the last 90 days, matching the dashboard.

funnel_v2_counts

ChatGPT
How many sample requests sit in each pipeline tab — toReview, readyToShip, shipped, pendingContent, completed, cancelled — under the filters you pass, plus the overall completionRate, the shop's approvalTarget (limit and used), archivedCount, expiringCount and a dataFreshness stamp. This is the tab-badge row above the board. Every tab count INCLUDES requests hidden because the creator is archived, so the funnel matches TikTok's Affiliate Center. archivedCounts breaks that hidden share down per tab, and archivedCount.total is the hidden request count overall. With show_archived=true the archived rows are counted as visible, so archivedCounts comes back zeroed; to list them, pass the same flag to /funnel/v2/requests. Accepts the same filters as /funnel/v2/requests (the counts respect them), so you can ask 'how many are in each stage for this product / date range'. Single-shop, CRM v2 shops only.

funnel_v2_filter_config

ChatGPT
The values you can actually filter the CRM v2 pipeline by for this shop — the products, sourcing automations, CRM tags and status tabs that exist in its data, plus the bounds of each metric range. Call this once to build a filter UI or to discover valid product_ids / automation_ids / tags before querying /funnel/v2/requests. Single-shop, CRM v2 shops only.

funnel_v2_metrics

ChatGPT
The headline metrics above the Sample Requests board: pendingReview (count plus how many expire soon), approvedInAutoProcess (count with period-over-period changePct and changeDirection), completionRate, and approvalTarget progress against the shop's sample-approval limit, with a dataFreshness stamp. pendingReview.count INCLUDES requests hidden because the creator is archived, so it matches TikTok's Affiliate Center; expiringSoon and completionRate stay over the visible rows, which are the ones you can act on. Accepts the same filters as /funnel/v2/requests. Under a sku_ids filter, notScopableBySku names the metrics that could not be narrowed — approvalTarget, whose limit and used counters are product-grain — so treat those as unscoped rather than filtered. Single-shop, CRM v2 shops only.

funnel_v2_requests

ChatGPT
The paginated sample-request pipeline for one shop — the rows behind the Sample Requests board. Each row carries the creator (handle, followers, level, rising-star / fast-growing signals, CRM tags), the product, the request's status and timestamps, and the creator's performance metrics (post rate, PPS score, average views, engagement rate, GMV per sample, videos per sample). Filter by pipeline tab (status), product, SKU, creator profile, sourcing automation, tag, date range, free-text search, and any of the metric ranges (min_* / max_*). product_ids and sku_ids are AND-ed: passing both narrows to those SKUs rather than widening. show_archived returns the archived board instead; show_expiring narrows to requests about to expire. Response also reports archivedCount (requests hidden because the creator is archived), expiringCount, lastUpdatedAt (when this shop was last observed on TikTok; null if never) and a dataFreshness stamp. Single-shop only, and only for shops on the CRM v2 pipeline — others get a 404 and should use /samples.

get_bof_settings_gmv_max_bof_settings_get

ChatGPT
Read the shop's GMV Max bottom-of-funnel auto-exclude toggle. Defaults to auto_exclude_enabled: false for shops that have never set it. Single shop only.

get_campaign_campaigns__campaign_id__get

ChatGPT
Returns the campaign in the same shape PATCH /campaigns/{id} accepts.

get_campaign_detail_campaigns__campaign_id__detail_get

ChatGPT
Full campaign detail: campaign metadata, applied/active creators with stage + payment-due + per-creator actions, aggregated stats (GMV, views, orders, payouts), and a content snippet. Equivalent to what the portal's campaign-detail page renders.

get_campaign_leaderboard_campaigns__campaign_id__leaderboard_get

ChatGPT
Ranked creator standings for a Leaderboard (contest) campaign: each creator's rank, weighted composite_score with a per-metric score_breakdown, and the raw GMV / views / videos / units stats. When the campaign has a currently-live (or recently-ended) micro-challenge, its windowed blitz board is nested under micro_challenge. Standings are paginated; total_creators is the full participant count. Scores come from the same shared scorer the dashboard and public share page use, so ranks agree across every surface. Single-shop only (the shop sets the response currency).

get_conversation_messages_creator_messages_conversation_e2ab38a8

ChatGPT
Full message thread with one creator by TikTok handle, oldest to newest, including who sent each message and when. Use for 'what did we say to @handle', 'show the conversation with this creator'. Read-only — to answer, stage a draft with the create-draft tool, show it to the user, and send it with the send-draft tool once they approve. Single shop only.

get_creator_categories_social_intelligence_creators_categories

ChatGPT
Creator content categories tracked on TikTok Shop.

get_deposit_history_campaigns_payments_deposits_get

ChatGPT
Money the shop has ADDED to its Creator Community wallet (deposits and their settlement status), newest first. This is funds in — for money paid out to creators use the payment history tool. Single shop only.

get_gmv_max_campaign_changes

ChatGPT
Paginated, append-only log of settings changes for one campaign, newest first. Each row carries the changed field, its old_value and new_value (JSON), and the changed_at timestamp. Empty data is a normal 200. Single shop only.

get_gmv_max_campaign_delivery_status

ChatGPT
Creative counts and spend for one campaign grouped by delivery status, computed from each creative's LATEST daily metric row. Statuses are bucketed from TikTok's raw creative_delivery_status into a canonical set (delivering, not_delivering, in_review, rejected, inactive, unknown); NULL or unrecognised statuses bucket as unknown. Sorted by spend descending. Empty data is a normal 200. Single shop only.

get_gmv_max_campaign_settings

ChatGPT
The campaign's current settings, normalized from TikTok's raw campaign/gmv_max/info payload into a stable snake_case object: status, target_roas, daily_budget, schedule window, auto_budget_enabled, product_selection, roi_protection_enabled, affiliate_posts_enabled, and placements. Settings TikTok did not report are null. Single shop only — set x-shop-id to the campaign's owning shop. 404 if the campaign is not found in this shop.

get_gmv_max_campaign_spend_by_surface

ChatGPT
Ad spend and distinct-creative counts for one campaign grouped by delivery surface (product_card, affiliate, brand, unknown) over a date range. NULL / unrecognised surface_bucket values bucket as unknown. Date range may not exceed 90 days (inclusive); defaults to the last 30 days. Sorted by spend descending. Empty data is a normal 200. Single shop only.

get_inbox_stats_creator_messages_stats_get

ChatGPT
Shop-level counts for the creator DM inbox: total conversations, conversations with unread messages, conversations awaiting a shop reply, and the total unread-message count (the badge number). unread_conversations counts conversations; unread_messages sums the unread messages inside them — they are NOT the same. For per-creator unread detail, page GET /conversations?unread_only=true.

get_insights_overview_social_intelligence_insights_overview_get

ChatGPT
Benchmark your shop against TikTok Shop ecosystem peers in your GMV segment. Includes funnel comparison and content-unfulfilled metrics.

get_payment_history_campaigns_payments_history_get

ChatGPT
Payments and settlements the shop has made OUT to creators from its Creator Community wallet, newest first. This is funds out — for money added to the wallet use the deposit history tool. Single shop only.

get_product_categories_social_intelligence_products_categories

ChatGPT
The TikTok Shop product category taxonomy (category ids and names) used to filter Social Intelligence market queries. Reference data about the open TikTok marketplace, not about this shop. Requires the Social Intelligence entitlement.

get_product_creators_products_product_id_creators

ChatGPT
Creators driving sales for a specific product (across TikTok Shop ecosystem).

get_product_detail_social_intelligence_products__product_id__get

ChatGPT
Detailed metrics for a single TikTok Shop product.

get_product_videos_products_product_id_videos

ChatGPT
Videos featuring a specific product with AI-analyzed content tags.

get_products_social_intelligence_products_get

ChatGPT
Browse all products across TikTok Shop ranked by GMV, units sold, rating.

get_seller_categories_social_intelligence_sellers_categories_get

ChatGPT
All seller (brand) categories on TikTok Shop ecosystem. Market-wide — not limited to your shop. ONLY WORKS for customers with Social Intelligence access.

get_seller_creators_sellers_seller_id_creators

ChatGPT
Creators driving sales for a specific seller on TikTok Shop. Filters: GMV, followers, post rate, categories.

get_seller_detail_social_intelligence_sellers__seller_id__get

ChatGPT
Detailed metrics for a single seller on TikTok Shop.

get_seller_products_sellers_seller_id_products

ChatGPT
All products from a specific seller on TikTok Shop.

get_seller_videos_social_intelligence_sellers__seller_id__videos

ChatGPT
Videos featuring products from a specific seller, with AI-analyzed content tags (hookType, sellingPoints) on top performers.

get_sellers_social_intelligence_sellers_get

ChatGPT
Browse all sellers on TikTok Shop ranked by 28d GMV, all-time GMV, creators, or videos. Filter by category. Returns a 'yourBrand' rank marker for your shop.

get_tracker_videos_campaigns_content_tracker_vids_post

ChatGPT
Used by the settlement screen to enumerate the videos a creator posted under a specific campaign.

get_wallet_balance_campaigns_payments_wallet_balance_get

ChatGPT
Current Creator Community marketplace wallet balance for the shop — the float that campaign payments draw down. Use for 'what's my wallet balance', 'do I have enough to pay creators'. Read-only; funding the wallet is a separate deposit action. Single shop only.

gmv_max_bof_settings_update

ChatGPT
Enable or disable automatic exclusion of bottom-of-funnel creators for this shop's GMV Max delivery. Upserts the shop's toggle and returns the new value. Requires read_write scope and an Idempotency-Key. Single shop only.

gmv_max_excluded_creators_add

ChatGPT
Manually exclude a creator (by TikTok handle) from this shop's GMV Max bottom-of-funnel delivery. Idempotent on (shop, handle): re-excluding an already-excluded creator is a no-op upsert that returns the existing row. Requires read_write scope and an Idempotency-Key. Single shop only.

gmv_max_excluded_creators_remove

ChatGPT
Remove a creator from this shop's GMV Max exclusion list, restoring them to bottom-of-funnel delivery. handle is the creator's TikTok handle (from GET /gmv-max/excluded-creators). Removing a creator who isn't excluded is a no-op that still returns 200 with removed: false. Requires read_write scope and an Idempotency-Key. Single shop only.

gmv_max_excluded_videos_add

ChatGPT
Exclude ONE video (creative) from this shop's GMV Max delivery, by TikTok video_id, without excluding its creator — use this to cut an unprofitable creative (e.g. zero orders at $10+ spend) while the creator's other videos keep delivering. The reconcile job removes the creative from every active campaign it is delivering in within ~4 hours and verifies it flipped to EXCLUDED. Idempotent on (shop, video_id): re-excluding an already excluded video keeps its current applied_status. Requires read_write scope and an Idempotency-Key. Single shop only. For many videos at once use POST /gmv-max/excluded-videos/bulk.

gmv_max_excluded_videos_add_bulk

ChatGPT
Exclude a list of videos (creatives) from this shop's GMV Max delivery in one call — paste the video ids from an Ads Manager export or from the GMV Max video summary tool. Up to 500 valid ids per call; duplicates are collapsed, already-excluded ids are counted in already_excluded, and inputs that are not a numeric TikTok video id come back in invalid (nothing is silently dropped). Each excluded creative comes off spend on the next reconcile (~4h) while its creator's other videos keep delivering. Requires read_write scope and an Idempotency-Key. Single shop only.

gmv_max_excluded_videos_remove

ChatGPT
Remove a video from this shop's GMV Max exclusion list. video_id is the TikTok video id (from GET /gmv-max/excluded-videos). Reacher stops enforcing the exclusion; TikTok does not automatically re-add a creative it has already EXCLUDED, so re-adding it to a campaign is done in Ads Manager. Removing a video that isn't excluded is a no-op that still returns 200 with removed: false. Requires read_write scope and an Idempotency-Key. Single shop only.

gmv_max_products_summary_gmv_max_products_summary_post

ChatGPT
Product-level GMV Max (TikTok Smart+) window totals for one shop PLUS an account-level 'overview' — the Seller Center 'GMV Max Ads overview' card (total cost, SKU orders, cost per order, gross revenue, ROI). Each product row SUMs cost / GMV / orders over the window with cost_per_order and roi RECOMPUTED from the summed bases (never averaged), plus the owning campaign's name / status / budget / target ROI (= ROAS bid). Each row is keyed by campaign_id + item_group_id (== product_id, the join key to product / Seller Center product datasets). Rows are sorted by cost descending and the overview reconciles with them. Use for 'top GMV Max products this month', 'GMV Max spend and ROI by product'. For the daily per-product series use the GMV Max product-timeseries tool. Single shop only. Same window defaults/caps as the timeseries tool (last 30 days, max 90). Optionally filter by campaign_id.

gmv_max_products_timeseries_gmv_max_products_timeseries_post

ChatGPT
Daily GMV Max (TikTok Smart+) metrics at the PRODUCT grain (SPU / item_group_id) for one shop: per product, per day — cost, gross_revenue (GMV), SKU orders, roi, and cost_per_order. This is TikTok Seller Center's per-campaign 'Product' table. Use for 'which products is GMV Max spending on', 'per-product GMV Max ROI by day'. For campaign-level (not per-product) daily metrics use the GMV Max campaign-metrics tool; for window totals use the GMV Max product-summary tool. Optionally filter by campaign_id and/or item_group_id (== product_id, the join key to product / Seller Center product datasets). roi and cost_per_order are TikTok's stored DAILY values, not window rollups. Single shop only. Defaults to the last 30 days ending yesterday; max range 90 days. Empty data is a normal result (the shop may have no GMV Max campaigns).

gmv_max_videos_summary_gmv_max_videos_summary_post

ChatGPT
Per-VIDEO (creative) GMV Max ad spend and performance for one shop across every campaign the video delivered in — video_id, campaign_ids, posted_date, creator_name, spend, orders, cost_per_order, roi, revenue, impressions, clicks, ctr (ad click rate), video_ctr (product click rate), latest delivery_status, surface, and is_excluded. This replaces the manual Ads Manager creative export. Use for 'which videos are burning spend with no orders', 'GMV Max creatives ranked by ROI', 'build an exclusion list'. Filter with campaign_id / min_spend, sort with sort_by / sort_dir, paginate with page / page_size (max 200). Then exclude a creative with the GMV Max excluded-videos add (single) or add-bulk tool — that takes ONE video off spend without excluding the creator. For per-day rows use the campaign creative-metrics tool; for product grain use the product-summary tool. Single shop only. Defaults to the last 30 days ending yesterday; max 90.

halo_analysis_halo_analysis_post

ChatGPT
The flagship halo read — how much off-TikTok revenue moved with TikTok activity over the window, and how confidently that can be claimed. Four things come back: summary — `base_sales is the average daily Amazon+Shopify revenue over the 30 days immediately BEFORE the window (the pre-period run rate). incremental_revenue is the window's revenue minus that run rate carried across the days that have data — the revenue above baseline, and the number to quote as halo lift. It goes negative when the window underperformed the prior 30 days. relationship_strength is the Pearson r between daily TikTok views and daily combined off-platform revenue; views_explain is r squared, readable as 'views explain N% of the day-to-day revenue swing'. **channel_correlations** — the same regression per off-platform channel, each with r, a two-sided p_value (below 0.05 is the usual bar for calling it real) and a plain-English label. TikTok GMV is deliberately absent: it is driven by the same views it would be correlated against, so it correlates by construction and is direct attribution, not halo. It appears under attribution instead. **branded_search_correlation** — TikTok views vs Amazon branded search, the earliest and cleanest halo signal. Null when the shop has no branded-search tracking. **attribution** — raw revenue sums per channel for the window, unmodelled. lag_days shifts TikTok views forward before correlating, so a video today can be matched against an Amazon order three days later; sweep 0-14 and keep the strongest r. Any r is null when fewer than 5 aligned day-pairs have data on both sides, or when a channel is not connected — check GET /halo/channels` first. Correlation is not causation: a strong r with a plausible lag is evidence, not proof. Defaults to the last 30 days ending yesterday; max 366, though TikTok views are only daily-resolved for the most recent ~30 days, so wider windows weaken the regression rather than strengthen it. Single-shop only.

halo_branded_search_halo_branded_search_post

ChatGPT
Amazon branded search is the cleanest halo signal there is: nobody searches a brand by name unless something put it in their head, and on TikTok-driven brands that something is usually a video. This returns the daily branded-search volume and click share for the window, the window totals, the peak day, and the Pearson correlation against TikTok views at the requested `lag_days — the same regression the analysis endpoint runs. top_search_terms is always null: Amazon reports branded-search volume per ASIN per day, not the query strings, so there is no term list to return. The field exists so it can be filled later without a breaking change. Pass asins to scope to specific products; omit for every tracked ASIN. An empty series means branded search isn't tracked for this shop (check branded_search on GET /halo/channels`). Single-shop only.

halo_channels_halo_channels_get

ChatGPT
The prerequisite call: which of this shop's four data channels are wired up, and which have actually landed data. Correlations are only computed for channels flagged here, so a null `amazon correlation on a shop with amazon: false is expected, not a failure. amazon / shopify mean an active authorization exists; the matching *_has_data` flags mean rows have arrived. Connected but not-yet-populated is the normal state for the first few hours after a brand links a store. Single-shop only.

halo_products_halo_products_get

ChatGPT
Every Amazon ASIN and Shopify product this shop has off-platform revenue rows for — the value set for the `amazon_asins and shopify_product_ids filters on the timeseries, analysis and branded-search endpoints. Omit channel to get both catalogs in one call; a catalog the shop has no data for comes back as an empty list. There is no TikTok catalog: TikTok halo inputs (views, GMV) are only stored shop-wide, so TikTok is never product-filterable and passing channel=tiktok is rejected. search` substring-matches ASIN and product name case-insensitively. Single-shop only.

halo_timeseries_halo_timeseries_post

ChatGPT
Every halo channel on one contiguous date axis: TikTok views and GMV, Amazon revenue, Shopify revenue, branded-search volume and click share. `dates[i] indexes every other array, so the arrays can be plotted or diffed element-wise without re-joining on date. A null means no data for that day; a 0 means a real zero — the distinction is preserved deliberately, and channels the shop hasn't connected are null throughout. Pass amazon_asins / shopify_product_ids to scope revenue (and branded search) to specific products; omit them for shop totals. TikTok points are only daily-resolved for the most recent ~30 days — beyond that TikTok's stored series is monthly-bucketed and cannot be aligned to days, so tiktok_views / tiktok_gmv` come back null for the out-of-coverage tail while the revenue series stay complete. Defaults to the last 30 days ending yesterday; max 366. Single-shop only.

halo_viral_videos_halo_viral_videos_get

ChatGPT
The shop's TikTok videos posted on one date, ranked by views — the drill-down for a spike. When the timeseries shows Amazon revenue jumping on the 14th and the analysis says the best lag is 3 days, this answers what went up on the 11th that caused it. Each video carries views, GMV, units sold and engagement counts, plus Reacher CDN links (permanent thumbnail, mirrored video) for the videos we have mirrored — null for the rest. `date` filters on posting date, not activity date, so a video that kept accruing views is ranked by its lifetime views under the day it was posted. Single-shop only.

image_brief_analyze_brand_voice

ChatGPT
Scrape the brand's website and extract a brand profile — name, voice descriptors, target audience, categories — and store it for the shop. This is what PUT /image-briefs/brand-voice depends on: a shop that has never had brand analysis run 404s there until this endpoint has created the profile. After it runs, brand voice is populated (and can be overridden with the PUT). It scrapes the site and runs an LLM, so it is a write: it needs read_write scope, counts against the write rate limit, and the shop's existing profile is returned as-is unless refresh: true (a shop has one profile). A required Idempotency-Key makes a retry replay rather than re-scrape; X-Dry-Run: true validates without scraping. Single shop only.

image_brief_create

ChatGPT
Save an image brief as a draft — typically the content returned by POST /image-briefs/generate, but any content is accepted. Up to 3 products; index 0 is the hero. Omit name and the brief is named after its headline. Idempotency-Key is required so a retry doesn't leave you with duplicate drafts. X-Dry-Run: true validates without saving.

image_brief_delete

ChatGPT
Permanently delete a saved image brief. This is not reversible — the draft and its content are gone. Deleting an already-deleted brief returns 404. Idempotency-Key is required; X-Dry-Run: true reports what would be deleted without deleting it.

image_brief_detail_image_briefs__brief_id__get

ChatGPT
One saved image brief with its full content and layout settings. Read-only.

image_brief_generate

ChatGPT
Generate the copy for a single-image creator brief from up to 3 of your products (index 0 is the hero): the kicker, signature and winning hooks, social proof, benefits, content ideas, and shop tagline. This returns content without saving it — pass the result to POST /image-briefs to keep it as a draft. The portal streams this generation token by token; here it is collapsed into one response. Each call spends model tokens, so Idempotency-Key is required and retries replay the first result rather than regenerating. Generation is non-deterministic — the same products give different copy each time.

image_brief_get_brand_voice_image_briefs_brand_voice_get

ChatGPT
The adjectives describing how your brand sounds (e.g. playful, clinical, premium). They are fed to every image-brief generation, so they shape the copy's tone. Read-only.

image_brief_product_context_image_briefs_product_context_get

ChatGPT
The product details an image brief renders and generates from — name, brand, price, image, description, top-performing hooks, and your brand voice — for up to 3 products (first is the hero). Use it to preview the poster header before generating. Read-only.

image_brief_set_brand_voice

ChatGPT
Replace the descriptors that steer the tone of generated image briefs. This is a replace, not an append — send the full list. Requires an existing brand profile for the shop; 404 until brand analysis has run. Affects future generations only; existing briefs keep their saved copy.

image_brief_update

ChatGPT
Change a saved image brief. Only the fields you send are updated, so you can patch a single value; sending an explicit null clears a nullable field. Up to 3 products. Idempotency-Key is optional (a patch is naturally repeatable); X-Dry-Run: true validates without writing.

image_briefs_list_image_briefs_get

ChatGPT
Your saved image-brief drafts, newest first, each with the poster identity (name, brand, price, image) of its products. Filter by name or kicker with search. Read-only.

instagram_business_discovery_meta_ads_instagram_busines_367e6762

ChatGPT
Resolve an Instagram handle to its public profile — follower count, post count, bio, display name, avatar and IG user ID — using the connected account's Graph access. The handle does not need any relationship with the brand, which makes this the sizing check before reaching out to a creator. Meta only resolves Business and Creator accounts through this edge: a personal account, a private account, or a handle that does not exist all come back as 404 alike, and no distinction between those cases is available. Pass the handle with or without a leading @. For repeated or typeahead lookups prefer /meta-ads/instagram/creator-lookup, which returns the same profile from a 5-minute cache and so does not spend Meta API quota per keystroke. Single shop only.

instagram_creator_lookup_meta_ads_instagram_creator_lookup_get

ChatGPT
Resolve an Instagram handle to a creator profile — IG user ID, handle, name, follower count and avatar — shaped as a suggestions list so the response stays stable as more resolution sources are added. Today exactly one source contributes, Meta's business discovery, so the list holds at most one entry. Results are cached in Valkey for 5 minutes per shop and query, which is what makes this the endpoint to call on keystroke; /meta-ads/instagram/business-discovery hits Meta every time and returns richer fields. A handle that cannot be resolved — nonexistent, private, or a personal rather than Business/Creator account — returns an empty suggestions list rather than a 404, so a typeahead never has to treat a miss as an error. verified is always null: Meta's discovery edge does not expose it. Single shop only.

instagram_media_insights_meta_ads_instagram_media_id_insights

ChatGPT
Reach and saves for a single Instagram post, returned as a flat metrics map so new metrics can be added without a breaking change. Meta serves per-media insights only for media owned by the connected account. Ask for a tagged post — anything from /meta-ads/instagram/tagged-media — and the answer is 422 INSIGHTS_NOT_AVAILABLE; that is Meta's rule, not a Reacher restriction, and the public engagement counts on the tagged-media row are the substitute. Source media_id values from /meta-ads/instagram/own-media. Single shop only.

instagram_own_media_meta_ads_instagram_own_media_get

ChatGPT
The 24 most recent posts published by the connected Instagram Business account, newest first, with caption, media type, media and thumbnail URLs, permalink, timestamp and public engagement counts. Unlike tagged media, these are owned posts — so each id here is a valid media_id for /meta-ads/instagram/media/{media_id}/insights, which is the only way to get reach and saves. Media and thumbnail URLs are short-lived signed Meta CDN links; mirror the bytes if you need them to persist. Rows are passed through exactly as Meta returns them. Single shop only.

instagram_tagged_media_meta_ads_instagram_tagged_media_get

ChatGPT
Up to 50 recent Instagram posts tagging the connected Business account — the organic creator content mentioning the brand, which is where whitelisting and Partnership-ad candidates are usually found. Each row carries the caption, media type, permalink, timestamp, the posting handle, and public like_count / comments_count. Meta restricts this edge to owner-visible fields, so media_url and thumbnail_url are not available for tagged posts (they are owner-only) — render the permalink for click-through. The public engagement counts here are the only engagement signal available for content the brand did not post; per-media /insights will refuse it. owner is best-effort and may be absent when Meta withholds it. Single shop only.

integrations_status

ChatGPT
The shop's connection matrix — one row per integration Reacher offers it, each with a key, a status and, when connected, the connected_at timestamp. Covers tiktok_shop_affiliate and tiktok_shop_customer_service (the TikTok Shop apps that back creator outreach and messaging), tiktok_for_business (the ads account behind GMV Max), meta (the Facebook/Instagram account behind Meta Ads rev-share), amazon and shopify (the off-TikTok revenue channels the Halo tracker correlates against), and discord. status is connected, disconnected, or coming_soon where the integration isn't available to this shop's region yet. Which rows appear is region-dependent: an integration with no presence in the shop's region is omitted rather than returned as disconnected. Use this to explain an empty data surface — Halo with no Amazon revenue and a disconnected amazon row is a setup gap, not missing data. Connecting an integration is a browser OAuth flow, so the portal's install links are not part of this response. Read-only, single-shop.

list_campaigns_campaigns_get

ChatGPT
Paginated list of the shop's creator campaigns with status/type filters and sortable columns. Returns counts per status tab (all/active/past/draft) and per type (retainer/challenge/leaderboard).

list_campaigns_gmv_max_campaigns_get

ChatGPT
List all GMV Max (TikTok Smart+) campaigns for the shop(s) addressed by x-shop-id. Returns cached campaign metadata last synced from TikTok by the portal — call the portal's sync endpoints to refresh. Supports multi-shop (x-shop-id: all or comma-separated).

list_campaigns_meta_ads_campaigns_get

ChatGPT
List the shop's Meta Ads (Cross-channel) rev-share campaigns, newest first. Optional status filter (draft|active|paused). Each row has commission settings + lightweight rollups (active creators, lifetime attributed revenue in cents, unpaid commission owed in cents). Use for 'my Meta ad campaigns', 'rev-share campaigns'. Single shop only. These are Meta ads — distinct from GMV Max (TikTok Smart+) and Creator Community campaigns.

list_content_campaigns_content_get

ChatGPT
All videos posted by creators across the shop's campaigns. Returns overview metrics (total posts, views, orders, GMV, wallet balance) plus a paginated content list. Use the campaign-detail endpoint for a campaign-scoped view.

list_conversations_creator_messages_conversations_get

ChatGPT
The shop's creator DM inbox. Use unreplied_only=true to get conversations awaiting a reply (what an AI agent typically iterates).

list_create

ChatGPT
Upload a list of creator handles + emails. Two paths: (1) JSON body with {name, description?, creator_handles: [...], creator_emails: [...]} — convenient when you have data structured. (2) Multipart CSV: file part file (csv with creator_name column required + optional email column) + form fields name, description. Returns list_id which you pass to automations as creators_to_include.lists_selected. Requires idempotency_key.

list_delete

ChatGPT
Soft-delete a list (state=archived). Idempotent. Requires idempotency_key. Existing automations referencing this list will continue to work but won't see new members; create a fresh list if the cohort needs to grow.

list_drafts_creator_messages_conversations_creator_handle_drafts

ChatGPT
Drafts currently staged on one creator's conversation, newest first, with their ids. Use to find a draft to send or discard, or to check whether a reply is already waiting for approval. Read-only. Single shop only.

list_excluded_creators_gmv_max_excluded_creators_get

ChatGPT
List the creators excluded from this shop's GMV Max bottom-of-funnel delivery — both manually excluded (source: manual) and auto-detected (source: auto_bof). Ordered applied first, then pending, then failed; newest first within each status. Single shop only (set x-shop-id to a specific shop ID).

list_excluded_videos_gmv_max_excluded_videos_get

ChatGPT
List the individual videos (creatives) excluded from this shop's GMV Max delivery. Unlike creator exclusions, a video exclusion takes ONE creative off spend and leaves the creator's other videos live. Ordered applied first, then pending, then failed; newest first within each status. applied_status tells you whether TikTok has confirmed the exclusion (applied), it is waiting for the 4-hourly reconcile (pending), the video is not in any active campaign (no_creatives), or an actively delivering placement could not be excluded (failed). Single shop only.

list_get_endpoint_lists__list_id__get

ChatGPT
One saved creator list by id, with the creators in it. Use after the list-the-lists tool when the user names a specific list, e.g. 'who is in my Beauty Q4 list'.

list_lists_endpoint_lists_get

ChatGPT
The shop's saved creator lists (id, name, and member count) — the segments used to target outreach automations. Use for 'what lists do I have'. Call this to find a list_id before fetching its members.

list_managed_creators_campaigns_creators_get

ChatGPT
All creators currently linked to the shop's campaigns. Includes overview metrics (total creators, multi-campaign creators, overall Return-On-Campaign-Spend) plus a paginated per-creator list.

list_shops_shops_get

ChatGPT
Discover which shops this API key can access. Call this first when the user asks about 'their shops' or 'their accounts'. Returns shop_id, shop_name, region, and currency — the shop_id is what you pass to the shop parameter on every other tool.

lives_list_lives_list_post

ChatGPT
Paginated per-session view of creator LIVE-attributed GMV for one shop — one row per affiliate LIVE session with creator, timestamps, GMV, units, and engagement. Single-shop only. Defaults to the last 30 days ending today. Sort by `live_gmv (default), start_time, units_sold or views. Empty sessions` is a normal 200 response for shops without live-session data.

lives_metrics

ChatGPT
The five LIVE performance cards the portal shows above the session table — Live GMV, Live Units Sold, Live Count, Avg Engagement Rate and Avg Viewing Duration. Each card carries its `value, unit, the percent change against the immediately preceding window of equal length, and chart_data: one point per day of the window, zero-filled on days with no sessions so the series length always matches the range. **Differs from POST /lives/summary** — that returns flat window totals. This returns the same totals plus period-over-period change and a daily series, and accepts the portal's filters / search so the cards can be scoped to a creator or a GMV band. Engagement rate is a decimal (0.0-1.0), durations are seconds. Single-shop only; defaults to the last 30 days ending today. LIVE analytics is region-gated — shops outside the supported regions get a 403 REGION_NOT_SUPPORTED`. A shop with no sessions returns zeroed cards as a normal 200.

lives_session_products

ChatGPT
The per-product breakdown behind one or more LIVE sessions: for each product featured in the session, its LIVE GMV, units sold, orders, average order value, creator commission and refunds. This is the session x product grain — `POST /lives/list gives the session totals, this explains what inside the session earned them. Pass the key values from POST /lives/list rows in live_session_ids (up to 50 per request). Results are keyed back by session ID in request order. Sessions with no product rows — including any ID that belongs to a different shop, or a shop still on the legacy LIVE data path — return an empty products` list rather than an error. Single-shop only.

lives_summary_lives_summary_post

ChatGPT
Window totals for creator LIVE-attributed GMV for one shop, from `customers.live_sessions (the Affiliate Center LIVE value shops see on /insights/transaction-analysis → LIVE streams). **Differs from POST /metrics/summary field gmv** — that is ALL affiliate revenue (video + live + product card). This isolates the LIVE-stream slice only. The live_gmv field on /metrics/summary is the same number as a simple cross-shop scalar; this endpoint adds per-shop currency, session count, engagement and viewing duration. Single-shop only — set x-shop-id to a specific shop ID. Defaults to the last 30 days ending today. Empty totals (live_count` 0) are a normal 200 response — live-session coverage is data-presence driven.

media_library_meta_ads_media_library_get

ChatGPT
Creator videos the shop uploaded to its Meta ad library (scoped to the currently connected ad account): usage-right id, Meta asset id + standardized asset name, and the rev-share campaign each is assigned to. Single shop only.

meta_ad_accounts_meta_ads_ad_accounts_get

ChatGPT
Every ad account the connected Meta user can manage, read live from Meta rather than from stored state, each with its name, currency, account status and owning Business Manager. is_current (and the top-level current_ad_account_id) marks the one this shop's ads and /meta-ads/ad-performance figures are read from. The list is the source of truth for what an account switch could target; switching itself stays in the portal. Requires a live Meta grant — a shop needing reconnection answers 409 META_REAUTH_REQUIRED. Single shop only.

meta_ad_performance_meta_ads_ad_performance_get

ChatGPT
Marketing API performance for the shop's connected ad account over a preset window: account-level totals (impressions, clicks, reach, spend, CTR, CPM, conversions) plus a per-ad table carrying the same metrics alongside each ad's creative — thumbnail, headline, body copy, link, call-to-action, and the branded-content partner's Instagram account for Partnership ads. conversions is the sum of every entry in Meta's actions breakdown, because the insights edge exposes no single conversions field — read it as total attributed actions, not purchases. spend and the derived rates are in currency, the ad account's own currency, which need not match the shop's TikTok currency. This is paid Meta data straight from the Marketing API and is unrelated to the rev-share attribution figures at /meta-ads/campaigns/{campaign_id}/rollups, which come from Reacher's own ledger — do not add them together. Sub-fetches are best-effort: a failing insights edge yields zeros and an empty ad list rather than an error. Returns 400 when the shop has no ad account linked. Single shop only.

meta_pages_meta_ads_pages_get

ChatGPT
Every Facebook Page the connected Meta user administers, read live from Meta, each resolved to its linked Instagram Business account (ig_user_id / ig_username, with has_instagram as the quick flag). is_current marks the Page this shop is connected through. The Instagram link matters beyond display: Partnership ads and creator whitelisting both run through the Page's IG account, so a Page with has_instagram: false leaves the connection functionally incomplete even while /meta-ads/status reports connected: true. Single shop only.

meta_status_meta_ads_status_get

ChatGPT
Whether this shop's Meta integration is live, and what it is wired to: the Facebook Page, the Instagram Business account, the ad account and the Business Manager. This is the cheap call — it reads the stored authorization rather than fanning out to Meta, with a single best-effort Instagram profile fetch layered on top (its failure degrades the ig object, never the response). connected: false covers both never-connected and revoked/expired-and-not-yet-repaired; a shop in the latter state answers 409 META_REAUTH_REQUIRED on the endpoints that call Meta. Poll this before the network-bound reads. Single shop only.

meta_summary_meta_ads_summary_get

ChatGPT
Everything the portal's Meta dashboard header renders, in one call: the connected Instagram account (with follower / media counts and recent engagement), the Page, the ad account (with its currency and account status), the Business Manager, plus counts of recent own and tagged Instagram media. Where /meta-ads/status is a database read, this fans out across several Graph edges — so it is served stale-while-revalidate from the same Valkey cache the portal uses (fresh under 5 minutes, usable-but-refreshing under 30, rebuilt inline only when cold), and invalidated immediately by any connection change. Every sub-object is open-schema: new fields can appear without a breaking change, and a sub-fetch that fails comes back as an empty object rather than failing the call. Single shop only.

payout_history_meta_ads_payouts_history_get

ChatGPT
Logged Stripe transfers to creators for the shop's Meta Ads rev-share payouts, newest first (amount, method, Stripe transfer id, timestamp). Use for 'Meta payout history'. Single shop only.

payouts_meta_ads_payouts_get

ChatGPT
Per-creator Meta Ads rev-share payout balances for the shop, plus totals (total owed, ready to pay, paid in last 30 days) — all in cents in the ad account's currency. These are Meta rev-share Stripe payouts, distinct from Creator Community campaign payments. Use for 'who do I owe', 'Meta payout balances'. Single shop only.

personalization_creator_sent_messages

ChatGPT
The personalized outreach messages this shop sent to one creator (the creator record's audit trail), newest first — the exact copy, whether it was fully personalized or fell back. Rows are recorded when the send engine locks the copy for delivery, so sent_at marks the delivery attempt, not a provider receipt. creator_id is the TikTok creator id (as returned by GET /automations/{id}/creators or GET /automations/{id}/sent-messages). Returns an empty list when this creator has never been personalized in this shop. Requires a single shop.

personalization_fallback_stats

ChatGPT
How many of an automation's personalized outreach messages used the brand fallback (creator had too little signal to personalize) versus were fully personalized. A lifetime aggregate across every send run of the automation, plus the fallback_rate convenience ratio. Counts are recorded when the send engine locks the copy for delivery (immediately before the DM goes out), so a delivery that fails at the last step may still be counted. An automation with no personalized sends yet returns zeros; an automation not in this shop returns 404. Requires a single shop.

personalization_preview

ChatGPT
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.

personalization_product_blocks

ChatGPT
Resolve the two product-sourced personalization blocks for one of your products: [Product Description] (the product's own catalog text) and [Product Selling Points] (2–3 concrete selling points DERIVED from the product's real title/description/attributes — never invented). Use the returned strings verbatim in POST /personalization/preview and in the personalization block of POST /automations/dm, so preview and send share the same fixed copy. Both blocks degrade to empty strings (the block simply drops out of the message) ONLY when the product isn't in this shop's catalog or has too little grounded content; a failed lookup (transient database error) returns 500 instead, so empty strings are always a true statement about the product, never an outage artifact — safe to store. Requires a single shop.

personalization_retone

ChatGPT
Rewrite the shared message body in a new tone (engaging | bold | inspirational), preserving every [Block] token so the template stays intact. This is brand-level copy (one message for everyone) — there's no creator here. Degrades to the original body on any failure, so the caller never ends up with a broken template. Requires a single shop.

pnl_adjustments

ChatGPT
Credits, clawbacks and manual corrections TikTok posts against a statement rather than an order. They never appear on order rows, so a P&L built only from `/pnl/orders silently omits them — net_amount is the figure to carry across. Windowed on the date TikTok raised the adjustment. settled_date` is null until it reaches a payout.

pnl_costs_coverage

ChatGPT
The SKUs that sold and the products that shipped samples in this window with no cost on file, ordered by how many units each one represents — the worklist for making `POST /pnl/profit complete, biggest impact first. coverage_pct` is by units, not by SKU count, so one missing best-seller outranks fifty missing long-tail SKUs.

pnl_costs_delete

ChatGPT
Remove one stored cost by its `id. The units it covered become uncosted again and drop out of contribution_profit — they are not treated as free-of-charge silently, they are reported as uncosted. Scoped to this shop, so an id belonging to another shop returns 404. Requires read_write` scope and a single shop.

pnl_costs_list

ChatGPT
Every cost input stored for this shop: cost of goods per SKU and per-unit sample cost per product. Returns full history — a row per `effective_from — not just what is in force today, so a caller restating an old window can see which amount applied then. sku_id` is null on the product-level default.

pnl_costs_upsert

ChatGPT
Insert or update cost inputs in bulk — the endpoint a spreadsheet or CSV import writes through. Rows are keyed on (product_id, sku_id, cost_type, effective_from): re-sending a key overwrites its amount rather than stacking a second cost onto the same units, so replaying the same import is safe. Omit `sku_id to set a product-level default that applies to every SKU without one of its own. Requires read_write` scope and a single shop.

pnl_customer_payments

ChatGPT
What the CUSTOMER paid for each order x SKU, as opposed to what the seller earned: subtotal before and after discount, which party funded each discount, shipping, retail delivery fee and tax. Paired to order lines on (order, SKU) to get a paid date, since this sheet carries none of its own. TikTok does not guarantee that pairing is 1:1, so a payment row with no matching order line falls outside the window rather than being invented into it.

pnl_orders

ChatGPT
One row per order x SKU with its fee breakdown, filterable by order source, settled state, product or SKU — the same filters applied by hand to the Seller Center export. Unsettled lines are included by default and their amounts still move.

pnl_products

ChatGPT
The per-product side of the P&L that `POST /pnl/summary reports in aggregate: every active product in the shop with its SKU pricing (sale and original price in currency units, not cents), stock, the derived discount_pct, and the affiliate commission_rate / shop_ads_commission_rate from the shop's most recent Target Collaboration config. gmv_max is shop-level, not per product: whether GMV Max is currently running and the average ROAS actually achieved across its active campaigns. tiktok_fee_pct is the platform's flat fee assumption used by the calculator. These are the *inputs* to a margin calculation, not settled money — for what TikTok actually paid out, use POST /pnl/summary or POST /pnl/orders. Single-shop only. A shop with no catalogued products returns an empty products` list as a normal 200.

pnl_profit

ChatGPT
TikTok's bottom line carried down by the costs it cannot see. `net_earnings is taken from the daily series unchanged — the only source that includes GMV Max ad spend — and cost of goods and sample cost are subtracted from it. Set cadence to get the running series as well as the totals. Units with no cost on file are COUNTED, never assumed to be zero, so contribution_profit is an upper bound while units_uncosted or sample_units_uncosted is non-zero. Use POST /pnl/costs/coverage` to get the list of what is missing.

pnl_skus

ChatGPT
One row per SKU: units sold and the fee lines from the order-level export summed over the window, joined to your cost of goods, with a gross profit and margin. This is a GROSS / CONTRIBUTION view, not a net bottom line. The fees here are the ones TikTok books against the order itself — referral, affiliate commission, refunds, discounts and the like — and ad spend is NOT among them: TikTok does not attribute ad spend to a single SKU, so gross_profit is revenue less those per-SKU fees less COGS, and stops one step short of net earnings. For the true shop-level bottom line that includes ad spend, use POST /pnl/summary and POST /pnl/profit. If you request the net_earnings or total_expense columns they are the order-line totals and likewise exclude ad spend. gross_profit is an upper bound while units_uncosted is non-zero — uncosted units are counted, never assumed free. Windowed by order PAID date; single shop only.

pnl_summary

ChatGPT
Window totals as an ordered waterfall, summed from TikTok's own daily P&L series. Rows are bucketed by order PAID date in the shop's Seller Center timezone. Recent days keep moving as orders settle — check `data_status` for freshness.

pnl_timeseries

ChatGPT
The running P&L: the same waterfall bucketed by day, week, bi-weekly or month. Buckets are summed from TikTok's daily rows, so any cadence reconciles to Seller Center exactly.

product_creators_products__product_id__creators_post

ChatGPT
Creators affiliated with a specific product in your shop.

product_videos_products__product_id__videos_post

ChatGPT
Videos featuring a specific product from your shop.

products_catalog_products_catalog_post

ChatGPT
The shop's merchandising catalog with current stock — for syncing products into an external CRM or ordering system. Sourced from TikTok's product catalog (refreshed roughly every 6 hours), NOT the affiliate performance data in POST /products/list. Each product carries its product-level inventory (total_inventory, sku_count, out_of_stock_sku_count) and, by default, a nested skus[] array with per-SKU stock and variant attributes. Set include_skus=false for a lighter product-only payload. All money is reported as integer minor currency units (cents) in the product's currency. Prices and stock are passed through exactly as TikTok reports them: product-level total_inventory and per-SKU inventory can legitimately differ during a sync, so do not assume total_inventory equals the sum of SKU inventories. There is no warehouse-level stock breakdown — inventory exists only at the product and SKU grain. For incremental syncs, pass updated_since and key off each row's updated_at. Soft-deleted products are excluded.

products_list_products_list_post

ChatGPT
Products in YOUR shop with GMV, units sold, video count, sample count, and est. commission over a date range. Use for 'top products', 'best sellers', 'products by category', 'products with sample activity'. Defaults to last 7 days. Also returns Seller Center per-product metrics as sc_ fields: sc_total_gmv, sc_orders, sc_units_sold, sc_customers, sc_aov, sc_impressions, sc_clicks, sc_ctr, sc_conversion, sc_gmv_per_1k_impr, sc_add_to_cart, sc_affiliate_gmv, sc_seller_video_gmv, sc_seller_live_gmv, sc_product_card_gmv, sc_shop_tab_gmv, sc_refunds — all-channel per-product figures (grouped by product_id) from the Seller Center scrape. sc_ fields are null for products not yet on the Seller Center sync.

reacher_recommendations

ChatGPT
Reacher Recommends for one shop: the automation types the shop has not run in the current timeframe, returned as ready-to-action suggestions. Each entry carries the automation title, description, impact type (e.g. 'High Impact', 'Addon'), the navigate path to set it up, its button label, and shop_names — the shops the recommendation applies to. Covers the four automation plays Reacher scores: Target Collab, Message + Product Card, Spark Code, and Content Flywheel. An empty array means the shop is already running all of them. Single-shop only.

reactivate_creator_campaigns_campaign_id_creators_creat_5dd4f19b

ChatGPT
Reverses a reject: status goes back to active. No new notification is sent.

reject_creator_campaigns_campaign_id_creators_creator_id_reject

ChatGPT
Sets CampaignCreatorMapping.status='rejected'. Sends a rejection email + SMS to the creator (fire-and-forget) — SKIPPED on dry-run.

remove_creator_campaigns_creators__creator_id__remove_post

ChatGPT
Removes the creator from ONE campaign (terminal removed status). The campaign lives in the x-shop-id shop; pass its id in the body. Removed creators disappear from the creator's portal views. Paid/completed creators are blocked (409) — their payout ledger is preserved and never overwritten. Idempotent: removing an already-removed creator returns 200 with code='already_removed' (no error). Combined with the Idempotency-Key replay, repeated calls are always safe. X-Dry-Run: true validates + echoes the intended action without writing or sending the optional SMS.

reply_to_creator_image_creator_messages_conversations_c_e491c5ec

ChatGPT
Send an image (https URL, fetched server-side) to a creator IMMEDIATELY, skipping the draft step. Prefer create-draft + send-draft so the user approves first. Requires an existing conversation. Cannot be undone. Single shop only.

reply_to_creator_messages_conversations_creator_handle_reply

ChatGPT
Send a plain-text DM to a creator IMMEDIATELY, skipping the draft step. Prefer create-draft + send-draft so the user reviews the exact text first; use this only when the user has already dictated the message and asked for it to go out now. Requires an existing conversation. Cannot be undone. Single shop only.

reply_to_creator_product_creator_messages_conversations_624703b8

ChatGPT
Send a product card (a product_id from this shop's catalog) to a creator IMMEDIATELY, skipping the draft step. Prefer create-draft + send-draft so the user approves first. Requires an existing conversation. Cannot be undone. Single shop only.

request_more_content_campaigns_content_request_more_post

ChatGPT
Updates the creator's posts requirement and minimum GMV target on their CampaignCreatorMapping, then fires a notification (email + SMS) asking for additional posts — notifications SKIPPED on dry-run.

samples_by_product_endpoint_samples_by_product_post

ChatGPT
Sample performance aggregated by product: request count, approval rate, GMV driven from sampled product. Defaults to last 7 days.

samples_list_samples_list_post

ChatGPT
Sample-request records with status (pending/approved/shipped/rejected), filterable by status, creator, product, and date range.

samples_metrics_samples_metrics_get

ChatGPT
The four stat cards above the sample-request table: `pendingReview (how many requests await a decision, plus how many of those are expiring soon), approvedInAutoProcess (samples auto-approved by an automation), completionRate (share of approved samples that produced content), and approvalTarget (usage against the shop's approval quota). The change metrics compare against the immediately preceding period of equal length. dataFreshness reports how current the underlying sample data is — TikTok's sample feed lags, so surface it rather than presenting the counts as real-time. date_from/date_to` must be given together and bound request creation date. Single-shop only.

samples_pipeline_counts_samples_pipeline_counts_get

ChatGPT
How many sample requests sit at each stage of the fulfilment funnel: `toReview → readyToShip → shipped → pendingContent → completed, plus cancelled. Also returns the shop's completionRate, its approvalTarget usage, the archivedCount, and expiringCount (requests about to lapse if no decision is made). Counts honour the same filters as the portal table, so a filtered funnel and a filtered list agree. They EXCLUDE requests hidden because the creator is archived (archivedCount.total is how many those are, and archivedCounts is unset here); for stage counts that include them, and so match TikTok's Affiliate Center, use GET /funnel/v2/counts. The portal's advanced numeric creator filters (GMV / views / post-rate bands) are not exposed here — use POST /samples/list and aggregate if you need those. date_from/date_to` must be given together. Single-shop only.

samples_product_config_create

ChatGPT
Create the auto-approval rule for one product. Requires read_write scope and a single shop. productId must not already have a config in this shop — a duplicate returns 409 PRODUCT_CONFIG_EXISTS; use PUT /samples/product-config/{config_id} to change an existing rule. idealCreatorProfileIds that don't belong to this shop are dropped rather than linked.

samples_product_config_delete

ChatGPT
Remove one product's auto-approval rule. The product falls back to the shop-wide quota; nothing already approved is affected. Requires read_write scope and a single shop. config_id is re-checked against this shop before the delete — a foreign ID returns 404.

samples_product_config_list

ChatGPT
Per-product sample auto-approval rules for this shop: monthly sample limit, daily approval target, the minimum GMV / post-rate a requester must clear, the ideal-creator profiles they must match, and how many samples of that product have already gone out this month (usedThisMonth). Products with no row here follow the shop-wide quota only. Read-only; requires a single shop.

samples_product_config_update

ChatGPT
Partially update one product's auto-approval rule. Requires read_write scope and a single shop. Omitted fields keep their current value; an explicit null clears the setting. config_id is re-checked against this shop before the write — a config belonging to another shop returns 404, never a cross-shop update.

samples_product_usage_samples_product_usage_get

ChatGPT
How many samples each product has consumed in the current calendar month (`productId → usedThisMonth`). This is the counter the portal checks per-product sample limits against, so it answers 'which product is about to run out of its monthly allowance'. Products with no usage this month are omitted. Single-shop only.

samples_profile_create

ChatGPT
Create a reusable ideal-creator profile for this shop. Requires read_write scope and a single shop. Names are unique per shop — a duplicate returns 409 PROFILE_NAME_EXISTS. Link the new profile to products via idealCreatorProfileIds on a product config.

samples_profile_delete

ChatGPT
Delete a profile and unlink it from every product config that referenced it — those products keep their other criteria. Requires read_write scope and a single shop. profile_id is re-checked against this shop before the delete — a foreign ID returns 404.

samples_profile_update

ChatGPT
Replace a profile's name and criteria. Requires read_write scope and a single shop. profile_id is re-checked against this shop before the write — a profile belonging to another shop returns 404. Renaming onto an existing name returns 409 PROFILE_NAME_EXISTS. Product configs linked to this profile pick up the new criteria immediately.

samples_profiles_list

ChatGPT
Reusable creator-quality criteria (minimum post rate, GMV range, minimum views, minimum followers) that product configs point at when deciding whether to auto-approve a sample request. linkedProducts counts how many product configs reference each profile. Read-only; requires a single shop.

samples_quota_get

ChatGPT
The shop-wide monthly sample ceiling. monthlyLimit is null when the shop has never set one, which means unlimited — per-product limits still apply. Read-only; requires a single shop.

samples_quota_update

ChatGPT
Set the shop-wide monthly sample ceiling. Requires read_write scope and a single shop. monthlyLimit must be present: a number caps the shop, null removes the cap. The shop is taken from the authenticated key / x-shop-id, never from the body.

sc_shop_health_metrics

ChatGPT
TikTok's six Shop Performance Score metrics for ONE shop (negative reviews, non-buyer-fault returns, seller-fault cancellations, on-time dispatch, handling time, message dissatisfaction): status EXCELLENT/GOOD/POOR/CRITICAL or NIL (no data), value with unit, thresholds, and how many problem items TikTok reported. Read the rows at latest_snapshot_date for the current picture. Use for 'is my shop health ok', 'why is my score poor'. Requires a single shop.

sc_shop_health_problems

ChatGPT
The specific orders, returns or chats TikTok blames for one Shop Performance Score metric (metric_code: NRR, NBFR, SFCR, OTDR, AHT, IM_DSAT) on the latest snapshot, paged. Use after sc_shop_health_metrics shows POOR/CRITICAL to answer 'which orders caused it'. Requires a single shop.

sc_shop_performance_channels

ChatGPT
Where ONE shop's sales came from, per day or week: affiliate (creator) GMV, the shop's own videos and lives, product page, shop tab, with clicks, impressions and orders per channel. affiliate_gmv already contains its video/live parts, and shop_tab_gmv overlaps the four channels rather than adding to them — gmv = affiliate + seller_video + seller_live + product_card (+ other); never sum every column. Use for 'share of sales from creators', 'own video vs creator GMV'. Requires a single shop.

sc_shop_performance_products

ChatGPT
ONE shop's products ranked over a window, from TikTok's official daily product list: per product GMV, refunds, orders, units, impressions, clicks, add-to-cart, and GMV + orders by channel (creators/affiliate, own videos, own lives, product page; shop_tab_gmv overlaps, other_gmv is the remainder). sort by gmv, orders, product_clicks or add_cart_count; limit (per page, up to 100) and page; product_total is the count across all pages. Use for 'top products last month', 'which products do creators sell', 'products with clicks but no orders'. Requires a single shop.

sc_shop_performance_timeseries

ChatGPT
Daily or weekly sales for ONE shop from TikTok's official Seller Center data: GMV, orders, units sold, visitors, page views, conversion rate. Pass granularity='week' for Sunday-start weeks; each bucket reports days_observed vs days_expected and is_complete, so call out partial weeks instead of reading them as drops. Window: preset ('7d', '30d', '90d', '12m', 'all') or start_date/end_date. Use for 'how did my shop do last week', 'GMV trend', 'conversion rate this month'. Requires a single shop.

search_creators_ai_search_creators_post

ChatGPT
Natural-language creator search (PROFILE mode): describe the kind of creator and get ranked matches from the global TikTok creator universe — e.g. 'skincare creators with high engagement', 'US home-decor creators'. Omit query to browse the top creators in your shop's region. Returns handle, categories, follower_count, gmv, engagement, bio, and top videos. Filter with the typed params: min/max GMV, units sold, average views, engagement, post rate, followers; product categories, gender, ethnicity, age, language; creator_level (GMV tier L0–L7); community (topic/hashtag targeting, e.g. a 'fitness' or 'clean beauty' community); and video/AI attributes (content_style, production_quality, personality_tone, etc.). To discover the exact filter values available for a region call the ai-search-filters tool; for community/hashtag values call the hashtag-autocomplete tool first. NOTE on GMV: gmv is the creator's sparse GLOBAL profile GMV (often null); shop_gmv is the GMV the creator drove for YOUR shop (populated for your affiliate roster). Available in every region. Requires a single shop (not 'all'/comma-separated). For spoken-word matching use the transcript-search tool; for visual matching use the video-search tool; for 'more creators like these' use the lookalike-search tool.

search_lookalike_ai_search_lookalike_post

ChatGPT
LOOKALIKE search: find creators SIMILAR to a seed set. Seed with seed_creator_ids (TikTok handles or ids, up to 50), a seed_crm_group_id, a seed_list_id, or a text query describing the archetype. CRM group / list seeds resolve to creators scoped to YOUR shop. The seeds themselves are excluded from results. Use for 'more creators like @x and @y' or 'creators like the ones in my Q3 group'. Single shop only. NOT available in every region yet — call the capabilities tool first.

search_transcript_ai_search_transcript_post

ChatGPT
TRANSCRIPT search: find creators by what they SAY in their videos. Pass a phrase in query (e.g. 'talks about gut health', 'mentions our brand name') and it matches creator video transcripts. match_sources picks spoken audio and/or on-screen text (defaults to audio). Each result's matched videos carry a match_type and a transcript snippet. Single shop only. NOT available in every region yet — call the capabilities tool first; a region without transcript data returns a 400 explaining it's not enabled. This SEARCHES creators by transcript — it does NOT return a video's transcript text. To read the full transcript of a specific video you own, use the per-video creative-analysis tool instead.

search_video_ai_search_video_post

ChatGPT
VIDEO (visual) search: find creators whose video CONTENT matches a text description — e.g. 'unboxing in a bright kitchen', 'gym workout b-roll'. Pass query. (Reference-image search exists as a separate upload endpoint and isn't available through this tool.) Single shop only. NOT available in every region yet — call the capabilities tool first; a region without visual data returns a 400.

seller_center_buyers_ranking

ChatGPT
The shop's products (ranking_type=product) or videos (ranking_type=video) ranked by how many new customers they brought in, from customers.sc_buyers_ranking. Use it to find the product or piece of content that actually acquires buyers, as opposed to the one that generates the most GMV from buyers you already had. customer_contribution is the entity's share (0-1) of the shop's new customers over TikTok's trailing period_months window (12 by default). No date window: this is a snapshot ranking that TikTok recomputes and the collector overwrites wholesale. Collection of this ranking is currently paused upstream, so the response reflects the last snapshot collected for the shop. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.

seller_center_channels

ChatGPT
Per-channel performance for the window from the Seller Center shop-tab stats — one entry per channel (shop_tab, search, other) with GMV, impressions, units sold and customers. baseline is TikTok's previous-period value for the same metrics, summed across the window. industry_median is the typical seller in this shop's industry — a benchmark, not an additive quantity, so it is reported as the most recent day in the window that carried one (as_of) rather than summed or averaged. It is null when TikTok returned no benchmark for the window; the daily collection path does not always include one. Max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.

seller_center_products

ChatGPT
One row per product for the window, from the Seller Center product-performance rollup. funnel walks impression → click → add-to-cart → order, and channels splits the product's GMV across the seller's own video and live content, creator (affiliate) video and live, the product card, and the shop tab (with its own impression / visitor / conversion counts). Every total is a SUM over the window's daily rows and every rate is recomputed as SUM(numerator) / SUM(denominator) — never an average of the daily rate columns, which would weight a quiet day the same as a peak one. A rate is null, not 0, when its denominator is zero. Sort with sort_by (one of ['gmv', 'orders', 'items_sold', 'customers', 'impressions', 'clicks', 'add_to_cart', 'affiliate_gmv', 'shop_tab_gmv', 'refunds']) and sort_dir; page with page / page_size. Defaults to the last 30 days ending yesterday; max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.

seller_center_shop_overview

ChatGPT
Window totals for the whole shop from the Seller Center overview, split by the channel the sale came through: video (creator vs seller), live (creator vs seller), and product card (shop tab vs search), plus product impressions / clicks and the derived click-through rate. comparison carries the comparison-period totals TikTok attaches to each day, summed across the window, and gmv_change_pct derives the swing. TikTok chooses those periods (typically the immediately preceding equal-length window), so treat it as a directional benchmark rather than a window you control. Related: POST /shop-gmv/timeseries gives the same channel hierarchy day by day, and POST /shop-gmv/summary gives the window totals without the comparison, product-card counts or listing impressions added here. aov is window GMV / window orders; customers is the sum of daily unique-buyer counts, so a buyer who purchased on two days is counted twice. Max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.

send_creator_message_draft

ChatGPT
SEND a staged draft to the creator on TikTok — this is the confirm step and it cannot be undone. Only call it after the user has seen the draft and explicitly approved sending it; never call it speculatively or in a loop. Pass the draft_id from the create-draft tool; the message body is taken from the draft, not from this call. On success the draft is removed so it cannot be sent twice. If TikTok refuses (daily / weekly messaging cap, 429) the draft is kept for the inbox — report that back rather than retrying. Use dry_run=true to check the draft resolves without sending. Single shop only.

shared_dashboard_create

ChatGPT
Mint a password-protected, publicly-reachable dashboard link for the shop — the thing a brand sends an agency or an investor. The response carries the uuid and the share_url to hand out; the password is never echoed back, so store what you sent. One live link per shop: creating a second while one is active returns 409. Archive the old one first with DELETE, which mints a fresh uuid and password on the next create rather than resurrecting the old link. Optionally lock the link to a fixed reporting window (locked_start_date + locked_end_date, both or neither) and choose what it shows via report_config. Outreach-volume metrics — TC invites, DMs sent, creators reached, sample counts — cannot be put on a share link and are rejected. Requires read_write scope and an Idempotency-Key header. Single-shop only.

shared_dashboard_delete

ChatGPT
Archive one share link. The uuid stops resolving immediately, so anyone holding the URL loses access — this is the revoke button. Archiving frees the shop to create a new link, which gets a fresh uuid and a fresh password rather than reviving the archived one's settings. Use PATCH ... {status: inactive} instead if you only want to pause a link you intend to bring back. Returns 404 if the link does not exist or belongs to a shop this key does not cover. Requires read_write scope.

shared_dashboard_list

ChatGPT
Every share link the API key can see, one per shop that has one — uuid, the viewer share_url, status, any locked reporting window, and the report_config describing which cards the viewer sees. The password is never returned; it is stored only as a hash. A shop with no link is simply absent from the list rather than returned as null. Works with a multi-shop key. Read-only — no read_write scope needed.

shared_dashboard_update

ChatGPT
Reconfigure one share link in place — the uuid and share_url stay valid, so anyone already holding the link keeps working. Rotate the viewer password with password, take the link offline without archiving it with status: inactive, move or clear the locked reporting window, and change which cards the viewer sees with report_config. Omitted fields are left alone, so a password rotation never wipes the metric selection. Clearing the locked window needs clear_lock: true — omitted dates mean 'unchanged', not 'unlock'. Returns 404 if the link does not exist or belongs to a shop this key does not cover. Requires read_write scope.

shop_blacklist_add

ChatGPT
Blacklist one or more creators so outreach automations stop targeting them. Handles are normalized before storage (a leading @ and surrounding whitespace are stripped, the handle is lowercased), so @Creator and creator are the same entry. The call is additive and forgiving: handles already on the list are counted in duplicates_skipped, malformed handles (URLs, blanks) in invalid_skipped — neither fails the request, so a partially valid batch still applies. Check added_count for what actually changed. At most 500 handles per request. Requires a key with read_write scope and a single shop.

shop_blacklist_clear

ChatGPT
Remove every creator from this shop's blacklist in one call, making all of them eligible for outreach again. There is no undo — the rows are deleted, not archived, so read the list with GET /shops/blacklist first if you may need to restore it. Clearing an already-empty list is a no-op that returns removed_count: 0. Requires a key with read_write scope and a single shop.

shop_blacklist_list

ChatGPT
The creators this shop has blacklisted. Outreach automations skip them, so this is the shop's suppression list. Handles are returned normalized (lowercased, no leading @) — that is the form DELETE /shops/blacklist/{creator} expects. Each row also carries the stable id and when it was added. Single-shop only.

shop_blacklist_remove

ChatGPT
Un-blacklist a single creator by handle, making them eligible for outreach again. The handle is normalized the same way as on add, so @Creator and creator both resolve to the same entry. A handle that is not on this shop's list returns 404 — this route is not a silent no-op, so a typo surfaces instead of being mistaken for a successful removal. To empty the whole list use POST /shops/blacklist/clear. Requires a key with read_write scope and a single shop.

shop_connection_health_shops__shop_id__health_get

ChatGPT
Whether Reacher is still collecting for a shop, so a consumer can tell "this shop genuinely had no activity" from "we stopped collecting for it" — the two look identical on every other endpoint. is_collecting is the one-field answer; failure_reason explains a false (banned / account_dead / shop_punished / permission_denied / affiliate_access_missing / login_issue) and onboarding_status covers shops that never finished setup. region_supported is false for shops in a region Reacher does not operate in — those never collect at all. shop_id must be one of your own shops. Send x-shop-id: all to poll any of them without re-issuing the request per shop.

shop_gmv_summary_shop_gmv_summary_post

ChatGPT
Window totals for one shop from the TikTok Seller Center daily rollup — SUMmed across the window with the same channel hierarchy as the timeseries response. Same coverage caveats as the timeseries endpoint. `aov is recomputed as total GMV / total orders over the window (a window-correct value, not the average of daily AOVs). customers` is the SUM of daily unique-customer counts — buyers who purchased on multiple days are double-counted; a true window-distinct count is not derivable from this rollup.

shop_gmv_timeseries_shop_gmv_timeseries_post

ChatGPT
Daily GMV for one shop from the TikTok Seller Center daily rollup, including channel breakdown (video → affiliate/seller, live → affiliate/seller, product_card → shop_tab/search) and traffic (product impressions/clicks). Differs from POST /metrics/timeseries metric=gmv — that endpoint reports affiliate-attributed GMV only (Reacher's view of creator-driven sales). This endpoint reports the total shop GMV including ads / Smart+ and organic. Use this when the customer wants numbers matching their TikTok Seller Center dashboard. Single-shop only — set `x-shop-id to a specific shop ID. Defaults to last 30 days ending yesterday. Max range 90 days (TikTok backfill depth). The newest available day is yesterday; today's row is not returned. Empty series` is a normal 200 response — Seller Center coverage is still rolling out.

shop_health_latest_shop_health_latest_post

ChatGPT
The most recent Shop Performance Score snapshot for one shop — the current `sps_score (0-5), sps_tier, peer_percentile, and the per-sub-metric dimensions breakdown. Single-shop only. snapshot is null` when the shop has no SPS data yet (non-official-API shop, or the first daily pull hasn't run).

shop_health_timeseries_shop_health_timeseries_post

ChatGPT
Daily Shop Performance Score for one shop from TikTok's official `shop_performances/overview API — the same SPS shown in Seller Center. Each point carries sps_score (0-5), sps_tier, peer_percentile, and a dimensions breakdown of the sub-metrics (on-time dispatch, negative-review rate, etc.). Single-shop only — set x-shop-id to a specific shop ID. Defaults to the last 30 days ending yesterday. Max range 90 days. Only shops on the official-API sync path are covered; an empty series` is a normal 200 response (history builds from the first daily pull).

shop_targets

ChatGPT
The performance targets the shop is measured against — the goal values behind the dashboard's progress bars. Each target carries its granularity (weekly / monthly / quarterly), the period it applies from (created_at), and a targets object with the per-metric goals: target_collabs, creators_messaged, sample_requests, sample_approved, videos_posted, videos_converted, spark_codes. Omit granularity to get the latest target for each granularity the shop has set; pass one to get that granularity's history, newest first. An empty targets array means the shop has not set any. Read-only — targets are created and edited in the Reacher dashboard. Single-shop only.

si_add_favorite

ChatGPT
Favorite one competitor brand or one product so it surfaces in the shop's Social Intelligence watchlist. Idempotent: favoriting something already on the list is a no-op that still returns 200, so a client does not have to read the list first. The ID is not validated against the SI catalog — an unknown ID is stored and simply resolves to nothing on read. Favorites are per shop, so this is visible to everyone on the account. Requires read_write scope. Single-shop only.

si_community_creator_brands

ChatGPT
The creator's per-brand breakdown — every seller they have posted for, with videos, gmv, unitsSold, avgViews and latestVideoAt for each. The competitive-overlap view: who else is already working with this creator, and how well it is going. Pass days to window relative to the creator's most recent post, or search to filter by brand name. total is the full brand count, not just the current page.

si_community_creator_detail

ChatGPT
Ecosystem-wide profile for one creator by TikTok handle: name, avatar, TikTok URL, region, content categories, and windowed performance (GMV, average views, shop posts, engagement rate, followers). This is the community view — what the creator does across all brands, which is the only view that exists for creators you have never worked with. For their history with your shop, use the CRM endpoints.

si_community_creator_videos

ChatGPT
Videos this creator posted for TikTok Shop brands, newest or top-performing first. Each row is the standard video card — views, likes, comments, shares, engagement, GMV, product, thumbnail, TikTok URL — plus brandName, the brand the video was made for. Pass seller_id to restrict to one brand's videos, or days to window relative to the creator's most recent post. Capped at 500 rows (capped flags truncation).

si_creators_last_updated

ChatGPT
When the community creator dataset was last synced for your shop's region. Use it to decide whether a re-poll is worthwhile — the directory refreshes on a schedule, not continuously. lastUpdated is null when no sync has landed for the region yet.

si_export_product_creators

ChatGPT
Export every creator driving GMV for one product, unpaginated. Same filters as get_product_creators. Returns JSON rows by default; format='csv' for a file. Costs one of the shop's limited daily exports — prefer get_product_creators for browsing. Check truncated before treating the result as complete.

si_export_products

ChatGPT
Export the whole filtered SI product list in one call instead of paging through get_products. Returns JSON rows by default (pass format='csv' only if the user explicitly wants a file). Costs one of the shop's limited daily exports, shared with portal exports — use get_products for browsing and reserve this for when the full set is genuinely needed. Capped at 1000 rows for most customers; check truncated in the response before treating the result as complete.

si_export_seller_creators

ChatGPT
Export every creator working with one seller/brand, unpaginated. Same filters as get_seller_creators. Returns JSON rows by default; format='csv' for a file. Useful for 'who are all the creators working with brand X'. Costs one of the shop's limited daily exports — prefer get_seller_creators for browsing. Check truncated before treating the result as complete.

si_list_community_creators

ChatGPT
Every creator tracked in your region's TikTok Shop ecosystem — not just your affiliates. Each row carries the profile (handle, name, avatar, follower count, content categories) and windowed performance (GMV, average views, shop posts, engagement rate) over a 1-, 7- or 28-day window. isMyAffiliate marks creators already in your CRM; set hide_my_affiliates=true to return only new prospects. Results are capped at 1000 rows — capped: true with totalMatching above that means you should narrow with search / category before paging.

si_list_favorites

ChatGPT
The shop's Social Intelligence watchlist for one entity type, most recently added first. Returns bare IDs — feed a brand ID into the seller endpoints or a product ID into the product endpoints to resolve it. Favorites are per shop, not per user: everyone on the account sees the same watchlist. Read-only — no read_write scope needed. Single-shop only.

si_my_benchmarks

ChatGPT
Your shop's seven headline metrics — GMV, videos posted, video views, active creators, GMV per video, GMV per sample, average videos per creator — each with its current value, period-over-period percent_change, a daily shop_timeseries, and the matching ecosystem benchmark_avg / benchmark_p90 and benchmark_timeseries. percentile_all ranks you against every tracked shop; percentile_segment ranks you inside your own GMV segment (gmv_segment), which is the fairer comparison. Precomputed daily — computed_date is the snapshot the numbers come from.

si_my_funnel

ChatGPT
Your shop's outreach funnel — DMs sent, TC invites sent, samples requested, samples approved, videos posted, videos converted — with each stage's value, the Reacher-wide benchmark_avg, and the stage-to-stage conversion_rate against benchmark_conversion_rate. Stages converting below the benchmark are flagged status: action_required and carry a recommendation. biggest_dropoff_stage names the weakest link. Also returns content_unfulfilled — creators who took a sample and never posted.

si_remove_favorite

ChatGPT
Un-favorite one brand or product. Returns 404 when the ID is not on this shop's watchlist — including when it is on another shop's — so a caller can neither delete nor probe a watchlist it does not own. Requires read_write scope. Single-shop only.

si_segment_benchmarks

ChatGPT
The raw ecosystem benchmark distribution for one GMV segment, independent of your own shop — average and p90 for each headline metric plus a daily benchmark_timeseries. Pass any segment, not just your own: all (every shop), segment_1 ($0–5K), segment_2 ($5K–50K), segment_3 ($50K–100K), segment_4 ($100K+). Use this to size the gap to the tier above you; use /my-benchmarks for where you sit today.

si_video_transcript

ChatGPT
The spoken-audio transcript of a Social Intelligence (competitor) video — one of the videos surfaced by the seller / product / trending video endpoints. Pass a video_id from one of those lists. Returns available: false when no transcript is held yet (e.g. no_speech, still processing, or the video isn't in our SI corpus). For your OWN shop's videos use the video creative-analysis endpoint (/videos/{video_id}/analysis) instead — that one carries the transcript plus the full creative breakdown.

spark_codes_gmv_max_spark_codes_get

ChatGPT
Cached spark-code sync state for the shop: which codes are queued, in flight, succeeded, or failed against TikTok. Read-only — sync itself is JWT-only on the portal. Single shop only.

spark_codes_list

ChatGPT
Every spark code collected for the shop, newest first. This is not `/gmv-max/spark-codes`. That endpoint returns the queue of codes waiting to be pushed to TikTok, which is empty until /gmv-max/spark-codes/sync-all is run. This one returns the codes themselves, including the ones creators submit through the spark-code form an automation DMs them. source says where a code came from: form (submitted through the form, or entered by hand), scraped (found on the creator's video), or bulk_upload (a retainer CSV). form_uuid ties a row back to the form link the creator was sent. permission reflects the checkbox on the form and is not a usage-rights grant — usage rights are a separate flow with their own statuses, exposed under /usage-rights. Creator contact details captured by the same form (email, address, phone) are deliberately not returned here. Single shop only — set x-shop-id to one shop ID.

stop_automation_gmv_max_automations__automation_id__stop_post

ChatGPT
Mark an automation `status='stopped' (terminal — no resume). Already-stopped automations are returned unchanged (idempotent on the row itself, independent of the Idempotency-Key` header). Boost cancellation against TikTok is best-effort and runs in a background thread on the portal side; this endpoint does not wait for it. Single shop only.

summary_metrics_summary_post

ChatGPT
Single-number headline KPIs for a date range: total GMV, active creators (distinct — not summed daily counts), video views, samples approved, GMV per video, GMV per sample, creator LIVE GMV both ways (live_gmv from Affiliate Center, sc_affiliate_live_gmv as Seller Center reports it — order-date attributed, so the two do not match). Seller Center whole-shop cards: orders, units_sold, aov, ctr, conversion_rate (all-channel; aov/ctr/conversion_rate are ratios computed over the full window). Matches the dashboard's top cards exactly. Defaults to last 30 days. Max 365 days.

sync_all_spark_codes_gmv_max_spark_codes_sync_all_post

ChatGPT
Queue every spark code for the shop that isn't already `synced. Writes pending rows to gmv_max_spark_code_sync; the offline CRJ fires the TikTok /tt_video/authorize/ calls on its next run. Returns immediately with {queued, skipped, message}. Shops without an active TikTok Business connection return 422 TIKTOK_NOT_CONNECTED`. Single shop only.

sync_spark_codes_gmv_max_spark_codes_sync_post

ChatGPT
Synchronously authorise the listed spark codes against the shop's TikTok Business ad account. Each code fires one TikTok `/tt_video/authorize/ call: * On success → code's sync_status flips to synced. * On TikTok QPS / rate-limit → code is left pending so the offline CRJ retries it; the response counts this in queued. * On hard error → failed with the error string. Up to 100 codes per request. Shops without an active TikTok Business connection return 422 TIKTOK_NOT_CONNECTED`. Single shop only.

target_collab_direct_invite

ChatGPT
Send a single TikTok Shop Target Collab (TC) invitation to a creator by handle. This is a convenience surface — it internally creates a single-creator TC automation and immediately starts it. Queued semantics. The response returns immediately with status: "queued". Actual TC delivery happens asynchronously through Reacher's TC delivery worker (browser automation, the same path the portal uses). Typical end-to-end latency is a few seconds, sometimes longer under worker load. Poll GET /public/v1/automations/{automation_id} for delivery status and target_collabs.invitation_id once the worker submits. Not for bulk. For >10 invites at a time, use POST /public/v1/automations/target-collab directly with a multi-creator audience — that's more efficient than calling this endpoint in a loop, and exposes the full TC feature set (content type, sample policy, follow-up DMs). Required. read_write scope, Idempotency-Key header. Pass X-Dry-Run: true to validate without persisting or queueing.

target_collab_get_support_contact_default

ChatGPT
Read the shop-level default support_contact used as a fallback when a TC create request omits support_contact (CORE-5428). Returns configured: false (with null fields) when no default is set — in that state TC creates still require a per-request support_contact. Requires a single shop (x-shop-id).

target_collab_set_support_contact_default

ChatGPT
Configure the shop-level default support_contact once, so TC create requests can omit it (CORE-5428). A per-request support_contact still overrides this default for that request. email is required; phone is optional. The upsert is keyed on the shop, so re-sending the same body yields the same state. Requires read_write scope, a single shop (x-shop-id), and an Idempotency-Key header (for contract consistency with the other public-API write endpoints) — replay/conflict semantics match those writes.

targets_set

ChatGPT
Set or update the goal values the shop is measured against for one granularity — the numbers behind the dashboard's progress bars. Upsert semantics: if the shop already has targets for the given granularity, the most recent set is updated in place; otherwise a new set is created. Only the metrics you send are stored, so send the full set you want in effect rather than a partial diff. Available metrics: target_collabs, creators_messaged, sample_requests, sample_approved, videos_posted, videos_converted, spark_codes. At least one is required, and each must be a non-negative integer. Read the current targets back with GET /targets. Requires a key with read_write scope and a single shop.

targets_set_bulk

ChatGPT
Convenience fan-out of PUT /targets — set weekly, monthly and quarterly goals in one request instead of three. Each entry is upserted exactly as the single-granularity route does, and each granularity may appear only once. NOT atomic: entries are applied in order and an invalid one aborts the request, leaving earlier entries already written. Re-sending the whole payload after fixing the bad entry is safe — writes are upserts. Requires a key with read_write scope and a single shop.

templates_gmv_max_templates_get

ChatGPT
Hard-coded set of quick-start automation templates the portal exposes (e.g. 'Boost top performers', 'Wind down low-ROAS'). Useful as a starting point when scaffolding an automation via the Phase-2 writes API. Not shop-scoped — same set for every caller.

timeseries_metrics_timeseries_post

ChatGPT
Day-by-day (or weekly/monthly) timeseries for chart-able metrics: gmv, total_gmv, live_gmv, sc_affiliate_live_gmv, creators, videos_posted, video_views, sample_requests, samples_approved, gmv_per_video, gmv_per_sample, creators_reached, creators_messaged, tc_invites_sent, gmv_driving_videos, new_creators_posting, emails_sent. Seller Center whole-shop cards: orders, units_sold, aov, ctr, conversion_rate (all-channel — aov/ctr/conversion_rate are ratios computed over the full window, not averages of daily ratios). Two different creator-LIVE figures: live_gmv is Affiliate Center (transaction date), sc_affiliate_live_gmv is Seller Center's own By order source → Creator → Lives (order date). They do not match — pick sc_affiliate_live_gmv when the customer is reconciling against Seller Center. Granularity auto-picks day/week/month based on range; use for 'trend over time', 'growth', 'week-over-week'. Max 730 days.

update_automation_gmv_max_automations__automation_id__put

ChatGPT
Patch an existing automation. Only active, non-expired automations are editable — stopped, deleted, or past-end-date rows return 422 with `AUTOMATION_NOT_EDITABLE or AUTOMATION_EXPIRED. PATCH semantics — fields the caller does NOT include are left unchanged. Sending null for boost_start_date / boost_end_date clears the boost window (both dates must be sent together). X-Dry-Run: true echoes the patch without writing. Idempotent via the Idempotency-Key` header. Single shop only.

update_campaign_campaigns__campaign_id__patch

ChatGPT
Modify campaign fields. campaign_type and creator_source are immutable post-create — pass them and you'll get 400 IMMUTABLE_FIELD.

update_gmv_max_campaign

ChatGPT
Patch the mutable subset of a GMV Max campaign — daily budget, target ROAS, name, and pause/resume (`operation_status). Requires read_write scope. PATCH semantics — fields the caller omits are left unchanged; at least one field must be provided. The shop must be connected to TikTok Business / GMV Max (400 INVALID_REQUEST otherwise). Idempotent via the Idempotency-Key header. X-Dry-Run: true` echoes the mapped TikTok patch without calling TikTok. Single shop only.

usage_rights_request_cancel

ChatGPT
Cancel a pending usage-rights request (status requested, accepted, or pending_payment). No-op-safe: cancelling an already-terminal record returns 409. Requires read_write scope and an Idempotency-Key. Single shop only.

usage_rights_request_create

ChatGPT
Create a usage-rights request for one of the shop's videos and send the creator the outreach DM. The video must be the shop's own; the creator is canonicalised from the live video owner (a mismatched creatorId is rejected). If the DM can't be delivered the request is rolled back and 422 DM_NOT_DELIVERED is returned — so the call is all-or-nothing. Requires read_write scope and an Idempotency-Key. Single shop only.

usage_rights_request_get

ChatGPT
One usage-rights record by id, scoped to this shop. Returns 404 if the record doesn't exist or belongs to another shop. Single shop only.

usage_rights_videos_list

ChatGPT
The shop's videos with their usage-rights status (requested, accepted, active, declined, …), filterable by status, search, date, GMV/views, creators, products, and spoken-transcript keywords. Ordered and paginated. Single shop only (set x-shop-id).

video_intel_analysis

ChatGPT
Get ONE video's spoken TRANSCRIPT plus Reacher's AI creative analysis — this is the tool that returns a video's transcript text. Pass the video_id (get ids from the videos-list tool) and a single shop. Returns: transcript (verbatim spoken audio) with transcript_language/transcript_source, a hook_summary of how it opens, the structure_outline of its beats, on_screen_text (OCR), vision_tags, detected_products, and scored creative features (hook-in-first-3s, pace, product-demo, voiceover, content summary). Pass include_experimental=true for the full analyzer block (~80 fields incl. hook_text, target_audience, sentiment, content_style, call-to-action, social-proof). analyzed:false (HTTP 200) = your video, not analyzed yet; 404 = not your shop's video. To SEARCH creators by what they say, use the transcript-search tool instead.

video_intel_analysis_batch

ChatGPT
Batch version of the per-video transcript + creative-analysis tool: pass a list of video_ids and get each one's transcript, hook_summary, structure_outline, features, etc. Never 404s — ids that aren't your shop's come back in not_found. Use to pull transcripts/analysis for a whole set of videos in one call. Single shop only.

video_intel_bof

ChatGPT
Get one video's bottom-of-funnel (BOF) verdict: whether the video reads as conversion-focused, with bof_status, bof_confidence, is_bof, and the matched_signals/matched_keywords behind the call. For the transcript and full creative breakdown use the per-video analysis tool. Single shop + video_id.

videos_creative_videos_creative_post

ChatGPT
Top videos by GMV in a date range WITH the AI creative breakdown per video: hook, sell points, product niche, shot style, videography. Use for creative analysis — 'why do our top videos work', 'what hooks do our best videos use'. Unanalyzed videos keep metrics and flag missing fields in creative.missing_fields.

videos_leaderboard_videos_leaderboard_post

ChatGPT
Creator-level shoppable-video leaderboard for a campaign window. Aggregates attributed video GMV and units per creator over a posted-date range (optionally restricted to specific product_ids), each with a per-product breakdown, ranked by total video GMV (default). Use this instead of paginating /videos/list + joining by hand: one row per creator with total_video_gmv, total_units_sold, qualifying_video_count (DISTINCT videos), and a products[] breakdown. min_gmv is a per-video-row threshold consistent with /videos/list. Multi-shop requests (x-shop-id: all or comma-separated) aggregate creators across shops, but only when every shop shares one currency — GMV cannot be summed across currencies, so a mixed-currency shop set is rejected (400); scope x-shop-id to a single currency/region.

videos_list_videos_list_post

ChatGPT
All affiliate videos with lifetime GMV, views, engagement. Use for general video browsing. For top videos over a period, use /videos/performance.

videos_performance_videos_performance_post

ChatGPT
Top videos by GMV or views within a date range. Use for 'best videos last month', 'most-watched videos this week'.

videos_retention

ChatGPT
Your shop's videos with per-video completion rate (watch_finish_rate), exposure (impressions), views, CTR and engagement — the organic hook-quality signal. TikTok exposes a 2-second view rate only for GMV Max ad creatives (video_view_rate_2s on /campaigns/{id}/creative-metrics); for organic videos the retention metric is completion, so use watch_finish_rate as the quality bar (min_watch_finish_rate filters to it). Ordered strongest-hook first. Scope: videos in the shop's own Seller Center analytics (posted for the shop).

view_video_content_campaigns_content_view_post

ChatGPT
Full detail for a single video by id — metrics, the creator who posted it, and the products attributed to it. Use when the user drills into one video; the videos-list tool is the way to find its id first.

weekly_report_agency_view_weekly_report_agency_view_post

ChatGPT
One row per shop for the window — affiliate GMV, videos posted, video views, videos converted, video conversion rate, active creators, GMV per video and GMV per sample, each with its % change against the previous equal-length period. This is the portal's Agency View table. Covers every shop this API key can access, so it works with `x-shop-id: all, a comma-separated list, or a single shop ID — a key scoped to a subset of shops only ever sees that subset. Sortable by any of: affiliate_gmv, videos_posted, video_views, active_creators, gmv_per_video, gmv_per_sample, video_conversion_rate, shop_name; search filters on shop name; results are paginated (page / page_size, max 100) and total_pagination` is the number of shops you can see after filtering. The window defaults to the last 7 settled days.

weekly_report_recommendations_weekly_report_recommendations_post

ChatGPT
The recommended-actions block of the weekly report on its own — cheaper than the full report when that is all you need. Each action carries a `type (e.g. reactivate_creators, amplify_videos, prioritize_products), a headline title, a one-line description, and the items it refers to (creator, video or product, each with a display label, image and a formatted metric). Generation is rule-based over the same top-N data the report uses. Single-shop only — set x-shop-id to a specific shop ID. The window defaults to the last 7 settled days and is capped at 90 days. An empty actions` list is a normal 200 for a shop with no qualifying activity.

weekly_report_weekly_report_post

ChatGPT
The complete affiliate performance report for one shop over a date window — the same payload the Reacher portal renders and exports. Includes affiliate GMV, units sold, GMV per video and GMV per sample (each with the previous equal-length period and its % change); recruitment counters (creators reached, sample requests, samples approved, DM / TC / email reply rates); performance counters (videos posted, video views, creators posting, creators converting); the creator-level distribution (L0-L7); six top-product leaderboards (GMV, units, sample requests, approvals, conversions, growth); top creators; top videos; and the rule-based `recommendations. Single-shop only — set x-shop-id to a specific shop ID. The window defaults to the last 7 settled days and is capped at 90 days; end_date must be at least 1 day in the past. An end_date past the shop's newest settled day is clamped to it, which can make the window shorter than requested (the 7-day default included) — the response's start_date/end_date` always report the window actually used, and the period-over-period comparison follows that same length. Returns 404 when the shop has no activity in the settled part of the window, and when the requested window lies entirely past the settled day — that message names the newest day the shop is reportable through, so a caller can retry against a window that works.

whoami_whoami_get

ChatGPT
Confirms the connection works and reports exactly what it can do: the account, the shops in scope, and the granted scopes. shops is the shops this KEY can reach, which is not always what the account owns — a connector authorized for two shops reports two. Read scopes before attempting a write: a key without read_write gets a 403 from every write endpoint. Cheap and side-effect free, so it is the right first call to verify a connection rather than a real query that might fail for its own reasons.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

323

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily