CallRail · AsyncAPI Specification
Callrail Webhooks
Version
View Spec
View on GitHub
Call TrackingConversation IntelligenceMarketing AttributionLead TrackingTelephonyAnalyticsForm TrackingAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-14'
method: searched
source: https://apidocs.callrail.com/#webhooks
spec_type: none
description: >-
CallRail publishes no AsyncAPI document. It does publish a full webhook reference — ten event
types, payload shapes, delivery semantics, and an HMAC signature scheme with a working test
vector. This artifact captures that event surface as published. Nothing here is inferred: every
event, field and rule below is transcribed from CallRail's own webhook documentation.
transport: HTTP POST
content_type: application/json
subscription:
configured_in: CallRail application (per company), or via the v3 API
api_paths:
- POST /v3/a/{account_id}/integrations.json
- PUT /v3/a/{account_id}/integrations/{integration_id}.json
api_docs: https://apidocs.callrail.com/#configuring-integrations
note: >-
Webhooks are modelled as an integration; the Integrations endpoints carry a "Webhook
Configuration Object". A webhook subscribes to a chosen URL and a chosen set of triggering
events.
payload_conventions:
body: >-
All attributes are available in the JSON POST body, which CallRail states is the recommended
format for new development.
query_string: >-
A limited number of attributes are also mirrored into the query string for legacy-API reasons.
CallRail explicitly recommends parsing the JSON body and ignoring the query string.
call_payload_shape: >-
The four inbound-call events and the two outbound-call events all send the call object as
documented under "Retrieving a Single Call".
delivery:
expected_response: 2xx
retries: false
retry_note: >-
CallRail does not resend webhooks. A non-2xx response means the delivery is lost — missing
calls on the receiving side may be the first indication of a problem. Repeated failures can
result in automated disabling of the webhook integration.
ordering: not specified
common_failure_causes:
- Typos or invalid receiving URLs
- Receiving server rejecting URLs over a certain length
security:
scheme: HMAC-SHA1, base64-encoded
header: Signature
secret: >-
CallRail generates a secret, random signing token per company, viewable on the Webhooks
configuration page in the application.
computation: base64(HMAC-SHA1(company_signing_key, raw_request_body))
reference_implementation: |
hmac = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), YOUR_COMPANY_SIGNING_KEY, request_payload)
signature = Base64.strict_encode64(hmac)
replay_protection: >-
Each webhook request includes a `timestamp` field derived from the request data, which the
receiver can compare against current time to reject replayed requests.
test_vector:
published: true
docs: https://apidocs.callrail.com/#validating-payloads
note: >-
CallRail publishes a documentation-only test signing key and the signature it must produce
over the sample call payload in the docs, so an implementer can verify their HMAC code before
going live. The key and expected signature are published in the reference; they are not
reproduced here to keep this repo free of secret-shaped strings.
event_count: 10
events:
- name: Pre-Call
trigger: The moment an inbound phone call is received by CallRail, before the call is connected.
payload: call object (subset — no duration, answered flag, or recording link yet)
use_case: Real-time screen-pops and CRM lookups for representatives.
- name: Call Routing Complete
trigger: The moment an inbound call has been routed to its destination.
payload: call object (more complete than Pre-Call, less than Post-Call)
use_case: Supplementing information shown to an agent while a call is in progress.
- name: Post-Call
trigger: >-
After an inbound call completes AND its recording, transcription and call summaries have
attached.
payload: call object (full)
latency: >-
Not real-time. Maximum 20-minute delay after hangup; the event fires at the 20-minute timeout
even if recording-related data is still missing.
guidance: >-
CallRail recommends also implementing Call Modified so that late recording, transcription or
call-summary data is not missed.
- name: Call Modified
trigger: A call changed after it ended — tag added, note written, recording attached, marked spam.
payload: call object with the modified values already applied, plus a `changes` array
fields:
- name: changes
description: >-
Array of the fields that changed. Documented members: tags, note, value,
transcription_text, call_summary, recording_duration, auto_score, manual_score.
- name: Outbound Post Call
trigger: After an outbound phone call has ended.
payload: call object with call_type set to "outbound"
- name: Outbound Call Modified
trigger: An outbound call changed after it ended (tag, note, etc.).
payload: call object with the modified values applied
- name: Text Message Received
trigger: A text message is received by one of your tracking numbers.
payload_fields:
- {name: id, description: Unique identifier for a specific text.}
- {name: resource_id, description: Unique alphanumeric identifier for the text message.}
- {name: source_number, description: The phone number that sent the text message.}
- {name: destination_number, description: The tracking number that was texted.}
- {name: content, description: The content of the text message.}
- {name: message_type, description: 'One of sms or mms.'}
- {name: media_urls, description: 'For MMS, an array of media URLs. Empty for SMS. Not long-lived — download immediately.'}
- {name: timestamp, description: Timestamp of receipt, with timezone offset.}
- {name: lead_status, description: 'One of good_lead, not_a_lead, previously_marked_good_lead, or null.'}
- {name: conversation_id, description: Unique identifier for the SMS conversation.}
- {name: company_resource_id, description: Unique identifier for the associated company.}
- {name: person_resource_id, description: Unique identifier for the associated person.}
- name: Text Message Sent
trigger: A text message is sent by one of your tracking numbers.
payload_fields:
- {name: id, description: Unique identifier for a specific text.}
- {name: resource_id, description: Unique alphanumeric identifier for the text message.}
- {name: agent, description: Name of the user who sent the text message.}
- {name: source_number, description: The phone number that sent the text message.}
- {name: destination_number, description: The number that was texted.}
- {name: content, description: The content of the text message.}
- {name: message_type, description: 'One of sms or mms.'}
- {name: media_urls, description: 'For MMS, an array of media URLs. Empty for SMS.'}
- {name: timestamp, description: Timestamp of send, with timezone offset.}
- {name: lead_status, description: 'One of good_lead, not_a_lead, previously_marked_good_lead, or null.'}
- {name: conversation_id, description: Unique identifier for the SMS conversation.}
- {name: company_resource_id, description: Unique identifier for the associated company.}
- {name: person_resource_id, description: Unique identifier for the associated person.}
- name: Form Submission
trigger: A form is submitted on your website (requires Form Tracking to be active).
payload_fields:
- {name: id, description: Unique identifier for a specific form submission.}
- {name: company_id, description: Unique identifier of the company receiving the form submission.}
- {name: form_data, description: 'The contents of the submission, broken down by form field.'}
- {name: form_url, description: The URL of the page the form was submitted from.}
- {name: landing_page_url, description: The URL the visitor first landed on.}
- {name: referrer, description: The URL that referred the visitor to your website.}
- {name: referring_url, description: The referrer's webpage.}
- {name: submitted_at, description: Timestamp of submission.}
- {name: first_form, description: Whether this is the first form submitted by this visitor.}
- {name: source, description: The marketing source that led to the form submission.}
- {name: keywords, description: 'Keywords the visitor searched for (paid ad sources only).'}
- {name: campaign, description: Marketing campaign attributed to the submission.}
- {name: medium, description: Marketing medium attributed to the submission.}
- {name: utm_source, description: UTM source parameter.}
- {name: utm_medium, description: UTM medium parameter.}
- {name: utm_campaign, description: UTM campaign parameter.}
- name: Convert Assist Complete
trigger: A Convert Assist run completes.
added: '2024-12-09'
note: Documented from the 2024-12-09 changelog entry onward.
gaps:
- No AsyncAPI (or CloudEvents) document is published for this event surface.
- No delivery retry, dead-letter, or replay endpoint.
- No event-log / webhook-delivery inspection API.
- Signature algorithm is SHA-1 rather than SHA-256.