API АйТиПростор

API предназначен для интеграции внешних сервисов с АйТиПростор. Первая версия позволяет управлять личными постами пользователя и собственными постами в сообществах, где владелец токена является владельцем сообщества: получать список ID, создавать, получать, редактировать и удалять посты.

Авторизация

API использует бессрочные токены. Токен создается в личном кабинете в разделе Интеграция и показывается только один раз. Передавайте токен только в HTTP-заголовке:

Authorization: Bearer itps_live.<publicId>.<secret>

Не передавайте токен в query string и не размещайте его в публичном frontend-коде.

Рекомендуемая схема интеграции — запросы с backend внешнего сервиса. Публичные endpoints API принимают CORS-запросы с HTTPS-сайтов, но хранить API-токен в браузерном JavaScript небезопасно: пользователь или сторонний скрипт сможет увидеть этот токен.

Права токена

ScopeНазначение
user.posts.readПолучение списка ID и чтение личных постов.
user.posts.writeСоздание и редактирование личных постов.
user.posts.deleteУдаление личных постов.
community.posts.readПолучение списка ID и чтение постов сообществ, которыми владеет пользователь.
community.posts.writeСоздание и редактирование постов в сообществах, которыми владеет пользователь.
community.posts.deleteУдаление постов в сообществах, которыми владеет пользователь.

Токены, выпущенные ранее для user.posts.*, также принимаются для соответствующих операций с owned-сообществами. Это сделано для совместимости существующих интеграций.

Базовый адрес

https://api.itprostore.ru/api/integrations/v1

OpenAPI

Машиночитаемая спецификация доступна в формате OpenAPI. Ее можно импортировать в Postman, Swagger UI, генераторы клиентов и системы автоматического тестирования.

Открыть Swagger UI · Скачать openapi.json

Посты пользователя

User API работает только с собственными личными постами: владелец токена должен быть и автором поста, и владельцем страницы профиля, на которой этот пост опубликован.

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

GET /user/posts/ids?skip=0&take=100

Максимальное значение take — 200. Возвращаются только личные посты владельца токена.

curl -X GET "https://api.itprostore.ru/api/integrations/v1/user/posts/ids?skip=0&take=100" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Создать пост

POST /user/posts
Content-Type: multipart/form-data

text=<b>Новый пост</b>
files=<file>
curl -X POST "https://api.itprostore.ru/api/integrations/v1/user/posts" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>" \
  -H "Idempotency-Key: 7f3b8616-0b8c-4a2b-bef1-31b542da0b21" \
  -F "text=<strong>Пост из интеграции</strong>" \
  -F "files=@/path/to/file.pdf"

Найти пост

GET /user/posts/search?text=часть%20текста&skip=0&take=20

Метод ищет личные посты владельца токена, в тексте которых есть указанная строка, и возвращает список ID от самых свежих к более старым. Параметр text обязателен: от 2 до 500 символов. skip и take используются для постраничной загрузки результатов, максимальное значение take — 100.

curl -X GET "https://api.itprostore.ru/api/integrations/v1/user/posts/search?text=%D0%9F%D0%BE%D1%81%D1%82%20%D0%B8%D0%B7%20%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8&skip=0&take=20" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"
{
  "found": true,
  "query": "Пост из интеграции",
  "ids": [123, 118, 91],
  "skip": 0,
  "take": 20,
  "hasMore": false
}

Если совпадений нет, API вернет 200, "found": false и пустой массив ids. Для GET-запроса передавайте text в query string, а не в multipart/form-data body.

Получить пост по ID

GET /user/posts/:id
curl -X GET "https://api.itprostore.ru/api/integrations/v1/user/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Редактировать пост

PUT /user/posts/:id
Content-Type: multipart/form-data

text=Обновленный текст
keptAttachments=old-file.png
files=<new-file>
curl -X PUT "https://api.itprostore.ru/api/integrations/v1/user/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>" \
  -F "text=Обновленный текст<br><a href="https://itprostore.ru">АйТиПростор</a>" \
  -F "keptAttachments=old-file.png" \
  -F "files=@/path/to/new-file.pdf"

Поле keptAttachments передается для вложений, которые нужно оставить. Все старые вложения, не переданные в keptAttachments, будут удалены.

Удалить пост

DELETE /user/posts/:id
curl -X DELETE "https://api.itprostore.ru/api/integrations/v1/user/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Посты сообщества

Community API управляет обычными постами-сообщениями в ленте сообщества. Статьи и репосты через этот API сейчас не создаются и не редактируются. API возвращает, редактирует и удаляет только те посты, где автором является владелец токена. Посты других участников сообщества через API недоступны, даже если токен принадлежит владельцу сообщества. В параметр {community} передайте slug из адреса /community/{slug} или числовой Id сообщества. Сервер всегда проверяет, что владелец API-токена является владельцем этого сообщества.

Получить список ID постов сообщества

GET /communities/:community/posts/ids?skip=0&take=100

Максимальное значение take — 200. Возвращаются только неудаленные обычные посты-сообщения, созданные владельцем токена.

curl -X GET "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/ids?skip=0&take=100" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Создать пост в сообществе

POST /communities/:community/posts
Content-Type: multipart/form-data

text=<b>Новый пост сообщества</b>
files=<file>
curl -X POST "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>" \
  -H "Idempotency-Key: 2b5e4ab1-1b57-4a1e-b025-3b5b2b9d80e8" \
  -F "text=<strong>Пост сообщества из интеграции</strong>" \
  -F "files=@/path/to/file.pdf"

Импортировать пост сообщества с датой

POST /communities/:community/posts/import
Content-Type: multipart/form-data

text=<b>Старый пост сообщества</b>
createdAt=2026-02-15T10:30:00+03:00
files=<file>

