Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.reply.io/llms.txt

Use this file to discover all available pages before exploring further.

When a subscription fires, Reply POSTs a JSON body to your configured url. This page lists the shape for every event type. It’s a reference you can read without signing up — the samples mirror what a live delivery looks like.

Envelope

Every delivery carries a common event envelope at the top level:
{
  "event": {
    "date": "2026-04-21T09:30:00.000Z",
    "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1",
    "type": "email_replied",
    "user_id": 1234,
    "team_id": 100,
    "subscription_id": 42
  },
  // event-specific fields follow, flat at the top level
}
FieldTypeNotes
event.dateISO-8601 UTCWhen the event occurred in Reply.
event.idUUIDUnique id for this delivery. Use for idempotency if you persist events.
event.typestringEvent name — matches the eventType on the subscription (see below).
event.user_idintReply user id that owns the subscription.
event.team_idintTeam id the event belongs to.
event.subscription_idintSubscription id that fired.

Shared conventions

  • Keys are snake_case. event_type, sequence_fields, reply_message_url.
  • Enum values are PascalCase strings. "Personal", "EmailDetected", "Hard".
  • Timestamps are ISO-8601 UTC with millisecond precision.
  • Contact reference — events tied to a prospect include a nested contact_fields object. Use contact_fields.id as the stable reference. Subscriptions created with includeProspectCustomFields: true also get contact_custom_fields alongside it.
  • Sequence reference — events tied to a sequence include a sequence_fields object. If SequenceId is 0 (manual action outside a sequence), the object is empty or omitted.
  • Email body toggles — events covering an email respect the subscription’s includeEmailUrl / includeEmailText flags. When false, the corresponding field is absent.

Reusable blocks

These appear in several events. Shown once here, referenced by name below.

contact_fields

{
  "id": 12345,
  "email": "prospect@example.com",
  "first_name": "Test",
  "last_name": "Prospect",
  "full_name": "Test Prospect",
  "title": "Test Title",
  "company": "Test Company",
  "linkedin_profile_url": "https://linkedin.com/in/test",
  "city": "Test City",
  "state": "Test State",
  "country": "Test Country",
  "time_zone_id": "America/Los_Angeles",
  "phone": "+1234567890",
  "domain": "example.com",
  "company_size": "51-200 employees",
  "industry": "Software",
  "linkedin_sales_navigator": "https://www.linkedin.com/sales/people/test",
  "linkedin_recruiter": "https://www.linkedin.com/recruiter/people/test"
}

contact_custom_fields

Only present when the subscription was created with payloadConfig.includeProspectCustomFields: true. Keys are the custom field titles configured on the contact.
{
  "Custom Field 1": "Custom Value 1"
}

sequence_fields

{
  "id": 200,
  "name": "Test Sequence",
  "step_number": 1
}

Event reference

email_replied

When: a prospect replies to a sequence email (auto-detected by Reply), or a Reply user manually marks the prospect as replied. The two paths emit the same event with a different reason and a different set of populated fields — see the field notes below.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_replied", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "sent_email_id": 999,
  "reply_date": "2026-04-21T09:30:00.000Z",
  "reply_message_id": "test-reply-msg-id",
  "reason": "EmailDetected",
  "email_from": "account@example.com",
  "reply_message_url": "https://example.com/test-email-blob",
  "email_text": "<html>…</html>",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "step_number": 1 }
}
  • reason"EmailDetected" when Reply detected the inbound message, "StatusSetManually" when a user flipped the status manually.
  • email_account_id — may be null on the manual-reply path when no email account is associated.
  • reply_message_id — non-null only on the auto-detect path; null when reason is "StatusSetManually".
  • email_from — present only on the auto-detect path and only when email_account_id is known. Absent on manual replies.
  • reply_message_url — present when the subscription has includeEmailUrl: true (auto-detect path only).
  • email_text — present when the subscription has includeEmailText: true (auto-detect path only).
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.

reply_categorized

When: an email reply is categorized — either automatically by Reply’s AI categorizer, or manually by a user setting a category in the Consolidated Inbox or legacy Inbox.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "reply_categorized", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "sent_email_id": 999,
  "reply_date": "2026-04-21T09:30:00.000Z",
  "reply_message_id": "test-reply-msg-id",
  "reply_inbox_category_name": "Interested",
  "reply_message_url": "https://example.com/test-email-blob",
  "email_text": "<html>…</html>",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • reply_inbox_category_name — human-readable category name. Built-in values: "No categories", "Interested", "Not interested", "Do not contact", "Not now", "Forwarded", "Meeting intent". Teams may also configure custom category labels — treat the field as a free-form string when matching.
  • reply_message_id — may be null on legacy code paths where the inbound Message-Id header was not captured.
  • reply_date — may be null on legacy code paths that don’t carry the original reply timestamp.
  • reply_message_url — present when the subscription has includeEmailUrl: true and a stored reply blob is available.
  • email_text — present when the subscription has includeEmailText: true and the reply body could be parsed from the blob.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — only the id key is emitted for this event (no step_number or name); the object is absent if the reply isn’t tied to a sequence.

