curl --request PATCH \
--url https://core-api.agentova.ai/v1/automations/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"status": "paused"
}
'import requests
url = "https://core-api.agentova.ai/v1/automations/{id}"
payload = { "status": "paused" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({status: 'paused'})
};
fetch('https://core-api.agentova.ai/v1/automations/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.agentova.ai/v1/automations/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'status' => 'paused'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core-api.agentova.ai/v1/automations/{id}"
payload := strings.NewReader("{\n \"status\": \"paused\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://core-api.agentova.ai/v1/automations/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"status\": \"paused\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.agentova.ai/v1/automations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"status\": \"paused\"\n}"
response = http.request(request)
puts response.read_body{
"id": "aut_01HZX3Q8K5N7P2R4S6T8V0W2Y4",
"name": "Comment replies — Support Agent",
"type": "social_comments",
"provider": "instagram_page",
"agent_id": "agt_01HZX3Q8K5N7P2R4S6T8V0W2Y5",
"agent_name": "Support Agent",
"status": "active",
"updated_at": "2026-08-21T07:00:00Z"
}Update an automation's status
Pauses (paused) or resumes (active) an automation. The body accepts
only these two values; any other value returns 400 invalid_request.
The body accepts no other field: an unknown field (a typo such as
statut) returns 400 invalid_request with the field name in
details.parameter, so a request that would change nothing is never
silently accepted.
- Idempotent: asking for the status the automation already has
returns
200and changes nothing (no event is sent). - Not controllable: an automation in
draftorerrorreturns422 automation_not_controllable(details.status). It has to be activated or repaired in the Agentova app first. - One mailbox, one agent: resuming an e-mail automation whose
mailbox is already used by another active agent returns
422 automation_not_controllablewithdetails.reason: account_in_use, as in the Agentova app. - Response time: the response is sent within 8 seconds. Resuming
can take longer, because the channel has to be reconnected: the
response then carries the current status, the work goes on in the
background, and the final status is announced by an
automation.status_changedevent. If the channel cannot be reconnected, the automation ends inerror(in the response or in that event) and has to be resumed from the Agentova app.
What a pause does depends on the channel. Except for Customer.io after a short pause (see below), nothing that arrives during the pause is caught up after the resume.
- E-mail (Gmail, Outlook, IMAP): pausing stops listening to the mailbox, exactly like the switch in the Agentova app, unless another active agent uses the same mailbox. E-mails received during the pause never get a reply from this automation. Resuming reconnects the mailbox and only handles the e-mails that arrive after the resume.
- Meta messages, WhatsApp, comments and stories: everything that arrives during the pause is ignored.
- Lead Ads: leads keep being recorded in Agentova and announced by
lead.created. Only the automation’s own actions (message, e-mail, call…) are skipped during the pause, and they are not run later. - CRM sources: pausing removes the trigger that listens to the CRM, and resuming sets it up again; CRM events that occur during the pause are never replayed. For Customer.io, which Agentova reads every 15 minutes, a paused automation is not read. After a pause of more than 6 hours, the segment changes made during the pause are never replayed; after a shorter pause, they may be handled when the automation resumes.
curl --request PATCH \
--url https://core-api.agentova.ai/v1/automations/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"status": "paused"
}
'import requests
url = "https://core-api.agentova.ai/v1/automations/{id}"
payload = { "status": "paused" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({status: 'paused'})
};
fetch('https://core-api.agentova.ai/v1/automations/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.agentova.ai/v1/automations/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'status' => 'paused'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core-api.agentova.ai/v1/automations/{id}"
payload := strings.NewReader("{\n \"status\": \"paused\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://core-api.agentova.ai/v1/automations/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"status\": \"paused\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.agentova.ai/v1/automations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"status\": \"paused\"\n}"
response = http.request(request)
puts response.read_body{
"id": "aut_01HZX3Q8K5N7P2R4S6T8V0W2Y4",
"name": "Comment replies — Support Agent",
"type": "social_comments",
"provider": "instagram_page",
"agent_id": "agt_01HZX3Q8K5N7P2R4S6T8V0W2Y5",
"agent_name": "Support Agent",
"status": "active",
"updated_at": "2026-08-21T07:00:00Z"
}Authorizations
API key created in the Agentova app (Settings → API), sent as Authorization: Bearer agk_live_…. One key = one workspace: the key determines the workspace, and no workspace identifier ever travels in requests. The Bearer scheme is case-insensitive. A revoked key is refused immediately.
Path Parameters
Opaque aut_… identifier, as returned by the API.
Body
paused to pause the automation, active to resume it.
active, paused Response
The automation after the request (returned unchanged if it already had the requested status). When a resume is still in progress after 8 seconds, this is the current status; the final one is announced by automation.status_changed.
An automation of the workspace, carried out by one agent.
Opaque identifier prefixed with aut_. Stable for a given automation.
Display label in English: what the automation does, then the agent's name (for example Comment replies — Support Agent, or HubSpot contacts — Support Agent for a CRM source). For display only: it can change, and two automations can share one.
social_comments, social_story and lead_ads cover the Meta networks (Facebook, Instagram). social_messages replies to private messages on the Meta networks and on WhatsApp (the provider field tells them apart). email_messages replies to the e-mails of a Gmail, Outlook or IMAP mailbox. crm_source is an automation triggered by a CRM.
social_comments, social_story, social_messages, lead_ads, email_messages, crm_source The connected service, as a raw value. Messaging automations: facebook, instagram, instagram_page, whatsapp, gmail, microsoft_outlook, imap. CRM sources carry the name of the CRM (for example hubspot). Treat it as an open string: new values can appear.
Opaque identifier of the agent, prefixed with agt_.
Name of the agent.
active: running.paused: paused from the Agentova app or throughPATCH.draft: never activated; it has to be activated from the Agentova app.error: stopped by a failure that has to be fixed from the Agentova app (for example a lost e-mail connection, a channel that could not be reconnected on resume, or a subscription to the provider that could not be renewed).
PATCH only acts on active and paused automations.
An automation that is deleted or deactivated in the Agentova app, or
whose connected account is disconnected, is no longer returned by the
API (404 automation_not_found). When a failure is what removes it
(revoked token, mailbox authentication refused, reconnection
impossible), a last automation.status_changed event is sent first,
with status: error. When the account is reconnected, an
automation.status_changed event with status: active is sent for
each automation that comes back. A deliberate deletion sends no event.
active, paused, draft, error Date of the last change to the automation. Use it to order automation.status_changed events.