Skip to main content
A custom HTTP tool calls your endpoint during a conversation. These requests have no top-level data envelope. Voice uses call; text uses thread. Both include tool_name and args.

Set up an HTTP tool

Configure parameters, connect your system, and verify execution.

Post-call webhook

Use this separate contract for analysis after a call.

Voice request

Your endpoint receives a JSON POST. Example values below are fictional; optional values can be empty or absent.
object
Context available during the call. This is not the analyzed post-call record.
string
Name of the invoked tool, as configured on the agent.
object
Arguments supplied for this invocation. Read configured inputs here, such as args.order_number. With no arguments, this can be {}.
Voice execution does not add a dedicated contact object, contact_id, transcript, recording, or final analysis. Dynamic variables may provide additional context, but do not assume those fields exist there.
The current voice execution path posts the body to the configured URL without forwarding configured tool headers or separate query parameters. Test endpoint can send them. A successful authenticated test therefore does not prove that a live call can authenticate. Coordinate header-based integration requirements with support.

Text request

The External API tool configured in the editor sends a JSON POST.
Text conversation
object
Conversation context. If context construction fails, the sender can fall back to a body containing only tool_name and args.
tool_name is the configured tool name. args contains configured arguments; undeclared keys are not automatically forwarded. Missing optional arguments may be omitted. The current visual text editor configures parameters as strings. The standard body does not include a dedicated agent_id, organization ID, transcript, or conversation summary. Fetch other records through your integration when needed.

Your endpoint response

Return valid JSON containing the result the agent needs. These example fields belong to your contract, not a required ContactShip response schema.
ContactShip makes the returned result available to the agent. You do not need to wrap it in call, thread, or args. Use instructions that distinguish a missing record, an operation still pending, and a completed action. For text tools, successful responses normally become a tool result containing the HTTP status and response data. A plain non-JSON string can remain opaque text. Return JSON with the correct content type, especially from workflow response nodes. Text requests default to a 15-second timeout unless configuration changes it. Selected transient network failures and HTTP 429, 503, or 504 can trigger up to two additional HTTP attempts. This is not a guarantee about the total number of agent invocations. For operations with side effects, use your own business operation key and stored result. A call or conversation can legitimately invoke a tool multiple times; its ID alone is not an operation ID. The standard body supplies no dedicated unique tool-invocation ID.

Test requests versus live execution

Test endpoint sends exactly the editable sample body. Initially it is built from parameter examples, without the live call, tool_name, or args wrapper. Edit it to resemble a full request when testing your parser.
Initial parameter sample
The test sends configured headers, times out after 10 seconds, and does not follow redirects. It does not invoke the agent. Confirm the actual body and authentication through a controlled call.

Find the data and diagnose failures

Compare received headers. The voice configurator test and live execution handle configured headers differently. Check authentication with support.
Read args.order_number during live execution. A voice configurator sample initially places parameters at the root.
Check the endpoint URL and browser CORS response. The test runs from the browser; real text execution runs on the server.
A tool runs during the conversation. Receive the completed transcript and analysis through the post-call webhook instead.