curl --request POST \
--url https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"formats": [
"story",
"mass_dm"
],
"start_date": "2026-10-01",
"hosts": [
123456
],
"targets": [
234567,
345678
],
"name": "Summer promo",
"end_date": "2023-12-25",
"rotation_type": "equal",
"daily_limits": {
"story": 2,
"mass_dm": 1
},
"same_target_cooldown_days": 3,
"friends_ttl_days": 3,
"bio_ttl_days": 3,
"post_ttl_days": 3,
"publish_settings": {
"pin_posts": true,
"vault_cleanup": true,
"vault_folder": true,
"mass_dm": {
"send_to": [
"Fans"
],
"exclude_lists": [
"Alt*"
],
"unsend_previous": true
}
},
"target_weights": {
"234567": 3,
"345678": 1
}
}
'import requests
url = "https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools"
payload = {
"formats": ["story", "mass_dm"],
"start_date": "2026-10-01",
"hosts": [123456],
"targets": [234567, 345678],
"name": "Summer promo",
"end_date": "2023-12-25",
"rotation_type": "equal",
"daily_limits": {
"story": 2,
"mass_dm": 1
},
"same_target_cooldown_days": 3,
"friends_ttl_days": 3,
"bio_ttl_days": 3,
"post_ttl_days": 3,
"publish_settings": {
"pin_posts": True,
"vault_cleanup": True,
"vault_folder": True,
"mass_dm": {
"send_to": ["Fans"],
"exclude_lists": ["Alt*"],
"unsend_previous": True
}
},
"target_weights": {
"234567": 3,
"345678": 1
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
formats: ['story', 'mass_dm'],
start_date: '2026-10-01',
hosts: [123456],
targets: [234567, 345678],
name: 'Summer promo',
end_date: '2023-12-25',
rotation_type: 'equal',
daily_limits: {story: 2, mass_dm: 1},
same_target_cooldown_days: 3,
friends_ttl_days: 3,
bio_ttl_days: 3,
post_ttl_days: 3,
publish_settings: {
pin_posts: true,
vault_cleanup: true,
vault_folder: true,
mass_dm: {send_to: ['Fans'], exclude_lists: ['Alt*'], unsend_previous: true}
},
target_weights: {'234567': 3, '345678': 1}
})
};
fetch('https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools', 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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools",
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([
'formats' => [
'story',
'mass_dm'
],
'start_date' => '2026-10-01',
'hosts' => [
123456
],
'targets' => [
234567,
345678
],
'name' => 'Summer promo',
'end_date' => '2023-12-25',
'rotation_type' => 'equal',
'daily_limits' => [
'story' => 2,
'mass_dm' => 1
],
'same_target_cooldown_days' => 3,
'friends_ttl_days' => 3,
'bio_ttl_days' => 3,
'post_ttl_days' => 3,
'publish_settings' => [
'pin_posts' => true,
'vault_cleanup' => true,
'vault_folder' => true,
'mass_dm' => [
'send_to' => [
'Fans'
],
'exclude_lists' => [
'Alt*'
],
'unsend_previous' => true
]
],
'target_weights' => [
'234567' => 3,
'345678' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools"
payload := strings.NewReader("{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"pool_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}Создать пул
Create a cross-promo pool.
curl --request POST \
--url https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"formats": [
"story",
"mass_dm"
],
"start_date": "2026-10-01",
"hosts": [
123456
],
"targets": [
234567,
345678
],
"name": "Summer promo",
"end_date": "2023-12-25",
"rotation_type": "equal",
"daily_limits": {
"story": 2,
"mass_dm": 1
},
"same_target_cooldown_days": 3,
"friends_ttl_days": 3,
"bio_ttl_days": 3,
"post_ttl_days": 3,
"publish_settings": {
"pin_posts": true,
"vault_cleanup": true,
"vault_folder": true,
"mass_dm": {
"send_to": [
"Fans"
],
"exclude_lists": [
"Alt*"
],
"unsend_previous": true
}
},
"target_weights": {
"234567": 3,
"345678": 1
}
}
'import requests
url = "https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools"
payload = {
"formats": ["story", "mass_dm"],
"start_date": "2026-10-01",
"hosts": [123456],
"targets": [234567, 345678],
"name": "Summer promo",
"end_date": "2023-12-25",
"rotation_type": "equal",
"daily_limits": {
"story": 2,
"mass_dm": 1
},
"same_target_cooldown_days": 3,
"friends_ttl_days": 3,
"bio_ttl_days": 3,
"post_ttl_days": 3,
"publish_settings": {
"pin_posts": True,
"vault_cleanup": True,
"vault_folder": True,
"mass_dm": {
"send_to": ["Fans"],
"exclude_lists": ["Alt*"],
"unsend_previous": True
}
},
"target_weights": {
"234567": 3,
"345678": 1
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
formats: ['story', 'mass_dm'],
start_date: '2026-10-01',
hosts: [123456],
targets: [234567, 345678],
name: 'Summer promo',
end_date: '2023-12-25',
rotation_type: 'equal',
daily_limits: {story: 2, mass_dm: 1},
same_target_cooldown_days: 3,
friends_ttl_days: 3,
bio_ttl_days: 3,
post_ttl_days: 3,
publish_settings: {
pin_posts: true,
vault_cleanup: true,
vault_folder: true,
mass_dm: {send_to: ['Fans'], exclude_lists: ['Alt*'], unsend_previous: true}
},
target_weights: {'234567': 3, '345678': 1}
})
};
fetch('https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools', 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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools",
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([
'formats' => [
'story',
'mass_dm'
],
'start_date' => '2026-10-01',
'hosts' => [
123456
],
'targets' => [
234567,
345678
],
'name' => 'Summer promo',
'end_date' => '2023-12-25',
'rotation_type' => 'equal',
'daily_limits' => [
'story' => 2,
'mass_dm' => 1
],
'same_target_cooldown_days' => 3,
'friends_ttl_days' => 3,
'bio_ttl_days' => 3,
'post_ttl_days' => 3,
'publish_settings' => [
'pin_posts' => true,
'vault_cleanup' => true,
'vault_folder' => true,
'mass_dm' => [
'send_to' => [
'Fans'
],
'exclude_lists' => [
'Alt*'
],
'unsend_previous' => true
]
],
'target_weights' => [
'234567' => 3,
'345678' => 1
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools"
payload := strings.NewReader("{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://studio-api.onlytraffic.com/api/external/v1/shoutouts/pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"formats\": [\n \"story\",\n \"mass_dm\"\n ],\n \"start_date\": \"2026-10-01\",\n \"hosts\": [\n 123456\n ],\n \"targets\": [\n 234567,\n 345678\n ],\n \"name\": \"Summer promo\",\n \"end_date\": \"2023-12-25\",\n \"rotation_type\": \"equal\",\n \"daily_limits\": {\n \"story\": 2,\n \"mass_dm\": 1\n },\n \"same_target_cooldown_days\": 3,\n \"friends_ttl_days\": 3,\n \"bio_ttl_days\": 3,\n \"post_ttl_days\": 3,\n \"publish_settings\": {\n \"pin_posts\": true,\n \"vault_cleanup\": true,\n \"vault_folder\": true,\n \"mass_dm\": {\n \"send_to\": [\n \"Fans\"\n ],\n \"exclude_lists\": [\n \"Alt*\"\n ],\n \"unsend_previous\": true\n }\n },\n \"target_weights\": {\n \"234567\": 3,\n \"345678\": 1\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"pool_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}{
"success": false,
"error": "validation_failed",
"message": "<string>",
"details": {},
"retry_after": 123
}hosts) и продвигаемых моделей (targets) с форматами публикаций и расписанием. Обе стороны берите из GET /shoutouts/accounts: каждому паблишеру нужна активная сессия, каждой продвигаемой модели активный креатив хотя бы одного включённого формата; модель без креатива какого-то формата в этом формате просто пропускается (фото и тексты готовятся в Studio).
daily_limits задаётся на паблишера в день: story и mass_dm это отправки в день, post это сколько промо-постов паблишер держит одновременно (каждый сменяется через post_ttl_days). Строки био и пины друзей обновляются по своему циклу. Рассылкам нужен publish_settings.mass_dm.send_to: имена списков OnlyFans, которые ищутся на странице каждого паблишера; имя, которого у паблишера нет, пропускается, а список, который одновременно исключён, сообщение не получает.
Ротация: equal продвигает первой наименее продвинутую модель, priority идёт по порядку targets, weighted делит упоминания по target_weights (3 против 1 значит втрое чаще). Пул стартует в статусе active с start_date.Авторизации
Your API key from the Studio Dashboard
Тело
1story, post, bio, friends, mass_dm ["story", "mass_dm"]
"2026-10-01"
of_account_id of the publishers; each needs an active session.
1 - 200 elements[123456]
of_account_id of the promoted models; each needs an active creative of at least one enabled format (a model without a creative of a format is skipped for that format). Order = priority under priority rotation.
1 - 200 elements[234567, 345678]
100"Summer promo"
Omit or send null for a pool that runs until paused.
equal promotes the least promoted model first, priority follows the order of targets, weighted shares mentions by target_weights.
equal, priority, weighted Per publisher per day: story 1 to 20, post 1 to 20 (posts held at once), mass_dm 1 to 5. Required for each of these formats.
Show child attributes
Show child attributes
{ "story": 2, "mass_dm": 1 }
1 <= x <= 903, 5, 7, 14, 30 3, 5, 7, 14, 30 1, 3, 5, 7 How publications go out.
Show child attributes
Show child attributes
Weighted rotation: of_account_id => weight 1 to 5.
Show child attributes
Show child attributes
{ "234567": 3, "345678": 1 }
Была ли эта страница полезной?