Быстрый старт

За пять минут вы пройдёте путь от регистрации до поста, поставленного в расписание. Весь код ниже — рабочие примеры из репозитория castbase-examples; выберите свой язык на любой вкладке, выбор запомнится для всей документации.

1. Регистрация

Откройте регистрацию, введите email и пароль, отметьте два согласия (на обработку персональных данных и с пользовательским соглашением) и подтвердите почту по ссылке из письма.

2. Проект

После входа нажмите «Создать проект». Проект — рабочее пространство: у него своё расписание, свои каналы, свои API-ключи и свои лимиты. Укажите название и часовой пояс (по умолчанию Europe/Moscow): в этом поясе читаются слоты расписания и время publish_at без указания зоны.

3. Подключите Instagram

В проекте откройте «Каналы» → «Подключить Instagram». Мастер за пять шагов проведёт вас по настройкам Meta и в конце попросит вставить токен. Канал сначала в статусе pending («проверяем…»), через минуту — active с именем аккаунта. Подробнее — в разделе Подключение Instagram.

4. API-ключ

«API-ключи» → «Выпустить ключ». Ключ вида cb_live_… показывается один раз, скопируйте его. Передайте его в переменную окружения — все примеры читают ключ оттуда:

export CASTBASE_API_KEY=cb_live_...
export CASTBASE_API_URL=https://castbase.ru   # необязательно, это значение по умолчанию

Каждый пример начинается с одной и той же настройки:

API_URL="${CASTBASE_API_URL:-https://castbase.ru}"
API_KEY="${CASTBASE_API_KEY:?Задайте CASTBASE_API_KEY (ключ проекта: кабинет -> API-ключи)}"
AUTH="Authorization: Bearer ${API_KEY}"

5. Канал для публикации

Узнайте id канала (или передайте свой в CASTBASE_CHANNEL_ID):

# Канал, в который публикуем: свой id или первый активный
CHANNEL_ID="${CASTBASE_CHANNEL_ID:-$(curl -sf -H "$AUTH" "$API_URL/v1/channels" | jq -r '[.data[] | select(.status == "active")][0].id // empty')}"
[ -n "$CHANNEL_ID" ] || { echo "Нет активного канала: подключите Instagram в кабинете (раздел «Каналы»)" >&2; exit 1; }

6. Загрузите медиа

Файл (JPEG, PNG или WebP до 8 МБ; видео MP4 или MOV до 300 МБ) загружается отдельным запросом и возвращает media_id. Обратите внимание на заголовок Idempotency-Key: он обязателен на каждом POST (подробнее — Идемпотентность).

# Загрузка файла: multipart/form-data, поле file. Idempotency-Key обязателен на каждом POST
MEDIA_ID=$(curl -sS --fail-with-body -X POST "$API_URL/v1/media" \
  -H "$AUTH" -H "Idempotency-Key: $(uuidgen)" \
  -F "file=@${MEDIA_FILE};type=image/jpeg" | jq -r '.media_id')
echo "media_id: $MEDIA_ID"

7. Создайте пост

Пост — это подпись, медиа, каналы и время публикации. Здесь время — через 10 минут; о других вариантах (next_slot, «сразу») — в разделе Посты и расписание.

# Создание поста. Повтор с тем же Idempotency-Key не создаст второй пост
PUBLISH_AT="${CASTBASE_PUBLISH_AT:-$(date -u -v+10M +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '+10 minutes' +%Y-%m-%dT%H:%M:%SZ)}"
POST_ID=$(curl -sS --fail-with-body -X POST "$API_URL/v1/posts" \
  -H "$AUTH" -H "Idempotency-Key: $(uuidgen)" -H "Content-Type: application/json" \
  -d "$(jq -n --arg channel "$CHANNEL_ID" --arg media "$MEDIA_ID" --arg at "$PUBLISH_AT" \
    '{channel_ids: [$channel], caption: "Привет из castbase! #api", media: [{media_id: $media}], publish_at: $at}')" | jq -r '.id')
echo "post_id: $POST_ID"

Ответ 201 содержит id поста и статус scheduled: пост принят и будет опубликован в назначенное время.

8. Узнайте результат

Статус поста и каждой его цели:

# Статус по каждой цели (каналу): scheduled -> dispatched -> published | failed ...
curl -sS --fail-with-body -H "$AUTH" "$API_URL/v1/posts/$POST_ID" \
  | jq -r '"status: \(.status)", (.targets[] | "target: \(.channel_id) \(.status) \(.permalink // "-")")'

И лента событий проекта — удобный способ узнавать об итогах без опроса каждого поста:

# Лента событий проекта: храните next_after и передавайте его как after
curl -sS --fail-with-body -H "$AUTH" "$API_URL/v1/events?after=0&limit=50" \
  | jq -r '(.data[] | "event: \(.seq) \(.type) \(.data.post_id // "")"), "next_after: \(.next_after)"'

В ленте появятся post.published (с ссылкой на публикацию), post.failed или другие события — см. Статусы и события.

Весь сценарий одной командой

Все шаги собраны в один скрипт на каждом языке. Клонируйте castbase-examples и запустите:

Язык Команда
curl ./curl/publish.sh
Python python3 python/publish.py
JavaScript node javascript/publish.mjs
PHP php php/publish.php
Go cd go && go run .

Что дальше