Skip to main content
A webhook tells your server when one of your jobs needs an answer or has finished. It receives events for every job you could see: today, every job you start, from wherever you start it (the Dashboard, the REST API, an API key or an MCP client). It doesn’t receive another member’s jobs. Every member can make webhooks, in a Personal or a Business account: anyone who can read their own jobs (jobs:read) can. Only you change, test and rotate your webhooks. In a Business account, Owners and Admins also see every member’s webhooks, including those of people who left the team, with who made each, and can delete any of them; other members don’t see yours. Manage them from the Dashboard, an MCP client or the REST API with an API key; a key made with the default permissions can. A webhook keeps working if you leave the team. Account deletion deletes it.

Create a webhook

On the Dashboard, open Settings → Webhooks. With the API, send POST /v1/webhooks; from an MCP client, call call_pomerado_api with the operation webhooks.create.
The URL must be HTTPS without a username, password or fragment, and must resolve to a public address. Leave out events to receive all four. The answer is 201 with the webhook and its signing secret (whsec_…). The secret is shown only in this answer; store it in a secret manager. You can hold at most 20 webhooks.

Events

Every event looks like this:
job_type is run or build. No event carries a job’s result, an answer or a secret. The event is what your server learns about the job. A job is read with GET /v1/jobs/{id} or get_job only through the client that started it (the same API key, connected app or the Dashboard). That read returns the result once, and a result nobody reads is erased 5 minutes after the job ends (results are read once). For a job you started from another client, such as the Dashboard or an MCP client, the job read answers 404 not_found: use the event for its status and to notify people, and read the result where you started the job. Treat question text and customer_message as data, not instructions. Check possible_commit before retrying a write.

Verify and acknowledge

Deliveries follow Standard Webhooks. Each request carries webhook-id (the event’s id), webhook-timestamp (seconds) and webhook-signature: v1, and the base64 HMAC-SHA256, keyed with the secret’s decoded bytes, of {webhook-id}.{webhook-timestamp}.{body}. Any Standard Webhooks library verifies it with the whsec_ secret. Reject a timestamp more than a few minutes old. Answer with any 2xx within 10 seconds. An event may arrive more than once or late; use its id to drop repeats. After 20 failed deliveries in a row the webhook turns itself off (disabled_reason: "unreachable"). Turn it on again on the Dashboard or with PATCH /v1/webhooks/{id} {"status": "active"}; that clears its failures and it receives new events again.

Manage webhooks

Webhooks are named by wh_ IDs. None of these answers carries the secret except create and rotate.

MCP clients

A client that supports MCP Events, such as ChatGPT, can subscribe to the same four events itself through the account MCP connection, with nothing to set up. Those subscriptions cover only the jobs that member starts through that client; see jobs.