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. Ее можно импортировать в Postman, Swagger UI, генераторы клиентов и системы автоматического тестирования.
Открыть Swagger UI · Скачать openapi.json
User API работает только с собственными личными постами: владелец токена должен быть и автором поста, и владельцем страницы профиля, на которой этот пост опубликован.
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.
GET /user/posts/:idcurl -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/:idcurl -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-токена является владельцем этого сообщества.
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.
GET /communities/:community/posts/:idcurl -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/:idcurl -X DELETE "https://api.itprostore.ru/api/integrations/v1/communities/my-community/posts/123" \
-H "Authorization: Bearer itps_live.<publicId>.<secret>"API поддерживает только то форматирование, которое доступно пользователю в редакторе постов АйТиПростор. Все остальные HTML-теги и атрибуты удаляются сервером при сохранении.
| Возможность | Разрешенные теги | Комментарий |
|---|---|---|
| Жирный текст | <strong>, <b> | Оба варианта принимаются, потому что браузеры могут формировать разные теги. |
| Курсив | <i>, <em> | Оба варианта принимаются по той же причине. |
| Абзац | <p> | Используйте для отдельных абзацев. Пробельные переносы между абзацами сервер нормализует. |
| Перенос строки | <br> | Используется для обычного переноса строки в редакторе. |
| Ссылка | <a href="https://..."> | Разрешены только http и https. Сервер добавляет target="_blank" и rel="noopener noreferrer". |
Не используйте списки, заголовки, таблицы, изображения внутри HTML, inline-стили, классы, scripts, iframe и обработчики событий. Такие элементы будут удалены или превращены в обычный текст.
.jpg, .jpeg, .png, .gif..rar, .7z, .pdf, .doc, .docx, .txt, .xlsx, .xls. Для создания поста можно передавать заголовок 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-Reset | Unix-время, когда лимит будет сброшен. |
Retry-After | Возвращается при 429; показывает, через сколько секунд можно повторить запрос. |
В личном кабинете в разделе Интеграция у каждого токена доступен журнал последних запросов: метод, путь, статус, scope, время выполнения, код ошибки и request ID.
Журнал помогает быстро понять, какой запрос получил ошибку, но не содержит тело запроса, вложения, исходный IP и сам API-токен.
Ошибки возвращаются в едином формате:
{
"errorCode": "ScopeDenied",
"message": "У API-токена нет прав для этого действия."
}