A webhook sends an HTTPS POST to your URL the moment something happens, so your tools do not
have to poll. Add endpoints in the cockpit under
API and webhooks: paste the URL,
pick the events, and copy the signing secret shown once.
| Event | Sent when |
| asset.created | A new asset was generated and saved (pending your approval, or approved on autopilot). |
| asset.approved | An asset was approved, in the cockpit or through the API. |
| asset.rejected | An asset was rejected, in the cockpit or through the API. |
| asset.updated | The content of an asset was edited, in the cockpit or through the API. |
| asset.deleted | An asset was deleted, on its own or together with its website, in the cockpit or through the API. |
| website.analyzed | A website analysis finished: status is ready or failed. |
| run.completed | An autopilot cycle finished, with its status and the number of assets it created. |
| webhook.test | You click Send test event. Always sent, whatever events you picked. data.test is true, and data.asset, data.website and data.run are samples in the shape of real events (your newest ones, or the examples on this page), so Zapier and Make pick up every field to map. |
The body is the same object for every event. data.asset, data.website
and data.run have exactly the shape the API returns, and asset.rejected adds
data.reason. asset.updated carries the asset after the edit. An endpoint receives only
the events it was created with: to add an event later, add the endpoint again with that event.
{
"id": "evt_01j9z3k6x2m7v4q8r5t0w1y2z3",
"type": "asset.approved",
"created_at": "2026-10-07T09:20:31Z",
"team_id": 87,
"data": {
"asset": {
"id": 4812,
"object": "asset",
"website_id": 311,
"channel": "google_ads",
"type": "google_rsa",
"type_label": "Google Search Ad",
"status": "approved",
"title": "Bookkeeping for agencies",
"body": null,
"payload": {
"ad_group": "Bookkeeping for agencies",
"headlines": [
"Bookkeeping For Agencies",
"Books Closed Every Month",
"From $49 a Month"
],
"descriptions": [
"Monthly books, payroll and reports for agencies. Start in a day.",
"A bookkeeper who knows retainers and project billing."
],
"final_url": "https://yourwebsite.com/pricing",
"keywords": [
{
"keyword": "agency bookkeeping",
"match": "phrase"
}
]
},
"scheduled_for": null,
"is_sample": false,
"run_id": 905,
"exports": [
{
"format": "csv",
"url": "https://automarketer.com/api/v1/assets/4812/export?format=csv"
}
],
"created_at": "2026-10-07T06:01:40Z",
"updated_at": "2026-10-07T06:01:40Z"
}
}
}
Headers on every delivery:
X-AutoMarketer-Event: the event type,
X-AutoMarketer-Event-Id: the event id, the same on every retry, so you can ignore a duplicate,
X-AutoMarketer-Delivery: the delivery id shown in your delivery log,
X-AutoMarketer-Signature: t=<unix time>,v1=<signature>.
Retries. Any 2xx answer within 10 seconds counts as delivered.
Anything else is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours,
7 attempts in all. Redirects are not followed. Every delivery is in the
delivery log in the cockpit with its latest status code, the number of attempts and the time of the
last one, and any delivery can be sent again from there with Send again. After 15 failed attempts in a row the endpoint turns
itself off and the cockpit tells you why. Fix it, send a test event, and turn it back on. Events that happened while it was
off are not queued for it: the delivery log shows the ones that failed, and Send again delivers them.
Allowed URLs. Public https addresses only. Addresses on localhost, private
networks and cloud metadata ranges are refused when you add them and again before every delivery.