---
title: "Set the shop's performance targets"
method: PUT
path: "/targets"
tags: ["Targets & Blacklist"]
---

# Set the shop's performance targets

`PUT /targets`

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.

## Request body

- TargetsWriteRequest — One granularity's performance goals.
  - `granularity` 'weekly' | 'monthly' | 'quarterly', required — Supported target granularity options
  - `targets` TargetMetricsInput, required — Nested model for target metrics in request payloads
    - `target_collabs` integer, nullable — Target number of collaborations
    - `creators_messaged` integer, nullable — Target number of creators messaged
    - `sample_requests` integer, nullable — Target number of sample requests
    - `videos_converted` integer, nullable — Target number of video conversions
    - `spark_codes` integer, nullable — Target number of spark codes
    - `sample_approved` integer, nullable — Target number of samples approved
    - `videos_posted` integer, nullable — Target number of videos posted
  - `effective_from` string, date-time, nullable — When the goals start applying. Defaults to now. Cannot be more than a year in the future.

## Response `200`

Successful Response

- TargetsWriteResponse — Result of a single-granularity target write.
  - `created` boolean, required — True when no target existed for this granularity and a new one was created; false when an existing one was updated.
  - `target` TargetResponse, required — Response model for a single target
    - `id` string, required — Target UUID
    - `customer_id` integer, required — Customer ID
    - `shop_id` integer, required — Shop ID
    - `granularity` string, required — Target time period granularity
    - `targets` TargetMetricsResponse, required — Nested model for target metrics in response payloads
      - `target_collabs` integer, nullable — Target number of collaborations
      - `creators_messaged` integer, nullable — Target number of creators messaged
      - `sample_requests` integer, nullable — Target number of sample requests
      - `videos_converted` integer, nullable — Target number of video conversions
      - `spark_codes` integer, nullable — Target number of spark codes
      - `sample_approved` integer, nullable — Target number of samples approved
      - `videos_posted` integer, nullable — Target number of videos posted
    - `created_at` string, date-time, required — When this target becomes applicable
    - `updated_at` string, date-time, required — Last update timestamp

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) · [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/reacherapp/reacher-data-api/revisions/d4fe3e380424/schema)
