API интеграция v2
Обзор API
TDS.SO предоставляет REST API v2 для программного управления всеми функциями системы. API поддерживает создание редиректов, управление доменами, создание лендингов, получение статистики и другие операции.
Базовый URL
https://dashboard.tds.so/api/v2/
Аутентификация
Все запросы к API должны содержать параметр token
- ваш API ключ, который можно получить в разделе настроек панели.
Храните API ключ в безопасном месте и не передавайте его третьим лицам.
Методы API
Создание ресурсов
Создание шаблона
Endpoint: GET /create/template
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
setting_name | Нет | string | Название шаблона |
redirect_type | Нет | string | Тип редиректа (js, meta, php) |
redirect_delay | Нет | integer | Задержка редиректа в секундах |
unique_type | Нет | string | Тип отслеживания уникальных посетителей (ip) |
auto_delete | Нет | integer | Автоудаление после часов |
min_symbols | Нет | integer | Минимальное количество символов URL |
max_symbols | Нет | integer | Максимальное количество символов URL |
is_ban_check | Нет | boolean | Включить проверку на бан |
is_random_phraze | Нет | boolean | Использовать случайные фразы |
is_preview | Нет | boolean | Включить режим превью |
- Пример запроса
- Ответ
GET /api/v2/create/template?token=your_api_key&setting_name=Test%20Template&redirect_type=js&redirect_delay=3&unique_type=ip&auto_delete=24&min_symbols=5&max_symbols=10
{
"response": {
"template": {
"name": "Test Template",
"id": 123
},
"route": "create/template"
}
}
Создание редиректов
Endpoint: GET /create/redirect
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
redirect_domains | Да | string | Домены для редиректа (через запятую) |
link_lists | Да | string | Целевые URL (через запятую) |
template | Нет | integer | ID шаблона для использования |
folder | Нет | string | Имя папки для организации ссылок |
expired_at | Нет | string | Дата истечения срока (YYYY-MM-DD HH:mm:ss) |
landing_user | Нет | integer | ID лендинга для пользователей (если шаблон типа landing) |
landing_bot | Нет | integer | ID лендинга для ботов (если шаблон типа landing) |
has_one | Нет | boolean | Создать одну ссылку на домен |
no_check | Нет | boolean | Пропустить валидацию доменов |
no_cache | Нет | boolean | Пропустить кеш доменов |
check_vk | Нет | boolean | Проверить статус бана ВК |
- Обычный редирект
- С лендингом
- Ответ
GET /api/v2/create/redirect?token=your_api_key&redirect_domains=example.com,test.com&link_lists=https://google.com,https://facebook.com&template=1&folder=test&expired_at=2024-12-31%2023:59:59
GET /api/v2/create/redirect?token=your_api_key&redirect_domains=example.com&link_lists=https://google.com&template=2&landing_user=456&landing_bot=789&folder=landing_campaign
{
"response": {
"valid": [
"https://example.com/abc123"
],
"invalid": []
},
"log": [
"Создано ссылок: 1"
],
"created_links": [
{
"original_link": "https://google.com",
"short_link": "https://example.com/abc123"
}
],
"links_count": 1
}
При использовании шаблона типа "landing":
landing_user
- ID лендинга, который будет показан обычным пользователямlanding_bot
- ID лендинга, который будет показан ботам- ID лендинга можно получить после создания лендинга или через метод
GET /get/landings
- Если параметры лендингов не указаны для шаблона типа "landing", будут использованы значения по умолчанию из шаблона
Создание лендинга
Создание лендинга загрузкой файла
Endpoint: POST /create/landing
Параметры (multipart/form-data):
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
landing_file | Да | file | ZIP архив или HTML файл (макс. 20MB) |
title | Нет | string | Заголовок лендинга |
- Пример запроса
- Ответ
POST /api/v2/create/landing
Content-Type: multipart/form-data
token=your_api_key
landing_file=@path/to/landing.zip
title=My Uploaded Landing
{
"response": {
"landing": {
"id": 789,
"title": "My Uploaded Landing",
"name": "landing.zip",
"files": ["index.html", "style.css", "script.js"]
},
"route": "create/landing",
"method": "file_upload"
}
}
Получение данных
Список ссылок
Endpoint: GET /get/links
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
offset | Нет | integer | Количество возвращаемых записей |
order | Нет | string | Порядок сортировки (DESC/ASC) |
folder_name | Нет | string | Фильтр по имени папки |
created_from | Нет | string | Фильтр по дате создания (от) |
created_to | Нет | string | Фильтр по дате создания (до) |
- Пример запроса
- Ответ
GET /api/v2/get/links?token=your_api_key&offset=10&order=DESC&folder_name=test
{
"response": {
"links": [
{
"link_id": 123,
"link_redirect": "https://example.com/abc123",
"redirect_to": "https://google.com",
"total_clicks": 150,
"mobile_clicks": 80,
"bots_clicks": 5,
"unique_clicks": 120,
"created_time": "2024-01-15T10:30:00.000000Z",
"folder_name": "test",
"expired_at": null
}
]
},
"full_stat": {
"full_clicks": 150,
"unique_clicks": 120,
"bots_clicks": 5,
"mobile_clicks": 80
}
}
Список доменов
Endpoint: GET /get/domains
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
template_id | Нет | integer | Фильтр по ID шаблона |
template_name | Нет | string | Фильтр по названию шаблона |
- Пример запроса
- Ответ
GET /api/v2/get/domains?token=your_api_key&template_id=1
{
"response": {
"domains": [
{
"domain": "example.com",
"plug": true,
"banned": false,
"owned": true,
"selling_key": null,
"link_count": 15
},
{
"domain": "test.com",
"plug": true,
"banned": false,
"owned": false,
"selling_key": "abc123",
"link_count": 5
}
]
}
}
Список шаблонов
Endpoint: GET /get/templates
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
name | Нет | string | Получить конкретный шаблон по названию |
- Пример запроса
- Ответ
GET /api/v2/get/templates?token=your_api_key
{
"response": {
"templates": [
{
"id": 1,
"name": "Default Template",
"bot_list": ["Googlebot", "Bingbot"],
"redirect_type": "js",
"min_symbols": 5,
"max_symbols": 10,
"random_phrazes": true,
"ban_check": true,
"useragent_bots": true,
"button": false,
"delay": 3,
"hours_delete": 24
}
]
}
}
Список лендингов
Endpoint: GET /get/landings
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
limit | Нет | integer | Ограничить количество результатов |
id | Нет | integer | Получить конкретный лендинг по ID |
- Все лендинги
- Конкретный лендинг
- Ответ (все)
- Ответ (конкретный)
GET /api/v2/get/landings?token=your_api_key&limit=10
GET /api/v2/get/landings?token=your_api_key&id=456
{
"response": {
"landings": [
{
"id": 456,
"title": "My API Landing",
"name": "API Landing - 2024-01-15 10:30:45",
"files": ["index.html"],
"created_at": "2024-01-15T10:30:45.000000Z",
"updated_at": "2024-01-15T10:30:45.000000Z"
},
{
"id": 789,
"title": "My Uploaded Landing",
"name": "landing.zip",
"files": ["index.html", "style.css", "script.js"],
"created_at": "2024-01-15T11:00:00.000000Z",
"updated_at": "2024-01-15T11:00:00.000000Z"
}
]
}
}
{
"response": {
"landing": {
"id": 456,
"title": "My API Landing",
"name": "API Landing - 2024-01-15 10:30:45",
"files": ["index.html"],
"created_at": "2024-01-15T10:30:45.000000Z",
"updated_at": "2024-01-15T10:30:45.000000Z"
}
}
}
Обновление ресурсов
Обновление ссылок
Endpoint: GET /set/links
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
redirect_link | Нет | string | Новый URL для редиректа |
link | Нет | string | Селектор ссылок: all, first, last, или конкретная ссылка |
set_folder | Нет | string | Новое имя папки |
expired_at | Нет | string | Новая дата истечения (YYYY-MM-DD HH:mm:ss) |
link_ids | Нет | string | Конкретные ID ссылок (через запятую) |
template_id | Нет | integer | Фильтр по ID шаблона |
template_name | Нет | string | Фильтр по названию шаблона |
folder | Нет | string | Фильтр по текущей папке |
group | Нет | string | Фильтр по группе |
- Все ссылки
- По шаблону
- По папке
- Ответ
GET /api/v2/set/links?token=your_api_key&redirect_link=https://newdestination.com&link=all&set_folder=updated_folder&expired_at=2024-12-31%2023:59:59
GET /api/v2/set/links?token=your_api_key&redirect_link=https://new-target.com&template_id=123
GET /api/v2/set/links?token=your_api_key&redirect_link=https://new-target.com&folder=old_folder&set_folder=new_folder
{
"response": "OK",
"new_redirect": "https://newdestination.com",
"updated_count": 15,
"expired_at": "2024-12-31 23:59:59",
"set_folder": "updated_folder",
"filters_applied": {
"link": "all"
}
}
Продление ссылок
Endpoint: GET /set/extend
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
hours | Да | integer | Количество часов для продления (макс. 8760) |
link | Нет | string | Селектор ссылок: all, first, last, или конкретная ссылка |
reactivate | Нет | boolean | Реактивировать неактивные ссылки |
template_id | Нет | integer | Фильтр по ID шаблона |
template_name | Нет | string | Фильтр по названию шаблона |
folder | Нет | string | Фильтр по папке |
group | Нет | string | Фильтр по группе |
- Пример запроса
- Ответ
GET /api/v2/set/extend?token=your_api_key&hours=48&link=all&reactivate=true
{
"response": "OK",
"extended_count": 12,
"reactivated_count": 3,
"new_created_at": "2024-01-13 10:30:45",
"filters_applied": {
"link": "all",
"hours": 48,
"reactivate": true
}
}
Управление доменами
Проверка доменов
Endpoint: GET /domains/check
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
domains_list | Да | string | Список доменов через запятую или 'current' для сохраненных |
check_google | Нет | boolean | Проверить статус бана Google |
check_vk | Нет | boolean | Проверить статус бана ВК |
check_yandex | Нет | boolean | Проверить статус бана Yandex |
save_domains | Нет | boolean | Сохранить валидные домены |
delete_invalid | Нет | boolean | Удалить невалидные домены |
no_cache | Нет | boolean | Пропустить кеш доменов |
note | Нет | string | Заметка папки для сохраненных доменов |
- Пример запроса
- Ответ
GET /api/v2/domains/check?token=your_api_key&domains_list=example.com,test.com&check_google=true&check_vk=true
[
{
"valid": [
{
"domain": "example.com",
"owned": true,
"banned": false,
"cached": false
}
],
"invalid": [
{
"domain": "test.com",
"reason": "Domain not available"
}
]
},
{
"log": [
"Проверено доменов: 2",
"Валидных: 1",
"Невалидных: 1"
]
},
{
"result": "Проверено доменов: 2 | Невалидных: 1"
}
]
Удаление доменов
Endpoint: GET /domains/delete
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
domains_list | Да | string | Список доменов через запятую или 'all' для всех |
soft | Нет | boolean | Мягкое удаление (можно восстановить) |
limit | Нет | integer | Ограничить количество удаляемых доменов |
- Пример запроса
- Ответ
GET /api/v2/domains/delete?token=your_api_key&domains_list=example.com,test.com&soft=true
[
"example.com",
{
"result": "Удаление доменов: 1"
}
]
Очистка кеша доменов
Endpoint: GET /domains/clear-cache
Параметры:
Параметр | Обязательный | Тип | Описание |
---|---|---|---|
token | Да | string | API ключ |
domains_list | Да | string | Список доменов через запятую или 'all' для всех |
- Пример запроса
- Ответ
GET /api/v2/domains/clear-cache?token=your_api_key&domains_list=all
{
"success": true,
"message": "Очищен весь кеш проверки доменов",
"cleared_count": 25
}
Обработка ошибок
Все ошибки возвращаются в формате 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
- Начните с тестирования на небольшом количестве данных
- Используйте песочницу для разработки
- Документируйте все используемые endpoint'ы
- Создайте обертку для API в вашем языке программирования
- Добавьте мониторинг и алерты для критических операций
- Максимум 1000 доменов за один запрос проверки
- Максимум 10000 ссылок в ответе get/links
- Размер запроса не должен превышать 2MB
- API ключ действителен до окончания подписки