Update an automation
Changes an automation.
A new definition replaces the draft; an active automation keeps running what it was activated with until it is activated again.
Guide: Automations
A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.
In: header
Path parameters
The project's id, proj_.... A secret key works only in the project it belongs to.
The automation's id, auto_....
Request body
application/json
TypeScript definitions
Use the request body type in TypeScript.
The new name, 1 to 255 characters.
The new description, up to 1,000 characters; null removes it.
The new environment: production or test.
The new draft, replacing the whole draft. An active automation keeps running its activated version until it is activated again.
The revision you read. The update fails with conflict (automation_revision_conflict) if someone saved since, instead of overwriting them.
Examples
curl -X PATCH "https://api.voidhash.com/api/v1/projects/proj_tz4a98xxat96iws9zmbrgj3a/automations/auto_p4n8c2v6x0z3q7w1e5r9t2y6" \ -H "Authorization: Bearer vh_sk_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome series (spring)", "expectedRevision": 4 }'{ "id": "auto_p4n8c2v6x0z3q7w1e5r9t2y6", "projectId": "proj_tz4a98xxat96iws9zmbrgj3a", "name": "Welcome series (spring)", "description": "Greets new users and nudges them after a day.", "status": "active", "environment": "production", "definition": { "version": 1, "trigger": { "type": "person_signed_up", "config": {}, "next": "welcome" }, "nodes": [ { "id": "welcome", "type": "send_push", "config": { "title": "Hi {{ person.name | default: \"there\" }}", "body": "Glad you're here." }, "next": { "out": "wait" } }, { "id": "wait", "type": "delay", "config": { "duration": { "amount": 1, "unit": "days" } }, "next": { "out": "paid" } }, { "id": "paid", "type": "condition", "config": { "condition": { "match": "all", "rules": [ { "field": "person.entitlements", "operator": "contains", "value": "premium" } ] } }, "next": { "no": "nudge" } }, { "id": "nudge", "type": "send_push", "config": { "title": "Still thinking?", "body": "Your trial is waiting." }, "next": {} } ], "settings": { "reentry": "once", "exitOn": [ "$subscription.created" ] } }, "revision": 5, "hasUnpublishedChanges": false, "activeVersionId": "auto_ver_s2d6f0g4h8j1k5l9z3x7c1v5", "triggerType": "person_signed_up", "activatedAt": "2026-03-05T10:00:00.000Z", "nextFireAt": null, "createdAt": "2026-03-04T15:30:00.000Z", "updatedAt": "2026-03-14T11:00:00.000Z", "issues": []}{ "error": { "type": "invalid_request", "code": "invalid_body", "message": "The request body is invalid: Expected object" }}{ "error": { "type": "unauthenticated", "code": "invalid_api_key", "message": "This secret key is not valid." }}{ "error": { "type": "permission_denied", "code": "permission_denied", "message": "Insufficient permissions." }}{ "error": { "type": "not_found", "code": "project_not_found", "message": "There is no project proj_tz4a98xxat96iws9zmbrgj3a, or this credential cannot use it.", "param": "projectId" }}{ "error": { "type": "conflict", "code": "automation_revision_conflict", "message": "Someone saved this automation since you read it; it is at revision 4. Read it again and reapply your change.", "param": "expectedRevision" }}{ "error": { "type": "internal", "code": "internal_error", "message": "Something went wrong on our side. Try again, and contact support with the Request-Id header if it keeps failing." }}Response body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
Errors
| Status | type | code | When |
|---|---|---|---|
| 409 | conflict | automation_revision_conflict | When expectedRevision is out of date. |
| 409 | conflict | automation_archived | For an archived automation. |
It can also fail with the errors every operation shares, such as unauthenticated; see Errors.
More in Automations
- List automations
GET - Create an automation
POST - Retrieve the automation catalog
GET - List audience cohorts
GET - Retrieve an automation
GET - Check an automation
POST - Test an automation
POST - Activate an automation
POST - Pause an automation
POST - Archive an automation
POST - Unarchive an automation
POST - List an automation's versions
GET - Retrieve an automation's stats
GET - List an automation's runs
GET - Start a run
POST - Retrieve a run
GET - Cancel a run
POST - Retry a run
POST
Something wrong or missing on this page? Tell us by email or on Discord.