Saltar al contenido principal
Receive a JSON POST after call analysis. Configure the voice agent’s outgoing URL in Advanced → Post-call and publish. This contract covers browser tests, phone calls, campaigns, and widgets.

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 be null 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.

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_data for fields you configure in Post-call. Use your own ID mapping to recover CRM context.
  • Missing evaluation_results can mean no evaluations were assigned or no results became available. unknown is 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_result when present. call_status: "ended" alone does not mean someone answered.

Delivery and retries

The sender uses Content-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.