In-app
Get Placement Content
What each placement shows one contact now
GET
/
api
/
v1
/
in-app
/
placement-feed
Get Placement Content
curl --request GET \
--url https://api.sequenzy.com/api/v1/in-app/placement-feed \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sequenzy.com/api/v1/in-app/placement-feed"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sequenzy.com/api/v1/in-app/placement-feed', 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/placement-feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sequenzy.com/api/v1/in-app/placement-feed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sequenzy.com/api/v1/in-app/placement-feed")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/in-app/placement-feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"subscriberId": "sub_123",
"placements": [
{
"placement": "home_hero",
"message": {
"id": "iam_placement",
"kind": "placement",
"format": null,
"position": null,
"eyebrow": "Members only",
"title": "Upgrade to Pro, Jane",
"body": "Get 20% off your first year.",
"imageUrl": "https://cdn.example.com/pro.png",
"imagePlacement": null,
"buttons": [
{ "label": "See plans", "action": "open_url", "url": "myapp://billing" },
{ "label": "Not now", "action": "dismiss", "url": null }
],
"data": { "campaign": "pro" },
"style": {
"preset": "brand",
"backgroundColor": "#ffffff",
"textColor": "#111827",
"mutedTextColor": "#4b5563",
"buttonColor": "#4f46e5",
"buttonTextColor": "#ffffff",
"cornerRadius": 16,
"buttonRadius": 8,
"fontFamily": "Inter, Arial, sans-serif"
},
"pinned": false,
"placement": "home_hero",
"priority": "high",
"layout": "card",
"sequenceId": "seq_1",
"stepId": "step_2",
"createdAt": "2026-11-07T10:00:00.000Z",
"expiresAt": null,
"displayedAt": null,
"clickedAt": null,
"clickCount": 0,
"dismissedAt": null,
"readAt": null,
"html": null,
"showCloseButton": false
}
},
{ "placement": "checkout_upsell", "message": null }
]
}
{
"error": "Ask for at most 10 placements at once"
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:read"
}
{
"error": "Subscriber not found."
}
For each placement key you ask for, returns the contact’s open placement item with the highest priority (ties go to the newest), or
null when there is nothing to show, so your app collapses the slot. Keys your workspace has not defined always return null. Use this from your backend when you render placements yourself; the mobile and web SDKs call the equivalent browser endpoint for you. Reading marks nothing displayed: report displayed, clicked and dismissed with Record In-App Event. Requires the subscribers:read scope.
Request
string
required
Comma-separated placement keys, up to 10. Each key appears once in the response, in request order.
string
The contact’s email. Give one of
email, externalId or subscriberId.string
The contact’s external ID from your app.
string
The Sequenzy subscriber ID.
string
Comma-separated button actions your app handles beyond
open_url and dismiss, such as request_push_permission. Items with other actions are skipped, so a lower-priority item can show instead.curl "https://api.sequenzy.com/api/v1/in-app/placement-feed?externalId=user_42&placements=home_hero,checkout_upsell" \
--header "Authorization: Bearer $SEQUENZY_API_KEY"
{
"success": true,
"subscriberId": "sub_123",
"placements": [
{
"placement": "home_hero",
"message": {
"id": "iam_placement",
"kind": "placement",
"format": null,
"position": null,
"eyebrow": "Members only",
"title": "Upgrade to Pro, Jane",
"body": "Get 20% off your first year.",
"imageUrl": "https://cdn.example.com/pro.png",
"imagePlacement": null,
"buttons": [
{ "label": "See plans", "action": "open_url", "url": "myapp://billing" },
{ "label": "Not now", "action": "dismiss", "url": null }
],
"data": { "campaign": "pro" },
"style": {
"preset": "brand",
"backgroundColor": "#ffffff",
"textColor": "#111827",
"mutedTextColor": "#4b5563",
"buttonColor": "#4f46e5",
"buttonTextColor": "#ffffff",
"cornerRadius": 16,
"buttonRadius": 8,
"fontFamily": "Inter, Arial, sans-serif"
},
"pinned": false,
"placement": "home_hero",
"priority": "high",
"layout": "card",
"sequenceId": "seq_1",
"stepId": "step_2",
"createdAt": "2026-11-07T10:00:00.000Z",
"expiresAt": null,
"displayedAt": null,
"clickedAt": null,
"clickCount": 0,
"dismissedAt": null,
"readAt": null,
"html": null,
"showCloseButton": false
}
},
{ "placement": "checkout_upsell", "message": null }
]
}
{
"error": "Ask for at most 10 placements at once"
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:read"
}
{
"error": "Subscriber not found."
}
⌘I
Get Placement Content
curl --request GET \
--url https://api.sequenzy.com/api/v1/in-app/placement-feed \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sequenzy.com/api/v1/in-app/placement-feed"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sequenzy.com/api/v1/in-app/placement-feed', 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/placement-feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sequenzy.com/api/v1/in-app/placement-feed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sequenzy.com/api/v1/in-app/placement-feed")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/in-app/placement-feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"subscriberId": "sub_123",
"placements": [
{
"placement": "home_hero",
"message": {
"id": "iam_placement",
"kind": "placement",
"format": null,
"position": null,
"eyebrow": "Members only",
"title": "Upgrade to Pro, Jane",
"body": "Get 20% off your first year.",
"imageUrl": "https://cdn.example.com/pro.png",
"imagePlacement": null,
"buttons": [
{ "label": "See plans", "action": "open_url", "url": "myapp://billing" },
{ "label": "Not now", "action": "dismiss", "url": null }
],
"data": { "campaign": "pro" },
"style": {
"preset": "brand",
"backgroundColor": "#ffffff",
"textColor": "#111827",
"mutedTextColor": "#4b5563",
"buttonColor": "#4f46e5",
"buttonTextColor": "#ffffff",
"cornerRadius": 16,
"buttonRadius": 8,
"fontFamily": "Inter, Arial, sans-serif"
},
"pinned": false,
"placement": "home_hero",
"priority": "high",
"layout": "card",
"sequenceId": "seq_1",
"stepId": "step_2",
"createdAt": "2026-11-07T10:00:00.000Z",
"expiresAt": null,
"displayedAt": null,
"clickedAt": null,
"clickCount": 0,
"dismissedAt": null,
"readAt": null,
"html": null,
"showCloseButton": false
}
},
{ "placement": "checkout_upsell", "message": null }
]
}
{
"error": "Ask for at most 10 placements at once"
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:read"
}
{
"error": "Subscriber not found."
}