API
READ
WRITE
Xác thực
Kiểm tra API Key của bạn
Bạn có thể kiểm tra tại menu góc trên bên phải > Cài đặt > Tài khoản > API Key.
Thêm vào header của request
Thêm API key đã cấp vào header Authorization theo định dạng Bearer.
Gửi yêu cầu đến base URL
Gửi yêu cầu đến base URL bên dưới, theo sau là đường dẫn endpoint.
⛔auth_key_note
Base URL
https://stepeee.com/public-api/v1
Ví dụ yêu cầu
curl "https://stepeee.com/public-api/v1/projects" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Định dạng phản hồi & lỗi
Tất cả các phản hồi đều được trả về theo định dạng envelope dưới đây.
Khi thành công
{ "data": ... }
Khi có lỗi
{ "error": { "code": "...", "message": "...", "details": { ... } } }
Mã trạng thái
| Trạng thái | Ý nghĩa |
|---|---|
| 401 | API key không hợp lệ hoặc đã hết hạn |
| 403 | ⛔status_403_desc |
| 404 | Tài nguyên không tồn tại (bao gồm cả trường hợp bạn không có quyền truy cập) |
| 405 | ⛔status_405_desc |
| 409 | ⛔status_409_desc |
| 422 | Tham số không hợp lệ |
| 429 | Đã vượt quá giới hạn tốc độ (rate limit) |
| 500 | Đã xảy ra lỗi ngoài dự kiến |
| 503 | ⛔status_503_desc |
⛔conventions_heading
⛔conv_access_heading
⛔conv_access_desc
⛔conv_deleted_heading
⛔conv_deleted_desc
⛔conv_pagination_heading
⛔conv_pagination_desc
⛔conv_datetime_heading
⛔conv_datetime_desc
⛔conv_ids_heading
⛔conv_ids_desc
⛔conv_files_heading
⛔conv_files_desc
⛔conv_values_heading
⛔conv_values_desc
⛔conv_money_heading
⛔conv_money_desc
⛔conv_write_heading
⛔conv_write_desc
⛔conv_idempotency_heading
⛔conv_idempotency_desc
⛔conv_rate_limit_heading
⛔conv_rate_limit_desc
⛔conv_write_rate_limit_heading
⛔conv_write_rate_limit_desc
⛔conv_errors_heading
⛔conv_errors_desc
| ⛔th_code | Ý nghĩa |
|---|---|
unauthorized | ⛔error_code_unauthorized |
forbidden | ⛔error_code_forbidden |
plan_required | ⛔error_code_plan_required |
team_plan_lost | ⛔error_code_team_plan_lost |
not_found | ⛔error_code_not_found |
method_not_allowed | ⛔error_code_method_not_allowed |
conflict | ⛔error_code_conflict |
idempotency_request_in_progress | ⛔error_code_idempotency_request_in_progress |
validation_error | ⛔error_code_validation_error |
idempotency_key_required | ⛔error_code_idempotency_key_required |
idempotency_key_invalid | ⛔error_code_idempotency_key_invalid |
idempotency_key_reused | ⛔error_code_idempotency_key_reused |
rate_limited | ⛔error_code_rate_limited |
internal_error | ⛔error_code_internal_error |
⛔conv_validation_example_heading
{
"error": {
"code": "validation_error",
"message": "The per page field must not be greater than 100.",
"details": {
"per_page": ["The per page field must not be greater than 100."]
}
}
}
⛔group_account_nav_label
⛔group_account_lead
-
⛔ep_me_title
GET /me -
⛔ep_me_subscription_title
GET /me/subscription -
⛔ep_me_tokens_title
GET /me/tokens -
⛔ep_me_token_usage_title
GET /me/token-usage -
⛔ep_me_storage_title
GET /me/storage -
⛔ep_me_payments_title
GET /me/payments -
⛔ep_me_referral_title
GET /me/referral
⛔ep_me_title
⛔ep_me_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
user_unique |
string | ⛔f_me_user_unique |
nickname |
string | null | ⛔f_me_nickname |
email |
string | ⛔f_me_email |
plan |
string | ⛔f_me_plan |
limits |
object | ⛔f_me_limits |
limits.projects |
integer | null | ⛔f_me_limits_projects |
limits.moviemode_variations_per_title |
integer | null | ⛔f_me_limits_movie_variations |
limits.blogmode_variations_per_title |
integer | null | ⛔f_me_limits_blog_variations |
limits.carouselmode_variations_per_title |
integer | null | ⛔f_me_limits_carousel_variations |
limits.postmode_variations_per_concept |
integer | null | ⛔f_me_limits_post_variations |
limits.team |
boolean | ⛔f_me_limits_team |
limits.script_duration_max |
integer | ⛔f_me_limits_script_duration_max |
limits.reading_time_max |
integer | ⛔f_me_limits_reading_time_max |
limits.reading_time_max_fulltext |
integer | ⛔f_me_limits_reading_time_max_fulltext |
limits.slide_count_max |
integer | ⛔f_me_limits_slide_count_max |
limits.cta_enabled |
boolean | ⛔f_me_limits_cta_enabled |
limits.thread_enabled |
boolean | ⛔f_me_limits_thread_enabled |
limits.schedule_title_variation_max |
integer | ⛔f_me_limits_schedule_title_variation_max |
limits.schedule_variation_create_max |
integer | ⛔f_me_limits_schedule_variation_create_max |
language |
string | null | ⛔f_me_language |
timezone |
string | ⛔f_me_timezone |
team |
object | null | ⛔f_me_team |
team.team_unique |
string | ⛔f_team_unique |
team.role |
string | ⛔f_me_team_role |
created_at |
string | ⛔f_me_created_at |
curl "https://stepeee.com/public-api/v1/me" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"user_unique": "aB3dE5gH7j",
"nickname": "Alice",
"email": "alice@example.com",
"plan": "pro",
"limits": {
"projects": 3,
"moviemode_variations_per_title": null,
"blogmode_variations_per_title": null,
"carouselmode_variations_per_title": null,
"postmode_variations_per_concept": null,
"team": false,
"script_duration_max": 1800,
"reading_time_max": 15,
"reading_time_max_fulltext": 4,
"slide_count_max": 20,
"cta_enabled": true,
"thread_enabled": true,
"schedule_title_variation_max": 50,
"schedule_variation_create_max": 5
},
"language": "ja",
"timezone": "Asia/Tokyo",
"team": null,
"created_at": "2026-09-01T10:20:30Z"
}
}
⛔ep_me_subscription_title
⛔ep_me_subscription_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
plan |
string | ⛔f_me_plan |
status |
string | ⛔f_sub_status |
managed_by_team |
boolean | ⛔f_sub_managed_by_team |
current_period_start |
string | null | ⛔f_sub_current_period_start |
current_period_end |
string | null | ⛔f_sub_current_period_end |
cancel_at_period_end |
boolean | ⛔f_sub_cancel_at_period_end |
cancel_at |
string | null | ⛔f_sub_cancel_at |
canceled_at |
string | null | ⛔f_sub_canceled_at |
scheduled_change |
object | null | ⛔f_sub_scheduled_change |
scheduled_change.plan |
string | ⛔f_sub_scheduled_change_plan |
scheduled_change.effective_at |
string | null | ⛔f_sub_scheduled_change_effective_at |
curl "https://stepeee.com/public-api/v1/me/subscription" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/subscription",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/subscription", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/subscription")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/subscription"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/subscription");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"plan": "pro",
"status": "active",
"managed_by_team": false,
"current_period_start": "2026-10-01T00:00:00Z",
"current_period_end": "2026-11-01T00:00:00Z",
"cancel_at_period_end": false,
"cancel_at": null,
"canceled_at": null,
"scheduled_change": {
"plan": "plus",
"effective_at": "2026-11-01T00:00:00Z"
}
}
}
⛔ep_me_tokens_title
⛔ep_me_tokens_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
balance |
integer | ⛔f_tok_balance |
reserved |
integer | ⛔f_tok_reserved |
available |
integer | ⛔f_tok_available |
wallet |
string | ⛔f_tok_wallet |
team_quota |
object | null | ⛔f_tok_team_quota |
team_quota.unlimited |
boolean | ⛔f_tok_quota_unlimited |
team_quota.view_only |
boolean | ⛔f_tok_quota_view_only |
team_quota.budget |
integer | null | ⛔f_tok_quota_budget |
team_quota.used |
integer | ⛔f_tok_quota_used |
team_quota.available |
integer | null | ⛔f_tok_quota_available |
team_quota.period |
string | null | ⛔f_tok_quota_period |
team_quota.next_reset_at |
string | null | ⛔f_tok_quota_next_reset_at |
auto_purchase.enabled |
boolean | ⛔f_tok_auto_enabled |
auto_purchase.plan |
string | null | ⛔f_tok_auto_plan |
auto_purchase.threshold |
integer | ⛔f_tok_auto_threshold |
curl "https://stepeee.com/public-api/v1/me/tokens" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/tokens",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/tokens", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/tokens")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/tokens"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/tokens");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"balance": 90000,
"reserved": 1200,
"available": 88800,
"wallet": "team",
"team_quota": {
"unlimited": false,
"view_only": false,
"budget": 10000,
"used": 2500,
"available": 7500,
"period": "week",
"next_reset_at": "2026-10-26T00:00:00Z"
},
"auto_purchase": {
"enabled": true,
"plan": "token_100",
"threshold": 5000
}
}
}
⛔ep_me_token_usage_title
⛔ep_me_token_usage_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
from |
⛔in_query | string (YYYY-MM-DD) | ⛔required_no | — | ⛔p_usage_from |
to |
⛔in_query | string (YYYY-MM-DD) | ⛔required_no | — | ⛔p_usage_to |
group_by |
⛔in_query | string | ⛔required_no | day |
⛔p_usage_group_by |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].period |
string | ⛔f_usage_period |
data[].consumed |
integer | ⛔f_usage_consumed |
data[].added |
integer | ⛔f_usage_added |
data[].consumed_by_type |
object | ⛔f_usage_consumed_by_type |
data[].added_by_type |
object | ⛔f_usage_added_by_type |
meta.from |
string | ⛔f_usage_meta_from |
meta.to |
string | ⛔f_usage_meta_to |
meta.group_by |
string | ⛔f_usage_meta_group_by |
meta.total_consumed |
integer | ⛔f_usage_meta_total_consumed |
meta.total_added |
integer | ⛔f_usage_meta_total_added |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | forbidden |
⛔e_usage_team_staff |
| 422 | validation_error |
⛔e_usage_range |
curl "https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/token-usage?from=2026-10-01&to=2026-10-20&group_by=day");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"period": "2026-10-18",
"consumed": 450,
"added": 0,
"consumed_by_type": { "image": 300, "text": 150 },
"added_by_type": {}
},
{
"period": "2026-10-20",
"consumed": 1000,
"added": 4800,
"consumed_by_type": { "video": 1000 },
"added_by_type": { "purchase": 5000, "referral_revoke": -200 }
}
],
"meta": {
"from": "2026-10-01",
"to": "2026-10-20",
"group_by": "day",
"total_consumed": 1450,
"total_added": 4800
}
}
⛔ep_me_storage_title
⛔ep_me_storage_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
used_bytes |
integer | ⛔f_storage_used_bytes |
capacity_bytes |
integer | null | ⛔f_storage_capacity_bytes |
by_type[].file_type |
string | null | ⛔f_storage_file_type |
by_type[].bytes |
integer | ⛔f_storage_bytes |
by_type[].files |
integer | ⛔f_storage_files |
curl "https://stepeee.com/public-api/v1/me/storage" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/storage",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/storage", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/storage")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/storage"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/storage");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"used_bytes": 734003200,
"capacity_bytes": null,
"by_type": [
{ "file_type": "image", "bytes": 52428800, "files": 120 },
{ "file_type": "movie", "bytes": 629145600, "files": 8 },
{ "file_type": "voice", "bytes": 52428800, "files": 15 }
]
}
}
⛔ep_me_payments_title
⛔ep_me_payments_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
status |
⛔in_query | string | ⛔required_no | — | ⛔p_payments_status |
type |
⛔in_query | string | ⛔required_no | — | ⛔p_payments_type |
from |
⛔in_query | string | ⛔required_no | — | ⛔p_from_created |
to |
⛔in_query | string | ⛔required_no | — | ⛔p_to_created |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].payment_unique |
string | ⛔f_pay_payment_unique |
data[].type |
string | ⛔f_pay_type |
data[].description |
string | ⛔f_pay_description |
data[].status |
string | ⛔f_pay_status |
data[].currency |
string | ⛔f_pay_currency |
data[].amount_subtotal |
integer | ⛔f_pay_amount_subtotal |
data[].tax_amount |
integer | ⛔f_pay_tax_amount |
data[].amount_total |
integer | ⛔f_pay_amount_total |
data[].line_items[] |
object | ⛔f_pay_line_items |
data[].receipt_url |
string | null | ⛔f_pay_receipt_url |
data[].invoice_pdf_url |
string | null | ⛔f_pay_invoice_pdf_url |
data[].created_at |
string | ⛔f_pay_created_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/payments?status=succeeded&per_page=10");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"payment_unique": "Xy12AbCd34Ef",
"type": "subscription_team",
"description": "Team Monthly",
"status": "succeeded",
"currency": "usd",
"amount_subtotal": 5000,
"tax_amount": 500,
"amount_total": 5500,
"line_items": [
{ "type": "base_plan", "quantity": 1, "amount": 4000, "description": "Team plan" },
{ "type": "extra_member", "quantity": 2, "amount": 1000, "description": null }
],
"receipt_url": "https://pay.stripe.com/receipts/...",
"invoice_pdf_url": "https://pay.stripe.com/invoice/.../pdf",
"created_at": "2026-10-01T08:00:00Z"
}
],
"meta": { "total": 1, "current_page": 1, "per_page": 10, "last_page": 1 }
}
⛔ep_me_referral_title
⛔ep_me_referral_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
code |
string | null | ⛔f_ref_code |
referral_url |
string | null | ⛔f_ref_referral_url |
is_active |
boolean | ⛔f_ref_is_active |
reward_type |
string | null | ⛔f_ref_reward_type |
clicks |
integer | ⛔f_ref_clicks |
signups |
integer | ⛔f_ref_signups |
conversions |
integer | ⛔f_ref_conversions |
earned |
object | ⛔f_ref_earned |
earned_tokens |
integer | ⛔f_ref_earned_tokens |
pending |
object | ⛔f_ref_pending |
available |
object | ⛔f_ref_available |
curl "https://stepeee.com/public-api/v1/me/referral" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/me/referral",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/me/referral", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/me/referral")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/me/referral"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/me/referral");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"code": "REFk5m2j8x9ab",
"referral_url": "https://stepeee.com?ref=REFk5m2j8x9ab",
"is_active": true,
"reward_type": "cash",
"clicks": 12,
"signups": 4,
"conversions": 2,
"earned": { "amount": 1300, "currency": "usd" },
"earned_tokens": 0,
"pending": { "amount": 300, "currency": "usd" },
"available": { "amount": 800, "currency": "usd" }
}
}
Dự án
⛔group_projects_lead
-
⛔ep_projects_list_title
GET /projects -
⛔ep_projects_detail_title
GET /projects/{project_unique} -
⛔ep_concepts_list_title
GET /projects/{project_unique}/concepts -
⛔ep_concepts_detail_title
GET /projects/{project_unique}/concepts/{concept_unique}
⛔ep_projects_list_title
Lấy danh sách các dự án mà chủ sở hữu API key có thể truy cập.
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].project_unique |
string | ⛔f_proj_project_unique |
data[].project_name |
string | ⛔f_proj_project_name |
data[].description |
string | null | ⛔f_proj_description |
data[].access_level |
string | ⛔f_proj_access_level |
data[].team |
object | null | ⛔f_proj_team |
data[].team.team_unique |
string | ⛔f_team_unique |
data[].is_readonly |
boolean | ⛔f_proj_is_readonly |
data[].readonly_since |
string | null | ⛔f_proj_readonly_since |
data[].created_at |
string | ⛔f_created_at |
data[].updated_at |
string | ⛔f_updated_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/projects" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"project_unique": "a1b2c3d4e5",
"project_name": "Sample Project",
"description": "Sample project description",
"access_level": "owner",
"team": null,
"is_readonly": false,
"readonly_since": null,
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-10-01T12:00:00Z"
}
],
"meta": { "total": 1, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_projects_detail_title
Lấy thông tin chi tiết của một dự án.
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
project_unique |
string | ⛔f_proj_project_unique |
project_name |
string | ⛔f_proj_project_name |
description |
string | null | ⛔f_proj_description |
access_level |
string | ⛔f_proj_access_level |
team |
object | null | ⛔f_proj_team |
team.team_unique |
string | ⛔f_team_unique |
is_readonly |
boolean | ⛔f_proj_is_readonly |
readonly_since |
string | null | ⛔f_proj_readonly_since |
created_at |
string | ⛔f_created_at |
updated_at |
string | ⛔f_updated_at |
scope |
string | ⛔f_proj_scope |
scope_region |
string | null | ⛔f_proj_scope_region |
counts.{mode}.concepts |
integer | ⛔f_proj_counts_concepts |
counts.{mode}.titles |
integer | null | ⛔f_proj_counts_titles |
counts.{mode}.contents |
object | ⛔f_proj_counts_contents |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"project_unique": "a1b2c3d4e5",
"project_name": "Sample Project",
"description": "Sample project description",
"access_level": "owner",
"team": null,
"is_readonly": false,
"readonly_since": null,
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-10-01T12:00:00Z",
"scope": "region",
"scope_region": "JP",
"counts": {
"moviemode": {
"concepts": 2,
"titles": 5,
"contents": { "total": 8, "not_started": 1, "in_progress": 3, "complete": 4 }
},
"blogmode": {
"concepts": 1,
"titles": 3,
"contents": { "total": 3, "not_started": 0, "in_progress": 1, "complete": 2 }
},
"carouselmode": {
"concepts": 0,
"titles": 0,
"contents": { "total": 0, "not_started": 0, "in_progress": 0, "complete": 0 }
},
"postmode": {
"concepts": 1,
"titles": null,
"contents": { "total": 1, "not_started": 0, "in_progress": 1, "complete": 0 }
}
}
}
}
⛔ep_concepts_list_title
⛔ep_concepts_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
mode |
⛔in_query | string | ⛔required_no | — | ⛔p_mode |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].concept_unique |
string | ⛔f_concept_unique |
data[].mode |
string | ⛔f_mode |
data[].concept_name |
string | ⛔f_concept_name |
data[].title_count |
integer | null | ⛔f_concept_title_count |
data[].content_count |
integer | ⛔f_concept_content_count |
data[].created_at |
string | ⛔f_created_at |
data[].updated_at |
string | ⛔f_updated_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts?mode=moviemode,postmode");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"concept_unique": "pC7d2KqLx01m",
"mode": "postmode",
"concept_name": "SaaS growth tips",
"title_count": null,
"content_count": 1,
"created_at": "2026-10-02T09:00:00Z",
"updated_at": "2026-10-02T09:00:00Z"
},
{
"concept_unique": "mC4f9TnB2q",
"mode": "moviemode",
"concept_name": "Cat facts",
"title_count": 3,
"content_count": 5,
"created_at": "2026-09-20T03:00:00Z",
"updated_at": "2026-09-28T03:00:00Z"
}
],
"meta": { "total": 2, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_concepts_detail_title
⛔ep_concepts_detail_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
concept_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_concept_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
concept_unique / mode / concept_name / title_count / content_count / created_at / updated_at |
— | ⛔f_concept_same_as_list |
description |
string | null | ⛔f_concept_description |
scope |
string | ⛔f_proj_scope |
scope_region |
string | null | ⛔f_proj_scope_region |
default_template_unique |
string | null | ⛔f_concept_default_template_unique |
titles |
array | null | ⛔f_concept_titles |
titles[].title_unique |
string | ⛔f_title_unique |
titles[].title_name |
string | ⛔f_title_name |
titles[].article_type |
string | null | ⛔f_title_article_type |
titles[].content_count |
integer | ⛔f_title_content_count |
persona |
object | null | ⛔f_persona |
persona.persona_unique |
string | ⛔f_persona_unique |
persona.gender |
string | ⛔f_persona_gender |
persona.generation |
string | ⛔f_persona_generation |
persona.region |
string | null | ⛔f_persona_region |
persona.keywords |
object | ⛔f_persona_keywords |
persona.description |
string | ⛔f_persona_description |
persona.casual_description |
string | null | ⛔f_persona_casual_description |
persona.taboos |
array | ⛔f_persona_taboos |
persona.timezone_mode |
string | ⛔f_persona_timezone_mode |
persona.timezone |
string | null | ⛔f_persona_timezone |
rule |
object | null | ⛔f_rule |
rule.rule_unique |
string | ⛔f_rule_unique |
rule.language |
string | ⛔f_rule_language |
rule.formality |
string | ⛔f_rule_formality |
rule.emoji |
string | ⛔f_rule_emoji |
rule.line_break |
string | ⛔f_rule_line_break |
rule.post_type_share |
object | ⛔f_rule_post_type_share |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 404 | not_found |
⛔e_concept_not_found |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/concepts/pC7d2KqLx01m");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"concept_unique": "pC7d2KqLx01m",
"mode": "postmode",
"concept_name": "SaaS growth tips",
"title_count": null,
"content_count": 1,
"created_at": "2026-10-02T09:00:00Z",
"updated_at": "2026-10-02T09:00:00Z",
"description": "Practical growth tips for SaaS founders",
"scope": "global",
"scope_region": null,
"default_template_unique": null,
"titles": null,
"persona": {
"persona_unique": "aV3kQ9mN2pRt",
"gender": "female",
"generation": "30s",
"region": "JP",
"keywords": { "occupation": "SaaS marketer", "interest": ["growth", "analytics"] },
"description": "A B2B SaaS marketer with ten years of experience...",
"casual_description": null,
"taboos": ["politics"],
"timezone_mode": "auto",
"timezone": "Asia/Tokyo",
"updated_at": "2026-10-02T09:10:00Z"
},
"rule": {
"rule_unique": "rU5tW7yZ9aBc",
"language": "ja",
"formality": "polite",
"emoji": "sometimes",
"line_break": "moderate",
"post_type_share": { "assertion": 40, "knowhow": 30, "experience": 20, "casual": 10 },
"updated_at": "2026-10-02T09:20:00Z"
}
}
}
Nội dung
⛔group_contents_lead
-
⛔ep_contents_list_title
GET /projects/{project_unique}/contents -
⛔ep_contents_detail_title
GET /projects/{project_unique}/contents/{variation_unique} -
⛔ep_contents_schedule_title
GET /projects/{project_unique}/contents/{variation_unique}/schedule
⛔ep_contents_list_title
Lấy danh sách tổng hợp các nội dung được tạo trong dự án (bài đăng, blog, hình ảnh và video).
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
mode |
⛔in_query | string | ⛔required_no | — | ⛔p_mode |
status |
⛔in_query | string | ⛔required_no | — | ⛔p_contents_status |
concept_unique |
⛔in_query | string | ⛔required_no | — | ⛔p_contents_concept_unique |
title_unique |
⛔in_query | string | ⛔required_no | — | ⛔p_contents_title_unique |
language |
⛔in_query | string | ⛔required_no | — | ⛔p_contents_language |
published |
⛔in_query | string | ⛔required_no | — | ⛔p_contents_published |
from |
⛔in_query | string | ⛔required_no | — | ⛔p_from_created |
to |
⛔in_query | string | ⛔required_no | — | ⛔p_to_created |
sort |
⛔in_query | string | ⛔required_no | -created_at |
⛔p_contents_sort |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].mode |
string | ⛔f_mode |
data[].variation_unique |
string | ⛔f_content_variation_unique |
data[].variation_no |
integer | ⛔f_content_variation_no |
data[].title |
string | ⛔f_content_title |
data[].concept |
object | ⛔f_content_concept |
data[].title_unique |
string | null | ⛔f_content_title_unique |
data[].language |
string | null | ⛔f_content_language |
data[].status |
string | ⛔f_content_status |
data[].progress.step_process |
integer | ⛔f_content_step_process |
data[].progress.is_complete |
boolean | ⛔f_content_is_complete |
data[].is_readonly |
boolean | ⛔f_content_is_readonly |
data[].confirmed_at |
string | null | ⛔f_content_confirmed_at |
data[].published_platforms |
array | ⛔f_content_published_platforms |
data[].created_at |
string | ⛔f_created_at |
data[].updated_at |
string | ⛔f_updated_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents?mode=blogmode&status=complete&published=false");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"mode": "blogmode",
"variation_unique": "bmA1b2C3d4E5",
"variation_no": 1,
"title": "How to start a blog",
"concept": { "concept_unique": "bC2x8RtY4u", "concept_name": "Blogging for beginners" },
"title_unique": "bT9kL3mN5pQr",
"language": "en",
"status": "complete",
"progress": { "step_process": 3, "is_complete": true },
"is_readonly": false,
"confirmed_at": "2026-10-03T08:00:00Z",
"published_platforms": [],
"created_at": "2026-10-01T03:00:00Z",
"updated_at": "2026-10-03T08:00:00Z"
}
],
"meta": { "total": 1, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_contents_detail_title
Lấy thông tin chi tiết của một nội dung. Bao gồm nội dung văn bản/tài nguyên đã tạo và trạng thái đăng tải (kết quả đăng lên SNS/WordPress, v.v.). Nội dung của "content" sẽ khác nhau tùy theo chế độ.
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
variation_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_variation_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
mode / variation_unique / … / updated_at |
— | ⛔f_content_same_as_list |
publish[] |
object | ⛔f_content_publish |
publish[].platform |
string | ⛔f_platform |
publish[].status |
string | ⛔f_publish_status |
publish[].post_url |
string | null | ⛔f_post_url |
publish[].posted_at |
string | null | ⛔f_posted_at |
content |
object | ⛔f_content_content |
package |
object | null | ⛔f_content_package |
package.video (moviemode) |
object | null | ⛔f_pkg_movie_video |
package.youtube.title (moviemode) |
string | null | ⛔f_pkg_youtube_title |
package.youtube.description (moviemode) |
string | null | ⛔f_pkg_youtube_description |
package.youtube.thumbnail (moviemode) |
object | null | ⛔f_pkg_youtube_thumbnail |
package.tiktok.caption (moviemode) |
string | null | ⛔f_pkg_tiktok_caption |
package.instagram.caption (moviemode / carouselmode) |
string | null | ⛔f_pkg_instagram_caption |
package.instagram.cover (moviemode) |
object | null | ⛔f_pkg_instagram_cover |
package.x.posts (moviemode / blogmode / carouselmode) |
array | ⛔f_pkg_x_posts |
package.title (blogmode) |
string | null | ⛔f_pkg_blog_title |
package.meta_description (blogmode) |
string | null | ⛔f_pkg_blog_meta_description |
package.body_html (blogmode) |
string | null | ⛔f_pkg_blog_body_html |
package.images (blogmode) |
array | ⛔f_pkg_blog_images |
package.cover_image (blogmode) |
object | null | ⛔f_pkg_blog_cover_image |
package.audio (blogmode) |
object | null | ⛔f_pkg_blog_audio |
package.slides[] (carouselmode) |
object | ⛔f_pkg_carousel_slides |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 404 | not_found |
⛔e_content_not_found |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/bmA1b2C3d4E5");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"mode": "blogmode",
"variation_unique": "bmA1b2C3d4E5",
"variation_no": 1,
"title": "How to start a blog",
"concept": { "concept_unique": "bC2x8RtY4u", "concept_name": "Blogging for beginners" },
"title_unique": "bT9kL3mN5pQr",
"language": "en",
"status": "complete",
"progress": { "step_process": 3, "is_complete": true },
"is_readonly": false,
"confirmed_at": "2026-10-03T08:00:00Z",
"published_platforms": ["wordpress"],
"created_at": "2026-10-01T03:00:00Z",
"updated_at": "2026-10-03T08:00:00Z",
"publish": [
{
"platform": "wordpress",
"status": "success",
"post_url": "https://blog.example.com/how-to-start-a-blog/",
"posted_at": "2026-10-03T09:00:00Z"
}
],
"content": { "body_html": "<h2>Why start a blog</h2><p>...</p>" },
"package": {
"title": "How to Start a Blog in 2026",
"meta_description": "A step-by-step guide to starting your first blog.",
"body_html": "<h2>Why start a blog</h2><p>...</p><figure><img src=\"https://...\" alt=\"\" /></figure>",
"images": [
{ "url": "https://...", "expires_at": "2026-10-21T10:00:00Z", "width": 1536, "height": 1024 }
],
"cover_image": { "url": "https://...", "expires_at": "2026-10-21T10:00:00Z", "width": 1200, "height": 630 },
"audio": null,
"x": { "posts": ["New post: How to start a blog in 2026"] }
}
}
}
⛔ep_contents_schedule_title
⛔ep_contents_schedule_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
variation_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_variation_unique |
from |
⛔in_query | string | ⛔required_no | — | ⛔p_schedule_from |
to |
⛔in_query | string | ⛔required_no | — | ⛔p_schedule_to |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
automation.enabled |
boolean | ⛔f_sch_auto_enabled |
automation.is_executing |
boolean | ⛔f_sch_auto_is_executing |
automation.week_limit |
integer | null | ⛔f_sch_auto_week_limit |
automation.week_count |
integer | ⛔f_sch_auto_week_count |
automation.next_refill_at |
string | null | ⛔f_sch_auto_next_refill_at |
automation.timezone |
string | null | ⛔f_sch_auto_timezone |
items[].schedule_unique |
string | ⛔f_sch_schedule_unique |
items[].post_unique |
string | null | ⛔f_sch_post_unique |
items[].scheduled_at |
string | ⛔f_sch_scheduled_at |
items[].scheduled_at_local |
string | ⛔f_sch_scheduled_at_local |
items[].timezone |
string | ⛔f_sch_timezone |
items[].status |
string | ⛔f_sch_status |
items[].confirm_state |
string | ⛔f_sch_confirm_state |
items[].created_via |
string | ⛔f_sch_created_via |
items[].post_type |
string | ⛔f_sch_post_type |
items[].text |
string | null | ⛔f_sch_text |
items[].thread[] |
object | ⛔f_sch_thread |
items[].image |
object | null | ⛔f_sch_image |
items[].post_url |
string | null | ⛔f_post_url |
items[].posted_at |
string | null | ⛔f_posted_at |
items[].fail_reason |
string | null | ⛔f_sch_fail_reason |
meta.from / meta.to |
string | ⛔f_sch_meta_range |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 404 | not_found |
⛔e_schedule_not_found |
| 422 | validation_error |
⛔e_schedule_range |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/contents/pmV7d2KqLx01/schedule?from=2026-10-20&to=2026-11-20");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"automation": {
"enabled": true,
"is_executing": true,
"week_limit": 4,
"week_count": 2,
"next_refill_at": "2026-10-26T15:00:00Z",
"timezone": "Asia/Tokyo"
},
"items": [
{
"schedule_unique": "Sc1aB2cD3eF4",
"post_unique": "Po1aB2cD3eF4",
"scheduled_at": "2026-10-20T01:00:00Z",
"scheduled_at_local": "2026-10-20T10:00:00",
"timezone": "Asia/Tokyo",
"status": "posted",
"confirm_state": "none",
"created_via": "auto",
"post_type": "assertion",
"text": "Most teams overthink onboarding...",
"thread": [
{
"text": "First, cut the steps in half.",
"post_url": "https://x.com/i/status/1848000000000000002",
"posted_at": "2026-10-20T01:00:05Z",
"image": null
}
],
"image": { "url": "https://...", "expires_at": "2026-10-21T10:00:00Z" },
"post_url": "https://x.com/i/status/1848000000000000001",
"posted_at": "2026-10-20T01:00:00Z",
"fail_reason": null
},
{
"schedule_unique": "Sc9zY8xW7vU6",
"post_unique": null,
"scheduled_at": "2026-10-25T09:30:00Z",
"scheduled_at_local": "2026-10-25T18:30:00",
"timezone": "Asia/Tokyo",
"status": "pending",
"confirm_state": "none",
"created_via": "auto",
"post_type": "knowhow",
"text": null,
"thread": [],
"image": null,
"post_url": null,
"posted_at": null,
"fail_reason": null
}
]
},
"meta": { "from": "2026-10-20T00:00:00Z", "to": "2026-11-20T23:59:59Z" }
}
⛔group_publish_nav_label
⛔group_publish_lead
-
⛔ep_publications_list_title
GET /projects/{project_unique}/publications -
⛔ep_accounts_list_title
GET /projects/{project_unique}/accounts
⛔ep_publications_list_title
⛔ep_publications_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
mode |
⛔in_query | string | ⛔required_no | — | ⛔p_mode |
platform |
⛔in_query | string | ⛔required_no | — | ⛔p_publications_platform |
status |
⛔in_query | string | ⛔required_no | — | ⛔p_publications_status |
from |
⛔in_query | string | ⛔required_no | — | ⛔p_publications_from |
to |
⛔in_query | string | ⛔required_no | — | ⛔p_publications_to |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].publication_unique |
string | ⛔f_pub_publication_unique |
data[].mode |
string | ⛔f_mode |
data[].content.variation_unique |
string | ⛔f_content_variation_unique |
data[].content.title |
string | null | ⛔f_content_title |
data[].platform |
string | ⛔f_platform |
data[].account |
object | null | ⛔f_pub_account |
data[].status |
string | ⛔f_publish_status |
data[].post_url |
string | null | ⛔f_post_url |
data[].error_code |
string | null | ⛔f_pub_error_code |
data[].is_automation |
boolean | ⛔f_pub_is_automation |
data[].posted_at |
string | null | ⛔f_posted_at |
data[].created_at |
string | ⛔f_created_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/publications?platform=x,youtube&status=failed");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"publication_unique": "Xk3p9QmZ2aLw",
"mode": "postmode",
"content": { "variation_unique": "pmV7d2KqLx01", "title": "SaaS growth tips" },
"platform": "x",
"account": null,
"status": "success",
"post_url": "https://x.com/i/status/1848123456789012345",
"error_code": null,
"is_automation": true,
"posted_at": "2026-10-04T10:00:00Z",
"created_at": "2026-10-03T22:10:00Z"
},
{
"publication_unique": "Pq2wE4rT6yUi",
"mode": "blogmode",
"content": { "variation_unique": "bmA1b2C3d4E5", "title": "How to start a blog" },
"platform": "wordpress",
"account": { "account_unique": "Wp3xY5zA7bCd", "name": "My WP Site" },
"status": "failed",
"post_url": null,
"error_code": "auth_failed",
"is_automation": false,
"posted_at": null,
"created_at": "2026-10-02T10:00:00Z"
}
],
"meta": { "total": 2, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_accounts_list_title
⛔ep_accounts_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].account_unique |
string | ⛔f_acc_account_unique |
data[].platform |
string | ⛔f_platform |
data[].name |
string | ⛔f_acc_name |
data[].image_url |
string | null | ⛔f_acc_image_url |
data[].status |
string | ⛔f_acc_status |
data[].token_expires_at |
string | null | ⛔f_acc_token_expires_at |
data[].connected_at |
string | null | ⛔f_acc_connected_at |
data[].last_used_at |
string | null | ⛔f_acc_last_used_at |
data[].site_url |
string | null | ⛔f_acc_site_url |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
curl "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/a1b2c3d4e5/accounts");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"account_unique": "Wh9kQ2mN4pRt",
"platform": "webhook",
"name": "https://hooks.example.com/…",
"image_url": null,
"status": "active",
"token_expires_at": null,
"connected_at": "2026-07-01T00:00:00Z",
"last_used_at": null,
"site_url": null
},
{
"account_unique": "Wp3xY5zA7bCd",
"platform": "wordpress",
"name": "Example Blog",
"image_url": null,
"status": "connection_error",
"token_expires_at": null,
"connected_at": "2026-08-01T00:00:00Z",
"last_used_at": null,
"site_url": "https://blog.example.com"
},
{
"account_unique": "Yt4aB6cD8eFg",
"platform": "youtube",
"name": "Channel B",
"image_url": "https://yt3.ggpht.com/abc.png",
"status": "expired",
"token_expires_at": "2026-10-01T00:00:00Z",
"connected_at": "2026-09-01T00:00:00Z",
"last_used_at": "2026-09-30T00:00:00Z",
"site_url": null
}
]
}
⛔group_automations_nav_label
⛔group_automations_lead
-
⛔ep_automations_list_title
GET /automations -
⛔ep_automations_detail_title
GET /automations/{auto_unique}
⛔ep_automations_list_title
⛔ep_automations_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
status |
⛔in_query | string | ⛔required_no | — | ⛔p_auto_status |
mode |
⛔in_query | string | ⛔required_no | — | ⛔p_auto_mode |
project_unique |
⛔in_query | string | ⛔required_no | — | ⛔p_auto_project_unique |
from |
⛔in_query | string | ⛔required_no | — | ⛔p_from_created |
to |
⛔in_query | string | ⛔required_no | — | ⛔p_to_created |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].auto_unique |
string | ⛔f_auto_auto_unique |
data[].mode |
string | ⛔f_auto_mode |
data[].project |
object | ⛔f_auto_project |
data[].content.variation_unique |
string | ⛔f_content_variation_unique |
data[].content.title |
string | null | ⛔f_content_title |
data[].run_no |
integer | ⛔f_auto_run_no |
data[].status |
string | ⛔f_auto_status |
data[].execution_mode |
string | ⛔f_auto_execution_mode |
data[].phases |
object | ⛔f_auto_phases |
data[].template.setup_template_name |
string | null | ⛔f_auto_setup_template_name |
data[].template.automation_template_name |
string | null | ⛔f_auto_automation_template_name |
data[].reserved_at |
string | null | ⛔f_auto_reserved_at |
data[].executed_at |
string | null | ⛔f_auto_executed_at |
data[].completed_at |
string | null | ⛔f_auto_completed_at |
data[].created_at |
string | ⛔f_auto_created_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/automations?status=executing,waiting_confirmation");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"auto_unique": "aB3dE5fG7h",
"mode": "blogmode",
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My Blog" },
"content": { "variation_unique": "Xy12Zw34Ab56", "title": "Spring travel tips" },
"run_no": 2,
"status": "executing",
"execution_mode": "sequential",
"phases": { "setup": "done", "step1": "done", "step2": "running", "step3": "not_started" },
"template": { "setup_template_name": "Default setup", "automation_template_name": null },
"reserved_at": null,
"executed_at": "2026-10-19T23:09:27Z",
"completed_at": null,
"created_at": "2026-10-19T23:09:20Z"
}
],
"meta": { "total": 1, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_automations_detail_title
⛔ep_automations_detail_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
auto_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_auto_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
auto_unique / mode / … / created_at |
— | ⛔f_auto_same_as_list |
steps[].key |
string | ⛔f_step_key |
steps[].phase |
string | ⛔f_step_phase |
steps[].status |
string | ⛔f_step_status |
steps[].started_at |
string | null | ⛔f_step_started_at |
steps[].finished_at |
string | null | ⛔f_step_finished_at |
steps[].duration_sec |
number | null | ⛔f_step_duration_sec |
steps[].error_code |
string | null | ⛔f_step_error_code |
accounts[] |
object | ⛔f_auto_accounts |
stop_requested |
boolean | ⛔f_auto_stop_requested |
confirmation.requested_at |
string | null | ⛔f_auto_confirm_requested_at |
confirmation.confirmed_at |
string | null | ⛔f_auto_confirmed_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_automation_not_found |
curl "https://stepeee.com/public-api/v1/automations/aB3dE5fG7h" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/automations/aB3dE5fG7h",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations/aB3dE5fG7h", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations/aB3dE5fG7h")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations/aB3dE5fG7h"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/automations/aB3dE5fG7h");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"auto_unique": "aB3dE5fG7h",
"mode": "blogmode",
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My Blog" },
"content": { "variation_unique": "Xy12Zw34Ab56", "title": "Spring travel tips" },
"run_no": 2,
"status": "failed",
"execution_mode": "sequential",
"phases": { "setup": "done", "step1": "done", "step2": "done", "step3": "error" },
"template": { "setup_template_name": "Default setup", "automation_template_name": "Skip voice" },
"reserved_at": null,
"executed_at": "2026-10-19T23:09:27Z",
"completed_at": "2026-10-19T23:17:50Z",
"created_at": "2026-10-19T23:09:20Z",
"steps": [
{ "key": "setup", "phase": "setup", "status": "success", "started_at": null, "finished_at": "2026-10-19T23:09:29Z", "duration_sec": 2.3, "error_code": null },
{ "key": "step1_1_text", "phase": "step1", "status": "success", "started_at": null, "finished_at": "2026-10-19T23:11:40Z", "duration_sec": 126.3, "error_code": null },
{ "key": "step2_2", "phase": "step2", "status": "skipped", "started_at": null, "finished_at": "2026-10-19T23:17:39Z", "duration_sec": null, "error_code": null },
{ "key": "step3_4_webhook", "phase": "step3", "status": "error", "started_at": null, "finished_at": "2026-10-19T23:17:46Z", "duration_sec": 1.2, "error_code": "automation_server_error" }
],
"accounts": [
{ "platform": "webhook", "account_unique": "dxuD2gk3NYuA", "name": null }
],
"stop_requested": false,
"confirmation": { "requested_at": null, "confirmed_at": null }
}
}
⛔group_materials_nav_label
⛔group_materials_lead
-
⛔ep_materials_list_title
GET /materials -
⛔ep_materials_detail_title
GET /materials/{material_unique} -
⛔ep_material_categories_title
GET /material-categories -
⛔ep_templates_list_title
GET /templates
⛔ep_materials_list_title
⛔ep_materials_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
kind |
⛔in_query | string | ⛔required_no | — | ⛔p_mat_kind |
type |
⛔in_query | string | ⛔required_no | — | ⛔p_mat_type |
category_unique |
⛔in_query | string | ⛔required_no | — | ⛔p_mat_category_unique |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].material_unique |
string | ⛔f_mat_material_unique |
data[].kind |
string | ⛔f_mat_kind |
data[].type |
string | ⛔f_mat_type |
data[].category |
object | null | ⛔f_mat_category |
data[].width / data[].height |
integer | null | ⛔f_mat_size_px |
data[].duration_ms |
integer | null | ⛔f_mat_duration_ms |
data[].size_bytes |
integer | ⛔f_mat_size_bytes |
data[].file |
object | ⛔f_mat_file |
data[].thumbnail |
object | null | ⛔f_mat_thumbnail |
data[].created_at |
string | ⛔f_created_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/materials?kind=image&type=image_vertical");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"material_unique": "aB3dE5fG7hJ9kL1mN3pQ",
"kind": "image",
"type": "image_vertical",
"category": { "category_unique": "Xy12Ab34Cd", "name": "Product shots" },
"width": 768,
"height": 1344,
"duration_ms": null,
"size_bytes": 1234567,
"file": { "url": "https://...", "expires_at": "2026-10-21T11:00:00Z" },
"thumbnail": { "url": "https://...", "expires_at": "2026-10-21T11:00:00Z" },
"created_at": "2026-10-01T10:00:00Z"
},
{
"material_unique": "Zq9Wv8Ut7Sr6Qp5On4Ml",
"kind": "bgm",
"type": "bgm",
"category": null,
"width": null,
"height": null,
"duration_ms": 30000,
"size_bytes": 482133,
"file": { "url": "https://...", "expires_at": "2026-10-21T11:00:00Z" },
"thumbnail": null,
"created_at": "2026-09-30T08:12:00Z"
}
],
"meta": { "total": 2, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_materials_detail_title
⛔ep_materials_detail_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
material_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_material_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
material_unique |
string | ⛔f_mat_material_unique |
kind |
string | ⛔f_mat_kind |
type |
string | ⛔f_mat_type |
category |
object | null | ⛔f_mat_category |
width / height |
integer | null | ⛔f_mat_size_px |
duration_ms |
integer | null | ⛔f_mat_duration_ms |
size_bytes |
integer | ⛔f_mat_size_bytes |
file |
object | ⛔f_mat_file |
thumbnail |
object | null | ⛔f_mat_thumbnail |
created_at |
string | ⛔f_created_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_material_not_found |
curl "https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/materials/aB3dE5fG7hJ9kL1mN3pQ");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"material_unique": "aB3dE5fG7hJ9kL1mN3pQ",
"kind": "image",
"type": "image_vertical",
"category": { "category_unique": "Xy12Ab34Cd", "name": "Product shots" },
"width": 768,
"height": 1344,
"duration_ms": null,
"size_bytes": 1234567,
"file": { "url": "https://...", "expires_at": "2026-10-21T11:00:00Z" },
"thumbnail": { "url": "https://...", "expires_at": "2026-10-21T11:00:00Z" },
"created_at": "2026-10-01T10:00:00Z"
}
}
⛔ep_material_categories_title
⛔ep_material_categories_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
kind |
⛔in_query | string | ⛔required_no | — | ⛔p_mat_kind |
type |
⛔in_query | string | ⛔required_no | — | ⛔p_mat_type |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].category_unique |
string | ⛔f_matcat_category_unique |
data[].name |
string | ⛔f_matcat_name |
data[].kind |
string | ⛔f_mat_kind |
data[].type |
string | ⛔f_mat_type |
data[].is_system |
boolean | ⛔f_matcat_is_system |
data[].material_count |
integer | ⛔f_matcat_material_count |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/material-categories?kind=image" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/material-categories?kind=image",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/material-categories?kind=image", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/material-categories?kind=image")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/material-categories?kind=image"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/material-categories?kind=image");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"category_unique": "Bg12Ab34Cd",
"name": "Lo-fi",
"kind": "bgm",
"type": "bgm",
"is_system": false,
"material_count": 3
},
{
"category_unique": "Xy12Ab34Cd",
"name": "Product shots",
"kind": "image",
"type": "image_vertical",
"is_system": false,
"material_count": 12
}
]
}
⛔ep_templates_list_title
⛔ep_templates_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
mode |
⛔in_query | string | ⛔required_no | — | ⛔p_tpl_mode |
kind |
⛔in_query | string | ⛔required_no | — | ⛔p_tpl_kind |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].template_unique |
string | ⛔f_tpl_template_unique |
data[].kind |
string | ⛔f_tpl_kind |
data[].mode |
string | ⛔f_mode |
data[].name |
string | ⛔f_tpl_name |
data[].created_at |
string | ⛔f_created_at |
data[].updated_at |
string | ⛔f_updated_at |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/templates?kind=setup&mode=moviemode");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"template_unique": "Ab12Cd34Ef",
"kind": "automation",
"mode": "carouselmode",
"name": "Morning carousel",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-10-05T00:00:00Z"
},
{
"template_unique": "Gh56Ij78Kl",
"kind": "setup",
"mode": "moviemode",
"name": "60-second explainer",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-10-01T00:00:00Z"
}
],
"meta": { "total": 2, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔group_write_contents_nav_label
⛔group_write_contents_lead
-
⛔ep_titles_store_title
POST /projects/{project_unique}/concepts/{concept_unique}/titles -
⛔ep_contents_destroy_title
DELETE /projects/{project_unique}/contents/{variation_unique}
⛔ep_titles_store_title
⛔ep_titles_store_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
concept_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_titles_concept_unique |
titles |
⛔in_body | string[] | ⛔required_yes | — | ⛔p_titles_titles |
language |
⛔in_body | string | ⛔required_yes | — | ⛔p_titles_language |
setup_template_unique |
⛔in_body | string | null | ⛔required_no | — | ⛔p_titles_setup_template_unique |
Idempotency-Key |
⛔in_header | string | ⛔required_no | — | ⛔p_idempotency_key_optional |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
created[] |
object | ⛔f_titles_created |
created[].title_unique |
string | ⛔f_titles_title_unique |
created[].title_name |
string | ⛔f_titles_title_name |
created[].variation_unique |
string | null | ⛔f_titles_variation_unique |
skipped[] |
object | ⛔f_titles_skipped |
skipped[].title_name |
string | ⛔f_titles_title_name |
skipped[].reason |
string | ⛔f_titles_skipped_reason |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 403 | readonly |
⛔e_titles_readonly |
| 404 | not_found |
⛔e_titles_not_found |
| 409 | title_limit_reached |
⛔e_title_limit_reached |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | validation_error |
⛔e_invalid_params |
| 422 | mode_not_supported |
⛔e_titles_mode_not_supported |
| 422 | template_not_found |
⛔e_titles_template_not_found |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
curl -X POST "https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90" \
-d '{
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}'
import requests
body = """{
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}"""
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
body: JSON.stringify({
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
request.httpBody = """
{
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"titles": ["Easy breakfast for beginners", "Meal prep in 5 minutes", "Easy breakfast for beginners"],
"language": "en",
"setup_template_unique": "Gh56Ij78Kl"
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/concepts/Cx2Yz4Wv6Ut8/titles");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"created": [
{ "title_unique": "q8Wm2LzR0pXa", "title_name": "Easy breakfast for beginners", "variation_unique": "Hn4kT7sY1cVb" },
{ "title_unique": "Zr5uP9eK3wQd", "title_name": "Meal prep in 5 minutes", "variation_unique": "Jm8oB2fN6xLe" }
],
"skipped": [
{ "title_name": "Easy breakfast for beginners", "reason": "duplicate" }
]
}
}
⛔ep_contents_destroy_title
⛔ep_contents_destroy_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
project_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_project_unique |
variation_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_variation_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
variation_unique |
string | ⛔f_deleted_variation_unique |
mode |
string | ⛔f_deleted_mode |
delete_at |
string | ⛔f_deleted_delete_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 403 | readonly |
⛔e_contents_destroy_readonly |
| 404 | not_found |
⛔e_contents_destroy_not_found |
| 409 | automation_running |
⛔e_automation_running |
| 409 | last_variation |
⛔e_last_variation |
| 422 | mode_not_supported |
⛔e_contents_destroy_mode_not_supported |
curl -X DELETE "https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.request(
"DELETE",
"https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb", {
method: "DELETE",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb")!)
request.httpMethod = "DELETE"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/projects/Pq7Rs9Tu1V/contents/Hn4kT7sY1cVb");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"variation_unique": "Hn4kT7sY1cVb",
"mode": "blogmode",
"delete_at": "2026-10-24T12:00:00Z"
}
}
⛔group_write_automations_nav_label
⛔group_write_automations_lead
-
⛔ep_automations_store_title
POST /automations -
⛔ep_automations_update_title
PATCH /automations/{auto_unique} -
⛔ep_automations_stop_title
POST /automations/{auto_unique}/stop -
⛔ep_automations_confirm_title
POST /automations/{auto_unique}/confirm
⛔ep_automations_store_title
⛔ep_automations_store_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
variation_uniques |
⛔in_body | string[] | ⛔required_yes | — | ⛔p_auto_variation_uniques |
automation_template_unique |
⛔in_body | string | ⛔required_yes | — | ⛔p_auto_automation_template_unique |
reserved_at |
⛔in_body | string | ⛔required_no | — | ⛔p_auto_reserved_at |
Idempotency-Key |
⛔in_header | string | ⛔required_yes | — | ⛔p_idempotency_key_required |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].auto_unique |
string | ⛔f_auto_auto_unique |
data[].mode |
string | ⛔f_auto_mode |
data[].project |
object | ⛔f_auto_project |
data[].content.variation_unique |
string | ⛔f_content_variation_unique |
data[].content.title |
string | null | ⛔f_content_title |
data[].run_no |
integer | ⛔f_auto_run_no |
data[].status |
string | ⛔f_auto_status |
data[].execution_mode |
string | ⛔f_auto_execution_mode |
data[].phases |
object | ⛔f_auto_phases |
data[].template.setup_template_name |
string | null | ⛔f_auto_setup_template_name |
data[].template.automation_template_name |
string | null | ⛔f_auto_automation_template_name |
data[].reserved_at |
string | null | ⛔f_auto_reserved_at |
data[].executed_at |
string | null | ⛔f_auto_executed_at |
data[].completed_at |
string | null | ⛔f_auto_completed_at |
data[].created_at |
string | ⛔f_auto_created_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 404 | content_not_found |
⛔e_auto_content_not_found |
| 404 | automation_template_not_found |
⛔e_auto_template_not_found |
| 409 | contents_not_automatable |
⛔e_contents_not_automatable |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | validation_error |
⛔e_auto_store_invalid |
| 422 | mode_not_supported |
⛔e_auto_mode_not_supported |
| 422 | mixed_modes |
⛔e_auto_mixed_modes |
| 422 | mixed_projects |
⛔e_auto_mixed_projects |
| 422 | automation_template_mode_mismatch |
⛔e_auto_template_mode_mismatch |
| 422 | idempotency_key_required |
⛔e_idempotency_key_required |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
| 503 | automation_dispatch_failed |
⛔e_auto_dispatch_failed_start |
curl -X POST "https://stepeee.com/public-api/v1/automations" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90" \
-d '{
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}'
import requests
body = """{
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}"""
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/automations",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
body: JSON.stringify({
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
request.httpBody = """
{
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"variation_uniques": ["Ab3dEf6hIj9k", "Lm2nOp5qRs8t"],
"automation_template_unique": "Tm7pL2xQ9z",
"reserved_at": "2030-01-02T12:04:05+09:00"
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/automations");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"auto_unique": "Qw3eRt6yUi",
"mode": "blogmode",
"project": { "project_unique": "Pj8kL3mN2b", "project_name": "My Project" },
"content": { "variation_unique": "Ab3dEf6hIj9k", "title": "My blog title" },
"run_no": 1,
"status": "pending",
"execution_mode": "sequential",
"phases": { "setup": "running", "step1": "not_started", "step2": "not_started", "step3": "not_started" },
"template": { "setup_template_name": null, "automation_template_name": "Morning blog" },
"reserved_at": "2030-01-02T03:04:05Z",
"executed_at": null,
"completed_at": null,
"created_at": "2026-10-21T10:00:00Z"
},
{
"auto_unique": "As4dFg7hJk",
"mode": "blogmode",
"project": { "project_unique": "Pj8kL3mN2b", "project_name": "My Project" },
"content": { "variation_unique": "Lm2nOp5qRs8t", "title": "My blog title" },
"run_no": 1,
"status": "pending",
"execution_mode": "sequential",
"phases": { "setup": "running", "step1": "not_started", "step2": "not_started", "step3": "not_started" },
"template": { "setup_template_name": null, "automation_template_name": "Morning blog" },
"reserved_at": "2030-01-02T03:04:05Z",
"executed_at": null,
"completed_at": null,
"created_at": "2026-10-21T10:00:00Z"
}
]
}
⛔ep_automations_update_title
⛔ep_automations_update_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
auto_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_auto_unique |
reserved_at |
⛔in_body | string | ⛔required_yes | — | ⛔p_auto_reserved_at_new |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
auto_unique |
string | ⛔f_auto_auto_unique |
mode |
string | ⛔f_auto_mode |
project |
object | ⛔f_auto_project |
content.variation_unique |
string | ⛔f_content_variation_unique |
content.title |
string | null | ⛔f_content_title |
run_no |
integer | ⛔f_auto_run_no |
status |
string | ⛔f_auto_status |
execution_mode |
string | ⛔f_auto_execution_mode |
phases |
object | ⛔f_auto_phases |
template.setup_template_name |
string | null | ⛔f_auto_setup_template_name |
template.automation_template_name |
string | null | ⛔f_auto_automation_template_name |
reserved_at |
string | null | ⛔f_auto_reserved_at |
executed_at |
string | null | ⛔f_auto_executed_at |
completed_at |
string | null | ⛔f_auto_completed_at |
created_at |
string | ⛔f_auto_created_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 404 | not_found |
⛔e_automation_not_found |
| 409 | automation_not_pending |
⛔e_automation_not_pending |
| 422 | validation_error |
⛔e_auto_reserved_at_invalid |
curl -X PATCH "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"reserved_at": "2031-05-06T07:08:09+09:00"
}'
import requests
body = """{
"reserved_at": "2031-05-06T07:08:09+09:00"
}"""
response = requests.request(
"PATCH",
"https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi", {
method: "PATCH",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
},
body: JSON.stringify({
"reserved_at": "2031-05-06T07:08:09+09:00"
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi")!)
request.httpMethod = "PATCH"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = """
{
"reserved_at": "2031-05-06T07:08:09+09:00"
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("""
{
"reserved_at": "2031-05-06T07:08:09+09:00"
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"reserved_at": "2031-05-06T07:08:09+09:00"
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"auto_unique": "Qw3eRt6yUi",
"mode": "blogmode",
"project": { "project_unique": "Pj8kL3mN2b", "project_name": "My Project" },
"content": { "variation_unique": "Ab3dEf6hIj9k", "title": "My blog title" },
"run_no": 1,
"status": "pending",
"execution_mode": "sequential",
"phases": { "setup": "running", "step1": "not_started", "step2": "not_started", "step3": "not_started" },
"template": { "setup_template_name": null, "automation_template_name": "Morning blog" },
"reserved_at": "2031-05-05T22:08:09Z",
"executed_at": null,
"completed_at": null,
"created_at": "2026-10-21T10:00:00Z"
}
}
⛔ep_automations_stop_title
⛔ep_automations_stop_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
auto_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_auto_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
auto_unique |
string | ⛔f_auto_auto_unique |
mode |
string | ⛔f_auto_mode |
project |
object | ⛔f_auto_project |
content.variation_unique |
string | ⛔f_content_variation_unique |
content.title |
string | null | ⛔f_content_title |
run_no |
integer | ⛔f_auto_run_no |
status |
string | ⛔f_auto_status |
execution_mode |
string | ⛔f_auto_execution_mode |
phases |
object | ⛔f_auto_phases |
template.setup_template_name |
string | null | ⛔f_auto_setup_template_name |
template.automation_template_name |
string | null | ⛔f_auto_automation_template_name |
reserved_at |
string | null | ⛔f_auto_reserved_at |
executed_at |
string | null | ⛔f_auto_executed_at |
completed_at |
string | null | ⛔f_auto_completed_at |
created_at |
string | ⛔f_auto_created_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_automation_not_found |
curl -X POST "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.method("POST", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/stop");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"auto_unique": "Qw3eRt6yUi",
"mode": "blogmode",
"project": { "project_unique": "Pj8kL3mN2b", "project_name": "My Project" },
"content": { "variation_unique": "Ab3dEf6hIj9k", "title": "My blog title" },
"run_no": 1,
"status": "stopped",
"execution_mode": "sequential",
"phases": { "setup": "running", "step1": "not_started", "step2": "not_started", "step3": "not_started" },
"template": { "setup_template_name": null, "automation_template_name": "Morning blog" },
"reserved_at": "2030-01-02T03:04:05Z",
"executed_at": null,
"completed_at": "2026-10-21T10:05:00Z",
"created_at": "2026-10-21T10:00:00Z"
}
}
⛔ep_automations_confirm_title
⛔ep_automations_confirm_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
auto_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_auto_unique |
Idempotency-Key |
⛔in_header | string | ⛔required_no | — | ⛔p_idempotency_key_optional |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
auto_unique |
string | ⛔f_auto_auto_unique |
mode |
string | ⛔f_auto_mode |
project |
object | ⛔f_auto_project |
content.variation_unique |
string | ⛔f_content_variation_unique |
content.title |
string | null | ⛔f_content_title |
run_no |
integer | ⛔f_auto_run_no |
status |
string | ⛔f_auto_status |
execution_mode |
string | ⛔f_auto_execution_mode |
phases |
object | ⛔f_auto_phases |
template.setup_template_name |
string | null | ⛔f_auto_setup_template_name |
template.automation_template_name |
string | null | ⛔f_auto_automation_template_name |
reserved_at |
string | null | ⛔f_auto_reserved_at |
executed_at |
string | null | ⛔f_auto_executed_at |
completed_at |
string | null | ⛔f_auto_completed_at |
created_at |
string | ⛔f_auto_created_at |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 404 | not_found |
⛔e_automation_not_found |
| 409 | automation_not_waiting_confirmation |
⛔e_automation_not_waiting_confirmation |
| 409 | content_readonly |
⛔e_auto_content_readonly |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
| 503 | automation_dispatch_failed |
⛔e_auto_dispatch_failed_confirm |
curl -X POST "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \ -H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90"
import requests
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/automations/Qw3eRt6yUi/confirm");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"auto_unique": "Qw3eRt6yUi",
"mode": "carouselmode",
"project": { "project_unique": "Pj8kL3mN2b", "project_name": "My Project" },
"content": { "variation_unique": "Ab3dEf6hIj9k", "title": "My carousel title" },
"run_no": 1,
"status": "pending",
"execution_mode": "parallel",
"phases": { "setup": "done", "step1": "done", "step2": "done", "step3": "running" },
"template": { "setup_template_name": null, "automation_template_name": "Weekly carousel" },
"reserved_at": null,
"executed_at": "2026-10-21T09:00:00Z",
"completed_at": null,
"created_at": "2026-10-21T09:00:00Z"
}
}
⛔group_write_posts_nav_label
⛔group_write_posts_lead
-
⛔ep_post_confirms_list_title
GET /post-confirms -
⛔ep_post_schedules_approve_title
POST /post-schedules/{schedule_unique}/approve -
⛔ep_post_schedules_post_now_title
POST /post-schedules/{schedule_unique}/post-now -
⛔ep_post_schedules_update_title
PATCH /post-schedules/{schedule_unique} -
⛔ep_post_schedules_destroy_title
DELETE /post-schedules/{schedule_unique}
⛔ep_post_confirms_list_title
⛔ep_post_confirms_list_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
state |
⛔in_query | string | ⛔required_no | — | ⛔p_pc_state |
project_unique |
⛔in_query | string | ⛔required_no | — | ⛔p_pc_project_unique |
page |
⛔in_query | integer | ⛔required_no | 1 |
⛔p_page |
per_page |
⛔in_query | integer | ⛔required_no | 20 |
⛔p_per_page |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].schedule_unique |
string | ⛔f_pc_schedule_unique |
data[].state |
string | null | ⛔f_pc_state |
data[].confirm_state |
string | ⛔f_pc_confirm_state |
data[].confirm_mode |
string | ⛔f_pc_confirm_mode |
data[].can_approve |
boolean | ⛔f_pc_can_approve |
data[].can_post_now |
boolean | ⛔f_pc_can_post_now |
data[].can_reschedule |
boolean | ⛔f_pc_can_reschedule |
data[].scheduled_at |
string | ⛔f_sch_scheduled_at |
data[].scheduled_at_local |
string | ⛔f_sch_scheduled_at_local |
data[].timezone |
string | ⛔f_sch_timezone |
data[].deadline_at |
string | null | ⛔f_pc_deadline_at |
data[].project |
object | ⛔f_auto_project |
data[].concept |
object | ⛔f_pc_concept |
data[].variation_unique |
string | ⛔f_content_variation_unique |
data[].post_unique |
string | ⛔f_pc_post_unique |
data[].post_type |
string | ⛔f_sch_post_type |
data[].text |
string | ⛔f_pc_text |
data[].thread[] |
object | ⛔f_pc_thread |
data[].image |
object | null | ⛔f_pc_image |
meta.total |
integer | ⛔f_meta_total |
meta.current_page |
integer | ⛔f_meta_current_page |
meta.per_page |
integer | ⛔f_meta_per_page |
meta.last_page |
integer | ⛔f_meta_last_page |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_project_not_found |
| 422 | validation_error |
⛔e_invalid_params |
curl "https://stepeee.com/public-api/v1/post-confirms?state=upcoming" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/post-confirms?state=upcoming",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/post-confirms?state=upcoming", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/post-confirms?state=upcoming")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/post-confirms?state=upcoming"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/post-confirms?state=upcoming");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"schedule_unique": "aB3dE5fG7hJ9",
"state": "upcoming",
"confirm_state": "awaiting",
"confirm_mode": "required",
"can_approve": true,
"can_post_now": false,
"can_reschedule": false,
"scheduled_at": "2026-10-19T13:00:00Z",
"scheduled_at_local": "2026-10-19T22:00:00",
"timezone": "Asia/Tokyo",
"deadline_at": "2026-10-19T13:00:00Z",
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My brand" },
"concept": { "concept_unique": "Cx2Yz4Wv6Ut8", "concept_name": "Morning tips" },
"variation_unique": "Vr5Ws7Xt9Yu1",
"post_unique": "Ps3Qt5Ru7Sv9",
"post_type": "knowhow",
"text": "First post of the thread",
"thread": [
{ "text": "Second post", "image": null },
{ "text": "Third post", "image": { "url": "https://...", "expires_at": "2026-10-19T13:00:00Z" } }
],
"image": null
}
],
"meta": { "total": 1, "current_page": 1, "per_page": 20, "last_page": 1 }
}
⛔ep_post_schedules_approve_title
⛔ep_post_schedules_approve_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
schedule_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_schedule_unique |
Idempotency-Key |
⛔in_header | string | ⛔required_no | — | ⛔p_idempotency_key_optional |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
schedule_unique / state / … / image |
— | ⛔f_pc_same_as_list |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 404 | post_schedule_not_found |
⛔e_post_schedule_not_found |
| 409 | confirm_expired |
⛔e_confirm_expired |
| 409 | confirm_not_pending |
⛔e_confirm_not_pending |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
curl -X POST "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \ -H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90"
import requests
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/approve");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"schedule_unique": "aB3dE5fG7hJ9",
"state": null,
"confirm_state": "confirmed",
"confirm_mode": "required",
"can_approve": false,
"can_post_now": false,
"can_reschedule": false,
"scheduled_at": "2026-10-19T13:00:00Z",
"scheduled_at_local": "2026-10-19T22:00:00",
"timezone": "Asia/Tokyo",
"deadline_at": null,
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My brand" },
"concept": { "concept_unique": "Cx2Yz4Wv6Ut8", "concept_name": "Morning tips" },
"variation_unique": "Vr5Ws7Xt9Yu1",
"post_unique": "Ps3Qt5Ru7Sv9",
"post_type": "knowhow",
"text": "First post of the thread",
"thread": [
{ "text": "Second post", "image": null },
{ "text": "Third post", "image": { "url": "https://...", "expires_at": "2026-10-19T13:00:00Z" } }
],
"image": null
}
}
⛔ep_post_schedules_post_now_title
⛔ep_post_schedules_post_now_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
schedule_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_schedule_unique |
allow_close_slot |
⛔in_body | boolean | ⛔required_no | false |
⛔p_allow_close_slot |
Idempotency-Key |
⛔in_header | string | ⛔required_no | — | ⛔p_idempotency_key_optional |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
schedule_unique / state / … / image |
— | ⛔f_pc_same_as_list |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 403 | resource_readonly |
⛔e_resource_readonly |
| 404 | post_schedule_not_found |
⛔e_post_schedule_not_found |
| 409 | confirm_not_expired |
⛔e_confirm_not_expired |
| 409 | schedule_close_to_other_slot |
⛔e_schedule_close_to_other_slot |
| 409 | schedule_locked |
⛔e_schedule_locked |
| 409 | schedule_processing |
⛔e_schedule_processing |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | validation_error |
⛔e_allow_close_slot_invalid |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
curl -X POST "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90" \
-d '{
"allow_close_slot": true
}'
import requests
body = """{
"allow_close_slot": true
}"""
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
body: JSON.stringify({
"allow_close_slot": true
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
request.httpBody = """
{
"allow_close_slot": true
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"allow_close_slot": true
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"allow_close_slot": true
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9/post-now");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"schedule_unique": "aB3dE5fG7hJ9",
"state": null,
"confirm_state": "confirmed",
"confirm_mode": "required",
"can_approve": false,
"can_post_now": false,
"can_reschedule": false,
"scheduled_at": "2026-10-21T12:01:00Z",
"scheduled_at_local": "2026-10-21T21:01:00",
"timezone": "Asia/Tokyo",
"deadline_at": null,
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My brand" },
"concept": { "concept_unique": "Cx2Yz4Wv6Ut8", "concept_name": "Morning tips" },
"variation_unique": "Vr5Ws7Xt9Yu1",
"post_unique": "Ps3Qt5Ru7Sv9",
"post_type": "knowhow",
"text": "First post of the thread",
"thread": [
{ "text": "Second post", "image": null },
{ "text": "Third post", "image": { "url": "https://...", "expires_at": "2026-10-19T13:00:00Z" } }
],
"image": null
}
}
⛔ep_post_schedules_update_title
⛔ep_post_schedules_update_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
schedule_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_schedule_unique |
scheduled_at |
⛔in_body | string | ⛔required_yes | — | ⛔p_pc_scheduled_at |
allow_close_slot |
⛔in_body | boolean | ⛔required_no | false |
⛔p_allow_close_slot |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
schedule_unique / state / … / image |
— | ⛔f_pc_same_as_list |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 403 | resource_readonly |
⛔e_resource_readonly |
| 404 | post_schedule_not_found |
⛔e_post_schedule_not_found |
| 409 | confirm_not_expired |
⛔e_confirm_not_expired |
| 409 | schedule_close_to_other_slot |
⛔e_schedule_close_to_other_slot |
| 409 | schedule_locked |
⛔e_schedule_locked |
| 409 | schedule_processing |
⛔e_schedule_processing |
| 422 | confirm_reschedule_past |
⛔e_confirm_reschedule_past |
| 422 | validation_error |
⛔e_pc_update_invalid |
curl -X PATCH "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}'
import requests
body = """{
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}"""
response = requests.request(
"PATCH",
"https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9", {
method: "PATCH",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
},
body: JSON.stringify({
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9")!)
request.httpMethod = "PATCH"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = """
{
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("""
{
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"scheduled_at": "2026-10-22T09:30:00-05:00",
"allow_close_slot": false
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"schedule_unique": "aB3dE5fG7hJ9",
"state": null,
"confirm_state": "confirmed",
"confirm_mode": "required",
"can_approve": false,
"can_post_now": false,
"can_reschedule": false,
"scheduled_at": "2026-10-22T14:30:00Z",
"scheduled_at_local": "2026-10-22T23:30:00",
"timezone": "Asia/Tokyo",
"deadline_at": null,
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My brand" },
"concept": { "concept_unique": "Cx2Yz4Wv6Ut8", "concept_name": "Morning tips" },
"variation_unique": "Vr5Ws7Xt9Yu1",
"post_unique": "Ps3Qt5Ru7Sv9",
"post_type": "knowhow",
"text": "First post of the thread",
"thread": [
{ "text": "Second post", "image": null },
{ "text": "Third post", "image": { "url": "https://...", "expires_at": "2026-10-19T13:00:00Z" } }
],
"image": null
}
}
⛔ep_post_schedules_destroy_title
⛔ep_post_schedules_destroy_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
schedule_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_schedule_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
schedule_unique |
string | ⛔f_pc_deleted_schedule_unique |
deleted |
boolean | ⛔f_deleted_flag |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 403 | resource_readonly |
⛔e_resource_readonly |
| 404 | post_schedule_not_found |
⛔e_post_schedule_not_found |
| 409 | post_posting_locked |
⛔e_post_posting_locked |
curl -X DELETE "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.request(
"DELETE",
"https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9", {
method: "DELETE",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9")!)
request.httpMethod = "DELETE"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/post-schedules/aB3dE5fG7hJ9");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"schedule_unique": "aB3dE5fG7hJ9",
"deleted": true
}
}
⛔group_write_webhooks_nav_label
⛔group_write_webhooks_lead
-
⛔ep_webhooks_list_title
GET /webhooks -
⛔ep_webhooks_store_title
POST /webhooks -
⛔ep_webhooks_destroy_title
DELETE /webhooks/{webhook_unique} -
⛔ep_webhooks_test_title
POST /webhooks/{webhook_unique}/test
⛔ep_webhooks_list_title
⛔ep_webhooks_list_desc
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
data[].webhook_unique |
string | ⛔f_wh_webhook_unique |
data[].url |
string | ⛔f_wh_url |
data[].events |
string[] | ⛔f_wh_events |
data[].description |
string | null | ⛔f_wh_description |
data[].is_active |
boolean | ⛔f_wh_is_active |
data[].last_delivery_at |
string | null | ⛔f_wh_last_delivery_at |
data[].last_delivery_status |
string | null | ⛔f_wh_last_delivery_status |
data[].last_response_status |
integer | null | ⛔f_wh_last_response_status |
data[].last_error |
string | null | ⛔f_wh_last_error |
data[].created_at |
string | ⛔f_created_at |
curl "https://stepeee.com/public-api/v1/webhooks" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.get(
"https://stepeee.com/public-api/v1/webhooks",
headers={"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx"},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/webhooks", {
headers: { Authorization: "Bearer sk_xxxxxxxxxxxxxxxx" },
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/webhooks")!)
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/webhooks"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/webhooks");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": [
{
"webhook_unique": "Xk3pQ9vLm2Ta",
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook",
"is_active": true,
"last_delivery_at": "2026-10-21T12:01:00Z",
"last_delivery_status": "failed",
"last_response_status": 503,
"last_error": "non_2xx_response",
"created_at": "2026-10-20T09:00:00Z"
}
]
}
⛔ep_webhooks_store_title
⛔ep_webhooks_store_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
url |
⛔in_body | string | ⛔required_yes | — | ⛔p_wh_url |
events |
⛔in_body | string[] | ⛔required_yes | — | ⛔p_wh_events |
description |
⛔in_body | string | null | ⛔required_no | — | ⛔p_wh_description |
Idempotency-Key |
⛔in_header | string | ⛔required_no | — | ⛔p_idempotency_key_optional |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
webhook_unique |
string | ⛔f_wh_webhook_unique |
url |
string | ⛔f_wh_url |
events |
string[] | ⛔f_wh_events |
description |
string | null | ⛔f_wh_description |
is_active |
boolean | ⛔f_wh_is_active |
last_delivery_at |
string | null | ⛔f_wh_last_delivery_at |
last_delivery_status |
string | null | ⛔f_wh_last_delivery_status |
last_response_status |
integer | null | ⛔f_wh_last_response_status |
last_error |
string | null | ⛔f_wh_last_error |
created_at |
string | ⛔f_created_at |
secret |
string | ⛔f_wh_secret |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 409 | webhook_limit_reached |
⛔e_webhook_limit_reached |
| 409 | idempotency_request_in_progress |
⛔e_idempotency_request_in_progress |
| 422 | validation_error |
⛔e_webhook_invalid |
| 422 | idempotency_key_invalid |
⛔e_idempotency_key_invalid |
| 422 | idempotency_key_reused |
⛔e_idempotency_key_reused |
curl -X POST "https://stepeee.com/public-api/v1/webhooks" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90" \
-d '{
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}'
import requests
body = """{
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}"""
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/webhooks",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
data=body,
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/webhooks", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
},
body: JSON.stringify({
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/webhooks")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90", forHTTPHeaderField: "Idempotency-Key")
request.httpBody = """
{
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}
""".data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/webhooks"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.header("Idempotency-Key", "5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}
"""))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$body = <<<'JSON'
{
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook"
}
JSON;
$ch = curl_init("https://stepeee.com/public-api/v1/webhooks");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
"Content-Type: application/json",
"Idempotency-Key: 5f0c2d8e-7a41-4c1b-9d3e-2b8f6a1c4e90",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"webhook_unique": "Xk3pQ9vLm2Ta",
"url": "https://example.com/hooks/stepeee",
"events": ["automation.completed", "post.published"],
"description": "production hook",
"is_active": true,
"last_delivery_at": null,
"last_delivery_status": null,
"last_response_status": null,
"last_error": null,
"created_at": "2026-10-21T12:00:00Z",
"secret": "whsec_5f0c2a9e8b7d4c3a1f6e9d8c7b6a5f4e3d2c1b0a9f8e7d6c"
}
}
⛔ep_webhooks_destroy_title
⛔ep_webhooks_destroy_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
webhook_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_webhook_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
webhook_unique |
string | ⛔f_wh_deleted_webhook_unique |
deleted |
boolean | ⛔f_deleted_flag |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 404 | not_found |
⛔e_webhook_not_found |
curl -X DELETE "https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.request(
"DELETE",
"https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta", {
method: "DELETE",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta")!)
request.httpMethod = "DELETE"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"webhook_unique": "Xk3pQ9vLm2Ta",
"deleted": true
}
}
⛔ep_webhooks_test_title
⛔ep_webhooks_test_desc
| ⛔th_name | ⛔th_in | ⛔th_type | ⛔th_required | ⛔th_default | ⛔th_desc |
|---|---|---|---|---|---|
webhook_unique |
⛔in_path | string | ⛔required_yes | — | ⛔p_webhook_unique |
| ⛔th_field | ⛔th_type | ⛔th_desc |
|---|---|---|
delivered |
boolean | ⛔f_wh_test_delivered |
response_status |
integer | null | ⛔f_wh_test_response_status |
error |
string | null | ⛔f_wh_test_error |
| ⛔th_status | ⛔th_code | ⛔th_when |
|---|---|---|
| 403 | plan_required |
⛔e_plan_required |
| 403 | team_plan_lost |
⛔e_team_plan_lost |
| 404 | not_found |
⛔e_webhook_not_found |
curl -X POST "https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test" \ -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxx"
import requests
response = requests.request(
"POST",
"https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test",
headers={
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
)
print(response.json())
const response = await fetch("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test", {
method: "POST",
headers: {
"Authorization": "Bearer sk_xxxxxxxxxxxxxxxx",
},
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test")!)
request.httpMethod = "POST"
request.setValue("Bearer sk_xxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
print(String(data: data, encoding: .utf8)!)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test"))
.header("Authorization", "Bearer sk_xxxxxxxxxxxxxxxx")
.method("POST", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://stepeee.com/public-api/v1/webhooks/Xk3pQ9vLm2Ta/test");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer sk_xxxxxxxxxxxxxxxx",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"data": {
"delivered": false,
"response_status": 500,
"error": "non_2xx_response"
}
}
⛔webhook_events_heading
⛔webhook_events_lead
| ⛔webhook_th_event | Ý nghĩa |
|---|---|
automation.waiting_confirmation | ⛔webhook_event_automation_waiting_confirmation |
automation.completed | ⛔webhook_event_automation_completed |
automation.failed | ⛔webhook_event_automation_failed |
post.published | ⛔webhook_event_post_published |
post.failed | ⛔webhook_event_post_failed |
post.confirm_required | ⛔webhook_event_post_confirm_required |
webhook.test | ⛔webhook_event_webhook_test |
⛔webhook_payload_heading
⛔webhook_payload_desc
| ⛔webhook_th_event | ⛔webhook_th_data |
|---|---|
automation.* | ⛔webhook_data_automation |
post.publishedpost.failed | ⛔webhook_data_post |
post.confirm_required | ⛔webhook_data_post_confirm_required |
webhook.test | {"webhook_unique": "…"} |
⛔webhook_payload_example_heading
automation.failed{
"id": "evt_Q2x8Lr0aZk9MvB3pT7cYw1Nd",
"type": "automation.failed",
"created_at": "2026-10-21T12:01:03Z",
"data": {
"auto_unique": "a8Kd02LmQz",
"mode": "blogmode",
"project": { "project_unique": "Pj7Xc2Lq9W", "project_name": "My Project" },
"content": { "variation_unique": "Vb3Nq8Ls1Kd0", "title": "How to start" },
"run_no": 2,
"status": "token_shortage",
"execution_mode": "sequential",
"phases": { "setup": "done", "step1": "done", "step2": "running", "step3": "not_started" },
"template": { "setup_template_name": "Default", "automation_template_name": null },
"reserved_at": null,
"executed_at": "2026-10-21T11:40:00Z",
"completed_at": "2026-10-21T12:00:41Z",
"created_at": "2026-10-21T11:39:58Z"
}
}
post.published{
"id": "evt_7hT2mWq9Zp3LxR8cVb1Nk5Ds",
"type": "post.published",
"created_at": "2026-10-21T12:02:10Z",
"data": {
"publication_unique": "Lg4Hs9Pq2Wx7",
"mode": "moviemode",
"project": { "project_unique": "Pj7Xc2Lq9W", "project_name": "My Project" },
"content": { "variation_unique": "Mv8Kq2Zt5Rb1", "title": "5 tips" },
"platform": "youtube",
"account": { "account_unique": "Ac1Bd2Ef3Gh4", "name": "My Channel" },
"status": "success",
"post_url": "https://www.youtube.com/watch?v=xxxxxxxx",
"error_code": null,
"is_automation": true,
"posted_at": "2026-10-21T12:01:55Z",
"created_at": "2026-10-21T12:01:20Z"
}
}
post.failed{
"id": "evt_9Zq1Lm4Xc7Vb2Nk8Ds3Pt6Wr",
"type": "post.failed",
"created_at": "2026-10-21T09:00:40Z",
"data": {
"publication_unique": "Pp5Kd8Lw2Qz9",
"mode": "postmode",
"project": { "project_unique": "Pj7Xc2Lq9W", "project_name": "My Project" },
"content": { "variation_unique": "Pv4Lk9Qz2Wx6", "title": "My X concept" },
"platform": "x",
"account": null,
"status": "failed",
"post_url": null,
"error_code": "token_expired",
"is_automation": true,
"posted_at": null,
"created_at": "2026-10-20T21:00:12Z",
"schedule_unique": "Sc6Hj1Kl8Mn3"
}
}
post.confirm_required{
"id": "evt_3Kd8Lq2Wz7Xc1Vb9Nm4Pt6Rs",
"type": "post.confirm_required",
"created_at": "2026-10-19T08:15:02Z",
"data": {
"schedule_unique": "aB3dE5fG7hJ9",
"state": "upcoming",
"confirm_state": "awaiting",
"confirm_mode": "required",
"can_approve": true,
"can_post_now": false,
"can_reschedule": false,
"scheduled_at": "2026-10-19T13:00:00Z",
"scheduled_at_local": "2026-10-19T22:00:00",
"timezone": "Asia/Tokyo",
"deadline_at": "2026-10-19T13:00:00Z",
"project": { "project_unique": "Pq7Rs9Tu1V", "project_name": "My brand" },
"concept": { "concept_unique": "Cx2Yz4Wv6Ut8", "concept_name": "Morning tips" },
"variation_unique": "Vr5Ws7Xt9Yu1",
"post_unique": "Ps3Qt5Ru7Sv9",
"post_type": "knowhow",
"text": "First post of the thread",
"thread": [
{ "text": "Second post", "image": null }
],
"image": { "url": "https://...", "expires_at": "2026-10-19T09:15:02Z" }
}
}
webhook.test{
"id": "evt_Q2x8Lr0aZk9MvB3pT7cYw1Nd",
"type": "webhook.test",
"created_at": "2026-10-21T12:00:00Z",
"data": { "webhook_unique": "Xk3pQ9vLm2Ta" }
}
⛔webhook_headers_heading
| ⛔webhook_th_header | ⛔th_desc |
|---|---|
Content-Type: application/json | ⛔webhook_header_content_type |
Stepeee-Signature: t=1792584000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd | ⛔webhook_header_signature |
Stepeee-Event-Id: evt_Q2x8Lr0aZk9MvB3pT7cYw1Nd | ⛔webhook_header_event_id |
Stepeee-Event-Type: automation.failed | ⛔webhook_header_event_type |
User-Agent: Stepeee-Webhooks/1.0 | ⛔webhook_header_user_agent |
⛔webhook_verify_heading
⛔webhook_verify_lead
- ⛔webhook_verify_step1
- ⛔webhook_verify_step2
- ⛔webhook_verify_step3
- ⛔webhook_verify_step4
- ⛔webhook_verify_step5
- ⛔webhook_verify_step6
⛔webhook_verify_code_heading
import hmac, hashlib, time
def verify(body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t, v1 = parts.get("t"), parts.get("v1")
if not t or not v1 or abs(time.time() - int(t)) > tolerance:
return False
expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, v1)
# Flask: verify(request.get_data(), request.headers["Stepeee-Signature"], SECRET)
const crypto = require("crypto");
function verify(rawBody, header, secret, toleranceSec = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
const t = parts.t, v1 = parts.v1;
if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false;
const expected = crypto.createHmac("sha256", secret).update(`${t}.`).update(rawBody).digest("hex");
return v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
// Express: receive the body as raw bytes with express.raw()
app.post("/hooks/stepeee", express.raw({ type: "application/json" }), (req, res) => {
if (!verify(req.body, req.get("Stepeee-Signature"), process.env.STEPEEE_WEBHOOK_SECRET)) return res.sendStatus(400);
const event = JSON.parse(req.body.toString("utf8"));
res.sendStatus(200);
});
function verifyStepeeeSignature(string $body, string $header, string $secret, int $tolerance = 300): bool
{
$parts = [];
foreach (explode(',', $header) as $part) {
[$k, $v] = array_pad(explode('=', $part, 2), 2, '');
$parts[$k] = $v;
}
if (! isset($parts['t'], $parts['v1']) || abs(time() - (int) $parts['t']) > $tolerance) {
return false;
}
$expected = hash_hmac('sha256', $parts['t'].'.'.$body, $secret);
return hash_equals($expected, $parts['v1']);
}
$ok = verifyStepeeeSignature(file_get_contents('php://input'), $_SERVER['HTTP_STEPEEE_SIGNATURE'] ?? '', $secret);
# BODY: raw request body, T: t from Stepeee-Signature, SECRET: whsec_...
printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}'
# The signature is valid if the output equals v1
⛔webhook_retry_heading
⛔webhook_retry_desc
⛔webhook_duplicate_desc
⛔webhook_destination_heading
⛔webhook_destination_desc