Публикация поста
Публикация асинхронная: вы создаёте публикацию, Warmup ставит её в очередь и публикует в каждую выбранную соцсеть, а вы опрашиваете результат.
Что поддерживает каждая соцсеть
Заголовок раздела «Что поддерживает каждая соцсеть»| Соцсеть | text |
photo |
story |
Лимит текста |
|---|---|---|---|---|
| да | да | да | 63 206 | |
| — | да | да | 2 200 | |
| Threads | да | да | — | 500 |
Одна публикация уходит в 1–3 соцсети. Каждая соцсеть из списка должна поддерживать выбранный kind.
Порядок
Заголовок раздела «Порядок»-
Загрузите картинку (для
kind: textне нужно). До 15 МБ; Warmup конвертирует её в JPEG.Окно терминала curl -X POST https://api.warmup.social/projects/$PROJECT_ID/media \-H "Authorization: Bearer $WARMUP_TOKEN" \-F "file=@photo.jpg"{ "id": "6f1c…", "url": "https://…", "width": 1080, "height": 1350 }Для ленты Instagram пропорции должны быть от 4:5 (вертикаль) до 1.91:1 (горизонталь). Для сторис лучше всего 9:16.
-
Создайте публикацию.
Окно терминала curl -X POST https://api.warmup.social/projects/$PROJECT_ID/publications \-H "Authorization: Bearer $WARMUP_TOKEN" \-H "Content-Type: application/json" \-d '{"kind": "photo","platforms": ["instagram", "threads"],"text": "Новая коллекция уже в продаже","mediaId": "6f1c…"}'API отвечает
202 Accepted: публикация и по цели на каждую соцсеть в статусеqueued. -
Опрашивайте, пока все цели не завершатся.
Окно терминала curl https://api.warmup.social/projects/$PROJECT_ID/publications/$PUBLICATION_ID \-H "Authorization: Bearer $WARMUP_TOKEN"Каждая цель проходит
queued→publishing→publishedилиfailed. Опрашивайте раз в несколько секунд; обычно всё завершается в пределах минуты.
Пример опроса
Заголовок раздела «Пример опроса»const api = "https://api.warmup.social";const headers = { Authorization: `Bearer ${process.env.WARMUP_TOKEN}` };
async function waitForPublication(projectId, publicationId) { for (let attempt = 0; attempt < 40; attempt++) { const res = await fetch(`${api}/projects/${projectId}/publications/${publicationId}`, { headers }); const publication = await res.json(); if (publication.targets.every((t) => t.status === "published" || t.status === "failed")) { return publication; } await new Promise((resolve) => setTimeout(resolve, 3000)); } throw new Error("Публикация ещё не завершилась");}Результат
Заголовок раздела «Результат»У цели в статусе published есть permalink (ссылка на пост), externalPostId и publishedAt. У цели в статусе failed есть errorCode:
errorCode |
Что делать |
|---|---|
needs_reauth, connection_not_ready |
Переподключить соцсеть (руководство). |
media_rejected |
Соцсеть отклонила картинку — проверьте размер и пропорции. |
media_aspect_ratio |
Картинка не подходит для ленты Instagram. |
rate_limit |
Сработал лимит публикаций самой соцсети — повторите позже. |
meta_unavailable |
Meta временно недоступна — повторите позже. |
published_unconfirmed |
Meta опубликовала пост, но не вернула его id. Скорее всего, пост вышел — проверьте аккаунт перед повтором. |
Отложенная публикация
Заголовок раздела «Отложенная публикация»Публикация — это план: state по умолчанию scheduled, и без scheduledAt она уходит сразу. Передайте будущий scheduledAt (ISO 8601 со смещением) — и публикация уйдёт в этот момент, с точностью около полуминуты. timezone — IANA-пояс, в котором вы ввели время: Warmup хранит его, чтобы показывать пост в планере в правильном локальном времени.
{ "kind": "photo", "platforms": ["instagram"], "mediaId": "6f1c…", "text": "Пятничный дроп", "scheduledAt": "2026-11-06T18:00:00+02:00", "timezone": "Europe/Kyiv"}state: draftоставляет публикацию в планере без отправки. Черновику не нужны подключённые соцсети, у него может не быть даты.- Пока публикация не отправлена (
state—draftилиscheduled),PATCH /projects/{id}/publications/{publicationId}меняет любое поле;scheduledAt: nullснимает дату,state: scheduledбез даты отправляет сразу. После отправкиPATCHотвечает409 publication_dispatched. POST /projects/{id}/publications/{publicationId}/publishотправляет черновик или запланированную публикацию немедленно.DELETE /projects/{id}/publications/{publicationId}убирает публикацию из планера; та, что ещёqueued, отменяется.GET /projects/{id}/publications?from=…&to=…возвращает окно планера плюс все черновики без даты;stateсводит результат по соцсетям (publishing,published,failed).
Правила и ограничения
Заголовок раздела «Правила и ограничения»- Для
kind: textнуженtext; дляphotoиstoryнуженmediaId, а дляtextон запрещён. - Соцсети из
platformsдолжны быть подключены и в статусеactive, иначе API ответит409сconnection_missingилиconnection_not_ready. - Загрузка и создание публикаций делят лимит 30 запросов в минуту на пользователя (сверх него —
429). GET /projects/{id}/publicationsбезfrom/toвозвращает 50 последних публикаций.