Skip to main content
DELETE

Remove a tapback

Method: DELETE | Endpoint: /v1/messages/{message_id}/reactions/{reaction_id} Description: Take back a tapback you added. It disappears from the message on the contact’s phone, and message.reaction.removed fires when it does. Authentication: API key in the Authorization header: Authorization: Bearer ib_pk_<64 hex>. Create keys in the dashboard under Settings → API access. Rate limit: 300 conversation actions per 60 seconds per account, shared with tapbacks, mark read and typing. Over that, 429 rate_limited with a Retry-After header; see Rate limits.

Request Body

None. The path parameters are the message’s message_id and the reaction’s id (reaction_id), both UUIDs.

How it behaves

  • Only your own tapback, on that message. A contact’s reaction, or a reaction on another message, answers 404 not_found.
  • The answer comes first. It returns 200 with status: "removed" at once. message.reaction.removed fires when the phone confirms. If your line can’t remove it, message.reaction.failed fires with action: "remove" and failed_reason: "retract_rejected", and the tapback may still show on the phone.
  • A tapback still pending won’t be sent once you remove it.
  • It’s safe to call twice. Removing a tapback that’s already removed, replaced or failed answers 200 with it unchanged.
  • Opt-outs don’t stop it. You can remove a tapback after the contact opted out.

Responses

200 OK The reaction, now removed (the same object as Add a tapback returns). A tapback that had already failed keeps status: "failed".
401 Unauthorized
Other message values: Authorization Bearer token required, API key required (use Authorization: Bearer ib_pk_…), Invalid API key format, Customer account not found. 403 Forbidden
Your iBubbl account is suspended or cancelled (message is then Account is cancelled). Every API-key endpoint returns this. 404 Not Found
Also returned for a malformed ID, a contact’s reaction, a reaction on a different message than the one in the path, and one that belongs to another account. 422 Unprocessable Entity
target_unsent or target_partly_unsent: the contact unsent the message (or part of it) after you reacted, so the tapback can’t be changed any more. 429 Too Many Requests
Wait the Retry-After header’s seconds, then send the same request again.

Authorizations

Authorization
string
header
required

Bearer API key. Format: Authorization: Bearer ib_pk_<64 hex> (70 characters). Generate keys from Dashboard → Settings → API Access.

Path Parameters

message_id
string
required
reaction_id
string
required

Response

The reaction, now removed.

id
string
required

Reaction ID. The reaction_id in message.reaction.* events.

message_id
string
required

The message the tapback is on.

conversation_id
string | null
required

The conversation that message is in.

type
string
required

love, like, dislike, laugh, emphasize or question.

emoji
string
required

The tapback as an emoji, e.g. ❤️.

direction
enum<string>
required

Always outbound: a tapback you sent.

Available options:
outbound
Allowed value: "outbound"
status
enum<string>
required

pending: accepted, not yet on the contact's phone. sent: delivered to Messages (message.reaction.added fires then). failed: never sent, see failed_reason (message.reaction.failed fires). removed: you removed it, or a newer tapback of yours on the same message replaced it.

Available options:
pending,
sent,
failed,
removed
failed_reason
string | null
required

Why a failed tapback wasn't sent: sms_target, target_not_found, bb_rejected, messages_error, expired, retract_rejected or target_unsent. Null otherwise.

created_at
string | null
required

When you sent the tapback (UTC).

removed_at
string | null
required

When it was removed or replaced (UTC); null while active.