Документация 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

Параметры запроса:

Поле Тип Обязательно Описание
email 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"
    }
}

Методы для работы с проектами

Получить список проектов

Нужно выполнить 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 да Список ссылок. Можно передать в виде массива ссылок или в виде текста (каждая ссылка отдельной строкой)
google нет, при условии 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 да Список ссылок. Можно передать массивом или текстом (каждая ссылка с новой строки).
google нет, если указан 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 Дата проверки индексации в Goolge

* Возможные статусы:

Статус Значение
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 да Ссылка на карту сайта
google нет, при условии 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 - доступ к аккаунту гугл предоставлен или нет 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);
    }
}