---
title: "Create a screenshot set"
method: POST
path: "/api/v1/screenshots/sets"
tags: ["Write"]
---

# Create a screenshot set

`POST /api/v1/screenshots/sets`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/screenshots/sets`
- Auth: HTTP bearer

Create a set from explicit layouts, a built-in template, or blank. Every set response carries a studio_url — humans can review/edit the same set in the dashboard. Requires the Indie plan and a write-scope API key.

## Request body

- object
  - `product_id` string, required
  - `store` 'ios' | 'android', required
  - `device_size` string, required: Device id from GET /screenshots/devices
  - `name` string
  - `template_id` string: Seed from a built-in template (mutually exclusive with screens)
  - `screens` object[]: 1-10 layout documents, in order

## Response `201`

The full set incl. screens[] with ids

- object
  - `data` object, required: Result payload — full field reference at https://trysonar.app/docs/api

## Other responses

- `400`: validation_error — field-level layout validation messages
- `401`: Missing or invalid API key
- `403`: Plan or scope insufficient (workspace endpoints need the Indie plan; writes also need a write-scope key)
- `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)
