curl --request POST \
--url https://api.pomerado.ai/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"events": []
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>', events: []})
};
fetch('https://api.pomerado.ai/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.pomerado.ai/v1/webhooks"
payload = {
"url": "<string>",
"events": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190",
"created_by": {
"user_id": "<string>",
"email": "<string>"
},
"url": "<string>",
"events": [
"job.needs_input"
],
"status": "active",
"disabled_reason": "manual",
"created_at": "<string>",
"last_delivery_at": "<string>",
"secret": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}Create a webhook
Create a webhook that receives the job events of every job you could see, the jobs you start from any client (the Dashboard, an MCP client or an API key), and return its signing secret once. Every member can make webhooks, and only you change, test and rotate yours; a Business Owner or Admin also sees and may delete them. Deliveries are signed with Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature), retried for about 15 minutes, and sent only to public HTTPS addresses. The webhook keeps working if you leave the team. Without events it receives all four. Events: job.needs_input (a job asks a question; the payload has its screened questions and the page where you answer), job.input_expiring (three minutes left to answer), job.succeeded and job.failed (a job settled). No event carries a result: read it from the job through the client that started it. You can hold at most 20 webhooks.
curl --request POST \
--url https://api.pomerado.ai/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"events": []
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>', events: []})
};
fetch('https://api.pomerado.ai/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.pomerado.ai/v1/webhooks"
payload = {
"url": "<string>",
"events": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190",
"created_by": {
"user_id": "<string>",
"email": "<string>"
},
"url": "<string>",
"events": [
"job.needs_input"
],
"status": "active",
"disabled_reason": "manual",
"created_at": "<string>",
"last_delivery_at": "<string>",
"secret": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"docs_url": "<string>",
"details": {}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Response
The new webhook and its one-time secret
a webhook ID: wh_ and 32 lowercase hex digits
"wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"
The member who made the webhook: only they change, test and rotate it, and it carries the events of the jobs they could see
Show child attributes
Show child attributes
job.needs_input, job.input_expiring, job.succeeded, job.failed active, disabled Why a disabled webhook sends nothing: manual (turned off), gone (its receiver answered 410), unreachable (20 failed deliveries in a row) or secret_unreadable (rotate its secret)
manual, gone, unreachable, secret_unreadable a string to be decoded into a Date
a string to be decoded into a Date
The Standard Webhooks signing secret (whsec_…), shown in this answer only. Verify each delivery's webhook-signature with it.