Перейти к основному содержимому

API интеграция

Обзор API

TDS.SO предоставляет REST API для программного управления всеми функциями системы. API поддерживает создание редиректов, управление доменами, получение статистики и другие операции.

Базовый URL

https://dashboard.tds.so/api/v2/

Аутентификация

Все запросы к API должны содержать параметр token - ваш API ключ, который можно получить в разделе настроек панели.

Важно

Храните API ключ в безопасном месте и не передавайте его третьим лицам.

Методы API

Создание шаблона

Endpoint: POST /create/template

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
setting_nameНетstringНазвание шаблона
setting_descriptionНетstringОписание шаблона
redirect_typeНетstringТип редиректа (meta, js, 301, 302, iframe и др.)
redirect_delayНетintegerЗадержка редиректа (1-10 сек)
unique_typeНетstringТип уникальности
auto_deleteНетintegerАвтоудаление через часов (1-30)
auto_bindНетbooleanАвтопривязка доменов
is_ban_checkНетbooleanПроверка бана
is_random_phrazeНетbooleanРандомные фразы
is_previewНетbooleanПревью
send_getНетbooleanПередача GET параметров
min_symbolsНетintegerМин. количество символов (1-10)
max_symbolsНетintegerМакс. количество символов (1-10)
reg1НетbooleanЛатиница
reg2НетbooleanКириллица
s_numsНетbooleanЦифры
subDomainsНетbooleanПоддомены
bot_listНетarrayСписок ботов
white_reffererНетstringБелый реферер
hasAudioНетbooleanАудио
ban_allНетbooleanБанить всех
minHourНетintegerМин. час (0-24)
maxHourНетintegerМакс. час (0-24)
bot_redirectНетstringРедирект для ботов
POST /api/v2/create/template
token=your_api_key&setting_name=Test_Template&redirect_type=meta&redirect_delay=3

Создание редиректа

Endpoint: POST /create/redirect

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
redirect_domainsДаstringДомены для редиректа (через запятую)
link_listsДаstringЦелевые URL (через запятую)
templateНетstring/intID, название шаблона или 'last', 'first', 'random'
has_oneНетbooleanОдин редирект для всех доменов
no_checkНетbooleanПропустить проверку доменов
check_vkНетbooleanПроверить бан ВК
POST /api/v2/create/redirect
token=your_api_key&redirect_domains=domain1.com,domain2.com&link_lists=https://target1.com

Получение данных

Список ссылок

Endpoint: GET /get/links

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
offsetНетintegerКоличество записей (по умолчанию 20)
orderНетstringПорядок сортировки (DESC/ASC)
{
"response": {
"links": [
{
"link_redirect": "http://domain.com/abc123",
"redirect_to": "https://target.com",
"total_clicks": 100,
"mobile_clicks": 45,
"bots_clicks": 5,
"unique_clicks": 80,
"created_time": "2024-01-01 12:00:00"
}
]
},
"full_stat": {
"full_clicks": 100,
"unique_clicks": 80,
"bots_clicks": 5,
"mobile_clicks": 45
}
}

Список доменов

Endpoint: GET /get/domains

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
template_idНетintegerID шаблона
template_nameНетstringНазвание шаблона
{
"response": {
"domains": [
{
"domain": "example.com",
"plug": 1,
"banned": 0,
"owned": 1,
"selling_key": null,
"link_count": 5
}
]
}
}

Список шаблонов

Endpoint: GET /get/templates

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
nameНетstringНазвание конкретного шаблона
{
"response": {
"templates": [
{
"id": 1,
"name": "Template Name",
"bot_list": ["google", "yandex"],
"redirect_type": "meta",
"min_symbols": 5,
"max_symbols": 10,
"random_phrazes": true,
"ban_check": true,
"useragent_bots": [],
"button": false,
"delay": 3,
"hours_delete": null
}
]
}
}

Обновление ссылок

