Why
Most webhooks carry an event, not a sentence. A call-completed event, a form submission, a pipeline-stage change: none of them say what the agent should do about it. So a webhook takes instructions, exactly as a routine takes a prompt.
Priority
Ambrose resolves what to do in this order, and stops at the first one it finds:
- Sent with the request. Any of
instruction,instructions,promptortask— in the JSON body, insidecustomData(where GHL nests its fields), or as a query-string parameter. - Stored on the node. A standing instruction saved on the agent or team, used by every webhook on it when the caller sends none.
- The node's Description. Its standing brief — what this agent is for.
The caller's instruction is top priority, always. A stored instruction or a Description is the fallback for a platform that cannot send one.
Sending one
POST https://app.hiambrose.com/api/agent/<webhook_id>/webhook/custom
Content-Type: application/json
{
"instruction": "Fetch this call's recording, transcribe it if there is no transcript, score it, and write the analysis to the vault.",
"event": "call.completed",
"call_id": "abc123"
}
For a GHL workflow, put it in customData.instructions on the webhook action.
The payload always travels
Whichever way the instruction arrived, the full payload is passed to the agent as labelled context. The instruction is the task; the payload is the data to do it with.
If nothing is set
With no instruction anywhere, no stored instruction and no Description, the webhook returns an error naming all three ways to fix it — rather than guessing at what you meant.