Sequences
Create Sequence
Create an automation sequence with AI-generated or explicit email/action steps
POST
/
api
/
v1
/
sequences
Create Sequence
curl --request POST \
--url https://api.sequenzy.com/api/v1/sequences \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"labels": [
"<string>"
],
"userCancellable": true,
"bccEmails": [
"<string>"
],
"trigger": "<string>",
"fromEmail": "<string>",
"fromName": "<string>",
"senderProfileId": "<string>",
"replyTo": "<string>",
"replyToName": "<string>",
"replyProfileId": "<string>",
"listId": "<string>",
"tagName": "<string>",
"segmentId": "<string>",
"stopOnSegmentExit": true,
"eventName": "<string>",
"integrationSlug": "<string>",
"integrationEventKey": "<string>",
"customIntegration": {},
"propertyFilters": [
{
"path": "<string>",
"operator": "<string>",
"value": {}
}
],
"inactiveDays": 123,
"inactivityBaseline": "<string>",
"minCount": 123,
"timeWindowDays": 123,
"enrollmentMode": "<string>",
"enrollmentFieldPath": "<string>",
"sendingWindow": {
"enabled": true,
"timezone": "<string>",
"startTime": "<string>",
"endTime": "<string>",
"days": [
{}
]
},
"stopCondition": {},
"goal": "<string>",
"emailCount": 123,
"durationDays": 123,
"emailStyle": "<string>",
"steps": [
{
"type": "<string>",
"nodeType": "<string>",
"config": {},
"subject": "<string>",
"text": "<string>",
"imageUrls": [
{}
],
"ineligibleAction": "<string>",
"label": "<string>",
"previewText": "<string>",
"isTransactional": true,
"ccEmails": [
"<string>"
],
"bccEmails": [
"<string>"
],
"attachments": [
{}
],
"blocks": [
{}
],
"html": "<string>",
"delay": {
"mode": "<string>",
"days": 123,
"hours": 123,
"minutes": 123,
"untilDateField": "<string>",
"untilOffsetDirection": "<string>",
"untilMissingAction": "<string>"
},
"waitUntil": {
"field": "<string>",
"offset": {},
"direction": "<string>",
"missingAction": "<string>"
},
"delayMs": 123,
"name": "<string>",
"discount": {
"label": "<string>",
"provider": "<string>",
"discountType": "<string>",
"percentOff": 123,
"amountOff": 123,
"currency": "<string>",
"duration": "<string>",
"durationInMonths": 123,
"appliesToAllPlans": true,
"planIds": [
{}
],
"codePrefix": "<string>",
"maxRedemptions": 123,
"lockToSubscriber": true,
"expiresAt": "<string>",
"expiresInHours": 123,
"name": "<string>"
}
}
]
}
'import requests
url = "https://api.sequenzy.com/api/v1/sequences"
payload = {
"name": "<string>",
"description": "<string>",
"labels": ["<string>"],
"userCancellable": True,
"bccEmails": ["<string>"],
"trigger": "<string>",
"fromEmail": "<string>",
"fromName": "<string>",
"senderProfileId": "<string>",
"replyTo": "<string>",
"replyToName": "<string>",
"replyProfileId": "<string>",
"listId": "<string>",
"tagName": "<string>",
"segmentId": "<string>",
"stopOnSegmentExit": True,
"eventName": "<string>",
"integrationSlug": "<string>",
"integrationEventKey": "<string>",
"customIntegration": {},
"propertyFilters": [
{
"path": "<string>",
"operator": "<string>",
"value": {}
}
],
"inactiveDays": 123,
"inactivityBaseline": "<string>",
"minCount": 123,
"timeWindowDays": 123,
"enrollmentMode": "<string>",
"enrollmentFieldPath": "<string>",
"sendingWindow": {
"enabled": True,
"timezone": "<string>",
"startTime": "<string>",
"endTime": "<string>",
"days": [{}]
},
"stopCondition": {},
"goal": "<string>",
"emailCount": 123,
"durationDays": 123,
"emailStyle": "<string>",
"steps": [
{
"type": "<string>",
"nodeType": "<string>",
"config": {},
"subject": "<string>",
"text": "<string>",
"imageUrls": [{}],
"ineligibleAction": "<string>",
"label": "<string>",
"previewText": "<string>",
"isTransactional": True,
"ccEmails": ["<string>"],
"bccEmails": ["<string>"],
"attachments": [{}],
"blocks": [{}],
"html": "<string>",
"delay": {
"mode": "<string>",
"days": 123,
"hours": 123,
"minutes": 123,
"untilDateField": "<string>",
"untilOffsetDirection": "<string>",
"untilMissingAction": "<string>"
},
"waitUntil": {
"field": "<string>",
"offset": {},
"direction": "<string>",
"missingAction": "<string>"
},
"delayMs": 123,
"name": "<string>",
"discount": {
"label": "<string>",
"provider": "<string>",
"discountType": "<string>",
"percentOff": 123,
"amountOff": 123,
"currency": "<string>",
"duration": "<string>",
"durationInMonths": 123,
"appliesToAllPlans": True,
"planIds": [{}],
"codePrefix": "<string>",
"maxRedemptions": 123,
"lockToSubscriber": True,
"expiresAt": "<string>",
"expiresInHours": 123,
"name": "<string>"
}
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
labels: ['<string>'],
userCancellable: true,
bccEmails: ['<string>'],
trigger: '<string>',
fromEmail: '<string>',
fromName: '<string>',
senderProfileId: '<string>',
replyTo: '<string>',
replyToName: '<string>',
replyProfileId: '<string>',
listId: '<string>',
tagName: '<string>',
segmentId: '<string>',
stopOnSegmentExit: true,
eventName: '<string>',
integrationSlug: '<string>',
integrationEventKey: '<string>',
customIntegration: {},
propertyFilters: [{path: '<string>', operator: '<string>', value: {}}],
inactiveDays: 123,
inactivityBaseline: '<string>',
minCount: 123,
timeWindowDays: 123,
enrollmentMode: '<string>',
enrollmentFieldPath: '<string>',
sendingWindow: {
enabled: true,
timezone: '<string>',
startTime: '<string>',
endTime: '<string>',
days: [{}]
},
stopCondition: {},
goal: '<string>',
emailCount: 123,
durationDays: 123,
emailStyle: '<string>',
steps: [
{
type: '<string>',
nodeType: '<string>',
config: {},
subject: '<string>',
text: '<string>',
imageUrls: [{}],
ineligibleAction: '<string>',
label: '<string>',
previewText: '<string>',
isTransactional: true,
ccEmails: ['<string>'],
bccEmails: ['<string>'],
attachments: [{}],
blocks: [{}],
html: '<string>',
delay: {
mode: '<string>',
days: 123,
hours: 123,
minutes: 123,
untilDateField: '<string>',
untilOffsetDirection: '<string>',
untilMissingAction: '<string>'
},
waitUntil: {
field: '<string>',
offset: {},
direction: '<string>',
missingAction: '<string>'
},
delayMs: 123,
name: '<string>',
discount: {
label: '<string>',
provider: '<string>',
discountType: '<string>',
percentOff: 123,
amountOff: 123,
currency: '<string>',
duration: '<string>',
durationInMonths: 123,
appliesToAllPlans: true,
planIds: [{}],
codePrefix: '<string>',
maxRedemptions: 123,
lockToSubscriber: true,
expiresAt: '<string>',
expiresInHours: 123,
name: '<string>'
}
}
]
})
};
fetch('https://api.sequenzy.com/api/v1/sequences', 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://api.sequenzy.com/api/v1/sequences",
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([
'name' => '<string>',
'description' => '<string>',
'labels' => [
'<string>'
],
'userCancellable' => true,
'bccEmails' => [
'<string>'
],
'trigger' => '<string>',
'fromEmail' => '<string>',
'fromName' => '<string>',
'senderProfileId' => '<string>',
'replyTo' => '<string>',
'replyToName' => '<string>',
'replyProfileId' => '<string>',
'listId' => '<string>',
'tagName' => '<string>',
'segmentId' => '<string>',
'stopOnSegmentExit' => true,
'eventName' => '<string>',
'integrationSlug' => '<string>',
'integrationEventKey' => '<string>',
'customIntegration' => [
],
'propertyFilters' => [
[
'path' => '<string>',
'operator' => '<string>',
'value' => [
]
]
],
'inactiveDays' => 123,
'inactivityBaseline' => '<string>',
'minCount' => 123,
'timeWindowDays' => 123,
'enrollmentMode' => '<string>',
'enrollmentFieldPath' => '<string>',
'sendingWindow' => [
'enabled' => true,
'timezone' => '<string>',
'startTime' => '<string>',
'endTime' => '<string>',
'days' => [
[
]
]
],
'stopCondition' => [
],
'goal' => '<string>',
'emailCount' => 123,
'durationDays' => 123,
'emailStyle' => '<string>',
'steps' => [
[
'type' => '<string>',
'nodeType' => '<string>',
'config' => [
],
'subject' => '<string>',
'text' => '<string>',
'imageUrls' => [
[
]
],
'ineligibleAction' => '<string>',
'label' => '<string>',
'previewText' => '<string>',
'isTransactional' => true,
'ccEmails' => [
'<string>'
],
'bccEmails' => [
'<string>'
],
'attachments' => [
[
]
],
'blocks' => [
[
]
],
'html' => '<string>',
'delay' => [
'mode' => '<string>',
'days' => 123,
'hours' => 123,
'minutes' => 123,
'untilDateField' => '<string>',
'untilOffsetDirection' => '<string>',
'untilMissingAction' => '<string>'
],
'waitUntil' => [
'field' => '<string>',
'offset' => [
],
'direction' => '<string>',
'missingAction' => '<string>'
],
'delayMs' => 123,
'name' => '<string>',
'discount' => [
'label' => '<string>',
'provider' => '<string>',
'discountType' => '<string>',
'percentOff' => 123,
'amountOff' => 123,
'currency' => '<string>',
'duration' => '<string>',
'durationInMonths' => 123,
'appliesToAllPlans' => true,
'planIds' => [
[
]
],
'codePrefix' => '<string>',
'maxRedemptions' => 123,
'lockToSubscriber' => true,
'expiresAt' => '<string>',
'expiresInHours' => 123,
'name' => '<string>'
]
]
]
]),
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://api.sequenzy.com/api/v1/sequences"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.sequenzy.com/api/v1/sequences")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/sequences")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Sequence created. AI is generating email content based on your brand. This typically takes 30-60 seconds.",
"sequence": {
"id": "seq_abc123",
"name": "Onboarding Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 5,
"sendingWindow": {
"enabled": true,
"timezone": "Europe/Kiev",
"startTime": "08:00",
"endTime": "20:00",
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}
}
}
{
"success": true,
"message": "Sequence created with 2 emails and 1 discount action spanning 1 day. Use POST /api/v1/sequences/{id}/enable to activate.",
"sequence": {
"id": "seq_abc123",
"name": "Welcome Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 2,
"discountCount": 1,
"nodeCount": 6,
"sendingWindow": null
}
}
{
"success": true,
"message": "Sequence created with 1 email. Use POST /api/v1/sequences/{id}/enable to activate. Add the custom event feed using eventTrackingCode and eventTracking before enabling.",
"sequence": {
"id": "seq_abc123",
"name": "Trial Started",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 1,
"nodeCount": 3
},
"eventTrackingCode": "await fetch(\"https://api.sequenzy.com/api/v1/subscribers/events\", { ... properties: { trial_id: \"<trial_id>\" } ... });",
"eventTracking": {
"endpoint": "https://api.sequenzy.com/api/v1/subscribers/events",
"method": "POST",
"docsUrl": "https://docs.sequenzy.com/api-reference/subscribers/events/trigger",
"integrationGuide": {
"tool": "get_integration_guide",
"arguments": { "use_case": "event_tracking" }
},
"payloadContract": {
"required": ["event", "properties"],
"identity": "Provide email or externalId. Email is required when the subscriber does not already exist.",
"event": "Must equal \"trial.started\".",
"requiredPropertyPaths": ["trial_id"]
},
"examplePayload": {
"email": "user@example.com",
"event": "trial.started",
"properties": { "trial_id": "<trial_id>" }
},
"examplePayloadMatchesFilters": true
},
"requiredEvents": ["trial.started"]
}
{
"error": "Either 'goal' (for AI generation) or 'steps' (for explicit content) is required"
}
{
"error": "Step 1: either 'blocks' or 'html' is required"
}
{
"error": "Step 1: expiresAt must be in the future"
}
{
"error": "Invalid trigger type 'invalid'. Valid types: contact_added, tag_added, segment_entered, event_received, inactivity, frequency"
}
{
"error": "propertyFilters is only supported for the event_received trigger"
}
{
"error": "propertyFilters[0].value is required for the 'equals' operator"
}
{
"error": "emailCount must be no more than 10"
}
{
"error": "Invalid API key"
}
{
"error": "No companies found. Create a company first using the create_company tool."
}
Create Sequence
Create an automation sequence that sends emails based on triggers. You can:- Provide a
goalto have AI generate the email content - Provide
stepswith explicit email content and actions such as discount creation or Update Subscriber - Omit both
goalandstepsto create the same blank trigger-to-completion draft the dashboard starts with
"effectiveStatus": "draft" and nobody is enrolled until you call
Enable Sequence. See
List Sequences for the full run-state mapping.
Request
string
required
Name for the sequence
string
Dashboard description for the sequence.
string[]
Dashboard label names. Missing labels are created automatically.
boolean
Whether recipients can cancel this sequence from email preferences.
string[]
Up to 10 addresses blind-copied on every sequence email.
string
Trigger type:
contact_added, tag_added, segment_entered,
event_received, inbound_webhook, inactivity, or frequency. Defaults to
contact_added when omitted.string
From address for every email in this sequence. Its domain must be configured
and verified. Mutually exclusive with
senderProfileId.string
Display name for a newly created sender profile. Requires
fromEmail; omit it
when you send senderProfileId, which already carries its own display name.string
Existing sender profile ID. It already supplies both the From address and the
display name, so send it on its own and omit
fromEmail and fromName.string
Reply-To address for every email in this sequence. Mutually exclusive with
replyProfileId.string
Display name for a newly created reply profile. Requires
replyTo; omit it
when you send replyProfileId, which already carries its own display name.string
Existing reply profile ID. It already supplies both the Reply-To address and
the display name, so send it on its own and omit
replyTo and replyToName.string
List ID (for
contact_added trigger)string
Tag name (for
tag_added trigger)string
Segment ID (for
segment_entered trigger)boolean
For
segment_entered, cancel an enrollment when the subscriber leaves the
segment.string
Event name (for
event_received, inactivity, frequency triggers)string
Integration slug for an
inbound_webhook trigger.string
Integration event key for an
inbound_webhook trigger.object
Custom integration metadata for an
inbound_webhook trigger.array
Event property filters (for
event_received and inbound_webhook triggers,
maximum 10).
The sequence only starts when the triggering event’s properties match ALL
filters. Use a dot-path into the event properties; use [] to match items
inside arrays, for example lineItems[].providerProductId.Show Filter properties
Show Filter properties
string
required
Dot-path into the event properties, such as
plan,
lineItems[].providerProductId, or productIds.string
required
One of
exists, not_exists, equals, not_equals, one_of,
contains, greater_than, or less_than. one_of matches when the
property equals any entry of the value array - for example, scope a
trigger to several products with
{"path": "lineItems[].providerProductId", "operator": "one_of", "value": ["prod_1", "prod_2"]}.string | number | boolean | array
Value to compare against. Required for every operator except
exists
and not_exists. For one_of, pass a non-empty array of strings or
numbers with at most 50 values; all other operators take a single
value.number
Days of inactivity (for
inactivity trigger)string
For
inactivity triggers, when to start counting for subscribers who have
never performed the event: sequence_created_at or subscriber_created_at.
Defaults to sequence_created_at.number
Minimum event count (for
frequency trigger)number
Time window in days (for
frequency trigger)string
Re-entry mode:
unlimited, one_time, or matching_field. Defaults to
matching_field for Shopify replenishment and back-in-stock events, otherwise
unlimited. matching_field is only valid for event_received and
inbound_webhook sequence triggers.string
Scalar dot-path event property used by
matching_field, such as order.id or
product.providerVariantId. Array traversal with [] is not supported; use
propertyFilters when the trigger must match values inside an array. Leave
empty for the built-in Shopify product/variant default.object
Optional local-time sending window for every email step in the sequence. Email
steps that become due outside the window wait until the next allowed local
time.
Show Sending window properties
Show Sending window properties
boolean
Set to
false to disable the window. Omit sendingWindow when you do not
want a sending restriction.string
required
IANA timezone for the window, such as
Europe/Kiev or
America/New_York.string
required
Earliest local send time in
HH:mm format, for example 08:00.string
required
Latest local send cutoff in
HH:mm format, for example 20:00. Must be
later than startTime.array
Allowed local days. Use full day names such as
monday; omit to allow
every day.object
Optional auto-stop condition, re-evaluated before every step including the
first one. Use
has_tag to end the sequence when a subscriber gets a tag,
event_received when an event is tracked, added_to_list when a subscriber
joins a list, entered_segment when a subscriber enters a segment,
field_changed when a subscriber attribute changes, or none to clear
auto-stop behavior. does_not_have_tag and removed_from_list stop the run
whenever the subscriber lacks that tag or list membership, so they act as a
required-tag or required-list allowlist and cancel everyone else before any
step sends. Guarded-out contacts still enroll and are then cancelled at the
trigger node, so they appear as cancellations there rather than in the active
or waiting enrollment counts. Clearing the guard does not retry them: they
only receive the sequence if the trigger fires for them again, and on the
one_time enrollment mode not even then. event_received can include
matchConfig.mode: "event_property" with field mapping rules; field_changed
can include matchConfig.mode: "field_value" with an operator and comparison
value.Option A: AI Generation
string
Description of what the sequence should accomplish. AI will generate email
content based on this.
number
Number of emails to generate (default:
5, maximum: 10)number
Total duration in days used to space AI-generated emails. Omit this to use the
default sequence delay schedule.
string
Style for the AI-generated emails:
visual (designed, with heroes, imagery,
and rich sections) or plain (personal, text-first notes with a single
button). Defaults to the company’s saved preference when omitted.Option B: Explicit Content
array
Array of explicit steps. Email steps must have either
blocks or html; SMS steps use type: "sms" with text; discount steps use type: "create_discount"; Update Subscriber steps use type: "update_subscriber", nodeType: "action_update_attributes", and config.Show Step properties
Show Step properties
string
Step type. Omit or use
email for email content. Use sms for a native SMS step, create_discount for a dynamic discount, or update_subscriber to copy event data onto the subscriber.string
Use
action_update_attributes for Update Subscriber steps.object
Update Subscriber step config.
firstName, lastName, and
customAttributeUpdates[].value can use standalone merge tags such as
{{event.plan}}, {{event.amount}}, and {{event.active}}. Set
valueType to text, number, or boolean; number and boolean values
are coerced after resolution.string
required
Email subject line. Required for email steps.
string
SMS steps only: plain-text message body. Merge tags like
{{FIRST_NAME}} work. Do not include opt-out text or a brand prefix - Sequenzy adds both automatically at send time. Generate drafts with the Generate SMS endpoint.array
SMS steps only: up to 2 publicly reachable image URLs sent as MMS media.
string
SMS steps only:
skip (default) continues the sequence when the contact can’t receive SMS (no phone, not opted in, unsupported country); exit removes them from the sequence.string
SMS steps only: display label for the step in the builder.
string
Email preview text
boolean
Use transactional chrome for this sequence email.
string[]
Per-step visible copy recipients.
string[]
Per-step blind-copy recipients.
array
URL-backed file attachments for this email step, as
{ filename, path }
objects. path can be a public HTTPS URL or, for an event-triggered
sequence, an event value such as {{event.file_url}}. filename can
also contain event merge tags, for example
file-{{event.order_id}}.pdf. Values are resolved from the event that
enrolled the subscriber, then the final URL is validated and fetched at
send time (max 10 attachments, 7MB total per email). Base64 content is
not supported here.array
Email content blocks in Sequenzy format.
Provide
blocks OR html, not both. Put block styling under styles;
top-level style keys like backgroundColor, backgroundOpacity,
borderColor, borderWidth, and borderRadius are normalized into
styles.string
Raw HTML content (plain HTML, React Email output, MJML output, etc.).
Stored as one raw HTML block; Sequenzy does not convert it to native
blocks.
Provide
html OR blocks, not both.object
Fixed delay before this email. To wait until a date from the enrollment
event/subscriber data, set
mode to until_date and provide
untilDateField, or use the waitUntil shorthand.Show Delay properties
Show Delay properties
string
duration for fixed waits or until_date for dynamic date-field
waits. Defaults to duration.number
Days to wait
number
Hours to wait
number
Minutes to wait
string
Date field path to wait until when
mode is until_date, for
example renews_at.string
before or after. Defaults to after.string
continue or exit when the date field is missing or invalid.
Defaults to continue.object
Shorthand for a dynamic delay that waits until a date field from the
enrollment event/subscriber data.
Show Wait-until properties
Show Wait-until properties
number
Delay before this step in milliseconds. Prefer
delay for hand-written
requests; use delayMs when importing provider waits.string
Optional name for the email template.
object
Discount configuration for
create_discount steps. For new integrations, put discount options here; legacy top-level discount fields are still accepted.Show Discount properties
Show Discount properties
string
Builder label for discount steps.
string
Discount provider. Use
stripe to dynamically create a Stripe coupon plus promotion code, or shopify to dynamically create a Shopify Admin discount code.string
Discount type:
percent or amount.number
Percent discount from
1 to 100. Required when discountType is percent.number
Fixed discount in the smallest currency unit, for example
500 for $5. Required when discountType is amount.string
Currency for fixed-amount discounts. Defaults to
usd.string
Coupon duration:
once, forever, or repeating. Defaults to once.number
Required for
repeating discounts.boolean
Whether the discount applies to all plans. Defaults to
true.array
Provider product IDs when
appliesToAllPlans is false. Stripe uses IDs like prod_abc123; Shopify accepts numeric product IDs or gid://shopify/Product/... IDs.string
Optional prefix for generated dynamic codes. The final code also includes a subscriber/token suffix.
number
Maximum redemptions for each generated code. Use
1 for subscriber-specific codes.boolean
Stripe-only. When
true, each generated promotion code is restricted to the matched subscriber’s Stripe customer.string
Optional future expiration date or ISO timestamp. Mutually exclusive with
expiresInHours.number
Optional relative expiration in hours, resolved to an absolute timestamp when each subscriber’s code is created. Use this for flows like “valid for 48 hours” that should restart per enrollment. Takes precedence over
expiresAt when both are provided.string
Optional display name for each dynamically generated provider discount.
Option C: Blank Draft
Send onlyname (and optionally metadata or a trigger). The API creates a
disabled draft containing the trigger and completion nodes, ready for later
insertSteps, branch insertion, or graph edits.
Discount Merge Tags
When acreate_discount step runs, Sequenzy creates a fresh provider discount/code for that subscriber’s automation run. Later emails in the same sequence can use discount merge tags from the most recent created discount:
{{discount.code}}{{discount.percentOff}}{{discount.amountOff}}{{discount.currency}}{{discount.expiresAt}}
Enrollment Modes
Usematching_field for event-triggered sequences where each run belongs to a specific object in the event payload. It lets a subscriber have separate active runs for different products, variants, orders, subscriptions, or other event-scoped objects, while blocking duplicate active runs for the same resolved field. Set enrollmentFieldPath for custom events, or send sequenceEnrollmentKey, enrollmentKey, or common product/variant fields in the event properties.
{
"trigger": "event_received",
"eventName": "ecommerce.order_placed",
"enrollmentMode": "matching_field",
"enrollmentFieldPath": "order.id"
}
Sending Windows
UsesendingWindow when a triggered sequence should start immediately but emails
should only go out during allowed local hours. The window is checked before every
email action, including later steps after delays or branches.
{
"sendingWindow": {
"enabled": true,
"timezone": "Europe/Kiev",
"startTime": "08:00",
"endTime": "20:00",
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}
}
Event-Personalized Sequence Emails
If you create a sequence withtrigger: "event_received", the event payload that enrolls the subscriber is available inside sequence emails through event. merge tags.
For example, if your app sends:
{
"email": "user@example.com",
"event": "weather.wind_alert",
"properties": {
"city": "Tel Aviv",
"alert": {
"maxSpeed": 75
},
"duration": {
"hours": 6
}
}
}
{{event.city}}{{event.alert.maxSpeed}}{{event.duration.hours|a few}}
Examples
AI-Generated Content
curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Onboarding Sequence",
"trigger": "contact_added",
"stopCondition": {
"type": "has_tag",
"value": "customer"
},
"sendingWindow": {
"enabled": true,
"timezone": "Europe/Kiev",
"startTime": "08:00",
"endTime": "20:00",
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"]
},
"goal": "Welcome new users and help them get started with our product",
"emailCount": 5,
"durationDays": 14
}'
Explicit Content with Blocks
curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Sequence",
"trigger": "contact_added",
"steps": [
{
"subject": "Welcome to our product!",
"blocks": [
{
"id": "heading-1",
"type": "heading",
"content": "Welcome!",
"level": 1
},
{
"id": "text-1",
"type": "text",
"content": "<p>Thanks for signing up. We are excited to have you.</p>",
"variant": "paragraph"
}
]
},
{
"subject": "Getting started guide",
"delay": { "days": 1 },
"blocks": [
{
"id": "heading-2",
"type": "heading",
"content": "Getting Started",
"level": 1
},
{
"id": "text-2",
"type": "text",
"content": "<p>Here is everything you need to get started...</p>",
"variant": "paragraph"
}
]
}
]
}'
Explicit Content with HTML (Auto-converted)
Use this when migrating from other platforms or when you have existing HTML templates (React Email, MJML, etc.).curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Migrated Sequence",
"trigger": "contact_added",
"steps": [
{
"subject": "Welcome!",
"html": "<h1>Welcome to our platform!</h1><p>We are thrilled to have you on board.</p><a href=\"https://example.com/start\">Get Started</a>"
},
{
"subject": "Quick tips to get started",
"delay": { "days": 2 },
"html": "<h2>Getting Started Guide</h2><p>Here are some tips:</p><ul><li>Complete your profile</li><li>Explore the dashboard</li><li>Connect your integrations</li></ul>"
}
]
}'
Explicit Discount Action
Use this when you want Sequenzy to generate a dynamic provider discount code before sending a follow-up email. Connect the selected provider in Settings before enabling the sequence.curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Win-back Discount",
"trigger": "tag_added",
"tagName": "cancelled",
"steps": [
{
"type": "create_discount",
"discount": {
"label": "Create win-back discount",
"provider": "stripe",
"discountType": "percent",
"percentOff": 20,
"duration": "once",
"appliesToAllPlans": true,
"maxRedemptions": 1,
"lockToSubscriber": true,
"codePrefix": "WINBACK"
}
},
{
"subject": "Come back with {{discount.code}}",
"delay": { "days": 1 },
"html": "<p>Use {{discount.code}} for {{discount.percentOff}}% off your next subscription.</p>"
}
]
}'
Inactivity Sequence
curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Login Win-back",
"trigger": "inactivity",
"eventName": "app.login",
"inactiveDays": 14,
"inactivityBaseline": "sequence_created_at",
"goal": "Bring inactive users back into the app"
}'
Product-Scoped Purchase Sequence (Property Filters)
UsepropertyFilters to start a purchase sequence only for one specific product, for example to deliver a digital product file. Use lineItems[].providerProductId for ecommerce.order_placed events, or productIds for Stripe saas.purchase events.
curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Ebook Delivery",
"trigger": "event_received",
"eventName": "saas.purchase",
"propertyFilters": [
{
"path": "productIds",
"operator": "equals",
"value": "prod_ABC123"
}
],
"steps": [
{
"subject": "Your download is ready",
"html": "<p><a href=\"{{event.download.url}}\">Download {{event.download.name}}</a></p>"
}
]
}'
Event-Triggered Sequence With {{event.*}}
curl -X POST "https://api.sequenzy.com/api/v1/sequences" \
-H "Authorization: Bearer seq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Wind Alert Follow-up",
"trigger": "event_received",
"eventName": "weather.wind_alert",
"steps": [
{
"subject": "Wind alert for {{event.city}}",
"html": "<p>Winds may reach {{event.alert.maxSpeed}} km/h for {{event.duration.hours|a few}} hours.</p>"
},
{
"subject": "Stay safe in {{event.city}}",
"delay": { "hours": 12 },
"html": "<p>The original alert is still active for {{event.city}}. Check local guidance if conditions change.</p>"
}
]
}'
Responses
{
"success": true,
"message": "Sequence created. AI is generating email content based on your brand. This typically takes 30-60 seconds.",
"sequence": {
"id": "seq_abc123",
"name": "Onboarding Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 5,
"sendingWindow": {
"enabled": true,
"timezone": "Europe/Kiev",
"startTime": "08:00",
"endTime": "20:00",
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}
}
}
{
"success": true,
"message": "Sequence created with 2 emails and 1 discount action spanning 1 day. Use POST /api/v1/sequences/{id}/enable to activate.",
"sequence": {
"id": "seq_abc123",
"name": "Welcome Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 2,
"discountCount": 1,
"nodeCount": 6,
"sendingWindow": null
}
}
{
"success": true,
"message": "Sequence created with 1 email. Use POST /api/v1/sequences/{id}/enable to activate. Add the custom event feed using eventTrackingCode and eventTracking before enabling.",
"sequence": {
"id": "seq_abc123",
"name": "Trial Started",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 1,
"nodeCount": 3
},
"eventTrackingCode": "await fetch(\"https://api.sequenzy.com/api/v1/subscribers/events\", { ... properties: { trial_id: \"<trial_id>\" } ... });",
"eventTracking": {
"endpoint": "https://api.sequenzy.com/api/v1/subscribers/events",
"method": "POST",
"docsUrl": "https://docs.sequenzy.com/api-reference/subscribers/events/trigger",
"integrationGuide": {
"tool": "get_integration_guide",
"arguments": { "use_case": "event_tracking" }
},
"payloadContract": {
"required": ["event", "properties"],
"identity": "Provide email or externalId. Email is required when the subscriber does not already exist.",
"event": "Must equal \"trial.started\".",
"requiredPropertyPaths": ["trial_id"]
},
"examplePayload": {
"email": "user@example.com",
"event": "trial.started",
"properties": { "trial_id": "<trial_id>" }
},
"examplePayloadMatchesFilters": true
},
"requiredEvents": ["trial.started"]
}
{
"error": "Either 'goal' (for AI generation) or 'steps' (for explicit content) is required"
}
{
"error": "Step 1: either 'blocks' or 'html' is required"
}
{
"error": "Step 1: expiresAt must be in the future"
}
{
"error": "Invalid trigger type 'invalid'. Valid types: contact_added, tag_added, segment_entered, event_received, inactivity, frequency"
}
{
"error": "propertyFilters is only supported for the event_received trigger"
}
{
"error": "propertyFilters[0].value is required for the 'equals' operator"
}
{
"error": "emailCount must be no more than 10"
}
{
"error": "Invalid API key"
}
{
"error": "No companies found. Create a company first using the create_company tool."
}
Notes
- The sequence is created in
draftstatus. UsePOST /api/v1/sequences/{id}/enableto activate it. - For backwards compatibility,
POST /v1/sequencesis still accepted as an alias. - When using email
steps, each email step creates an email template in your account that can be edited later. - Sequences with
create_discountsteps require a connected integration for the selected provider before activation. - SMS steps require the SMS add-on (paid plans). Check Get SMS Settings first; steps added while SMS is not ready are stored but skip at runtime.
- When using
goal, AI generates content asynchronously. PollGET /api/v1/sequences/{id}to check enrichment status. - The first step typically has no delay (sends immediately after trigger).
- If
sendingWindowis set, each email step sends only during the allowed local hours and waits until the next allowed time otherwise. - For
event_receivedsequences, properties sent toPOST /api/v1/subscribers/eventsare available as{{event.*}}merge tags in sequence emails. - For custom event triggers, use the returned
eventTrackingCodeandeventTrackingcontract to implement the application-owned event feed. The contract includes normalizedpropertyFiltersand reports whether its generated example already satisfies them throughexamplePayloadMatchesFilters. If that value isfalse, adapt the example usingpayloadContractandexamplePayloadNotebefore sending it. Withmatching_fieldenrollment, every required property path must be present inpropertiesor the sequence cannot identify the matching run. - When using
htmlin steps, the content is preserved as one raw HTML block. Useblockswhen you want native Sequenzy block editing.
⌘I
Create Sequence
curl --request POST \
--url https://api.sequenzy.com/api/v1/sequences \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"labels": [
"<string>"
],
"userCancellable": true,
"bccEmails": [
"<string>"
],
"trigger": "<string>",
"fromEmail": "<string>",
"fromName": "<string>",
"senderProfileId": "<string>",
"replyTo": "<string>",
"replyToName": "<string>",
"replyProfileId": "<string>",
"listId": "<string>",
"tagName": "<string>",
"segmentId": "<string>",
"stopOnSegmentExit": true,
"eventName": "<string>",
"integrationSlug": "<string>",
"integrationEventKey": "<string>",
"customIntegration": {},
"propertyFilters": [
{
"path": "<string>",
"operator": "<string>",
"value": {}
}
],
"inactiveDays": 123,
"inactivityBaseline": "<string>",
"minCount": 123,
"timeWindowDays": 123,
"enrollmentMode": "<string>",
"enrollmentFieldPath": "<string>",
"sendingWindow": {
"enabled": true,
"timezone": "<string>",
"startTime": "<string>",
"endTime": "<string>",
"days": [
{}
]
},
"stopCondition": {},
"goal": "<string>",
"emailCount": 123,
"durationDays": 123,
"emailStyle": "<string>",
"steps": [
{
"type": "<string>",
"nodeType": "<string>",
"config": {},
"subject": "<string>",
"text": "<string>",
"imageUrls": [
{}
],
"ineligibleAction": "<string>",
"label": "<string>",
"previewText": "<string>",
"isTransactional": true,
"ccEmails": [
"<string>"
],
"bccEmails": [
"<string>"
],
"attachments": [
{}
],
"blocks": [
{}
],
"html": "<string>",
"delay": {
"mode": "<string>",
"days": 123,
"hours": 123,
"minutes": 123,
"untilDateField": "<string>",
"untilOffsetDirection": "<string>",
"untilMissingAction": "<string>"
},
"waitUntil": {
"field": "<string>",
"offset": {},
"direction": "<string>",
"missingAction": "<string>"
},
"delayMs": 123,
"name": "<string>",
"discount": {
"label": "<string>",
"provider": "<string>",
"discountType": "<string>",
"percentOff": 123,
"amountOff": 123,
"currency": "<string>",
"duration": "<string>",
"durationInMonths": 123,
"appliesToAllPlans": true,
"planIds": [
{}
],
"codePrefix": "<string>",
"maxRedemptions": 123,
"lockToSubscriber": true,
"expiresAt": "<string>",
"expiresInHours": 123,
"name": "<string>"
}
}
]
}
'import requests
url = "https://api.sequenzy.com/api/v1/sequences"
payload = {
"name": "<string>",
"description": "<string>",
"labels": ["<string>"],
"userCancellable": True,
"bccEmails": ["<string>"],
"trigger": "<string>",
"fromEmail": "<string>",
"fromName": "<string>",
"senderProfileId": "<string>",
"replyTo": "<string>",
"replyToName": "<string>",
"replyProfileId": "<string>",
"listId": "<string>",
"tagName": "<string>",
"segmentId": "<string>",
"stopOnSegmentExit": True,
"eventName": "<string>",
"integrationSlug": "<string>",
"integrationEventKey": "<string>",
"customIntegration": {},
"propertyFilters": [
{
"path": "<string>",
"operator": "<string>",
"value": {}
}
],
"inactiveDays": 123,
"inactivityBaseline": "<string>",
"minCount": 123,
"timeWindowDays": 123,
"enrollmentMode": "<string>",
"enrollmentFieldPath": "<string>",
"sendingWindow": {
"enabled": True,
"timezone": "<string>",
"startTime": "<string>",
"endTime": "<string>",
"days": [{}]
},
"stopCondition": {},
"goal": "<string>",
"emailCount": 123,
"durationDays": 123,
"emailStyle": "<string>",
"steps": [
{
"type": "<string>",
"nodeType": "<string>",
"config": {},
"subject": "<string>",
"text": "<string>",
"imageUrls": [{}],
"ineligibleAction": "<string>",
"label": "<string>",
"previewText": "<string>",
"isTransactional": True,
"ccEmails": ["<string>"],
"bccEmails": ["<string>"],
"attachments": [{}],
"blocks": [{}],
"html": "<string>",
"delay": {
"mode": "<string>",
"days": 123,
"hours": 123,
"minutes": 123,
"untilDateField": "<string>",
"untilOffsetDirection": "<string>",
"untilMissingAction": "<string>"
},
"waitUntil": {
"field": "<string>",
"offset": {},
"direction": "<string>",
"missingAction": "<string>"
},
"delayMs": 123,
"name": "<string>",
"discount": {
"label": "<string>",
"provider": "<string>",
"discountType": "<string>",
"percentOff": 123,
"amountOff": 123,
"currency": "<string>",
"duration": "<string>",
"durationInMonths": 123,
"appliesToAllPlans": True,
"planIds": [{}],
"codePrefix": "<string>",
"maxRedemptions": 123,
"lockToSubscriber": True,
"expiresAt": "<string>",
"expiresInHours": 123,
"name": "<string>"
}
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
labels: ['<string>'],
userCancellable: true,
bccEmails: ['<string>'],
trigger: '<string>',
fromEmail: '<string>',
fromName: '<string>',
senderProfileId: '<string>',
replyTo: '<string>',
replyToName: '<string>',
replyProfileId: '<string>',
listId: '<string>',
tagName: '<string>',
segmentId: '<string>',
stopOnSegmentExit: true,
eventName: '<string>',
integrationSlug: '<string>',
integrationEventKey: '<string>',
customIntegration: {},
propertyFilters: [{path: '<string>', operator: '<string>', value: {}}],
inactiveDays: 123,
inactivityBaseline: '<string>',
minCount: 123,
timeWindowDays: 123,
enrollmentMode: '<string>',
enrollmentFieldPath: '<string>',
sendingWindow: {
enabled: true,
timezone: '<string>',
startTime: '<string>',
endTime: '<string>',
days: [{}]
},
stopCondition: {},
goal: '<string>',
emailCount: 123,
durationDays: 123,
emailStyle: '<string>',
steps: [
{
type: '<string>',
nodeType: '<string>',
config: {},
subject: '<string>',
text: '<string>',
imageUrls: [{}],
ineligibleAction: '<string>',
label: '<string>',
previewText: '<string>',
isTransactional: true,
ccEmails: ['<string>'],
bccEmails: ['<string>'],
attachments: [{}],
blocks: [{}],
html: '<string>',
delay: {
mode: '<string>',
days: 123,
hours: 123,
minutes: 123,
untilDateField: '<string>',
untilOffsetDirection: '<string>',
untilMissingAction: '<string>'
},
waitUntil: {
field: '<string>',
offset: {},
direction: '<string>',
missingAction: '<string>'
},
delayMs: 123,
name: '<string>',
discount: {
label: '<string>',
provider: '<string>',
discountType: '<string>',
percentOff: 123,
amountOff: 123,
currency: '<string>',
duration: '<string>',
durationInMonths: 123,
appliesToAllPlans: true,
planIds: [{}],
codePrefix: '<string>',
maxRedemptions: 123,
lockToSubscriber: true,
expiresAt: '<string>',
expiresInHours: 123,
name: '<string>'
}
}
]
})
};
fetch('https://api.sequenzy.com/api/v1/sequences', 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://api.sequenzy.com/api/v1/sequences",
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([
'name' => '<string>',
'description' => '<string>',
'labels' => [
'<string>'
],
'userCancellable' => true,
'bccEmails' => [
'<string>'
],
'trigger' => '<string>',
'fromEmail' => '<string>',
'fromName' => '<string>',
'senderProfileId' => '<string>',
'replyTo' => '<string>',
'replyToName' => '<string>',
'replyProfileId' => '<string>',
'listId' => '<string>',
'tagName' => '<string>',
'segmentId' => '<string>',
'stopOnSegmentExit' => true,
'eventName' => '<string>',
'integrationSlug' => '<string>',
'integrationEventKey' => '<string>',
'customIntegration' => [
],
'propertyFilters' => [
[
'path' => '<string>',
'operator' => '<string>',
'value' => [
]
]
],
'inactiveDays' => 123,
'inactivityBaseline' => '<string>',
'minCount' => 123,
'timeWindowDays' => 123,
'enrollmentMode' => '<string>',
'enrollmentFieldPath' => '<string>',
'sendingWindow' => [
'enabled' => true,
'timezone' => '<string>',
'startTime' => '<string>',
'endTime' => '<string>',
'days' => [
[
]
]
],
'stopCondition' => [
],
'goal' => '<string>',
'emailCount' => 123,
'durationDays' => 123,
'emailStyle' => '<string>',
'steps' => [
[
'type' => '<string>',
'nodeType' => '<string>',
'config' => [
],
'subject' => '<string>',
'text' => '<string>',
'imageUrls' => [
[
]
],
'ineligibleAction' => '<string>',
'label' => '<string>',
'previewText' => '<string>',
'isTransactional' => true,
'ccEmails' => [
'<string>'
],
'bccEmails' => [
'<string>'
],
'attachments' => [
[
]
],
'blocks' => [
[
]
],
'html' => '<string>',
'delay' => [
'mode' => '<string>',
'days' => 123,
'hours' => 123,
'minutes' => 123,
'untilDateField' => '<string>',
'untilOffsetDirection' => '<string>',
'untilMissingAction' => '<string>'
],
'waitUntil' => [
'field' => '<string>',
'offset' => [
],
'direction' => '<string>',
'missingAction' => '<string>'
],
'delayMs' => 123,
'name' => '<string>',
'discount' => [
'label' => '<string>',
'provider' => '<string>',
'discountType' => '<string>',
'percentOff' => 123,
'amountOff' => 123,
'currency' => '<string>',
'duration' => '<string>',
'durationInMonths' => 123,
'appliesToAllPlans' => true,
'planIds' => [
[
]
],
'codePrefix' => '<string>',
'maxRedemptions' => 123,
'lockToSubscriber' => true,
'expiresAt' => '<string>',
'expiresInHours' => 123,
'name' => '<string>'
]
]
]
]),
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://api.sequenzy.com/api/v1/sequences"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.sequenzy.com/api/v1/sequences")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/sequences")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": [\n \"<string>\"\n ],\n \"userCancellable\": true,\n \"bccEmails\": [\n \"<string>\"\n ],\n \"trigger\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromName\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"replyTo\": \"<string>\",\n \"replyToName\": \"<string>\",\n \"replyProfileId\": \"<string>\",\n \"listId\": \"<string>\",\n \"tagName\": \"<string>\",\n \"segmentId\": \"<string>\",\n \"stopOnSegmentExit\": true,\n \"eventName\": \"<string>\",\n \"integrationSlug\": \"<string>\",\n \"integrationEventKey\": \"<string>\",\n \"customIntegration\": {},\n \"propertyFilters\": [\n {\n \"path\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": {}\n }\n ],\n \"inactiveDays\": 123,\n \"inactivityBaseline\": \"<string>\",\n \"minCount\": 123,\n \"timeWindowDays\": 123,\n \"enrollmentMode\": \"<string>\",\n \"enrollmentFieldPath\": \"<string>\",\n \"sendingWindow\": {\n \"enabled\": true,\n \"timezone\": \"<string>\",\n \"startTime\": \"<string>\",\n \"endTime\": \"<string>\",\n \"days\": [\n {}\n ]\n },\n \"stopCondition\": {},\n \"goal\": \"<string>\",\n \"emailCount\": 123,\n \"durationDays\": 123,\n \"emailStyle\": \"<string>\",\n \"steps\": [\n {\n \"type\": \"<string>\",\n \"nodeType\": \"<string>\",\n \"config\": {},\n \"subject\": \"<string>\",\n \"text\": \"<string>\",\n \"imageUrls\": [\n {}\n ],\n \"ineligibleAction\": \"<string>\",\n \"label\": \"<string>\",\n \"previewText\": \"<string>\",\n \"isTransactional\": true,\n \"ccEmails\": [\n \"<string>\"\n ],\n \"bccEmails\": [\n \"<string>\"\n ],\n \"attachments\": [\n {}\n ],\n \"blocks\": [\n {}\n ],\n \"html\": \"<string>\",\n \"delay\": {\n \"mode\": \"<string>\",\n \"days\": 123,\n \"hours\": 123,\n \"minutes\": 123,\n \"untilDateField\": \"<string>\",\n \"untilOffsetDirection\": \"<string>\",\n \"untilMissingAction\": \"<string>\"\n },\n \"waitUntil\": {\n \"field\": \"<string>\",\n \"offset\": {},\n \"direction\": \"<string>\",\n \"missingAction\": \"<string>\"\n },\n \"delayMs\": 123,\n \"name\": \"<string>\",\n \"discount\": {\n \"label\": \"<string>\",\n \"provider\": \"<string>\",\n \"discountType\": \"<string>\",\n \"percentOff\": 123,\n \"amountOff\": 123,\n \"currency\": \"<string>\",\n \"duration\": \"<string>\",\n \"durationInMonths\": 123,\n \"appliesToAllPlans\": true,\n \"planIds\": [\n {}\n ],\n \"codePrefix\": \"<string>\",\n \"maxRedemptions\": 123,\n \"lockToSubscriber\": true,\n \"expiresAt\": \"<string>\",\n \"expiresInHours\": 123,\n \"name\": \"<string>\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Sequence created. AI is generating email content based on your brand. This typically takes 30-60 seconds.",
"sequence": {
"id": "seq_abc123",
"name": "Onboarding Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 5,
"sendingWindow": {
"enabled": true,
"timezone": "Europe/Kiev",
"startTime": "08:00",
"endTime": "20:00",
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}
}
}
{
"success": true,
"message": "Sequence created with 2 emails and 1 discount action spanning 1 day. Use POST /api/v1/sequences/{id}/enable to activate.",
"sequence": {
"id": "seq_abc123",
"name": "Welcome Sequence",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 2,
"discountCount": 1,
"nodeCount": 6,
"sendingWindow": null
}
}
{
"success": true,
"message": "Sequence created with 1 email. Use POST /api/v1/sequences/{id}/enable to activate. Add the custom event feed using eventTrackingCode and eventTracking before enabling.",
"sequence": {
"id": "seq_abc123",
"name": "Trial Started",
"status": "draft",
"enrollmentPaused": false,
"effectiveStatus": "draft",
"acceptsNewEnrollments": false,
"processesExistingEnrollments": false,
"effectiveStatusSummary": "Draft. Nobody is enrolled and no emails are sent.",
"emailCount": 1,
"nodeCount": 3
},
"eventTrackingCode": "await fetch(\"https://api.sequenzy.com/api/v1/subscribers/events\", { ... properties: { trial_id: \"<trial_id>\" } ... });",
"eventTracking": {
"endpoint": "https://api.sequenzy.com/api/v1/subscribers/events",
"method": "POST",
"docsUrl": "https://docs.sequenzy.com/api-reference/subscribers/events/trigger",
"integrationGuide": {
"tool": "get_integration_guide",
"arguments": { "use_case": "event_tracking" }
},
"payloadContract": {
"required": ["event", "properties"],
"identity": "Provide email or externalId. Email is required when the subscriber does not already exist.",
"event": "Must equal \"trial.started\".",
"requiredPropertyPaths": ["trial_id"]
},
"examplePayload": {
"email": "user@example.com",
"event": "trial.started",
"properties": { "trial_id": "<trial_id>" }
},
"examplePayloadMatchesFilters": true
},
"requiredEvents": ["trial.started"]
}
{
"error": "Either 'goal' (for AI generation) or 'steps' (for explicit content) is required"
}
{
"error": "Step 1: either 'blocks' or 'html' is required"
}
{
"error": "Step 1: expiresAt must be in the future"
}
{
"error": "Invalid trigger type 'invalid'. Valid types: contact_added, tag_added, segment_entered, event_received, inactivity, frequency"
}
{
"error": "propertyFilters is only supported for the event_received trigger"
}
{
"error": "propertyFilters[0].value is required for the 'equals' operator"
}
{
"error": "emailCount must be no more than 10"
}
{
"error": "Invalid API key"
}
{
"error": "No companies found. Create a company first using the create_company tool."
}