Endpoint: POST /set/links

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
redirect_linkДаstringНовый URL для редиректа
linkУсловно*stringСсылка, домен, 'last', 'first', 'all'
template_idУсловно*integerID шаблона
template_nameУсловно*stringНазвание шаблона
folderУсловно*stringПапка доменов
groupНетstringГруппа ссылок

* Должен быть указан хотя бы один из параметров: link, template_id, template_name или folder

POST /api/v2/set/links
token=your_api_key&redirect_link=https://new-target.com&link=domain.com

Управление доменами

Проверка доменов

Endpoint: POST /domain/check

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
domains_listДаstringСписок доменов через запятую или 'current'
check_vkНетbooleanПроверка бана ВК
check_googleНетbooleanПроверка бана Google (требуется токен)
check_yandexНетbooleanПроверка бана Yandex (требуется токен)
delete_invalidНетbooleanУдалить невалидные домены
noteНетstringПапка для сохранения
generate_keysНетbooleanГенерировать ключи продажи
give_domainНетstringEmail для передачи доменов
[
{
"valid": ["domain1.com", "domain2.com"],
"invalid": ["bad-domain.com"]
},
{
"log": "Проверка доступности...",
"result": "Проверено доменов: 3 | Невалидных: 1"
}
]

Удаление доменов

Endpoint: POST /domain/delete

Параметры:

ПараметрОбязательныйТипОписание
tokenДаstringAPI ключ
domains_listДаstringСписок доменов через запятую или 'all'
softНетbooleanМягкое удаление (не удаляет ссылки)
limitНетintegerОграничение количества
[
["domain1.com", "domain2.com"],
{
"result": "Удаление доменов: 2 | Ссылок: 10"
}
]

Обработка ошибок

Все ошибки возвращаются в формате JSON с полями error и error_id:

{
"error": "Invalid token",
"error_id": 2
}

Коды ошибок

error_idОписание
0Закончился срок панели или общая ошибка
1Не заполнено обязательное поле
2Невалидный API ключ
3Неправильное название метода
4Пустой ответ или данные не найдены
5Ошибка валидации параметров

Примеры использования

PHP

<?php
$token = 'your_api_key';
$baseUrl = 'https://dashboard.tds.so/api/v2';

// Создание шаблона
function createTemplate($token, $name, $redirectType = 'meta') {
$url = $GLOBALS['baseUrl'] . '/create/template';

$data = [
'token' => $token,
'setting_name' => $name,
'redirect_type' => $redirectType
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

return json_decode($response, true);
}

// Обновление ссылок по шаблону
function updateLinksByTemplate($token, $templateId, $newRedirect) {
$url = $GLOBALS['baseUrl'] . '/set/links';

$data = [
'token' => $token,
'template_id' => $templateId,
'redirect_link' => $newRedirect
];

$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($data)
]
];

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

return json_decode($response, true);
}

// Использование
$result = createTemplate($token, 'My Template', 'js');
$templateId = $result['response']['template']['id'];

$updateResult = updateLinksByTemplate($token, $templateId, 'https://new-target.com');
echo "Обновлено ссылок: " . $updateResult['updated_count'];

Python

import requests

class TDSAPI:
def __init__(self, token):
self.token = token
self.base_url = 'https://dashboard.tds.so/api/v2'

def create_redirect(self, domains, targets, template=None):
"""Создание редиректов"""
url = f'{self.base_url}/create/redirect'

data = {
'token': self.token,
'redirect_domains': ','.join(domains) if isinstance(domains, list) else domains,
'link_lists': ','.join(targets) if isinstance(targets, list) else targets
}

if template:
data['template'] = template

response = requests.post(url, data=data)
return response.json()

def update_links_by_folder(self, folder, new_redirect):
"""Обновление ссылок по папке"""
url = f'{self.base_url}/set/links'

data = {
'token': self.token,
'folder': folder,
'redirect_link': new_redirect
}

response = requests.post(url, data=data)
return response.json()

def check_domains(self, domains, check_vk=True, check_google=False):
"""Проверка доменов"""
url = f'{self.base_url}/domain/check'