Метод предназначен для переноса старых публикаций в АйТиПростор. Он создает обычный пост сообщества, но сохраняет указанную дату публикации и не отправляет уведомления: ни SignalR-события, ни push. Поэтому, чтобы увидеть импортированный пост на странице сообщества, обновите страницу после завершения импорта.

  • createdAt обязателен. Передавайте дату и время в ISO 8601, желательно с часовым поясом.
  • Дата не может быть в будущем.
  • Дата не может быть старше одного года от момента запроса.
  • В ленте сообщества пост будет отсортирован по указанному времени публикации.
curl -X POST "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/import" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>" \
  -H "Idempotency-Key: 9c8f5f23-6f17-4f28-99e4-c9bbd32f5ac1" \
  -F "text=<strong>Пост из архива</strong>" \
  -F "createdAt=2026-02-15T10:30:00+03:00" \
  -F "files=@/path/to/archive-image.png"

Найти пост сообщества

GET /communities/:community/posts/search?text=часть%20текста&skip=0&take=20

Метод ищет обычные посты-сообщения в указанном сообществе, созданные владельцем токена, и возвращает список ID от самых свежих к более старым. Параметр text обязателен: от 2 до 500 символов. skip и take используются для постраничной загрузки результатов, максимальное значение take — 100.

curl -X GET "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/search?text=%D0%9F%D0%BE%D1%81%D1%82%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0&skip=0&take=20" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"
{
  "found": true,
  "query": "Пост сообщества",
  "communityId": 10,
  "communitySlug": "my-community",
  "ids": [123, 118, 91],
  "skip": 0,
  "take": 20,
  "hasMore": false
}

Если совпадений нет, API вернет 200, "found": false и пустой массив ids. Для GET-запроса передавайте text в query string, а не в multipart/form-data body.

Получить пост сообщества по ID

GET /communities/:community/posts/:id
curl -X GET "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Редактировать пост сообщества

PUT /communities/:community/posts/:id
Content-Type: multipart/form-data

text=Обновленный текст
keptAttachments=old-file.png
files=<new-file>
curl -X PUT "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>" \
  -F "text=Обновленный текст<br><a href="https://itprostore.ru">АйТиПростор</a>" \
  -F "keptAttachments=old-file.png" \
  -F "files=@/path/to/new-file.pdf"

Поле keptAttachments работает так же, как у личных постов: передайте имена вложений, которые нужно оставить. Остальные старые вложения будут удалены.

Удалить пост сообщества

DELETE /communities/:community/posts/:id
curl -X DELETE "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/123" \
  -H "Authorization: Bearer itps_live.<publicId>.<secret>"

Форматирование HTML

API поддерживает только то форматирование, которое доступно пользователю в редакторе постов АйТиПростор. Все остальные HTML-теги и атрибуты удаляются сервером при сохранении.

ВозможностьРазрешенные тегиКомментарий
Жирный текст<strong>, <b>Оба варианта принимаются, потому что браузеры могут формировать разные теги.
Курсив<i>, <em>Оба варианта принимаются по той же причине.
Абзац<p>Используйте для отдельных абзацев. Пробельные переносы между абзацами сервер нормализует.
Перенос строки<br>Используется для обычного переноса строки в редакторе.
Ссылка<a href="https://...">Разрешены только http и https. Сервер добавляет target="_blank" и rel="noopener noreferrer".

Не используйте списки, заголовки, таблицы, изображения внутри HTML, inline-стили, классы, scripts, iframe и обработчики событий. Такие элементы будут удалены или превращены в обычный текст.

Вложения

  • Можно прикрепить максимум 5 файлов.
  • Размер одного файла — до 25 МБ, суммарно — до 50 МБ.
  • Изображения: .jpg, .jpeg, .png, .gif.
  • Файлы: .rar, .7z, .pdf, .doc, .docx, .txt, .xlsx, .xls.
  • Для личных постов API управляет только постами, где владелец токена является автором и владельцем страницы.
  • Для постов сообщества API доступен только владельцу сообщества и работает только с его собственными обычными постами-сообщениями, без статей и репостов.

Idempotency-Key

Для создания поста можно передавать заголовок Idempotency-Key. Это защищает от дублей, если внешний сервис повторил запрос из-за сетевой ошибки или таймаута.

ПравилоОписание
ДлинаОт 1 до 128 ASCII-символов без пробелов. Удобно использовать UUID.
Срок храненияКлюч хранится 24 часа для конкретного токена, метода, адреса и содержимого запроса.
ПовторПовтор такого же запроса возвращает сохраненный ответ и заголовок Idempotent-Replayed: true.
КонфликтЕсли ключ уже использован с другим содержимым, API вернет 409.

Используйте новый Idempotency-Key для каждой логической операции создания поста. Для чтения, редактирования и удаления этот заголовок сейчас не требуется.

Лимиты запросов

Публичный API ограничен по IP-адресу, чтобы защитить сервис от перегрузки. Текущий лимит: 120 запросов в минуту.

ЗаголовокЗначение
X-RateLimit-LimitМаксимальное число запросов в текущем окне.
X-RateLimit-RemainingСколько запросов осталось до конца окна.
X-RateLimit-ResetUnix-время, когда лимит будет сброшен.
Retry-AfterВозвращается при 429; показывает, через сколько секунд можно повторить запрос.

Журнал токена

В личном кабинете в разделе Интеграция у каждого токена доступен журнал последних запросов: метод, путь, статус, scope, время выполнения, код ошибки и request ID.

Журнал помогает быстро понять, какой запрос получил ошибку, но не содержит тело запроса, вложения, исходный IP и сам API-токен.

Ошибки

Ошибки возвращаются в едином формате:

{
  "errorCode": "ScopeDenied",
  "message": "У API-токена нет прав для этого действия."
}