## Move a sticker already on a message

**patch** `/v3/messages/{messageId}/reactions/{reactionId}`

Move, resize or rotate a sticker that has already been peeled onto a message.
The change is sent to every device in the conversation, exactly as dragging the
sticker by hand would.

Only stickers can be repositioned — a tapback has no placement, so a non-sticker
`reactionId` is rejected. Any field omitted from `placement` keeps its current value.

`reactionId` is the `id` from the reaction on the message, or from the
`reaction.added` webhook. Stickers stack, so this id is what distinguishes one
sticker from another on the same message.

Stickers peeled before this endpoint existed cannot be moved: addressing one
requires an identifier that was not recorded at the time, and it returns 404.

### Path Parameters

- `messageId: string`

- `reactionId: string`

### Body Parameters

- `placement: object { rotation, scale, x, y }`

  Optional position, size and rotation of a sticker on the target
  bubble. Only valid when type is "sticker".

  Every field is independent and optional — omit the object entirely,
  or any field within it, to keep the default (centred, default size,
  unrotated).

  - `rotation: optional number`

    Clockwise rotation in degrees.

  - `scale: optional number`

    Size relative to the default, where 1 matches the size a
    sticker gets natively.

    Values outside 0.5–1.5 are clamped rather than rejected. The
    upper bound keeps a sticker within the size range iMessage
    itself displays: its own limit is larger, but that allowance
    assumes the transparent padding Apple's stickers carry, which
    a full-bleed image does not have.

    Scale is linear, so 1.5 is a little over twice the area.

  - `x: optional number`

    Horizontal position on the target bubble, from -1 (far left) to
    1 (far right). 0 is centred.

  - `y: optional number`

    Vertical position on the target bubble, from -1 (top) to
    1 (bottom). 0 is centred.

### Returns

- `status: optional string`

- `success: optional boolean`

- `trace_id: optional string`

### Example

```http
curl https://api.linqapp.com/api/partner/v3/messages/$MESSAGE_ID/reactions/$REACTION_ID \
    -X PATCH \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $LINQ_API_V3_API_KEY" \
    -d '{
          "placement": {
            "scale": 0.75,
            "x": 0.6,
            "y": 0.5
          }
        }'
```

#### Response

```json
{
  "status": "accepted",
  "success": true,
  "trace_id": "trace_id"
}
```
