curl --request POST \
--url https://{subdomain}.conveyour.com/api/triggers \
--header 'Content-Type: application/json' \
--header 'x-conveyour-token: <api-key>' \
--data '
{
"campaign_id": "<string>",
"type": "<string>",
"name": "<string>",
"delay": 123,
"draft": true,
"...": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
campaign_id: '<string>',
type: '<string>',
name: '<string>',
delay: 123,
draft: true,
'...': '<string>'
})
};
fetch('https://{subdomain}.conveyour.com/api/triggers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
campaign_id: '<string>',
type: '<string>',
name: '<string>',
delay: 123,
draft: true,
'...': '<string>'
})
};
fetch('https://{subdomain}.conveyour.com/api/triggers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/triggers"
payload = {
"campaign_id": "<string>",
"type": "<string>",
"name": "<string>",
"delay": 123,
"draft": True,
"...": "<string>"
}
headers = {
"x-conveyour-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/triggers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'campaign_id' => '<string>',
'type' => '<string>',
'name' => '<string>',
'delay' => 123,
'draft' => true,
'...' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "success",
"data": {
"id": "64a1b2c3d4e5f6a7b8c9d0e1",
"campaign_id": "CAMPAIGN_ID",
"type": "lesson"
}
}{
"status": "failed",
"message": "Lacking necessary permission add_contacts",
"data": {
"permission": "add_contacts"
}
}Create a trigger
Creates a new trigger.
Create a trigger
Permission: Requires automations or campaigns; sending type: "lesson" additionally requires lessons. Denials read Manage Automations or Campaigns.
How a trigger relates to a campaign. campaign_id in the body decides scoping and is optional:
- Omit it and the trigger is scoped to your team directly — this is the automation case.
- Pass a default (simple) campaign and it is likewise scoped to the team.
- Pass a regular campaign and the trigger is scoped to the org and user instead, with no
team_idstored on it. That is deliberate — storing a team on a trigger inside a shared campaign would produce a campaign only some members can see.
If the campaign id cannot be resolved within your team scope, the request is narrowed rather than rejected, so a wrong id yields an empty or unexpected scope instead of an error.
curl --request POST \
--url https://{subdomain}.conveyour.com/api/triggers \
--header 'Content-Type: application/json' \
--header 'x-conveyour-token: <api-key>' \
--data '
{
"campaign_id": "<string>",
"type": "<string>",
"name": "<string>",
"delay": 123,
"draft": true,
"...": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
campaign_id: '<string>',
type: '<string>',
name: '<string>',
delay: 123,
draft: true,
'...': '<string>'
})
};
fetch('https://{subdomain}.conveyour.com/api/triggers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
campaign_id: '<string>',
type: '<string>',
name: '<string>',
delay: 123,
draft: true,
'...': '<string>'
})
};
fetch('https://{subdomain}.conveyour.com/api/triggers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/triggers"
payload = {
"campaign_id": "<string>",
"type": "<string>",
"name": "<string>",
"delay": 123,
"draft": True,
"...": "<string>"
}
headers = {
"x-conveyour-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/triggers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'campaign_id' => '<string>',
'type' => '<string>',
'name' => '<string>',
'delay' => 123,
'draft' => true,
'...' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "success",
"data": {
"id": "64a1b2c3d4e5f6a7b8c9d0e1",
"campaign_id": "CAMPAIGN_ID",
"type": "lesson"
}
}{
"status": "failed",
"message": "Lacking necessary permission add_contacts",
"data": {
"permission": "add_contacts"
}
}Authorizations
Your API key token. Contacts endpoints require a Server-only — Full API key — see Authentication.
Query Parameters
Team scope for the request, as one or more team ObjectIds. The brackets are required: PHP keeps only the last value for a repeated plain key, so teams=A&teams=B silently resolves to B alone. On requests with a JSON body you may send teams (no brackets) in the body instead.
Values that are not valid ObjectIds are silently ignored — a mistyped team ID behaves as if no team was sent. See the teams section of the API conventions guide.
Body
The campaign this trigger belongs to.
The trigger type. Valid values include lesson, sms, email, and contactupdate (plus other types returned in data.types from GET /api/triggers). Values like send_lesson or send_sms are invalid and fail with "Cannot create trigger".
Optional display name for the trigger.
Delay in seconds before the trigger fires.
When true, saves the trigger as a draft (not live).
Type-specific fields (e.g. lesson_id for the lesson type). See GET /api/triggers data.schemas for the full list per type.
Response
Success.
The common response envelope shared by all ConveYour endpoints.