Skip to main content

Conversation events

Webhooks fired by the Inbox. See Webhooks overview for setup, envelope format, signature verification, retries, and security.

EventWhen it firesVolume
message.createdA message is sent in one of your creator conversations — by the creator or by someone on your team.High

Use this to react to creator replies without polling. A common pattern is to treat the event as a nudge — you get the message body inline, so a receiver that only needs the text can act on the payload alone.

message.created​

{
"id": "wh_2f7a1c4e-9b3d-4f21-8a55-1c0d7e2b6f90",
"event": "message.created",
"version": "1",
"createdAt": "2026-08-12T09:20:01.412Z",
"brandId": "229",
"data": {
"conversationId": "7788",
"threadId": "b229-4521",
"messageId": "55501",
"actor": "creator",
"authorUserId": "4521",
"creatorId": "4521",
"text": "Sounds good — can we move the date to Aug 15?",
"hasAttachments": false,
"sentAt": "2026-08-12T09:20:00.000Z"
}
}
FieldTypeDescription
conversationIdstring | nullStable id for the conversation. null in the rare case the conversation record could not be resolved at send time.
threadIdstringThread identifier in b<brandId>-<creatorId> form. Stable for the lifetime of the conversation.
messageIdstringUnique id for this message. Two deliveries carrying the same messageId are the same message — see Delivery guarantees.
actorstringcreator if the creator wrote it, brand if someone on your team did.
authorUserIdstringUser id of the author.
creatorIdstringUser id of the creator side of the conversation, regardless of who wrote this message.
textstring | nullMessage body. null when the message carries only attachments. May contain basic HTML as authored in the composer.
hasAttachmentsbooleanWhether the message has one or more file attachments.
sentAtstring | nullISO 8601 timestamp of the message itself. Distinct from the envelope's createdAt, which is when the delivery was built.

What does not fire​

  • System messages. Booking confirmations, status changes, and other platform-generated entries in a thread do not produce a message.created event. Only messages written by a person do.
  • Creator-to-creator threads. Only conversations between your brand and a creator fire; there is no brand to scope the others to.
  • Message edits and deletions. v1 has no event for them.

Both directions fire​

Messages sent by your own team also produce an event, including ones your integration sent through Limelight itself. This is deliberate — it keeps the event stream a complete record of the conversation rather than a partial one — but it means a naive receiver can act on its own writes.

Filter on actor if you only want inbound traffic:

if (payload.event === 'message.created' && payload.data.actor === 'creator') {
// creator replied — hand off to your agent
}

Attachments​

hasAttachments tells you whether files are present; the payload carries no file names or download URLs. Deliveries are retained and viewable in Settings, and a download link sitting in that log would either expire and confuse, or not expire and become a standing read handle to your files. Fetch attachments by messageId when you need them.

Delivery guarantees​

The general retry rules apply, plus two things specific to this event:

  • Exactly one event per message. Deduplication is keyed on the message itself, so a retried internal write cannot produce a second event for the same messageId.
  • The body is read at delivery time, not at send time. For a delivery that was retried, text reflects the message as it stands when the attempt is made.

Use X-Limelight-Delivery-Id for transport-level dedup and data.messageId for message-level dedup. The second is the one that survives replays.

Ordering​

Deliveries are not ordered. Retries and concurrent sends mean a later message can arrive first. Order by sentAt if sequence matters, and treat messageId as the identity.

Manual resend​

The Lead Feed's Send to webhook action does not apply to conversation events — it resends events attached to a lead, and a message belongs to a conversation. Use the Test button in Settings → API to send a sample message.created to your endpoint.