Push
Register a Push Device
Register an APNs, FCM or web push token for a contact
POST
/
api
/
v1
/
push
/
devices
Register a Push Device
curl --request POST \
--url https://api.sequenzy.com/api/v1/push/devices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"platform": "<string>",
"token": "<string>",
"keys": {},
"email": "<string>",
"subscriberId": "<string>",
"deviceName": "<string>",
"appVersion": "<string>",
"osVersion": "<string>",
"locale": "<string>",
"timezone": "<string>"
}
'import requests
url = "https://api.sequenzy.com/api/v1/push/devices"
payload = {
"platform": "<string>",
"token": "<string>",
"keys": {},
"email": "<string>",
"subscriberId": "<string>",
"deviceName": "<string>",
"appVersion": "<string>",
"osVersion": "<string>",
"locale": "<string>",
"timezone": "<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({
platform: '<string>',
token: '<string>',
keys: {},
email: '<string>',
subscriberId: '<string>',
deviceName: '<string>',
appVersion: '<string>',
osVersion: '<string>',
locale: '<string>',
timezone: '<string>'
})
};
fetch('https://api.sequenzy.com/api/v1/push/devices', 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/push/devices",
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([
'platform' => '<string>',
'token' => '<string>',
'keys' => [
],
'email' => '<string>',
'subscriberId' => '<string>',
'deviceName' => '<string>',
'appVersion' => '<string>',
'osVersion' => '<string>',
'locale' => '<string>',
'timezone' => '<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/push/devices"
payload := strings.NewReader("{\n \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\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/push/devices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/push/devices")
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 \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"created": true,
"device": {
"id": "dev_123",
"subscriberId": "sub_456",
"platform": "ios",
"status": "active",
"invalidReason": null,
"source": "api",
"deviceName": "Jane iPhone",
"userAgent": null,
"appVersion": "3.2.0",
"osVersion": "18.1",
"locale": "en-US",
"timezone": "America/New_York",
"tokenPreview": "…9f3a21bc",
"lastSeenAt": "2026-10-01T12:00:00.000Z",
"createdAt": "2026-09-20T09:30:00.000Z"
},
"message": "Device registered."
}
{
"error": "iOS tokens are the hex APNs device token (64+ hex characters)."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:write"
}
{
"error": "Subscriber not found."
}
Register a Push Device
Registers or refreshes a device, typically from your app backend after the app receives its APNs or Firebase token. Registering a known token again reactivates it, refreshes its metadata, and moves it to the contact you pass. An unknown email becomes a contact quietly: no lists and nocontact_added sequences.
Each contact keeps up to 20 active devices; the least recently seen are retired. Returns 201 for a new token and 200 for a known one. Requires the subscribers:write scope.
Request
string
required
ios, android, or web.string
required
iOS: the hex APNs device token. Android: the FCM registration token. Web: the
PushSubscription endpoint (also send keys).object
Web only:
PushSubscription.toJSON().keys with p256dh and auth.string
Contact to link. Created quietly when new.
string
Existing subscriber to link instead of
email.string
Label shown in the dashboard.
string
Your app version.
string
Operating system version.
string
Device locale, for example
en-US.string
IANA timezone.
curl -X POST "https://api.sequenzy.com/api/v1/push/devices" \
--header "Authorization: Bearer $SEQUENZY_API_KEY" \
--header "Content-Type: application/json" \
--data '{"platform":"ios","token":"8f2c9e...","email":"jane@example.com","deviceName":"Jane iPhone","appVersion":"3.2.0"}'
Responses
{
"success": true,
"created": true,
"device": {
"id": "dev_123",
"subscriberId": "sub_456",
"platform": "ios",
"status": "active",
"invalidReason": null,
"source": "api",
"deviceName": "Jane iPhone",
"userAgent": null,
"appVersion": "3.2.0",
"osVersion": "18.1",
"locale": "en-US",
"timezone": "America/New_York",
"tokenPreview": "…9f3a21bc",
"lastSeenAt": "2026-10-01T12:00:00.000Z",
"createdAt": "2026-09-20T09:30:00.000Z"
},
"message": "Device registered."
}
{
"error": "iOS tokens are the hex APNs device token (64+ hex characters)."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:write"
}
{
"error": "Subscriber not found."
}
⌘I
Register a Push Device
curl --request POST \
--url https://api.sequenzy.com/api/v1/push/devices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"platform": "<string>",
"token": "<string>",
"keys": {},
"email": "<string>",
"subscriberId": "<string>",
"deviceName": "<string>",
"appVersion": "<string>",
"osVersion": "<string>",
"locale": "<string>",
"timezone": "<string>"
}
'import requests
url = "https://api.sequenzy.com/api/v1/push/devices"
payload = {
"platform": "<string>",
"token": "<string>",
"keys": {},
"email": "<string>",
"subscriberId": "<string>",
"deviceName": "<string>",
"appVersion": "<string>",
"osVersion": "<string>",
"locale": "<string>",
"timezone": "<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({
platform: '<string>',
token: '<string>',
keys: {},
email: '<string>',
subscriberId: '<string>',
deviceName: '<string>',
appVersion: '<string>',
osVersion: '<string>',
locale: '<string>',
timezone: '<string>'
})
};
fetch('https://api.sequenzy.com/api/v1/push/devices', 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/push/devices",
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([
'platform' => '<string>',
'token' => '<string>',
'keys' => [
],
'email' => '<string>',
'subscriberId' => '<string>',
'deviceName' => '<string>',
'appVersion' => '<string>',
'osVersion' => '<string>',
'locale' => '<string>',
'timezone' => '<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/push/devices"
payload := strings.NewReader("{\n \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\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/push/devices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/push/devices")
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 \"platform\": \"<string>\",\n \"token\": \"<string>\",\n \"keys\": {},\n \"email\": \"<string>\",\n \"subscriberId\": \"<string>\",\n \"deviceName\": \"<string>\",\n \"appVersion\": \"<string>\",\n \"osVersion\": \"<string>\",\n \"locale\": \"<string>\",\n \"timezone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"created": true,
"device": {
"id": "dev_123",
"subscriberId": "sub_456",
"platform": "ios",
"status": "active",
"invalidReason": null,
"source": "api",
"deviceName": "Jane iPhone",
"userAgent": null,
"appVersion": "3.2.0",
"osVersion": "18.1",
"locale": "en-US",
"timezone": "America/New_York",
"tokenPreview": "…9f3a21bc",
"lastSeenAt": "2026-10-01T12:00:00.000Z",
"createdAt": "2026-09-20T09:30:00.000Z"
},
"message": "Device registered."
}
{
"error": "iOS tokens are the hex APNs device token (64+ hex characters)."
}
{
"error": "Invalid API key"
}
{
"error": "API key is missing required scope: subscribers:write"
}
{
"error": "Subscriber not found."
}