Webhook Logsv2

List webhook logs

GET/webhooks/{webhookId}/logs

List delivery logs for a specific webhook.

Path parameters

webhookIdRequiredstring

Unique identifier of the webhook subscription, prefixed with wh_ (e.g. wh_abc123def456). Returned when you create or list webhooks.

Headers

AuthorizationRequiredstring

Your API key, sent as a bearer token: Authorization: Bearer <api_key>. Editing this stays in sync with the API key box on the right.

Bearer

Query parameters

limitoptionalinteger

Maximum number of items to return in a single response. Must be between 1 and 200; defaults to 50. Use together with offset to page through large result sets.

offsetoptionalinteger

Number of items to skip before returning results. Combine with limit for page-based pagination (e.g. offset=50&limit=50 returns the second page). Defaults to 0.

sortoptionalstring

Sort order by attempted time

"asc""desc"
statusoptionalinteger

Filter by exact HTTP status code

min_statusoptionalinteger

Minimum HTTP status code

max_statusoptionalinteger

Maximum HTTP status code

Returns

logsoptionalWebhookLog[]

Array of WebhookLog

event_idoptionalstring
scopeoptionalstring
"api""integration""org"
attempted_timeoptionalinteger
response_received_atoptionalinteger | null
webhook_urloptionalstring
event_bodyoptionalWebhookEventPayload

Webhook event payload. Structure varies by event type. All message events include group information when applicable.

eventoptionalstring

Event type (e.g., message.received, message.sent, message.delivered, message.failed, message.read)

message_idoptionalstring

Unique message identifier

external_idoptionalstring

Recipient identifier (phone number, email, or group ID)

statusoptionalstring

Message status carried by the event. queued / pending = accepted, not yet handed off; sent = handed to Apple/the carrier; delivered = a delivery receipt was received; read = a read receipt was received (iMessage, when the recipient has read receipts on); failed = delivery failed (see error_code / error_message); received = an inbound message arrived.

"queued""pending""sent""delivered""failed""read""received"
protocoloptionalstring

Transport used to carry the message; never null. pending = accepted and dispatched, wire service not resolved yet (settles within seconds of send); imessage = delivered over iMessage (blue bubble); rcs = delivered over RCS; sms = fell back to SMS/MMS (green bubble); unknown = accepted by the carrier but the wire service could not be resolved before the tracking window closed (see error).

"pending""unknown""imessage""sms""rcs"
timestampoptionalinteger

Event timestamp in milliseconds

internal_idoptionalstring | null

Phone number that sent/received the message

textoptionalstring | null

Message text content

formatted_textoptionalstring

Markdown for a rich-text (bold/italic/underline/strikethrough) message. Omitted entirely when the message carries no styling, so its presence is how you detect rich text. Present in both directions: on an outbound send made with format: "markdown", and on an inbound iMessage whose sender styled their text — so styling a customer applied in Messages arrives here even though your integration never asked for it. Always a normalized re-serialization of the message's actual styling rather than an echo of the source string: bold is spelled **, italic *, underline ++, strikethrough ~~, and any character that would otherwise read as a delimiter is backslash-escaped. Re-sending this value verbatim with format: "markdown" reproduces the same styled message. Blooio iMessage only. This is the SAME field delivered on the message webhooks, so a message reads identically via REST or webhook.

attachmentsoptionalobject[]

Array of attachment objects

Array of object

urloptionalstring
nameoptionalstring | null
is_groupoptionalboolean

Whether this message is from/to a group chat. Always present.

group_idoptionalstring | null

Group ID (only present when is_group=true)

group_nameoptionalstring | null

Group display name (only present when is_group=true)

participantsoptionalobject[]

Array of group participants (only present when is_group=true). One entry per person: a participant appears once even if Blooio holds more than one identity for their number.

Array of object

contact_idoptionalstring
identifieroptionalstring
nameoptionalstring | null
chat_guidoptionalstring | null

The device's own identifier for the group conversation this message arrived in (only on message.received when is_group=true). Two group chats can hold the same members and are then indistinguishable by group_id and participants alone; chat_guid is what tells them apart. Matches the chat_guid on GET /groups/{groupId}.

chat_nameoptionalstring | null

The name the device reports for the conversation (only on message.received when is_group=true). May differ from group_name, or be present when group_name is null.

senderoptionalstring | null

Sender identifier (for inbound messages)

sent_atoptionalinteger | null

Timestamp when message was sent (for message.sent events)

delivered_atoptionalinteger | null

Timestamp when message was delivered (for message.delivered events)

read_atoptionalinteger | null

Timestamp when message was read (for message.read events)

error_codeoptionalstring | null

Error code (for message.failed events)

error_messageoptionalstring | null

Error description (for message.failed events)

response_statusoptionalinteger | null

HTTP status code received from the webhook endpoint

response_jsonoptionalobject | null

Response body from the webhook endpoint (if JSON)

metadataoptionalobject

Additional metadata about the webhook delivery

organization_idoptionalstring
event_nameoptionalstring
message_idoptionalstring
is_replayoptionalboolean
original_event_idoptionalstring
duration_msoptionalinteger
paginationoptionalobject
totaloptionalinteger

Total number of matching logs

limitoptionalinteger
offsetoptionalinteger
returnedoptionalinteger

Number of logs returned in this response

has_moreoptionalboolean

Whether there are more logs to fetch

Response codes

200List of webhook logs
401Authentication required or invalid
404Resource not found

Sends a live request with your values and shows the real response below. Your key is stored only in this browser.

Request
curl -X GET https://api.blooio.com/v2/api/webhooks/wh_abc123def456/logs?limit=50&offset=0&sort=desc&status=0&min_status=0&max_status=0 \
Response objectexample
{  "logs": [    {      "event_id": "evt_a1b2c3d4",      "scope": "api",      "attempted_time": 0,      "response_received_at": 0,      "webhook_url": "https://example.com",      "event_body": {        "event": "message.sent",        "message_id": "msg_a1b2c3d4",        "external_id": "obj_a1b2c3d4",        "status": "queued",        "protocol": "pending",        "timestamp": 0,        "internal_id": "obj_a1b2c3d4",        "text": "Hello from Blooio!",        "formatted_text": "string",        "attachments": [          {            "url": "https://example.com",            "name": "Jane Doe"          }        ],        "is_group": true,        "group_id": "grp_a1b2c3d4",        "group_name": "string",        "participants": [          {            "contact_id": "ct_a1b2c3d4",            "identifier": "+15551234567",            "name": "Jane Doe"          }        ],        "chat_guid": "iMessage;+;chat123456789",        "chat_name": "Sales Team",        "sender": "string",        "sent_at": 0,        "delivered_at": 0,        "read_at": 0,        "error_code": "string",        "error_message": "string"      },      "response_status": 0,      "response_json": {},      "metadata": {        "organization_id": "org_a1b2c3d4",        "event_name": "string",        "message_id": "msg_a1b2c3d4",        "is_replay": true,        "original_event_id": "obj_a1b2c3d4",        "duration_ms": 1200      }    }  ],  "pagination": {    "total": 3,    "limit": 50,    "offset": 1,    "returned": 0,    "has_more": true  }}