data = {
'token': self.token,
'domains_list': ','.join(domains) if isinstance(domains, list) else domains,
'check_vk': check_vk,
'check_google': check_google
}

response = requests.post(url, data=data)
return response.json()

# Использование
api = TDSAPI('your_api_key')

# Создание редиректов
result = api.create_redirect(
domains=['domain1.com', 'domain2.com'],
targets=['https://target.com'],
template='last'
)

# Обновление ссылок в папке
update_result = api.update_links_by_folder('Campaign_2024', 'https://new-target.com')
print(f"Обновлено {update_result['updated_count']} ссылок")

# Проверка доменов
check_result = api.check_domains(['domain1.com', 'domain2.com'], check_vk=True)
print(check_result[1]['result'])

JavaScript (Node.js)

const axios = require('axios');

class TDSAPI {
constructor(token) {
this.token = token;
this.baseURL = 'https://dashboard.tds.so/api/v2';
}

async createTemplate(name, options = {}) {
const params = new URLSearchParams({
token: this.token,
setting_name: name,
...options
});

try {
const response = await axios.post(`${this.baseURL}/create/template`, params);
return response.data;
} catch (error) {
console.error('Error creating template:', error.response?.data || error.message);
throw error;
}
}

async updateLinksByTemplate(templateName, newRedirect) {
const params = new URLSearchParams({
token: this.token,
template_name: templateName,
redirect_link: newRedirect
});

try {
const response = await axios.post(`${this.baseURL}/set/links`, params);
return response.data;
} catch (error) {
console.error('Error updating links:', error.response?.data || error.message);
throw error;
}
}

async getStatistics() {
const params = { token: this.token };

try {
const response = await axios.get(`${this.baseURL}/get/links`, { params });
return response.data;
} catch (error) {
console.error('Error getting statistics:', error.response?.data || error.message);
throw error;
}
}
}

// Использование
(async () => {
const api = new TDSAPI('your_api_key');

try {
// Создание шаблона
const template = await api.createTemplate('JS Template', {
redirect_type: 'js',
redirect_delay: 2
});
console.log('Template created:', template);

// Обновление ссылок
const updateResult = await api.updateLinksByTemplate('JS Template', 'https://new-target.com');
console.log(`Updated ${updateResult.updated_count} links`);

// Получение статистики
const stats = await api.getStatistics();
console.log('Statistics:', stats.full_stat);

} catch (error) {
console.error('API Error:', error);
}
})();

Рекомендации по использованию

1. Обработка ошибок

  • Всегда проверяйте наличие поля error в ответе
  • Добавьте повторные попытки для сетевых ошибок
  • Используйте таймауты для запросов (рекомендуется 30 секунд)
  • Логируйте все ошибки для отладки

2. Оптимизация

  • Кэшируйте список шаблонов и доменов
  • Группируйте операции при массовых обновлениях
  • Используйте фильтры для точечных изменений
  • Не превышайте 60 запросов в минуту

3. Безопасность

  • Храните API ключ в переменных окружения
  • Используйте HTTPS для всех запросов
  • Регулярно ротируйте API ключи
  • Ограничьте доступ к API только с доверенных IP

4. Массовые операции

При работе с большим количеством данных:

  • Разбивайте операции на батчи по 100-500 записей
  • Добавляйте задержки между запросами (1-2 секунды)
  • Используйте асинхронные запросы где возможно
  • Мониторьте использование API
Лучшие практики
  1. Начните с тестирования на небольшом количестве данных
  2. Используйте песочницу для разработки
  3. Документируйте все используемые endpoint'ы
  4. Создайте обертку для API в вашем языке программирования
  5. Добавьте мониторинг и алерты для критических операций
Ограничения
  • Максимум 1000 доменов за один запрос проверки
  • Максимум 10000 ссылок в ответе get/links
  • Размер запроса не должен превышать 2MB
  • API ключ действителен до окончания подписки