---
title: "Switch the review responder on/off or change its settings"
method: PATCH
path: "/api/v1/apps/{id}/review-responder"
tags: ["Write"]
---

# Switch the review responder on/off or change its settings

`PATCH /api/v1/apps/{id}/review-responder`

## Request

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

Partial update — omitted fields keep their value; unknown fields → 400 validation_error. An empty body on an app with no settings switches it on. The first switch-on starts the backfill (the latest 200 reviews, stored as backlog: no drafts, no alerts, no auto replies). Switching to auto mode only affects reviews written afterwards; switching back to manual returns unsent auto replies to the inbox as drafts. Requires the Indie plan and a write-scope API key.

## Path parameters

- `id` string, required

## Request body

- object
  - `enabled` boolean
  - `mode` 'manual' | 'auto'
  - `auto_delay_minutes` integer
  - `auto_min_rating` integer
  - `auto_max_rating` integer
  - `auto_daily_cap` integer
  - `instructions` string
  - `sign_off` string, nullable
  - `reply_language` 'review' | 'en'

## Response `200`

{ app_id, settings }

- object
  - `data` object, required
    - `app_id` string, uuid
    - `settings` ReviewResponderSettings: Review responder settings for one own iOS app. Auto mode posts AI replies after auto_delay_minutes, only for reviews written at/after auto_since and rated within auto_min_rating..auto_max_rating, up to auto_daily_cap per day; replies the AI flags as needing a human are held.
      - `enabled` boolean
      - `mode` 'manual' | 'auto'
      - `auto_delay_minutes` integer
      - `auto_min_rating` integer
      - `auto_max_rating` integer
      - `auto_daily_cap` integer
      - `auto_since` string, date-time, nullable: When auto mode was switched on; null in manual mode
      - `instructions` string
      - `sign_off` string, nullable
      - `reply_language` 'review' | 'en': review = the reviewer's language, en = always English
      - `last_synced_at` string, date-time, nullable
      - `last_error` string, nullable: Latest sync or posting problem, e.g. the App Store Connect key lacks a role

## Other responses

- `400`: bad_request (not an own iOS app) or validation_error
- `401`: Missing or invalid API key
- `403`: Plan or scope insufficient (workspace endpoints need the Indie plan; writes also need a write-scope key)
- `404`: Resource not found or not tracked by your organization
- `429`: Rate limited — see `error.reason`: daily_limit (Indie plan: 1,000 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

---

[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/73fe8bc46522?raw)
