Mailroom добавляет свои маршруты админки в плагин API Grav под /api/v1/mailroom/. Каждый экран админки построен на этих маршрутах, поэтому всё, что делает она, может сделать и скрипт, и ИИ-клиент (см. MCP). Пути ниже опускают префикс /api/v1.
Это маршруты админки. Публичный эндпоинт подписки — другое дело, без ключа: см. API подписки.
Используйте любые учётные данные, которые принимает плагин API:
Ключ API, отправленный как X-API-Key. Создайте его в Admin Next (свой аккаунт, затем API Keys) или на сервере командой bin/plugin api keys:generate --user=<username>. Ключ, созданный с областями, ограничен ими: дайте ему mailroom.view, а также mailroom.manage и mailroom.send, если он должен писать и отправлять.
JWT из POST /auth/token, отправленный как X-API-Token (так делает Admin Next).
Каждому маршруту нужен api.access и одно из прав Mailroom. Чтение требует mailroom.view, запись — mailroom.manage, а всё, что кладёт почту в ящики, требует mailroom.send вместе с mailroom.manage. api.super считается всеми тремя. Таблицы ниже говорят view, manage или send.
Ответы заворачивают полезную нагрузку в data: {"data": {...}}.
Ошибки — сведения о проблеме (application/problem+json) с status, title и detail. Отказ, с которым можно что-то сделать (код списка, который нельзя изменить, исключённый адрес, недопустимый тег слияния), говорит об этом в detail.
Время — секунды эпохи UTC в обе стороны.
Адрес электронной почты никогда не возвращается вызывающему, у которого его не было.
Списки принимают page и per_page (не более 200 там, где маршрут листает).
Каждая кампания, начиная с новых. status, page, per_page. Счётчики состояний — по всей таблице.
POST /mailroom/campaigns
manage
Создать черновик. См. ниже.
GET /mailroom/campaigns/audience
view
Посчитать, кого достигнет кампания до её создания: lists=1,3, segment=5.
GET /mailroom/campaigns/{id}
view
Одна кампания со её счётчиками, процентами, тестом темы и возможными следующими шагами
PATCH /mailroom/campaigns/{id}
manage
Редактировать черновик или запланированную кампанию
DELETE /mailroom/campaigns/{id}
manage
Удалить черновик или отменённую кампанию
GET /mailroom/campaigns/{id}/sends
view
Её получатели и то, что произошло с каждым. status, page, per_page.
GET /mailroom/campaigns/{id}/links
view
Её ссылки и переходы по ним
GET /mailroom/campaigns/{id}/timeline
view
Её первые 48 часов по часам
GET /mailroom/campaigns/{id}/preview
view
Нарисовать сохранённую кампанию
POST /mailroom/campaigns/{id}/preview
manage
Нарисовать несохранённые поля (subject, preheader, body_md, layout)
POST /mailroom/campaigns/{id}/test
send
{email}: отправить одну тестовую копию
POST /mailroom/campaigns/{id}/start
send
Отправить сейчас или {scheduled_at} (секунды эпохи UTC), чтобы запланировать
POST /mailroom/campaigns/{id}/pause
manage
Приостановить
POST /mailroom/campaigns/{id}/resume
send
Продолжить приостановленную или остановленную кампанию
POST /mailroom/campaigns/{id}/cancel
manage
Отменить навсегда
GET /mailroom/campaigns/{id}/catch-up
view
Посчитать людей, присоединившихся к её спискам после её отправки
POST /mailroom/campaigns/{id}/catch-up
send
Отправить её им
POST /mailroom/campaigns/{id}/retry-failed
send
Повторить каждую неудачную отправку или {send_id} для одной
Поля кампании для создания и редактирования: name (обязательно при создании), subject, preheader, body_md, layout (store для брендированного макета или plain), list_id или list_ids (все списки по порядку), segment_id, template_id (только при создании: один раз копирует поля шаблона), from_name, from_email, reply_to, track_opens, track_clicks, subject_b, ab_sample_percent (от 10 до 50), ab_window_minutes и utm ({source, medium, campaign, content}). Оставьте list_ids пустым и дайте segment_id, чтобы отправить всем в любом списке, кто совпадает с ним.
Таблица. q, status, source, list, list_status (вместе с list), tag, campaign_id с campaign_received (yes или no), page, per_page. Счётчики состояний по всей таблице и list_counts со списком.
POST /mailroom/subscribers
manage
Добавить одного человека: {email, name, list_id, tags, language, mode, note}. mode — invite или subscribed (тогда note обязательна); без него решает список. outcome ответа говорит added, invited, already_on или already_invited.
Один человек: согласие, списки, теги, импорт, с которым он пришёл, исключён ли адрес, что ему отправляли и consent_log
PATCH /mailroom/subscribers/{id}
manage
{name, language, lists, tags}. Адрес изменить нельзя. Меняются только списки, в которых он уже состоит, а список, из которого он ушёл сам, остаётся покинутым.
DELETE /mailroom/subscribers/{id}
manage
Удалить его. Исключение остаётся.
POST /mailroom/subscribers/{id}/unsubscribe
manage
Убрать его из всех списков с записью, что это сделал сайт
POST /mailroom/subscribers/{id}/resubscribe
manage
{note, list_id}: вернуть его с тем, как он просил. Без list_id — во все списки, где он был.
Multipart: file и необязательно mapping (JSON) и list_id. Отвечает столбцами, найденным пресетом, первыми строками так, как их прочитают, и dry_run со счётчиками. Инструмента MCP нет.
POST /mailroom/imports
manage
Multipart: file, mapping (JSON со столбцом email), list_id, as_confirmed, tag, basis. Ставит импорт в очередь. Инструмента MCP нет.