Skip to content
Linq Copy agent prompt

Move a sticker already on a message

client.messages.updateStickerPlacement(stringreactionID, MessageUpdateStickerPlacementParams { messageId, placement } params, RequestOptionsoptions?): MessageUpdateStickerPlacementResponse { status, success, trace_id }
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
reactionID: string
formatuuid
params: MessageUpdateStickerPlacementParams { messageId, placement }
messageId: string

Path param: The message the sticker sits on

formatuuid
placement: Placement

Body param: 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?: number

Clockwise rotation in degrees.

formatdouble
minimum-180
maximum180
scale?: number

How large the sticker is drawn. Omit it for the default size — equivalent to 1 for an image, or 0.5 for an emoji.

Values outside 0.05–2.5 are clamped rather than rejected.

Scale is linear, so 2.5 is a little over six times the area.

formatdouble
minimum0.05
maximum2.5
x?: number

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

formatdouble
minimum-1
maximum1
y?: number

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

formatdouble
minimum-1
maximum1
ReturnsExpand Collapse
MessageUpdateStickerPlacementResponse { status, success, trace_id }
status?: string
success?: boolean
trace_id?: string

Move a sticker already on a message

import LinqAPIV3 from '@linqapp/sdk';

const client = new LinqAPIV3({
  apiKey: process.env['LINQ_API_V3_API_KEY'], // This is the default and can be omitted
});

const response = await client.messages.updateStickerPlacement(
  '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
  {
    messageId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
    placement: {
      x: 0.6,
      y: 0.5,
      scale: 0.75,
    },
  },
);

console.log(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
}