curl -X DELETE https://api.ibubbl.com/v1/conversations/3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d/typing \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const conversationId = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d";
const res = await fetch(`https://api.ibubbl.com/v1/conversations/${conversationId}/typing`, {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
console.log(data.status);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
conversation_id = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d"
res = requests.delete(
f"https://api.ibubbl.com/v1/conversations/{conversation_id}/typing",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["status"])
{
"conversation_id": "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d",
"typing": false,
"status": "stopped",
"ignored_reason": null,
"expires_at": null
}
{
"detail": {
"error": "not_found",
"message": "Conversation not found"
}
}
Stop typing
Stop showing the typing bubble. You don’t need this before sending: a sent message clears it on its own. Some phones keep showing the bubble for up to a minute after a stop that isn’t followed by a message.
Typing shows only in a 1:1 iMessage conversation the contact has already messaged. Anywhere else the call answers 200 with status: "ignored" and an ignored_reason, and does nothing.
Idempotent: stopping when nothing is typing answers 200 stopped.
Counts toward the conversation-actions rate limit (300 a minute per account).
curl -X DELETE https://api.ibubbl.com/v1/conversations/3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d/typing \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const conversationId = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d";
const res = await fetch(`https://api.ibubbl.com/v1/conversations/${conversationId}/typing`, {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
console.log(data.status);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
conversation_id = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d"
res = requests.delete(
f"https://api.ibubbl.com/v1/conversations/{conversation_id}/typing",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["status"])
{
"conversation_id": "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d",
"typing": false,
"status": "stopped",
"ignored_reason": null,
"expires_at": null
}
{
"detail": {
"error": "not_found",
"message": "Conversation not found"
}
}
Stop typing
Method:DELETE | Endpoint: /v1/conversations/{conversation_id}/typing
Description: Stop the typing bubble you started with Start typing, when you decide not to reply. You don’t need it before sending: a message you send clears the dots on its own.
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 start typing. Over that, 429 rate_limited with a Retry-After header; see Rate limits.
Request Body
None. The path parameterconversation_id is the conversation’s ID (a UUID).
How it behaves
- iBubbl stops at once; some phones take longer. The dots may stay on the contact’s iPhone for up to about a minute after a stop that isn’t followed by a message. Sending a message always clears them straight away.
- It’s safe to call twice, or when nothing is typing: the answer is
200withstatus: "stopped". - Never refused for a block or an opt-out. In a group, an SMS or RCS conversation, or one the contact hasn’t messaged yet, it answers
ignoredwith the sameignored_reasonas Start typing.
curl -X DELETE https://api.ibubbl.com/v1/conversations/3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d/typing \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const conversationId = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d";
const res = await fetch(`https://api.ibubbl.com/v1/conversations/${conversationId}/typing`, {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
console.log(data.status);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
conversation_id = "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d"
res = requests.delete(
f"https://api.ibubbl.com/v1/conversations/{conversation_id}/typing",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["status"])
{
"conversation_id": "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d",
"typing": false,
"status": "stopped",
"ignored_reason": null,
"expires_at": null
}
{
"detail": {
"error": "not_found",
"message": "Conversation not found"
}
}
Responses
200 OK The same fields as Start typing, withtyping: false and status stopped (or ignored).
{
"conversation_id": "3a4b5c6d-7e8f-9a0b-1c2d-3e4f5a6b7c8d",
"typing": false,
"status": "stopped",
"ignored_reason": null,
"expires_at": null
}
{
"detail": {
"error": "unauthorized",
"message": "Invalid or revoked API key"
}
}
message values: Authorization Bearer token required, API key required (use Authorization: Bearer ib_pk_…), Invalid API key format, Customer account not found.
403 Forbidden
{
"detail": {
"error": "forbidden",
"message": "Account is suspended"
}
}
message is then Account is cancelled). Every API-key endpoint returns this.
404 Not Found
{
"detail": {
"error": "not_found",
"message": "Conversation not found"
}
}
{
"detail": {
"error": "rate_limited",
"message": "Too many conversation actions; wait 12s (limit 300 a minute per account)."
}
}
Retry-After header’s seconds, then call again.Authorizations
Bearer API key. Format: Authorization: Bearer ib_pk_<64 hex> (70 characters). Generate keys from Dashboard → Settings → API Access.
Path Parameters
Response
Typing stopped (or ignored).
The conversation.
Whether the typing bubble is on after this call.
started (or kept going), stopped, or ignored: typing can't be shown here and nothing was done; see ignored_reason.
started, stopped, ignored group (not available in group conversations), not_imessage (the contact is on SMS or RCS), no_chat (the contact hasn't messaged this line yet). Null otherwise.
group, not_imessage, no_chat When the bubble stops unless you call again (UTC), 10 seconds after the call. Null unless started.

