Ссылки-приглашения
Общая ссылка-приглашение — управляемый адрес, который ведёт на объявление компании и помечает пришедшие по нему отклики. Одному объявлению можно завести сколько угодно ссылок: по одной на канал распространения (телеграм-канал, рассылка, объявление на доске), а затем сравнивать, какой канал привёл исполнителей.
Ссылка не расширяет доступ. Это только атрибуция: объявление, закрытое для показа, по ссылке не откроется, а исполнитель проходит те же регистрацию и идентификацию, что и обычно.
Все методы требуют доступ org.task-invite-links.read или org.task-invite-links.write
и scope announcement в токене.
Сценарий использования
- Создать ссылку —
POST .../task-invite-linksдля нужного объявления. В ответе приходитtoken; публичный адрес собирается какhttps://market.selfwork.ru/ad-link/{token}. - Распространить — разослать адрес по своему каналу. Каждый переход учитывается в статистике ссылки.
- Получить отклик — исполнитель переходит по адресу, при необходимости регистрируется и идентифицируется, затем откликается на объявление.
- Прочитать источник — в списке откликов
(Отклики) и в списке предложений
(Предложения) у такого отклика заполнено поле
taskInviteLink. Оба списка дополнительно фильтруются поTASK_INVITE_LINK_ID, а агрегированные счётчики канала возвращает фильтр ссылок.
Создание ссылки-приглашения
Создаёт ссылку для объявления о задаче. Объявление должно быть опубликовано. Требует доступ
org.task-invite-links.write.
Запрос
Метод: POST URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links
Path Parameters
| Параметр | Тип | Обязательное поле | Пример | Описание |
|---|---|---|---|---|
| organisationId | string (uuid) | Да | 550e8400-e29b-41d4-a716-446655440000 | ID организации |
Request Body
| Поле | Тип | Обязательное поле | Описание |
|---|---|---|---|
| taskAnnouncementId | number | Да | ID объявления о задаче, на которое создаётся ссылка |
| name | string | Нет | Название канала распространения, до 128 символов. Не уникально |
| expiresAt | string | Нет | Момент истечения срока действия, ISO 8601. Без значения ссылка бессрочная |
Пример запроса
curl -X 'POST' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-d '{
"taskAnnouncementId": 2481,
"name": "Телеграм-канал «Работа рядом»",
"expiresAt": "2026-12-31T23:59:59.000Z"
}'
Пример успешного ответа
{
"requestId": "97c5678a-8c6a-4688-8452-68ab606fe049",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Телеграм-канал «Работа рядом»",
"status": "ACTIVE",
"expiresAt": "2026-12-31T23:59:59.000Z",
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-24T14:50:00.000Z"
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Созданная ссылка-приглашение |
| id | string (uuid) | Идентификатор ссылки-приглашения |
| taskAnnouncementId | number | ID объявления о задаче |
| token | string | Токен, подставляемый в публичный адрес /ad-link/{token} на маркетплейсе |
| name | string, null | Название канала распространения |
| status | string | Статус ссылки (см. справочник ниже) |
| expiresAt | string, null | Момент истечения срока действия, ISO 8601. null — бессрочная |
| createdBy | string | Идентификатор сотрудника, создавшего ссылку |
| createdAt | string | Дата создания |
| updatedAt | string | Дата последнего изменения |
Статусы ссылки (status)
| Статус | Описание |
|---|---|
| ACTIVE | Ссылка работает |
| DISABLED | Ссылка отключена вручную. Статистика сохраняется, отключение обратимо |
| ARCHIVED | Объявление стало недоступно, ссылка архивирована автоматически |
Срок действия и статус — независимые оси. Истёкшая ссылка остаётся в статусе ACTIVE, но не
работает: чтобы вернуть её в строй, нужно сдвинуть или снять expiresAt.
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров или тела запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_ANNOUNCEMENT_NOT_PUBLISHED | Объявление не опубликовано или закрыто |
| TASK_INVITE_LINK_TOKEN_GENERATION_FAILED | Не удалось сгенерировать уникальный токен ссылки |
| UNKNOWN_ERROR | Ошибка сервера |
Фильтрация ссылок-приглашений
Возвращает список ссылок организации со статистикой канала. Требует доступ
org.task-invite-links.read.
Запрос
Метод: POST URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/filter
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
Request Body
Общая структура запроса описана в разделе Фильтрация: общая структура.
Доступные фильтры (filters)
| Имя (name) | Тип значения (value) | Пример значения | Описание |
|---|---|---|---|
| TASK_ANNOUNCEMENT_ID | array[number] | [2481, 2482] | Ссылки указанных объявлений |
| STATUS | array[string] | ["ACTIVE", "DISABLED"] | Статусы ссылки |
| NAME | array[string] | ["Телеграм-канал «Работа рядом»"] | Точное совпадение названия канала |
| CREATED_BY | array[string] | ["9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01"] | Ссылки, созданные конкретным сотрудником |
Доступные сортировки
| Поле (field) | Описание |
|---|---|
| CREATED_AT | Дата создания ссылки |
| NAME | Название канала |
| TOTAL_VISITS_COUNT | Общее количество переходов |
Поля, обрабатываемые по query
Текстовый поиск (query) выполняет поиск частичного совпадения по названию канала и токену
ссылки.
Пример запроса
curl -X 'POST' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/filter" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-d '{
"filters": [
{ "name": "TASK_ANNOUNCEMENT_ID", "value": [2481] },
{ "name": "STATUS", "value": ["ACTIVE"] }
],
"order": [{ "field": "TOTAL_VISITS_COUNT", "sort": "DESC" }],
"pagination": { "limit": 10, "lastId": null }
}'
Пример успешного ответа
{
"requestId": "25f4f954-a53d-44f5-8154-f6b5ff4ef7a8",
"result": {
"lastId": "550e8400-e29b-41d4-a716-446655440000",
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Телеграм-канал «Работа рядом»",
"status": "ACTIVE",
"expiresAt": null,
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-24T14:50:00.000Z",
"totalVisitsCount": 128,
"uniqueVisitsCount": 47,
"offersCount": 12
}
]
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Контейнер с результатом фильтрации |
| result.lastId | string, null | ID последнего элемента для получения следующей страницы |
| result.items | array | Массив ссылок-приглашений |
| totalVisitsCount | number | Все переходы по работающей ссылке, включая повторные и анонимные |
| uniqueVisitsCount | number | Количество уникальных авторизованных посетителей |
| offersCount | number | Количество откликов, пришедших по ссылке |
Остальные поля элементов result.items совпадают с полями ссылки, описанными в разделе
«Создание ссылки-приглашения».
Переход по неработающей ссылке (отключена, истекла, архивирована) не пополняет ни один счётчик.
Статистика возвращается только этим методом и методом получения ссылки: каждое поле стоит отдельного запроса, поэтому создание, обновление, включение и отключение её не отдают.
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров или тела запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| UNKNOWN_ERROR | Ошибка сервера |
Получение ссылки-приглашения
Возвращает ссылку со статистикой канала по её идентификатору. Требует доступ
org.task-invite-links.read.
Запрос
Метод: GET URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/{linkId}
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
| linkId | string (uuid) | Да | ID ссылки-приглашения |
Request Body
Тело запроса не требуется (Empty Body).
Пример запроса
curl -X 'GET' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/550e8400-e29b-41d4-a716-446655440000" \
-H "accept: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Пример успешного ответа
{
"requestId": "25f4f954-a53d-44f5-8154-f6b5ff4ef7a8",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Телеграм-канал «Работа рядом»",
"status": "ACTIVE",
"expiresAt": null,
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-24T14:50:00.000Z",
"totalVisitsCount": 128,
"uniqueVisitsCount": 47,
"offersCount": 12
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Ссылка-приглашение со статистикой |
| id | string (uuid) | Идентификатор ссылки-приглашения |
| taskAnnouncementId | number | ID объявления о задаче |
| token | string | Токен для формирования публичного адреса |
| name | string, null | Название канала распространения |
| status | string | Статус ссылки |
| expiresAt | string, null | Момент истечения срока действия |
| createdBy | string | Идентификатор сотрудника, создавшего ссылку |
| createdAt | string | Дата создания |
| updatedAt | string | Дата последнего изменения |
| totalVisitsCount | number | Общее количество переходов по ссылке |
| uniqueVisitsCount | number | Количество уникальных авторизованных посетителей |
| offersCount | number | Количество откликов, пришедших по ссылке |
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_INVITE_LINK_NOT_FOUND | Ссылка не существует, удалена или принадлежит другой организации |
| UNKNOWN_ERROR | Ошибка сервера |
Обновление ссылки-приглашения
Меняет название канала и срок действия. Требует доступ org.task-invite-links.write.
Запрос
Метод: PUT URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/{linkId}
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
| linkId | string (uuid) | Да | ID ссылки-приглашения |
Request Body
| Поле | Тип | Обязательное поле | Описание |
|---|---|---|---|
| name | string | Нет | Название канала распространения, до 128 символов |
| expiresAt | string, null | Нет | Момент истечения срока действия, ISO 8601. null снимает ограничение |
Хотя бы одно поле должно быть передано.
Пример запроса
curl -X 'PUT' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/550e8400-e29b-41d4-a716-446655440000" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-d '{
"name": "Авито",
"expiresAt": null
}'
Пример успешного ответа
{
"requestId": "97c5678a-8c6a-4688-8452-68ab606fe049",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Авито",
"status": "ACTIVE",
"expiresAt": null,
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-25T09:12:00.000Z"
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Обновлённая ссылка-приглашение |
| id | string (uuid) | Идентификатор ссылки-приглашения |
| taskAnnouncementId | number | ID объявления о задаче |
| token | string | Токен для формирования публичного адреса |
| name | string, null | Название канала распространения |
| status | string | Статус ссылки |
| expiresAt | string, null | Момент истечения срока действия |
| createdBy | string | Идентификатор сотрудника, создавшего ссылку |
| createdAt | string | Дата создания |
| updatedAt | string | Дата последнего изменения |
Ответ не содержит полей статистики.
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров или тела запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_INVITE_LINK_EMPTY_UPDATE | В запросе не передано ни одного изменяемого поля |
| TASK_INVITE_LINK_NOT_FOUND | Ссылка не существует, удалена или принадлежит другой организации |
| UNKNOWN_ERROR | Ошибка сервера |
Включение ссылки-приглашения
Возвращает ранее отключённую ссылку в работу. Требует доступ org.task-invite-links.write.
Запрос
Метод: POST URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/{linkId}/enable
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
| linkId | string (uuid) | Да | ID ссылки-приглашения |
Request Body
Тело запроса не требуется (Empty Body).
Метод идемпотентен: повторный вызов для уже активной ссылки возвращает тот же результат и ничего не меняет.
Включение ссылки не отменяет истечение срока: если expiresAt в прошлом, ссылка останется
неработающей до тех пор, пока срок не сдвинут или не снят. Ссылку в статусе ARCHIVED включить
можно, но при следующем переходе она вернётся в ARCHIVED, если объявление действительно закрыто.
Пример запроса
curl -X 'POST' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/550e8400-e29b-41d4-a716-446655440000/enable" \
-H "accept: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Пример успешного ответа
{
"requestId": "97c5678a-8c6a-4688-8452-68ab606fe049",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Телеграм-канал «Работа рядом»",
"status": "ACTIVE",
"expiresAt": null,
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-25T09:12:00.000Z"
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Включённая ссылка-приглашение |
| id | string (uuid) | Идентификатор ссылки-приглашения |
| taskAnnouncementId | number | ID объявления о задаче |
| token | string | Токен для формирования публичного адреса |
| name | string, null | Название канала распространения |
| status | string | Статус ссылки (ACTIVE) |
| expiresAt | string, null | Момент истечения срока действия |
| createdBy | string | Идентификатор сотрудника, создавшего ссылку |
| createdAt | string | Дата создания |
| updatedAt | string | Дата последнего изменения |
Ответ не содержит полей статистики.
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_INVITE_LINK_NOT_FOUND | Ссылка не существует, удалена или принадлежит другой организации |
| UNKNOWN_ERROR | Ошибка сервера |
Отключение ссылки-приглашения
Ссылка перестаёт работать, накопленная статистика сохраняется. Требует доступ
org.task-invite-links.write.
Запрос
Метод: POST URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/{linkId}/disable
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
| linkId | string (uuid) | Да | ID ссылки-приглашения |
Request Body
Тело запроса не требуется (Empty Body).
Метод идемпотентен: повторный вызов для уже отключённой ссылки возвращает тот же результат и ничего не меняет.
Отключать и включать ссылку в пределах срока действия можно сколько угодно раз. Исполнитель, перешедший по отключённой ссылке, увидит сообщение «Ссылка отключена».
Пример запроса
curl -X 'POST' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/550e8400-e29b-41d4-a716-446655440000/disable" \
-H "accept: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Пример успешного ответа
{
"requestId": "97c5678a-8c6a-4688-8452-68ab606fe049",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"taskAnnouncementId": 2481,
"token": "k7fd2mqrx9ab",
"name": "Телеграм-канал «Работа рядом»",
"status": "DISABLED",
"expiresAt": null,
"createdBy": "9f1c6e2a-1c2b-4a3d-8f4e-5b6c7d8e9f01",
"createdAt": "2026-07-24T14:50:00.000Z",
"updatedAt": "2026-07-25T09:12:00.000Z"
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Отключённая ссылка-приглашение |
| id | string (uuid) | Идентификатор ссылки-приглашения |
| taskAnnouncementId | number | ID объявления о задаче |
| token | string | Токен для формирования публичного адреса |
| name | string, null | Название канала распространения |
| status | string | Статус ссылки (DISABLED) |
| expiresAt | string, null | Момент истечения срока действия |
| createdBy | string | Идентификатор сотрудника, создавшего ссылку |
| createdAt | string | Дата создания |
| updatedAt | string | Дата последнего изменения |
Ответ не содержит полей статистики.
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_INVITE_LINK_NOT_FOUND | Ссылка не существует, удалена или принадлежит другой организации |
| UNKNOWN_ERROR | Ошибка сервера |
Удаление ссылки-приглашения
Удаляет ссылку-приглашение. Удаление мягкое: атрибуция в уже собранных откликах остаётся
читаемой, а токен не освобождается. Требует доступ org.task-invite-links.write.
Запрос
Метод: DELETE URL: https://b2b.selfwork.ru/openapi/v2/organisation/{organisationId}/task-invite-links/{linkId}
Path Parameters
| Параметр | Тип | Обязательное поле | Описание |
|---|---|---|---|
| organisationId | string (uuid) | Да | ID организации |
| linkId | string (uuid) | Да | ID ссылки-приглашения |
Request Body
Тело запроса не требуется (Empty Body).
Пример запроса
curl -X 'DELETE' \
"https://b2b.selfwork.ru/openapi/v2/organisation/550e8400-e29b-41d4-a716-446655440000/task-invite-links/550e8400-e29b-41d4-a716-446655440000" \
-H "accept: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Пример успешного ответа
{
"requestId": "97c5678a-8c6a-4688-8452-68ab606fe049",
"result": {
"id": "550e8400-e29b-41d4-a716-446655440000"
},
"success": true
}
Описание полей ответа
| Поле | Тип | Описание |
|---|---|---|
| requestId | string (uuid) | Уникальный идентификатор запроса |
| success | boolean | Статус выполнения запроса |
| result | object | Результат удаления |
| id | string (uuid) | Идентификатор удалённой ссылки-приглашения |
Возможные ошибки
| Code | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации параметров запроса |
| FORBIDDEN_ERROR | В токене нет необходимого scope или доступа |
| TASK_INVITE_LINK_NOT_FOUND | Ссылка не существует, удалена или принадлежит другой организации |
| UNKNOWN_ERROR | Ошибка сервера |