Update a automation
/api/v1/automations/{automation}Parameters
| Name | In | Type | Description |
|---|---|---|---|
automationrequired | path | string | The automation identifier. |
Request body
namestringA name for your team, like
Welcome series.entry_rulestringonce | every_time | cooldownWhether a contact can go through it more than once:
onceever,every_timethe trigger happens, orcooldown(again only aftersettings.cooldown_hours).graphobjectThe steps, as
{"nodes": [...], "edges": [...]}. The easiest way to get a valid one is to build it in the dashboard, or start from a recipe (GET /automations/recipes), and read it back withGET /automations/{id}.GET /automations/node-typeslists the step types and their settings.nodesarrayThe steps, each
{"id", "type", "config"}.GET /automations/node-typeslists the types and what goes inconfig.edgesarrayHow the steps connect, each
{"from", "to"}with step IDs, plus"branch"after a step that splits.
settingsobjectOptional. When contacts leave early (
exit_events,exits), thegoals, thestream(marketingortransactional) and, forentry_rule: cooldown, thecooldown_hoursbetween entries. Read the current values withGET /automations/{id}.exit_eventsarray<string>Events that take a contact out early, by name, like
order_completed.exitsobjectWhen a contact leaves early.
eventsarray<object>Events that take a contact out early, each
{"event": "order_completed"}, optionally only when the event's properties matchwhere.eventstringrequiredWhich delivery event to pretend happened.
wherearrayOptional. Conditions on the event's properties, like a segment's rules.
matchstringall | anyallconditions inwheremust match, oranyone.
on_unsubscribebooleanTake the contact out when they unsubscribe.
on_replybooleanTake the contact out when they reply to one of its emails.
segments_enteredarray<string>Take the contact out when they join one of these segments, by segment ID.
goalsarrayWhat counts as success, shown in the automation's report.
streamstringmarketing | transactionaltransactionalfor emails your app sends one at a time, like receipts and sign-in codes;marketingfor newsletters and promotions. They go out from different addresses so one cannot harm the other.cooldown_hoursintegerWith
entry_rule: cooldown: how many hours before a contact may go through again.
Request
/api/v1/automations/{automation}curl -X PUT 'https://app.mailyte.com/api/v1/automations/01JBT8XQ2M9WYC3K4F6R7S8T9V' \
-H 'Authorization: Bearer mk_live_YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "Welcome series"
}'const response = await fetch('https://app.mailyte.com/api/v1/automations/01JBT8XQ2M9WYC3K4F6R7S8T9V', {
method: 'PUT',
headers: {
Authorization: 'Bearer mk_live_YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Welcome series"
}),
});
const { data } = await response.json();import requests
response = requests.put(
"https://app.mailyte.com/api/v1/automations/01JBT8XQ2M9WYC3K4F6R7S8T9V",
headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
json={
"name": "Welcome series"
},
)
data = response.json()["data"]<?php
$response = Http::withToken('mk_live_YOUR_API_KEY')
->put('https://app.mailyte.com/api/v1/automations/01JBT8XQ2M9WYC3K4F6R7S8T9V', [
'name' => 'Welcome series',
]);
$data = $response->json('data');require "net/http"
require "json"
uri = URI("https://app.mailyte.com/api/v1/automations/01JBT8XQ2M9WYC3K4F6R7S8T9V")
request = Net::HTTP::Put.new(uri)
request["Authorization"] = "Bearer mk_live_YOUR_API_KEY"
request["Content-Type"] = "application/json"
request.body = {
"name": "Welcome series"
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }Response
Success.
dataobjectidstringnamestringstatestringdraft | live | paused | archivedentry_rulestringonce | every_time | cooldownWhether a contact may enter more than once.
settingsobjectexit_eventsarray<string>Event names that end a run early, checked before every step.
exitsobjectThe full exit rules: events (with optional property filters), whether unsubscribing exits, and segments whose entry exits.
eventsarray<object>on_unsubscribebooleanon_replybooleanLeave the journey when the contact replies to any of its emails (auto-replies ignored).
segments_enteredarray<string>
streamstringmarketing | transactionalcooldown_hoursinteger
graphobjectThe editable draft: {nodes[{id,type,config}], edges[{from,to,branch?}]}. Publishing snapshots it into a version.
validationobjectokbooleanerrorsobjectProblems keyed by node id (nodes.<id>.<field>) or graph/settings.
live_versionobjectidstringnumberintegerpublished_atstring
paused_bystringuser | breakercountsobjectin_flightintegerRuns that have not finished.
completedintegerexitedintegerfailedintegeremails_sentintegerEmails this automation has actually sent, across every version. Only counted on the list; 0 elsewhere.
published_atstringpaused_atstringarchived_atstringcreated_atstringupdated_atstring
Returned inside the standard envelope.
Errors
| Status | When |
|---|---|
401 | The API key is missing, unknown, revoked or expired. All four answer identically, on purpose: distinguishing them would confirm which keys exist. |
403 | The key is valid but may not do this: it lacks the required scope, its IP allowlist does not include you, or this endpoint does not accept API keys. |
404 | No such resource in this organization. |
422 | The request was understood but the values were not acceptable. |
429 | Too many requests, or the organization has spent its sending allowance. `Retry-After` says how long to wait. |
Every status, with what causes it and what to do, is on the error reference.