Документация
Всё необходимое для интеграции TrafficNinja в вашу инфраструктуру — справочник REST API и руководство по плагину WordPress.
API-интеграция
REST API TrafficNinja позволяет программно управлять сайтами, категориями, темами и синхронизировать сгенерированные статьи с вашей платформой. Все эндпоинты имеют префикс /api/v1/.
Базовый URL
https://trafficninja.io/api/v1Аутентификация
TrafficNinja использует аутентификацию Bearer-токена. Ваш API-ключ генерируется автоматически в процессе онбординга. Найдите его в панели управления в разделе Настройки → Настройки интеграции.
Скопируйте API-ключ из Панель управления → Настройки → Настройки интеграции и передавайте его как Bearer-токен в каждом запросе.
Используйте ваш API-ключ в каждом запросе:
curl https://trafficninja.io/api/v1/websites \
-H "Authorization: Bearer {your-api-key}" \
-H "Accept: application/json"Основные эндпоинты
Сайты
/api/v1/websitesСписок всех сайтов Авт./api/v1/websitesСоздать сайт Авт./api/v1/websites/{id}Получить сайт Авт./api/v1/websites/{id}Обновить сайт Авт./api/v1/websites/{id}Удалить сайт Авт.Публикации
/api/v1/postsСписок публикаций Авт./api/v1/posts/{id}Получить публикацию Авт.Необязательные фильтры: website_id (целое число), statuses[] (published|draft|archived|deleted), title (частичное совпадение), date_from / date_to (ГГГГ-ММ-ДД)
GET /api/v1/posts?website_id=1&statuses[]=published&title=seo&date_from=2026-01-01&date_to=2026-04-30
Authorization: Bearer {your-api-key}Пример: Создание сайта
POST /api/v1/websites
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "My Blog",
"url": "https://myblog.com",
"industry": "technology",
"country": "US",
"language": "en"
}{
"id": 42,
"name": "My Blog",
"url": "https://myblog.com",
"status": "active",
"created_at": "2026-04-10T12:00:00Z"
}Эндпоинты плагина WordPress
Эти эндпоинты используются плагином WordPress с помощью ключа API WordPress, созданного в панели управления. Передайте его в заголовке X-API-Key:
X-API-Key: {your-wordpress-api-key}/api/v1/wordpress/connection-testПроверить ключ API и подключение/api/v1/wordpress/content-queueПолучить статьи для публикации/api/v1/wordpress/content/{id}Получить полный контент статьиContent queue item shape
{
"id": 99,
"title": "10 Ways to Boost Local SEO",
"slug": "10-ways-boost-local-seo",
"content": "<h2>...</h2><p>...</p>",
"meta_description": "Learn how to dominate local search...",
"focus_keyword": "local SEO tips",
"json_ld": "{"@context":"https://schema.org",...}",
"locale": "en",
"categories": ["SEO", "Marketing"],
"scheduled_for": "2026-04-11T08:00:00Z"
}Исходящие вебхуки
TrafficNinja может отправлять подписанный JSON-запрос (POST) на указанный вами URL при каждом изменении состояния публикации. Настройте один URL вебхука на сайт — опрос API не нужен.
Настройка вебхука
Укажите URL вебхука через API или в настройках сайта в панели управления. При первом сохранении URL автоматически генерируется секрет подписи и возвращается в ответе. Сохраните его в надёжном месте — он потребуется для проверки входящих запросов.
/api/v1/websites/{id}/settings/webhookУстановить или удалить URL вебхука Авт./api/v1/websites/{id}/settings/webhook/regenerate-secretОбновить секрет подписи Авт.PUT /api/v1/websites/42/settings/webhook
Authorization: Bearer {your-api-key}
Content-Type: application/json
{ "webhook_url": "https://yoursite.com/hooks/trafficninja" }
→ 200 OK
{
"data": {
"webhook_url": "https://yoursite.com/hooks/trafficninja",
"webhook_secret": "abc123...64chars",
"has_webhook": true
}
}События
post.publishedСтатус публикации изменился на «опубликовано» (автопубликация или вручную).post.archivedСтатус публикации изменился на «в архиве».post.content_editedЗаголовок или тело опубликованной, черновой или архивной публикации было отредактировано.Структура полезной нагрузки
Каждая доставка — это HTTP POST с Content-Type: application/json. Объект post соответствует ответу GET /api/v1/posts/{id}.
{
"event": "post.published",
"timestamp": "2026-04-18T10:30:00Z",
"website_id": 42,
"post": {
"id": 99,
"title": "10 Ways to Boost Local SEO",
"slug": "10-ways-boost-local-seo",
"status": "published",
"language": "en-US",
"meta_description": "Learn how to dominate local search...",
"seo_score": 94,
"word_count": 2300,
"published_at": "2026-04-18T10:29:58Z",
...
}
}Проверка подписи
Каждый запрос содержит заголовок X-Webhook-Signature вида sha256= и HMAC-SHA256 hex-дайджест тела запроса, подписанный вашим секретом вебхука. Всегда проверяйте его перед обработкой полезной нагрузки.
// Node.js verification example
const crypto = require('crypto');
function verifySignature(rawBody, secret, signatureHeader) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody) // use the raw request body bytes
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}// PHP verification example
function verifySignature(string $rawBody, string $secret, string $signatureHeader): bool {
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
return hash_equals($expected, $signatureHeader);
}Доставка и повторные попытки
Обработка ошибок
Все ошибки возвращают JSON в едином формате:
{
"message": "The given data was invalid.",
"errors": {
"email": ["The email field is required."]
}
}400Bad Request — ошибка валидации401Unauthorized — отсутствует или недействительный токен403Forbidden — недостаточно прав404Not Found — ресурс не существует422Unprocessable Entity — ошибка бизнес-логики429Too Many Requests — превышен лимит запросов500Server Error — попробуйте позже