email_sent

When: Reply successfully dispatches an email from a sequence step (fired after the sent-email record is persisted by the CampaignSending Cloud Function).
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_sent", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "sent_email_id": 999,
  "sent_email_message_id": "test-message-id",
  "sent_email_date": "2026-04-21T09:30:00.000Z",
  "sent_message_url": "https://example.com/test-email-blob",
  "email_text": "<html>…</html>",
  "email_from": "account@example.com",
  "sent_email_variant": "A",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "step_number": 1 }
}
  • sent_email_variant — letter identifying which A/B variant was sent (omitted when the step has a single variant). Derived from the sorted position of the step’s email template; wraps to "A1", "B1"… after "Z".
  • sent_message_url — present when the subscription has includeEmailUrl: true and the sent message blob is available.
  • email_text — present when the subscription has includeEmailText: true and the blob body parses successfully.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id and step_number only; name is not populated for this event.

email_opened

When: a tracked email is opened by the recipient. Opens from IP addresses configured as the user’s own (in the user’s IP exclusion list) are silently filtered before the event is raised.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_opened", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "sent_email_id": 999,
  "sent_email_message_id": "test-message-id",
  "email_open_date": "2026-04-21T09:30:00.000Z",
  "opens_count": 1,
  "email_from": "account@example.com",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "step_number": 1 }
}
  • opens_count — cumulative lifetime open count for this sent email (always >= 1; increments on each re-open). Not a per-delivery delta.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id and step_number only; name is not populated for this event.
When: a recipient clicks a tracked link inside an email.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_link_clicked", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_link_url": "https://example.com/test-link",
  "email_from": "account@example.com",
  "contact_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "name": "Test Sequence", "step_number": 1 }
}

email_bounced

When: a sent email bounces or is rejected by the recipient mail system. Fired both from the replies-fetching pipeline (when an inbound message is classified as a bounce) and from the campaign service when sent emails are flagged as bounced.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_bounced", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "sent_email_id": 999,
  "bounce_date": "2026-04-21T09:30:00.000Z",
  "bounce_type": "Hard",
  "bounce_message_id": "test-bounce-id",
  "sent_message_url": "https://example.com/test-email-blob",
  "email_text": "<html>…</html>",
  "email_from": "account@example.com",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • bounce_type — one of: "Unknown", "Soft", "Hard", "GmailApiLimitWarning", "Office365LimitWarning", "MailboxFull", "AuthenticationFailure", "SpamRejection", "PolicyViolation". When no specific type can be determined, the value is "Unknown".
  • sent_message_url — present when the subscription has includeEmailUrl: true and the sent message blob is available.
  • email_text — present when the subscription has includeEmailText: true and the blob body parses successfully.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only; no step_number or name for this event.

email_auto_reply

When: Reply’s replies-fetching pipeline classifies an inbound message as an auto-reply or out-of-office responder. Both classifications fire this same event — see reply_type below.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_auto_reply", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "sent_email_id": 999,
  "reply_date": "2026-04-21T09:30:00.000Z",
  "reply_message_id": "test-reply-id",
  "reply_subject": "Out of Office: Test Subject",
  "reply_type": "AutoReply",
  "reply_message_url": "https://example.com/test-email-blob",
  "email_text": "<html>…</html>",
  "email_from": "account@example.com",
  "user_name": "Test User",
  "user_email": "user@example.com",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "step_number": 1 }
}
  • reply_type"AutoReply" for vacation/auto-responder messages, "OutOfOffice" for out-of-office classifications. Both values flow through this event; use this field to distinguish.
  • email_account_id — may be null if the underlying event has no associated email account.
  • email_from — present only when email_account_id is known; absent otherwise.
  • reply_message_url — present when the subscription has includeEmailUrl: true.
  • email_text — present when the subscription has includeEmailText: true and the reply body parses successfully.
  • user_name / user_email — the Reply user that owns the sequence at event-raise time (full name and login email). Omitted if the user record cannot be loaded.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.

email_account_connection_lost

When: a connected mailbox stops authenticating (OAuth revoked, password changed, etc.). No prospect context — this is an account-level event.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_account_connection_lost", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "email_account_address": "account@example.com"
}

email_account_error

