- Головна
- Документація API
Документація API
Адреса API: https://2index.ninja/api/v1/
Для виконання запиту до API потрібно передати Bearer токен доступу в заголовку Authorization.
curl https://2index.ninja/api/v1/account -H "Authorization: Bearer API_TOKEN"
Токен доступу можна отримати у відповідному розділі в кабінеті користувача.
У відповіді на кожен запит присутній параметр success, за яким визначається успішність запиту.
Параметр errors містить повідомлення про помилки.
У деяких випадках, якщо повертатиметься помилка 403, необхідно вказати user-agent, наприклад:
curl https://2index.ninja/api/v1/account -H "Authorization: Bearer API_TOKEN" -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
Запити можуть бути обмежені з боку хостингу, у цьому випадку ми рекомендуємо використовувати проксі.
Методи для роботи з акаунтом
Реєстрація користувача
Виконайте POST запит за адресою register
POST https://2index.ninja/api/v1/register
Параметри запиту:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
| string | так | Email користувача у форматі [email protected] |
|
| source | string | ні | Джерело реєстрації, за замовчуванням api. Може бути, наприклад, wordpress_plugin. |
Приклади відповідей:
Успішна реєстрація:
{
"success": true,
"message": "User registered successfully!",
"account": {
"email": "[email protected]",
"tariff": "White Ninja",
"available_projects": 1,
"balance": 100.0,
"available_links": 100,
"available_indexation_check_links": 500,
"link_sending_speed": 100,
"available_link_sending_speed": 100,
"tariff_available": true,
"tariff_expiring_date": "2025-01-16T14:26:11.700740Z",
"email_verified": false,
"link_cost": "$0.00056",
"api_key": "API_KEY"
}
}
Можливі помилки:
Помилка валідації:
{
"errors": {
"email": ["The email field is required."]
}
}
Email уже зареєстрований:
{
"message": "The email has already been taken."
}
Після успішної реєстрації на вказаний email буде надіслано лист для активації акаунта.
Отримати дані акаунта
Потрібно виконати GET запит за адресою account
GET https://2index.ninja/api/v1/account
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"account": {
"email": "[email protected]",
"tariff": "White Ninja",
"balance": 100.0,
"available_projects": 1,
"available_links": 100,
"available_indexation_check_links": 500,
"link_sending_speed": 100,
"available_link_sending_speed": 45,
"tariff_available": true,
"tariff_expiring_date": "2025-01-16T14:26:11.000000Z",
"email_verified": false,
"link_cost": "$0.00056"
}
}
Де:
| Поле | Опис |
|---|---|
link_sending_speed |
Ліміт швидкості відправки посилань за тарифом (загалом на акаунт за добу). |
available_link_sending_speed |
Залишок швидкості — link_sending_speed мінус сума indexing_speed за всіма проєктами. Тобто скільки ще можна призначити новим або наявним проєктам без перевищення ліміту. |
Методи для роботи з проєктами
Отримати список проєктів
Потрібно виконати GET запит за адресою project
GET https://2index.ninja/api/v1/project
Пагінація (необов'язково)
За замовчуванням (без параметрів) повертаються всі не-архівні проєкти користувача — поведінка збережена для зворотної сумісності.
Якщо передано параметр page, відповідь переключається в режим пагінації і додатково містить блок pagination.
| Параметр | Тип | Обов'язково | Опис |
|---|---|---|---|
page |
integer | ні | Номер сторінки. Якщо не передано — повертаються всі проєкти. |
per_page |
integer | ні | Розмір сторінки. Приймається тільки разом із page. За замовчуванням 20, допустимий діапазон 1…100 (значення поза діапазоном обрізаються). |
Приклад запиту з пагінацією:
GET https://2index.ninja/api/v1/project?page=2&per_page=10
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"projects": [
{
"id": 1,
"name": "Project name",
"type": "indexing",
"website": "https://domain.com/",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_type": "internal",
"google_account_access_granted": 0,
"links_total": 500,
"links_sending_speed": 400,
"links_sent_google": 100,
"links_sent_yandex": 40,
"links_sent_bing": 100,
"in_queue": 360,
"sent_links": 100,
"indexed": 30,
"not_indexed": 0,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_sent_url": "DOWNLOAD_SENT_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL"
},
{
"id": "2",
"name": "Project 2 name",
"type": "indexing_check",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_total": 200,
"links_checking_speed": 100,
"in_queue": 100,
"checked": 100,
"indexed": 70,
"not_indexed": 30,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL",
"download_all_url": "DOWNLOAD_ALL_URL",
"download_checked_url": "DOWNLOAD_CHECKED_URL",
}
...
]
}
У режимі пагінації (коли передано page) відповідь містить додатковий блок pagination:
{
"success": true,
"projects": [ ... ],
"pagination": {
"current_page": 2,
"last_page": 5,
"per_page": 10,
"total": 47
}
}
Отримати дані проєкту
Потрібно виконати GET запит за адресою project/{project_id}
GET https://2index.ninja/api/v1/project/1
У відповідь будуть отримані дані у форматі JSON:
- Для проєкту індексації:
{
"success": true,
"project": {
"id": 1,
"name": "Project name",
"type": "indexing",
"website": "https://domain.com/",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_type": "internal",
"google_account_access_granted": 0,
"links_total": 500,
"links_sending_speed": 400,
"links_sent_google": 100,
"links_sent_yandex": 40,
"links_sent_bing": 100,
"in_queue": 360,
"sent_links": 100,
"indexed": 30,
"not_indexed": 0,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_sent_url": "DOWNLOAD_SENT_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL"
}
}
- Для проєкту перевірки індексації:
{
"success": true,
"project": {
"id": "2",
"name": "Project 2 name",
"type": "indexing_check",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_total": 200,
"links_checking_speed": 100,
"in_queue": 100,
"checked": 100,
"indexed": 70,
"not_indexed": 30,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL",
"download_all_url": "DOWNLOAD_ALL_URL",
"download_checked_url": "DOWNLOAD_CHECKED_URL"
}
}
Створити проєкт
Потрібно виконати POST запит за адресою project
POST https://2index.ninja/api/v1/project
Параметри запиту:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
| name | string | так | Назва проєкту |
| website | string | так* | Адреса сайту у форматі https://site.domain/. *Обов'язкове якщо тип проєкту: indexing |
| for_external_links | boolean | ні | Проєкт для зовнішніх посилань. Якщо не вказано, буде тільки для внутрішніх. |
| indexing_speed | integer | ні** | Швидкість індексації проєкту, якщо не вказано буде застосована вся доступна швидкість на акаунті. Використовується для проєктів з типом indexing. Для проєктів з типом indexing_check використовується checking_speed |
| checking_speed | integer | ні** | Швидкість перевірки посилань проєкту, якщо не вказано буде застосована вся доступна швидкість на акаунті. Використовується для проєктів з типом indexing_check. Для проєктів з типом indexing використовується indexing_speed |
| type | string | ні | Тип проєкту. Можливі варіанти: indexing — індексація посилань, indexing_check — перевірка індексації посилань. Якщо не вказано — створить проєкт індексації посилань indexing |
** При створенні проєкту будь-якого типу можна використовувати будь-який із параметрів indexing_speed і checking_speed — вони є аліасами один одного, але якщо передано обидва, буде використано indexing_speed.
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "The project has been successfully created"
}
Приклад створення проєкту індексації посилань:
POST https://2index.ninja/api/v1/project
name: Project 1
website: https://website.com
for_external_links: 1
indexing_speed: 100
Приклад створення проєкту перевірки індексації посилань:
POST https://2index.ninja/api/v1/project
name: Project 2
checking_speed: 100
Створити (отримати) проєкт для плагіна Wordpress
Знаходить проєкт, прив'язаний до сайту на WordPress. Якщо такого проєкту немає, створює новий.
Потрібно виконати POST запит за адресою account/get_wordpress_project
POST https://2index.ninja/api/v1/account/get_wordpress_project
Параметри запиту:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
| website | string | так | Адреса сайту у форматі https://site.domain/ |
У результаті запиту буде знайдено проєкт користувача із зазначеною адресою сайту або створено новий для зазначеного сайту. У новому проєкті буде вказана індексація внутрішніх посилань, а швидкість відправки буде обрана максимальна.
Для існуючого проєкту у відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "Found existing project domain.com",
"project": {
"id": 1,
"name": "Project name",
"website": "https://domain.com/",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_type": "internal",
"google_account_access_granted": 0,
"links_total": 500,
"links_sending_speed": 400,
"links_sent_google": 100,
"links_sent_yandex": 40,
"links_sent_bing": 100,
"in_queue": 360,
"sent_links": 100,
"indexed": 30,
"not_indexed": 0,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_sent_url": "DOWNLOAD_SENT_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL"
}
}
Для нового проєкту у відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "The project has been successfully created",
"project": {
"id": 1,
"name": "Project name",
"website": "https://domain.com/",
"status": "in progress",
"created_at": "2024-03-01 14:34:56",
"links_type": "internal",
"google_account_access_granted": 0,
"links_total": 500,
"links_sending_speed": 400,
"links_sent_google": 100,
"links_sent_yandex": 40,
"links_sent_bing": 100,
"in_queue": 360,
"sent_links": 100,
"indexed": 30,
"not_indexed": 0,
"download_queue_url": "DOWNLOAD_QUEUE_URL",
"download_sent_url": "DOWNLOAD_SENT_URL",
"download_indexed_url": "DOWNLOAD_INDEXED_URL",
"download_unindexed_url": "DOWNLOAD_UNINDEXED_URL"
}
}
Очистити чергу індексації
Потрібно виконати POST запит за адресою project/{project_id}/clear_queue
POST https://2index.ninja/api/v1/project/1/clear_queue
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "The indexing queue has been cleared successfully. X links have been removed"
}
Або буде повернуто відповідне повідомлення про помилку:
{
"success": false,
"errors": ["Project not found"]
}
Обнулити швидкість завершених проєктів
Масова операція — встановлює indexing_speed = 0 для всіх завершених (completed) проєктів користувача. Корисно, коли після масового завершення проєктів потрібно вивільнити зайняту швидкість, не архівуючи їх.
Потрібно виконати POST запит за адресою project/reset_speed_completed:
POST https://2index.ninja/api/v1/project/reset_speed_completed
Без параметрів — впливає на всі завершені проєкти користувача з indexing_speed > 0. Усі параметри-фільтри опціональні; дати передаються у форматі Y-m-d.
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
created_at_from |
string | ні | Дата створення проєкту, нижня межа (Y-m-d). |
created_at_to |
string | ні | Дата створення проєкту, верхня межа (Y-m-d). |
completed_at_from |
string | ні | Дата переходу в completed, нижня межа. |
completed_at_to |
string | ні | Дата переходу в completed, верхня межа. |
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "Speed reset for 5 projects",
"affected_projects": 5
}
У разі невалідного формату дати:
{
"success": false,
"errors": {
"completed_at_from": ["The completed at from field must match the format Y-m-d."]
}
}
Архівувати завершені проєкти
Масова операція — переводить усі завершені (completed) проєкти користувача в archived, обнулюючи їхню швидкість. Корисно для пакетного «закриття» завершених проєктів без поштучних запитів.
Потрібно виконати POST запит за адресою project/archive_completed:
POST https://2index.ninja/api/v1/project/archive_completed
Приймає ті самі опціональні фільтри за діапазонами дат, що й reset_speed_completed:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
created_at_from |
string | ні | Дата створення проєкту, нижня межа (Y-m-d). |
created_at_to |
string | ні | Дата створення проєкту, верхня межа (Y-m-d). |
completed_at_from |
string | ні | Дата переходу в completed, нижня межа. |
completed_at_to |
string | ні | Дата переходу в completed, верхня межа. |
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "5 projects have been archived",
"archived_count": 5
}
Методи для роботи з посиланнями
Додати посилання
Потрібно виконати POST запит за адресою link/add
POST https://2index.ninja/api/v1/link/add
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_id | так | ID проєкту |
| links | так | Список посилань. Можна передати у вигляді масиву посилань або у вигляді тексту (кожне посилання окремим рядком) |
| ні, за умови yandex або bing | Надсилати посилання в Google | |
| yandex | ні, за умови google або bing | Надсилати посилання в Yandex |
| bing | ні, за умови google або yandex | Надсилати посилання в Bing |
| google_access_granted | ні | Надано доступ до акаунта Google |
У відповідь будуть отримані дані у форматі JSON:
{
"success": true,
"message": "Links have been successfully added to the project"
}
Якщо у списку будуть помилкові посилання, посилання не будуть додані, у відповідь буде отримано відповідне повідомлення про помилку:
{
"success": false,
"errors": ["You sent invalid links"],
"invalid_links": ["http://wrong.link"]
}
Для проєктів перевірки індексації посилання додаються так само як і для індексації, google_access_granted — не обов'язково передавати, буде ігноруватися. Пошукові системи потрібно вказати, але наразі доступна перевірка лише в google.
Додати посилання за назвою проєкту
Потрібно виконати POST запит за адресою link/add_simple. Якщо проєкту з вказаним іменем не існує, він буде створений автоматично з максимальною швидкістю відправки.
POST https://2index.ninja/api/v1/link/add_simple
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_name | ні | Назва проєкту. Якщо не вказано, буде створено проєкт з іменем "default". |
| links | так | Список посилань. Можна передати масивом або текстом (кожне посилання з нового рядка). |
| ні, якщо вказано yandex або bing | Надсилати посилання в Google. | |
| yandex | ні, якщо вказано google або bing | Надсилати посилання в Yandex. |
| bing | ні, якщо вказано google або yandex | Надсилати посилання в Bing. |
| google_access_granted | ні | Надано доступ до акаунта Google. |
Для проєктів перевірки індексації посилання додаються так само як і для індексації, google_access_granted — не обов'язково передавати, буде ігноруватися. Пошукові системи потрібно вказати, але наразі доступна перевірка лише в google.
Приклад запиту:
{
"project_name": "My Website",
"links": ["https://example.com/page1", "https://example.com/page2"],
"google": true,
"yandex": false,
"bing": true,
"google_access_granted": false
}
Відповідь у разі успіху:
{
"success": true,
"message": "Links have been successfully added to the project",
"project_name": "My Website",
"project_id": 12345
}
Можливі помилки:
- Якщо у списку будуть помилкові посилання:
{
"success": false,
"errors": ["You sent invalid links"],
"invalid_links": ["http://wrong.link"]
}
- Якщо сталася помилка під час створення проєкту:
{
"success": false,
"errors": ["Failed to create the project"]
}
Перевірити статус посилання
Виконайте POST запит за адресою /api/v1/link/status
POST https://2index.ninja/api/v1/link/status
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_id | так | ID проєкту |
| link | так | Посилання, що перевіряється |
- При успішному запиті у відповідь буде отримано json об'єкт:
{
"success": true,
"link": {
"id": 34368960,
"url": "https://2index.ninja/",
"google": "Sent",
"yandex": "Sent",
"bing": "Sent",
"is_external": 1,
"google_sent": "2025-08-24 20:10:02",
"yandex_sent": "2025-08-24 20:45:02",
"bing_sent": "2025-08-24 20:05:05",
"google_sent_attempts": 1,
"yandex_sent_attempts": 1,
"bing_sent_attempts": 1,
"google_indexed": 1,
"google_indexing_check_date": "2025-08-29"
}
}
Де:
| Поле | Опис |
|---|---|
id |
ID посилання |
url |
Посилання |
google |
* Статус відправки в Google |
yandex |
* Статус відправки в Yandex |
bing |
* Статус відправки в Bing |
is_external |
Зовнішнє посилання |
google_sent |
Дата відправки в Google |
yandex_sent |
Дата відправки в Yandex |
bing_sent |
Дата відправки в Bing |
google_sent_attempts |
К-сть спроб відправки в Google |
yandex_sent_attempts |
К-сть спроб відправки в Yandex |
bing_sent_attempts |
К-сть спроб відправки в Bing |
google_indexed |
Проіндексовано в Google |
google_indexing_check_date |
Дата перевірки індексації в Google |
* Можливі статуси:
| Статус | Значення |
|---|---|
New |
Нове |
Sent |
Відправлено |
In the queue |
У черзі відправки |
In the process |
У процесі відправки |
Error sending |
Сталася помилка під час відправки |
Don\'t index |
Не індексувати |
Sent to reindexing |
Відправлено на переіндексацію |
- Якщо сталася помилка, буде повернуто JSON об'єкт із повідомленням про помилку. Приклади помилок:
{
"success": false,
"errors":{
"link": [
"The link field is required."
]
}
}
{
"success": false,
"errors":[
"Project not found"
]
}
{
"success": false,
"errors":[
"URL not found"
]
}
Також можна отримати статус посилання за ID посилання
Для цього виконайте GET запит за адресою /api/v1/link/status/ID
GET https://2index.ninja/api/v1/link/status/ID
Відповідь на запит буде такою самою як і в попередньому варіанті
Відправити посилання на переіндексацію
Надсилає непроіндексовані посилання на переіндексацію. Приймає параметр max_attempts для обмеження максимальної к-сті переотправок посилань (від 1 до 10). Приймає масив посилань links для переотправки на індексацію, якщо посилання не передані то отримує всі непроіндексовані посилання з проєкту. Далі перевіряє к-сть відправок посилань і після перевірки намагається додати посилання у проєкт, враховуючи ліміти акаунта. Якщо передані посилання, які не надсилалися, вони теж будуть додані в чергу.
Виконайте POST запит за адресою /api/v1/link/resent_notindexed_links/{project_id}
POST https://2index.ninja/api/v1/link/resent_notindexed_links/{project_id}
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_id | так | ID проєкту |
| max_attempts | так (від 1 до 10) | Ліміт спроб відправки на індексацію |
| links | ні, якщо не вказано — будуть використовуватися ВСІ непроіндексовані посилання вказаного проєкту | Посилання, що переотправляються |
- При успішному запиті у відповідь буде отримано json об'єкт:
{
"success": true,
"message": "Links have been successfully added to the project. Invalid links was ignored.",
"invalid_links": [],
"project_id": 1,
"ignored_links": [
{
"url": "https://domain.com/url1",
"attempts": 2
},
{
"url": "https://domain.com/url2",
"attempts": 2
}
]
}
Де:
| Поле | Опис |
|---|---|
success |
Статус успішності запиту |
message |
Повідомлення про успіх |
invalid_links |
Список невалідних посилань, які не були додані |
project_id |
ID проєкту |
ignored_links |
Проігноровані посилання — ті, що вже відправлені max_attempts чи більше разів |
У разі помилки буде повернуто json об'єкт із повідомленнями про помилки. Наприклад:
{
"success": false,
"errors": {
"max_attempts": [
"The max attempts field must not be greater than 10."
],
"links": [
"The links field must be an array."
]
}
}
Або:
{
"success": false,
"errors": [
"You do not have enough tokens to add any links. You need at least 1 tokens."
],
"ignored_links": []
}
Видалити посилання з проєкту
Видаляє посилання або масив посилань із проєкту. Якщо посилання ще у черзі відправки — токени за нього повертаються на баланс. Уже відправлені посилання видаляються без повернення токенів.
Виконайте POST запит за адресою /api/v1/link/delete/{project_id}:
POST https://2index.ninja/api/v1/link/delete/{project_id}
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_id | так | ID проєкту (передається в URL). |
| link | так | Посилання для видалення. Можна передати один рядок або масив посилань. |
- При успішному запиті у відповідь буде отримано json об'єкт:
{
"success": true,
"deleted": 3,
"message": "The URLs have been deleted."
}
Якщо в проєкті було кілька однакових URL (наприклад, посилання повторно додавалося), у відповіді буде додаткове поле duplicates:
{
"success": true,
"deleted": 5,
"duplicates": 2,
"message": "The URLs have been deleted, including duplicate (re-submitted) entries."
}
Якщо переданих посилань у проєкті не знайшлося:
{
"success": true,
"deleted": 0,
"message": "No URLs were found to delete."
}
Можливі помилки:
{
"success": false,
"errors": ["You cannot work with links. The project is deeply archived"]
}
{
"success": false,
"errors": "Project not found"
}
Робота з джерелами посилань
Джерела посилань доступні для будь-яких типів проєктів і обробляються однаково. Для проєктів перевірки індексації доступний вибір лише google.
Додавання карти сайту
Виконайте POST запит за адресою /api/v1/sitemap/add
POST https://2index.ninja/api/v1/sitemap/add
Параметри запиту:
| Поле | Обов'язково | Опис |
|---|---|---|
| project_id | так | ID проєкту |
| sitemap | так | Посилання на карту сайту |
| ні, за умови yandex або bing | Надсилати посилання в Google | |
| yandex | ні, за умови google або bing | Надсилати посилання в Yandex |
| bing | ні, за умови google або yandex | Надсилати посилання в Bing |
| google_access_granted | ні | Надано доступ до акаунта Google |
| watch | ні | Слідкувати за змінами карти сайту |
Можливі помилки:
| Помилка |
|---|
| Помилка валідації даних. Одне з обов'язкових полів відсутнє або має неправильне значення. |
| Недоступність тарифу. Тарифний план користувача завершився. |
| Проєкт не знайдено. Користувач не володіє вказаним проєктом або проєкт не існує. |
| Внутрішня помилка сервера |
Приклади відповідей:
Успішне додавання карти сайту:
{
"success": true,
"message": "Карта сайту успішно додана, ми завантажимо її якомога швидше і надішлемо повідомлення електронною поштою після завершення."
}
Помилка валідації:
{
"errors": ["sitemap":["The sitemap field is required."]]
}
Проєкт не знайдено:
{
"errors": ["Project not found"]
}
Оновлення статусу відстеження карти сайту
Виконайте POST запит за адресою /api/v1/sitemap/update_watch
POST https://2index.ninja/api/v1/sitemap/update_watch
Параметри запиту:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
| project_id | integer | так | ID проєкту |
| sitemap_id | integer | так | ID карти сайту |
| watch | boolean | так | Ознака того, чи потрібно відстежувати зміни карти сайту |
Можливі помилки:
| Помилка |
|---|
| Помилка валідації даних. Одне з обов'язкових полів відсутнє або має неправильне значення. |
| Проєкт або джерело посилання не знайдено. Користувач не володіє вказаним проєктом або проєкт/джерело не існує. |
| Внутрішня помилка сервера |
Приклади відповідей:
Успішне оновлення статусу відстеження:
{
"success": true
}
Джерело посилання не знайдено:
{
"errors": ["Link source not found"]
}
Видалення джерела посилань
Виконайте POST запит за адресою /api/v1/sitemap/delete
POST https://2index.ninja/api/v1/sitemap/delete
Параметри запиту:
| Поле | Тип | Обов'язково | Опис |
|---|---|---|---|
| project_id | integer | так | ID проєкту |
| sitemap_id | integer | так | ID карти сайту |
Можливі помилки:
| Помилка |
|---|
| Помилка валідації даних. Одне з обов'язкових полів відсутнє або має неправильне значення. |
| Проєкт або джерело посилання не знайдено. Користувач не володіє вказаним проєктом або проєкт/джерело не існує. |
| Внутрішня помилка сервера |
Приклади відповідей:
Успішне видалення джерела посилань:
{
"success": true,
"message": "Джерело посилань успішно видалено"
}
Проєкт не знайдено:
{
"errors": ["Project not found"]
}
Список джерел посилань
Для отримання списку доданих джерел посилань потрібно зробити POST запит на https://2index.ninja/api/v1/link_sources
У запиті передати project_id
У результаті буде повернуто такий набір даних:
[
{
"id": 1247,
"project_id": 3540,
"name": "urls.txt",
"type": "text file",
"created_at": "2025-01-17T15:51:43.000000Z",
"processing_date": "2025-01-17T15:51:48.000000Z",
"has_error": false,
"error_message": "",
"status": "success",
"is_pending": false,
"is_success": true,
"total_links": 29585,
"added_links": 29582,
"invalid_links": 3,
"watch": 0,
"google_access_granted": 0,
"is_external_links": 1,
"search_engines": {
"google": "1"
}
},
{
"id": 1246,
"project_id": 3540,
"name": "urls.txt",
"type": "text file",
"created_at": "2025-01-17T15:50:59.000000Z",
"processing_date": "2025-01-17T15:51:02.000000Z",
"has_error": false,
"error_message": "",
"status": "success",
"is_pending": false,
"is_success": true,
"total_links": 29585,
"added_links": 10440,
"invalid_links": 1,
"watch": 0,
"google_access_granted": 0,
"is_external_links": 1,
"search_engines": {
"google": "1"
}
},
{
"id": 1245,
"project_id": 3540,
"name": "urls.txt",
"type": "text file",
"created_at": "2025-01-17T15:46:17.000000Z",
"processing_date": null,
"has_error": false,
"error_message": null,
"status": "pending",
"is_pending": true,
"is_success": false,
"total_links": 0,
"added_links": 0,
"invalid_links": 0,
"watch": 0,
"google_access_granted": 0,
"is_external_links": 1,
"search_engines": {
"google": "1"
}
},
{
"id": 1244,
"project_id": 3540,
"name": "urls.txt",
"type": "text file",
"created_at": "2025-01-17T14:52:07.000000Z",
"processing_date": "2025-01-17T14:53:06.000000Z",
"has_error": true,
"error_message": "Unable to encode attribute [invalid_links_list] for model [App\\Models\\LinkSource\\LinkSource] to JSON: Malformed UTF-8 characters, possibly incorrectly encoded.",
"status": "error",
"is_pending": false,
"is_success": false,
"total_links": 29585,
"added_links": 0,
"invalid_links": 3,
"watch": 0,
"google_access_granted": 0,
"is_external_links": 1,
"search_engines": {
"google": "1"
}
}
]
Де
id — id джерела посилань
project_id — id проєкту
name — назва прикріпленого файлу або адреса карти сайту
type — тип джерела файлів (текстовий файл або карта сайту) — може бути: sitemap, text file
created_at — дата створення
processing_date — дата обробки
has_error — сталася помилка обробки
error_message — повідомлення про помилку
status — статус — може бути: pending (очікує обробки), error (помилка обробки), success
is_pending — зараз обробляється
is_success — успішна обробка
total_links — усього знайдено посилань
added_links — додано посилань
invalid_links — невалідні посилання
watch — статус спостереження за картою сайту
google_access_granted — доступ до акаунта google надано чи ні
is_external_links — зовнішні посилання
search_engines — підключені пошукові системи
Приклад реалізації на PHP
<?php
/**
* Клас для роботи з API сервісу 2Index.Ninja
*/
class API_2IndexNinja
{
/**
* URL API-ендпоінта
* @var string
*/
private $url = 'https://2index.ninja/api/v1/';
/**
* Токен доступу до API
* @var string
*/
private $access_token;
/**
* Конструктор класу.
*
* @param string $access_token Токен доступу для авторизації в API.
*/
public function __construct($access_token)
{
$this->access_token = $access_token;
}
/*
|--------------------------------------------------------------------------
| Методи для роботи з акаунтом
|--------------------------------------------------------------------------
*/
/**
* Отримує інформацію про поточний акаунт.
*
* @return array|null Декодована відповідь API з даними акаунта.
*/
public function account()
{
return $this->make_request('account');
}
/**
* Реєструє нового користувача.
*
* @param string $email Email нового користувача.
* @param string $source Джерело реєстрації.
* @return array|null Декодована відповідь API.
*/
public function register_user($email, $source)
{
return $this->make_request('register', [
'email' => $email,
'source' => $source,
]);
}
/*
|--------------------------------------------------------------------------
| Методи для роботи з проєктами
|--------------------------------------------------------------------------
*/
/**
* Отримує список проєктів користувача.
*
* Без параметрів повертає всі не-архівні проєкти. Якщо передано $page,
* увімкнено пагінацію і у відповіді з'являється блок 'pagination'.
*
* @param int|null $page Номер сторінки (якщо вказано — увімкнено пагінацію).
* @param int|null $per_page Розмір сторінки (1..100, за замовчуванням 20). Враховується лише з $page.
* @return array|null Декодована відповідь API зі списком проєктів.
*/
public function projects_list($page = null, $per_page = null)
{
$url_data = [];
if ($page) {
$url_data['page'] = $page;
if ($per_page) {
$url_data['per_page'] = $per_page;
}
}
$url_data = $url_data ? ('?' . http_build_query($url_data)) : '';
return $this->make_request('project' . $url_data);
}
/**
* Отримує дані конкретного проєкту за його ID.
*
* @param int $id ID проєкту.
* @return array|null Декодована відповідь API з даними проєкту.
*/
public function project($id)
{
return $this->make_request('project/' . $id);
}
/**
* Додає новий проєкт для індексації посилань.
*
* @param string $name Назва проєкту.
* @param string $website Сайт проєкту.
* @param bool $for_external_links Чи призначений для зовнішніх посилань (0 або 1).
* @param int|null $indexing_speed Швидкість індексації.
* @return array|null Декодована відповідь API з даними створеного проєкту.
*/
public function add_project($name, $website, $for_external_links = 0, $indexing_speed = null)
{
return $this->make_request('project', [
'name' => $name,
'website' => $website,
'for_external_links' => $for_external_links,
'indexing_speed' => $indexing_speed,
'type' => 'indexing',
]);
}
/**
* Додає новий проєкт для перевірки індексації.
*
* @param string $name Назва проєкту.
* @param int|null $checking_speed Швидкість перевірки.
* @return array|null Декодована відповідь API з даними створеного проєкту.
*/
public function add_indexing_check_project($name, $checking_speed = null)
{
return $this->make_request('project', [
'name' => $name,
'checking_speed' => $checking_speed,
'type' => 'indexing_check',
]);
}
/**
* Знаходить проєкт, прив'язаний до сайту на WordPress.
* Якщо такого проєкту немає, створює новий.
*
* @param string $website URL сайту для пошуку проєкту.
* @return array|null Декодована відповідь API з даними проєкту.
*/
public function get_wordpress_project($website)
{
return $this->make_request('account/get_wordpress_project', ['website' => $website]);
}
/**
* Очищає чергу посилань для проєкту.
*
* @param int $project_id ID проєкту.
* @return array|null Декодована відповідь API.
*/
public function clear_queue($project_id)
{
return $this->make_request('project/' . $project_id . '/clear_queue', true);
}
/**
* Обнуляє швидкість індексації у всіх завершених проєктів користувача.
* Усі параметри-фільтри необов'язкові; дати у форматі Y-m-d.
*
* @param string|null $created_at_from
* @param string|null $created_at_to
* @param string|null $completed_at_from
* @param string|null $completed_at_to
* @return array|null Декодована відповідь: success, message, affected_projects.
*/
public function reset_speed_completed(
$created_at_from = null,
$created_at_to = null,
$completed_at_from = null,
$completed_at_to = null
) {
$payload = array_filter([
'created_at_from' => $created_at_from,
'created_at_to' => $created_at_to,
'completed_at_from' => $completed_at_from,
'completed_at_to' => $completed_at_to,
]);
// Без параметрів: порожній масив трактується make_request() як "немає
// POST-даних" і надсилається GET, який ловиться маршрутом project/{id}.
// Тому за порожніх фільтрів примусово використовуємо POST через true.
return $this->make_request('project/reset_speed_completed', $payload ?: true);
}
/**
* Архівує всі завершені проєкти користувача.
* Приймає ті самі необов'язкові фільтри за діапазонами дат, що й
* reset_speed_completed.
*
* @param string|null $created_at_from
* @param string|null $created_at_to
* @param string|null $completed_at_from
* @param string|null $completed_at_to
* @return array|null Декодована відповідь: success, message, archived_count.
*/
public function archive_completed(
$created_at_from = null,
$created_at_to = null,
$completed_at_from = null,
$completed_at_to = null
) {
$payload = array_filter([
'created_at_from' => $created_at_from,
'created_at_to' => $created_at_to,
'completed_at_from' => $completed_at_from,
'completed_at_to' => $completed_at_to,
]);
return $this->make_request('project/archive_completed', $payload ?: true);
}
/*
|--------------------------------------------------------------------------
| Методи для роботи з посиланнями
|--------------------------------------------------------------------------
*/
/**
* Додає посилання у вказаний проєкт.
*
* @param int $project_id ID проєкту.
* @param array|string $links Масив посилань або одне посилання у вигляді рядка.
* @param bool $google Чи надсилати в Google.
* @param bool $yandex Чи надсилати в Yandex.
* @param bool $bing Чи надсилати в Bing.
* @param bool $google_access_granted Прапорець, що підтверджує доступ до Google.
* @return array|null Декодована відповідь API.
*/
public function add_links($project_id, $links, $google, $yandex, $bing, $google_access_granted = false)
{
return $this->make_request('link/add', [
'project_id' => $project_id,
'links' => $links,
'google' => $google,
'yandex' => $yandex,
'bing' => $bing,
'google_access_granted' => $google_access_granted,
]);
}
/**
* Додає посилання у проєкт за іменем. Якщо проєкт не існує, він буде створений.
*
* @param array|string $links Масив посилань або одне посилання у вигляді рядка.
* @param bool $google Чи надсилати в Google.
* @param bool $yandex Чи надсилати в Yandex.
* @param bool $bing Чи надсилати в Bing.
* @param string $project_name Ім'я проєкту (за замовчуванням 'default').
* @param bool $google_access_granted Прапорець, що підтверджує доступ до Google.
* @return array|null Декодована відповідь API.
*/
public function add_links_simple($links, $google, $yandex, $bing, $project_name = 'default', $google_access_granted = false)
{
return $this->make_request('link/add_simple', [
'project_name' => $project_name,
'links' => $links,
'google' => $google,
'yandex' => $yandex,
'bing' => $bing,
'google_access_granted' => $google_access_granted,
]);
}
/**
* Отримує джерела посилань для проєкту.
*
* @param int $project_id ID проєкту.
* @return array|null Декодована відповідь API.
*/
public function link_sources($project_id)
{
return $this->make_request('link_sources', [
'project_id' => $project_id
]);
}
/**
* Отримує статус вказаного посилання.
* Якщо одне й те саме посилання надсилалося кілька разів — поверне статус останнього надісланого.
*
* @param int $project_id ID проєкту
* @param string $link Посилання, що перевіряється
* @return array Статус посилання
*/
public function checkLink($project_id, $link)
{
return $this->make_request('link/status', [
'project_id' => $project_id,
'link' => $link,
]);
}
/**
* Отримує статус вказаного посилання.
*
* @param int $link_id ID посилання
* @return array Статус посилання
*/
public function checkLinkById($link_id)
{
return $this->make_request('link/status/' . $link_id);
}
/**
* Переотправляє непроіндексовані посилання проєкту на індексацію.
* Якщо $links не переданий — беруться всі непроіндексовані посилання проєкту,
* у яких кількість спроб менша за $max_attempts.
*
* @param int $project_id ID проєкту.
* @param int $max_attempts Максимальна кількість спроб відправки (1..10).
* @param array|null $links Конкретний список посилань для переотправки.
* @return array|null
*/
public function resent_notindexed_links($project_id, $max_attempts, $links = null)
{
return $this->make_request('link/resent_notindexed_links/' . $project_id, [
'max_attempts' => $max_attempts,
'links' => $links,
]);
}
/**
* Видаляє посилання або масив посилань із проєкту.
*
* @param int $project_id ID проєкту.
* @param string|array $link Посилання для видалення (або масив).
* @return array|null
*/
public function deleteUrls($project_id, $link)
{
return $this->make_request('link/delete/' . $project_id, [
'link' => $link,
]);
}
/*
|--------------------------------------------------------------------------
| Методи для роботи з джерелами посилань
|--------------------------------------------------------------------------
*/
/**
* Додає Sitemap у проєкт.
*
* @param int $project_id ID проєкту.
* @param string $sitemap_url URL файлу Sitemap.
* @param bool $google Чи надсилати в Google.
* @param bool $yandex Чи надсилати в Yandex.
* @param bool $bing Чи надсилати в Bing.
* @param bool $google_access_granted Прапорець, що підтверджує доступ до Google.
* @param bool $watch Чи увімкнути відстеження змін у Sitemap.
* @return array|null Декодована відповідь API.
*/
public function add_sitemap($project_id, $sitemap_url, $google, $yandex, $bing, $google_access_granted = false, $watch = false)
{
return $this->make_request('sitemap/add', [
'project_id' => $project_id,
'sitemap' => $sitemap_url,
'google' => $google,
'yandex' => $yandex,
'bing' => $bing,
'google_access_granted' => $google_access_granted,
'watch' => $watch,
]);
}
/**
* Вмикає або вимикає відстеження змін для Sitemap.
*
* @param int $project_id ID проєкту.
* @param int $sitemap_id ID файлу Sitemap.
* @param bool $watch Новий статус відстеження (true — увімкнути, false — вимкнути).
* @return array|null Декодована відповідь API.
*/
public function update_sitemap_watch($project_id, $sitemap_id, $watch)
{
return $this->make_request('sitemap/update_watch', [
'project_id' => $project_id,
'sitemap_id' => $sitemap_id,
'watch' => $watch,
]);
}
/**
* Видаляє Sitemap із проєкту.
*
* @param int $project_id ID проєкту.
* @param int $sitemap_id ID файлу Sitemap для видалення.
* @return array|null Декодована відповідь API.
*/
public function sitemap_delete($project_id, $sitemap_id)
{
return $this->make_request('sitemap/delete', [
'project_id' => $project_id,
'sitemap_id' => $sitemap_id,
]);
}
/**
* Виконує запит до API.
*
* @param string $endpoint Ендпоінт API для виклику.
* @param array|true $post_data Дані для POST-запиту. Якщо true — надсилається порожній POST.
* @return array|null Декодована JSON-відповідь API або null у разі помилки.
*/
private function make_request($endpoint, $post_data = [])
{
$ch = curl_init($this->url . $endpoint);
if ($post_data === true) {
curl_setopt($ch, CURLOPT_POST, 1);
} elseif ($post_data) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
}
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . $this->access_token]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
// Вказує user-agent — необхідно, якщо з'являються помилки 403.
// curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36');
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, 1);
}
}