---
title: "Publish a review reply on the App Store (or schedule it)"
method: POST
path: "/api/v1/review-replies/{id}/post"
tags: ["Write"]
---

# Publish a review reply on the App Store (or schedule it)

`POST /api/v1/review-replies/{id}/post`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/review-replies/{id}/post`
- Auth: HTTP bearer

PUBLIC ACTION: publishes the reply under the developer's name, now or after delay_minutes. An optional body replaces the reply text first. Apple keeps one response per review, so posting overwrites an existing one (shown as edited); a new reply takes up to 24h to go live (status pending_publish, then published). Needs an Admin-role App Store Connect key — 403 forbidden otherwise, or when App Store Connect isn't connected or the app isn't in the connected account. 503 unavailable when App Store Connect doesn't accept the reply. Requires an Indie or Agency plan and a write-scope API key.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `body` string
  - `delay_minutes` integer: 0/omitted = post now; otherwise schedule

## Response `200`

The review — pending_publish/published after an immediate post, scheduled with a delay

- object
  - `data` ReviewReply, required: An own iOS app's App Store review (synced from App Store Connect) with its reply workflow state.
    - `id` string, uuid: Sonar review id (use with /api/v1/review-replies/{id})
    - `app_id` string, uuid
    - `asc_review_id` string: Apple's App Store Connect review id
    - `rating` integer
    - `title` string, nullable
    - `body` string, nullable
    - `reviewer_nickname` string, nullable
    - `country` string, nullable: Storefront, ISO 3166-1 alpha-2
    - `territory` string: Apple territory code (alpha-3, e.g. USA)
    - `created_at` string, date-time
    - `language` string, nullable: Review language, ISO 639-1 (null until drafted)
    - `title_en` string, nullable: English translation; null for English reviews
    - `body_en` string, nullable: English translation; null for English reviews
    - `reply` object
      - `status` 'backlog' | 'pending' | 'draft' | 'held' | 'scheduled' | 'posting' | 'pending_publish' | 'published' | 'failed' | 'dismissed' | 'answered': backlog = existed before the responder was switched on; pending = waiting for the AI draft; held = auto mode didn't post it (see hold_reason); pending_publish = sent, Apple takes up to 24h; answered = a response Sonar didn't write exists
      - `body` string, nullable
      - `language` string, nullable
      - `body_en` string, nullable: English copy of a non-English reply
      - `source` 'ai' | 'user' | 'api' | 'null', nullable
      - `hold_reason` string, nullable: needs_human (may carry a note after a colon), quota or daily_cap
      - `scheduled_for` string, date-time, nullable
      - `posted_at` string, date-time, nullable
      - `posted_by` string, nullable
      - `error` string, nullable
    - `app_store_response` object, nullable: The live developer response App Store Connect reports, whoever wrote it
      - `body` string
      - `state` string, nullable: PENDING_PUBLISH or PUBLISHED
      - `updated_at` string, date-time, nullable

## Other responses

- `400`: validation_error — no reply text yet, or delay_minutes out of range
- `401`: Missing or invalid API key
- `403`: forbidden — App Store Connect not connected, app not in the connected account, or the key lacks the Admin role (reconnect with an Admin key)
- `404`: Resource not found or not tracked by your organization
- `409`: conflict — already being posted, or not in a postable state
- `429`: Rate limited — see `error.reason`: daily_limit (Indie 1,000, Agency 5,000, trial 150 requests/day, resets 00:00 UTC; see `reset_at`), anonymous_daily_limit / batch_too_large (keyless free tier), store_rate_limited or concurrency_limit (transient, honor `retry_after_seconds`)
- `500`: Unexpected server error
- `503`: unavailable — App Store Connect didn't accept the reply, retry

---

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