When: a connected mailbox surfaces a non-empty IMAP or SMTP error — token invalidation, send failure, health-check failure, disconnect detection, reputation issue, sending pause, limit hit. Fires every time the underlying error string is updated to a non-empty value; clearing the warning does not fire.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "email_account_error", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "email_account_id": 1,
  "email_account_error": "Sending: SMTP authentication failed",
  "email_account_address": "account@example.com"
}
  • email_account_error — free-form error string. Always carries a "Receiving: " (IMAP) or "Sending: " (SMTP) prefix produced by the warning-update handler; the remainder is the raw underlying exception or status message.
  • email_account_address — omitted when the email account lookup returns no record (rare but possible after deletion).

contact_finished

When: a contact’s participation in a sequence ends — either by completing all steps, hitting a terminal status, or being manually finished. See finish_reason below for the specific cause.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "contact_finished", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "finish_reason": "Replied",
  "finished_date": "2026-04-21T09:30:00.000Z",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • finish_reason — one of:
    • "Replied" — contact replied to a sequence email.
    • "Bounced" — sending bounced and the contact was removed.
    • "Manual" — a user manually finished the contact.
    • "FinishedAfterXdays" — time-based finish from the sequence’s max-days setting.
    • "None" — no specific reason recorded.
    • "Called" — finished after a phone call interaction.
    • "OptOut" — contact opted out (unsubscribe link, manual, or “Do Not Contact” categorization).
    • "MeetingBooked" — a meeting was booked with the contact.
    • "ForbiddenStep" — the next step’s content was rejected by guardrails.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only; no step_number or name for this event.

contact_opted_out

When: a contact is opted out via any of three paths: clicking the unsubscribe link in an email, a user manually opting them out in the web app, or a reply being categorized as “Do Not Contact” in the inbox. All three paths fire this same event with the same payload shape — there is no source or reason field distinguishing them.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "contact_opted_out", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "opt_out_date": "2026-04-21T09:30:00.000Z",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only.

contact_called

When: a phone call with this contact reaches a deliverable state — connected, missed, voicemail, logged manually, or timed out. Reply accumulates call-event parts (start, status, resolution, recording) and only fires the webhook once all required parts arrive (or a cloud-function timeout forces delivery with partial data).
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "contact_called", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "from_number": "+1234567890",
  "duration": 60,
  "disposition": "Answered",
  "resolution": "Positive",
  "notes": "Spoke with prospect, scheduled a follow-up.",
  "recording_url": "https://example.com/test-call-recording",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • from_number — the outbound number used for the call (a number assigned to the user or a pooled number).
  • duration — call length in seconds. 0 for manually-logged calls or calls that never connected.
  • disposition"Answered", "LoggedManually", "NoAnswer", "Busy", or "Fail". Mapped from the underlying Twilio call status.
  • resolution — either one of the built-in values ("Positive", "ToCall", "Negative") or a user-defined custom resolution name configured by the team (which fully replaces the enum value on the wire). Treat as a free-form string when matching.
  • notes — free-form resolution notes the user entered. null when no notes were saved.
  • recording_url — signed URL to replay the call recording. null when the call was not recorded (e.g. no-answer, busy, logged manually, recording disabled).
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only.

linkedin_connection_request_sent

When: Reply successfully sends a LinkedIn connection request on behalf of the user as part of a sequence step.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_connection_request_sent", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "sender_linkedin_account_id": 50,
  "initial_message": "Test connection request",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • sender_linkedin_account_id — the Reply-internal LinkedIn account ID (not a LinkedIn public identifier).
  • initial_message — the connection request body actually sent. May be null if the request was sent without a note.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only.

linkedin_connection_request_accepted

When: Reply’s LinkedIn polling detects that a previously-sent connection request has been accepted. Only fires for connections originally sent through Reply — connections accepted outside Reply are not reported.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_connection_request_accepted", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "sender_linkedin_account_id": 50,
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200 }
}
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — emits id only.

linkedin_message_sent

When: Reply sends a LinkedIn message (regular message or InMail). Voice messages are emitted with is_voice_attached: true; InMails always carry is_voice_attached: false.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_message_sent", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "sender_linkedin_account_id": 50,
  "initial_message": "Test message",
  "is_inmail": false,
  "is_voice_attached": false,
  "linkedin_message_id": "test-msg-id",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "step_number": 1 }
}
  • linkedin_message_id — Reply’s internal grouped-message identifier (string), not the native LinkedIn platform message ID.
  • is_inmailtrue for InMail steps, false for regular messages.
  • is_voice_attachedtrue when a voice attachment was sent (only possible on regular messages).
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.

linkedin_message_replied

