Configure and troubleshoot
Set the destination, run a test, and inspect delivery attempts.
Choose another webhook
Inbound context, conversations, and follow-up closure have different contracts.
When delivery happens
1
The conversation ends
Ending the call does not immediately provide its analyzed result.
2
Analysis becomes available
ContactShip prepares summary, extracted fields, transcript, and call result. If the agent has evaluations, delivery can wait for their results.
3
Your receiver accepts the event
ContactShip posts the body below. Persist accepted work and return HTTP 2xx within 30 seconds; process longer workflows asynchronously.
Payload structure
The top-level body is{ "data": { ... } }. It has no required event or webhook event ID. A test call can have an associated contact; the presence of a contact controls the extra fields.
Extra call fields are
call_result, from_number, to_number, and call_additional_data. See Call types for each origin and the distinction between type, state, and result.
Field reference
Expand an object to inspect its fields. Optional context can be omitted; some stored values can benull or empty.
object
Agent associated with the call.
object
Organization context when available. Contains
name, email, and country; no organization ID.object
Call result. Handle a missing block if context could not be retrieved.
object
Present when a contact is associated and its context is available.
object
Campaign context for
campaign_call. Normally {} for other types; can be omitted if unavailable.Examples by call type
These are illustrative bodies using fictional data, not captured customer calls. Select the scenario to compare fields. They show one possible result; missing and empty values remain possible.- Web tests
- Phone
- Campaign
- Widget and web
- Results
Correlation and missing data
- Store the call ID from creation. This webhook does not forward
metadata, a separate event ID,direction, organization ID, campaign ID, call price, or agent version as dedicated fields. - Use
data.call.call_analysis.custom_analysis_datafor fields you configure in Post-call. Use your own ID mapping to recover CRM context. - Missing
evaluation_resultscan mean no evaluations were assigned or no results became available.unknownis an evaluation result, not a missing evaluation. - A call without a recorded call row may have no final webhook. This can affect inbound calls that never connect.
- For an unanswered call, use
call_resultwhen present.call_status: "ended"alone does not mean someone answered.
Delivery and retries
The sender usesContent-Type: application/json, a 30-second timeout, and accepts HTTP 2xx. It can follow up to three redirects. Queue retries and manual retries can deliver the same call again.
Use durable processing state keyed by call ID and action. Persist accepted work before acknowledging it, retry failed actions independently, and avoid duplicating completed external operations. A generic HTTP success response does not prove your business action finished.
The sender does not add the lead-routing x-contactship-signature header. Do not reuse another webhook’s signing contract. Keep API keys on your server; an API key is not automatically sent to your webhook URL.
Inspect an actual delivery
Open Calls → Webhooks and select the event. Compare destination, attempts, response, and raw data with your receiver. The event ID shown in that screen helps support investigate; it is not automatically present in the HTTP body. The current voice editor has no sample-payload test button. Publish the URL and make a controlled test call. Receiver workflows can perform real actions during tests.Automate follow-ups
Map analysis into a task, CRM update, or another attempt.
Retrieve a call
Query a recorded call by its ContactShip ID.
