---
title: "Set the shop's performance targets for several granularities"
method: POST
path: "/targets/bulk"
tags: ["Targets & Blacklist"]
---

# Set the shop's performance targets for several granularities

`POST /targets/bulk`

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.

## Request body

- TargetsBulkWriteRequest — Several granularities' goals in one call.
  - `targets` TargetsWriteRequest[], required — Up to 10 target sets, one per granularity. Repeating a granularity is rejected.
    - `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

- TargetsBulkWriteResponse — Per-granularity results of a bulk target write.
  - `results` TargetsWriteResponse[], required — One entry per submitted target set, in request order.
    - `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/5eefff009b5b/schema)