When: Reply’s LinkedIn thread polling detects an inbound message on a thread tied to an active sequence contact. Only fires when the thread maps to a known sequence prospect in Reply.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_message_replied", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "sender_linkedin_account_id": 50,
  "linkedin_message_id": "01234567-89ab-cdef-0123-456789abcdef",
  "linkedin_message": "Test reply",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" },
  "sequence_fields": { "id": 200, "name": "Test Sequence" }
}
  • linkedin_message_id — UUID of the persisted reply row in Reply’s DB (not a LinkedIn platform identifier).
  • linkedin_message — raw reply text as fetched from the LinkedIn thread.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • sequence_fields — always emits name; id is included only when the contact is currently tied to a sequence (SequenceId > 0).

linkedin_reply_categorized

When: Reply’s categorizer assigns a category to one or more LinkedIn threads. Fires per affected thread.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_reply_categorized", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "linkedin_thread_id": 1,
  "reply_inbox_category_name": "Interested",
  "last_reply_date": "2026-04-21T09:30:00.000Z",
  "contact_fields": { "…": "see above" },
  "contact_custom_fields": { "…": "see above" }
}
  • reply_inbox_category_name — one of the fixed built-in category names: "No categories", "Interested", "Not interested", "Do not contact", "Not now", "Forwarded", "Meeting intent". Unlike the email reply_categorized event, LinkedIn categorization does not support team-custom label names.
  • last_reply_date — present only when the underlying event reports it (latest message timestamp on the thread); otherwise omitted.
  • contact_custom_fields — present when the subscription has includeProspectCustomFields: true.
  • Note: this event has no sequence_fields block — the underlying event args don’t carry sequence context.

autopilot_stopped

When: an evergreen sequence’s autopilot is deactivated. Only three reasons emit this event — see autopilot_error_message below. (Other internal pause reasons like NotEnoughCredits and AdvancedDataSearchNotAllowed silently suppress the event.)
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "autopilot_stopped", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "autopilot_error_message": "the active contacts limit has been reached",
  "user_name": "Test User",
  "user_email": "user@example.com",
  "sequence_owner_name": "Test Owner",
  "sequence_owner_email": "owner@example.com",
  "sequence_fields": { "id": 200, "name": "Test Sequence" }
}
  • autopilot_error_message — one of three exact strings:
    • "the sequence has been deactivated" — sequence was manually deactivated.
    • "the active contacts limit has been reached" — contacts limit hit.
    • "there are no more contacts/companies matching the filter criteria" — search pool exhausted.
  • user_name / user_email — the Reply user who triggered the deactivation (full name and login email). Omitted when the user record cannot be loaded.
  • sequence_owner_name / sequence_owner_email — the user who originally created the sequence. Omitted when the owner cannot be resolved.
  • Dual delivery on team accounts: when the user who triggered deactivation is not the sequence owner, the event fires twice — once with user_id of the acting user and once with user_id of the sequence owner. Both carry identical sequence_fields and autopilot_error_message.

linkedin_account_alerts

When: Reply detects a LinkedIn account-level condition that needs the user’s attention — Sales Navigator disconnected, weekly connection-request limit reached, or InMail credits exhausted.
{
  "event": { "date": "2026-04-21T09:30:00.000Z", "id": "4c1b9e74-5ac3-4b0f-9a60-2a37a9b4a2d1", "type": "linkedin_account_alerts", "user_id": 1234, "team_id": 100, "subscription_id": 42 },
  "linkedin_id": 50,
  "linkedin_name": "Test LinkedIn Account",
  "linkedin_account_alert": "Sales Navigator is disconnected. Please reconnect your LinkedIn account to continue sending InMail steps.",
  "team_name": "Test Workspace",
  "linkedin_owner_name": "Test User",
  "linkedin_owner_email": "owner@example.com"
}
  • linkedin_id / linkedin_name — the LinkedIn account the alert is about.
  • linkedin_account_alert — human-readable alert text. See the variant list below for the exact strings Reply currently emits.
  • team_name — name of the team that owns the LinkedIn account. Omitted when the team has no name set.
  • linkedin_owner_name / linkedin_owner_email — the user who originally connected the LinkedIn account. Both are omitted when the owner cannot be resolved.
  • Underlying variants and their re-fire window per (linkedinAccountId, variant):
    • SalesNavigatorDisconnected — Sales Navigator session lost. Text: Sales Navigator is disconnected. Please reconnect your LinkedIn account to continue sending InMail steps. Re-fires at most every 12 hours.
    • InMailCreditsExhausted — InMail credit balance hit zero. Text: InMail credits are used up — this account can't send InMails until credits renew. Re-fires at most every 24 hours.
    • ConnectionRequestWeeklyLimitReached — LinkedIn weekly connection-request quota reached. Text: Weekly connection request limit reached. Sending new connection requests will resume after LinkedIn resets the quota. Re-fires at most every 24 hours.

Verifying in your own account

Once you have a subscription, fire a synthetic delivery to your URL with POST /v3/webhooks/{id}/test — the body matches the shapes above exactly, with deterministic placeholder data.