In-app
Launch an In-App Campaign
Launch an in-app campaign now or schedule it
POST
/
api
/
v1
/
in-app
/
campaigns
/
{campaignId}
/
send
Launch an In-App Campaign
curl --request POST \
--url https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduledAt": {}
}
'import requests
url = "https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send"
payload = { "scheduledAt": {} }
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({scheduledAt: {}})
};
fetch('https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send', 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/in-app/campaigns/{campaignId}/send",
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([
'scheduledAt' => [
]
]),
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/in-app/campaigns/{campaignId}/send"
payload := strings.NewReader("{\n \"scheduledAt\": {}\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/in-app/campaigns/{campaignId}/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduledAt\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send")
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 \"scheduledAt\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"campaign": {
"id": "cmp_abc123",
"name": "New dashboards",
"type": "in_app",
"status": "sent",
"state": "live",
"message": {
"label": "",
"kind": "message",
"format": "modal",
"title": "Hi {{firstName}}, dashboards are here",
"body": "See every campaign at a glance.",
"buttons": [
{
"label": "Take a look",
"action": "open_url",
"url": "myapp://dashboards"
}
]
},
"priority": "high",
"endsAt": "2026-12-01T00:00:00.000Z",
"targetLists": {
"type": "segment",
"segmentId": "seg_123"
},
"scheduledAt": null,
"sentAt": "2026-11-08T09:00:00.000Z",
"estimatedRecipientCount": 1200,
"labelIds": [],
"createdAt": "2026-11-07T12:00:00.000Z",
"updatedAt": "2026-11-08T09:00:00.000Z"
},
"message": "In-app campaign is live. 1200 contacts currently match the audience; each gets it the next time their app fetches its feed."
}
{
"error": "Add a title or message before launching this in-app campaign."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: campaigns:send"
}
{
"error": "Campaign not found."
}
{
"error": "Only draft or scheduled in-app campaigns can be launched or rescheduled."
}
Launches a draft or scheduled in-app campaign now, or schedules it when
scheduledAt is a future ISO 8601 time. The campaign needs a message, an audience with at least one include rule, and an end time (if any) after the start. Requires the campaigns:send scope.
Launching writes nothing per contact. While the campaign is live, each contact in the audience gets the message the first time their app fetches its feed (the SDK feed, the browser feed or List In-App Messages). So contacts who join the audience after launch get it, and so do contacts who first open your app days later, until the campaign ends or you stop it. An app version that can’t draw the message (its format or a button action) doesn’t use it up: the contact gets it when an app version that can asks.
Request
string
required
The in-app campaign ID.
string | null
Future ISO 8601 time to go live. Omit or pass
null to launch now.curl -X POST "https://api.sequenzy.com/api/v1/in-app/campaigns/cmp_abc123/send" \
--header "Authorization: Bearer $SEQUENZY_API_KEY" \
--header "Content-Type: application/json" \
--data '{}'
Responses
{
"success": true,
"campaign": {
"id": "cmp_abc123",
"name": "New dashboards",
"type": "in_app",
"status": "sent",
"state": "live",
"message": {
"label": "",
"kind": "message",
"format": "modal",
"title": "Hi {{firstName}}, dashboards are here",
"body": "See every campaign at a glance.",
"buttons": [
{
"label": "Take a look",
"action": "open_url",
"url": "myapp://dashboards"
}
]
},
"priority": "high",
"endsAt": "2026-12-01T00:00:00.000Z",
"targetLists": {
"type": "segment",
"segmentId": "seg_123"
},
"scheduledAt": null,
"sentAt": "2026-11-08T09:00:00.000Z",
"estimatedRecipientCount": 1200,
"labelIds": [],
"createdAt": "2026-11-07T12:00:00.000Z",
"updatedAt": "2026-11-08T09:00:00.000Z"
},
"message": "In-app campaign is live. 1200 contacts currently match the audience; each gets it the next time their app fetches its feed."
}
{
"error": "Add a title or message before launching this in-app campaign."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: campaigns:send"
}
{
"error": "Campaign not found."
}
{
"error": "Only draft or scheduled in-app campaigns can be launched or rescheduled."
}
⌘I
Launch an In-App Campaign
curl --request POST \
--url https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduledAt": {}
}
'import requests
url = "https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send"
payload = { "scheduledAt": {} }
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({scheduledAt: {}})
};
fetch('https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send', 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/in-app/campaigns/{campaignId}/send",
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([
'scheduledAt' => [
]
]),
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/in-app/campaigns/{campaignId}/send"
payload := strings.NewReader("{\n \"scheduledAt\": {}\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/in-app/campaigns/{campaignId}/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduledAt\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/in-app/campaigns/{campaignId}/send")
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 \"scheduledAt\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"campaign": {
"id": "cmp_abc123",
"name": "New dashboards",
"type": "in_app",
"status": "sent",
"state": "live",
"message": {
"label": "",
"kind": "message",
"format": "modal",
"title": "Hi {{firstName}}, dashboards are here",
"body": "See every campaign at a glance.",
"buttons": [
{
"label": "Take a look",
"action": "open_url",
"url": "myapp://dashboards"
}
]
},
"priority": "high",
"endsAt": "2026-12-01T00:00:00.000Z",
"targetLists": {
"type": "segment",
"segmentId": "seg_123"
},
"scheduledAt": null,
"sentAt": "2026-11-08T09:00:00.000Z",
"estimatedRecipientCount": 1200,
"labelIds": [],
"createdAt": "2026-11-07T12:00:00.000Z",
"updatedAt": "2026-11-08T09:00:00.000Z"
},
"message": "In-app campaign is live. 1200 contacts currently match the audience; each gets it the next time their app fetches its feed."
}
{
"error": "Add a title or message before launching this in-app campaign."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: campaigns:send"
}
{
"error": "Campaign not found."
}
{
"error": "Only draft or scheduled in-app campaigns can be launched or rescheduled."
}