Skip to content
Linq Copy agent prompt

Move a sticker already on a message

messages.update_sticker_placement(strreaction_id, MessageUpdateStickerPlacementParams**kwargs) -> MessageUpdateStickerPlacementResponse
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.

ParametersExpand Collapse
message_id: str
formatuuid
reaction_id: str
formatuuid
placement: Placement

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[float]

Clockwise rotation in degrees.

formatdouble
minimum-180
maximum180
scale: Optional[float]

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.

formatdouble
minimum0.5
maximum1.5
x: Optional[float]

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

formatdouble
minimum-1
maximum1
y: Optional[float]

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

formatdouble
minimum-1
maximum1
ReturnsExpand Collapse
class MessageUpdateStickerPlacementResponse:
status: Optional[str]
success: Optional[bool]
trace_id: Optional[str]

Move a sticker already on a message

import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
response = client.messages.update_sticker_placement(
    reaction_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    message_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    placement={
        "x": 0.6,
        "y": 0.5,
        "scale": 0.75,
    },
)
print(response.trace_id)
{
  "status": "accepted",
  "success": true,
  "trace_id": "trace_id"
}
{
  "error": {
    "status": 400,
    "code": 1002,
    "message": "Phone number must be in E.164 format",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/1xxx/1002/"
  },
  "success": false
}
{
  "error": {
    "status": 401,
    "code": 2004,
    "message": "Unauthorized - missing or invalid authentication token",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2004/"
  },
  "success": false
}
{
  "error": {
    "status": 403,
    "code": 2005,
    "message": "Access denied - insufficient permissions for this resource",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2005/"
  },
  "success": false
}
{
  "error": {
    "status": 404,
    "code": 2001,
    "message": "Resource not found",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2001/"
  },
  "success": false
}
{
  "error": {
    "status": 500,
    "code": 3006,
    "message": "Internal server error",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/3xxx/3006/"
  },
  "success": false
}
Returns Examples
{
  "status": "accepted",
  "success": true,
  "trace_id": "trace_id"
}
{
  "error": {
    "status": 400,
    "code": 1002,
    "message": "Phone number must be in E.164 format",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/1xxx/1002/"
  },
  "success": false
}
{
  "error": {
    "status": 401,
    "code": 2004,
    "message": "Unauthorized - missing or invalid authentication token",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2004/"
  },
  "success": false
}
{
  "error": {
    "status": 403,
    "code": 2005,
    "message": "Access denied - insufficient permissions for this resource",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2005/"
  },
  "success": false
}
{
  "error": {
    "status": 404,
    "code": 2001,
    "message": "Resource not found",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/2xxx/2001/"
  },
  "success": false
}
{
  "error": {
    "status": 500,
    "code": 3006,
    "message": "Internal server error",
    "doc_url": "https://docs.linqapp.com/channel/imessage/error/codes/3xxx/3006/"
  },
  "success": false
}