Skip to content

Register a custom_webhook tool target

POST
/v1/webhook-targets
curl --request POST \
--url https://api.vocapable.com/v1/webhook-targets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "webhook_id": "example", "description": "example", "parameters": {}, "side_effect": "read_only", "url": "example", "timeout_seconds": 5, "max_invocations_per_call": 3 }'

Register one target, minting its signing secret - the only time it is readable.

Everything bind time would refuse is refused here, where it costs one API request instead of one tool on a live call: a reserved name, a schema the runtime’s validator cannot enforce, one over the prompt budget, and a URL outside the delivery policy.

Media typeapplication/json
WebhookTargetCreateRequest

POST /webhook-targets - one spoken-name integration a live call may invoke.

The field bounds are the prompt-budget bounds from vocapable_contracts.toolschema: the id lands in a schema enum the model reads and the description in the catalog it re-reads every turn, so what this model refuses is exactly what bind time would.

object
webhook_id
required
Webhook Id
string
>= 1 characters <= 64 characters
description
required
Description
string
>= 1 characters <= 500 characters
parameters
required
Parameters
object
key
additional properties
any
side_effect
required
SideEffect

Whether an invocation only reads, or changes state something else can observe.

Two values by design: anything that is not a lookup gets an idempotency key. That is why end_call - runtime-local, but a state change - is MUTATING.

string
Allowed values: read_only mutating
url
required
Url
string
>= 1 characters <= 2048 characters
timeout_seconds
Timeout Seconds
number
default: 5 > 0 <= 30
max_invocations_per_call
Max Invocations Per Call
integer
default: 3 >= 1 <= 20

Successful Response

Media typeapplication/json
WebhookTargetSecretView

A summary plus the plaintext secret, when the answering call minted one.

object
id
required
Id
string
webhook_id
required
Webhook Id
string
description
required
Description
string
parameters
required
Parameters
object
key
additional properties
any
side_effect
required
Side Effect
string
timeout_seconds
required
Timeout Seconds
number
max_invocations_per_call
required
Max Invocations Per Call
integer
url
required
Url
string
status
required
Status
string
previous_secret_expires_at
required
Any of:
string format: date-time
created_at
required
Created At
string format: date-time
updated_at
required
Updated At
string format: date-time
secret
required
Any of:
string
Examplegenerated
{
"id": "example",
"webhook_id": "example",
"description": "example",
"parameters": {},
"side_effect": "example",
"timeout_seconds": 1,
"max_invocations_per_call": 1,
"url": "example",
"status": "example",
"previous_secret_expires_at": "2026-04-15T12:00:00Z",
"created_at": "2026-04-15T12:00:00Z",
"updated_at": "2026-04-15T12:00:00Z",
"secret": "example"
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}