---
title: "Set Signal Reaction"
method: PUT
path: "/{brand_id}/signals/{signal_id}/reaction"
tags: ["signals"]
---

# Set Signal Reaction

`PUT /{brand_id}/signals/{signal_id}/reaction`

## Request

- Base URL: `https://api.scrunchai.com/v1`
- URL: `https://api.scrunchai.com/v1/{brand_id}/signals/{signal_id}/reaction`
- Auth: HTTP bearer

Set (or replace) the calling user's reaction on a signal. Reactions are keyed on the signal's stable identity (`fingerprint`, `subject_kind`, `competitor_id`, `alert_type` and `scope_qualifier`), so a reaction survives the nightly re-detection of the same underlying issue.

The reaction is attributed to the caller's user: the signed-in user for a user token (JWT), or the key's creator for an API key. Tokens with no user receive 403.

## Path parameters

- `brand_id` integer, required
- `signal_id` integer, required

## Request body

- APISignalReactionUpsert: Request body for `setSignalReaction`.
  - `reaction` 'useful' | 'not_useful' | 'dismissed' | 'actioned', required: Reaction to set: `useful`, `not_useful`, `dismissed`, or `actioned`.
  - `reason` string, nullable: Optional free-text reason accompanying the reaction.

## Response `200`

Successful Response

- APISignalReaction: A user's reaction to a signal's stable identity.
  - `user_id` integer, required: ID of the user the reaction belongs to.
  - `insight_id` integer, required: Signal ID the reaction was last set on.
  - `fingerprint` string, required: Stable signal identity the reaction follows across re-detections.
  - `subject_kind` 'brand' | 'competitor', required: Subject of the signal the reaction is on: `brand` or `competitor`.
  - `competitor_id` integer, nullable: Competitor ID of the signal the reaction is on; null for `brand`.
  - `alert_type` 'level_change' | 'trend' | 'level', required: Detection kind of the signal the reaction is on.
  - `scope_qualifier` string, required: Scope variant of the signal the reaction is on.
  - `reaction` 'useful' | 'not_useful' | 'dismissed' | 'actioned', required: The reaction value.
  - `reason` string, nullable: Free-text reason, when provided.
  - `surface` 'in_app' | 'email' | 'slack' | 'api', required: Where the reaction was set: `in_app`, `email`, `slack`, or `api`.
  - `created_at` string, date-time, required: When the reaction was first set (UTC).
  - `updated_at` string, date-time, required: When the reaction was last changed (UTC).

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-08** `9b86067d188a`: 4 info
  - added the optional property `competitor_id` to the response with the `200` status
  - added the required property `alert_type` to the response with the `200` status
  - added the required property `scope_qualifier` to the response with the `200` status
  - added the required property `subject_kind` to the response with the `200` status

[Operation history](https://skmtc.dev/scrunchai/apis/scrunch-data-api/changes/:brand_id/signals/:signal_id/reaction/put.md)

---

[API](https://skmtc.dev/scrunchai/apis/scrunch-data-api.md) - [All operations](https://skmtc.dev/scrunchai/apis/scrunch-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/scrunchai/apis/scrunch-data-api/revisions/de4fc679600a?raw)
