МожливостіСутності
Документація
    Ring Platform

    Децентралізоване самобудівне майбутнє

    Увійти
    Сутності
    Можливості
    Магазин
    Документація
    Концепції
    RING ЕкономікаSonoratek LLCГлобальний впливAI зустрічає Web3
    Розпочати
    Швидкий стартКалькуляторДорожня карта
    Конфіденційність|Контакти
    v1.104.26|Sonoratek LLC

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Розгортання на власному сервері
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Архітектура News Kingdom
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server
    OSS і enterprise

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Розгортання на власному сервері
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Архітектура News Kingdom
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server
    OSS і enterprise

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Розгортання на власному сервері
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Архітектура News Kingdom
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server
    OSS і enterprise

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Email AI-CRM API

    Доступ адміністратора

    Всі маршрути /api/admin/email/* потребують аутентифікованої сесії platform admin (роль admin або superadmin).

    Адмін-інтерфейс

    Інтерфейс перегляду знаходиться за адресою /admin/crm/* (CrmAdminShell). API залишаються /api/admin/email/* — див. Email AI-CRM.

    Cron / webhook

    /api/cron/* та /api/webhooks/email/inbound використовують CRON_SECRET або WEBHOOK_EMAIL_SECRET — не user session. Якщо секрет відсутній — запит відхиляється.

    CRM SMTP ≠ Auth SMTP

    Відправка чернеток використовує EmailSenderService + канальний SMTP (CRM_CHANNEL_*). Для авторизаційних OTP використовується lib/mailer.ts / SMTP_*. Не плутайте це в технічній документації.

    Адмін — канали

    GET /api/admin/email/channels

    Тільки для читання: статус каналів CRM (без паролей). Використовується для фільтрації inbox за каналами в UI.

    Відповідь:

    json
    
    {
      "channels": [
        {
          "id": "primary",
          "name": "Primary",
          "flow": "standard",
          "mailbox": "INBOX",
          "imapHost": "mail.ringdom.org",
          "imapUser": "info@ringdom.org",
          "smtpHost": "mail.ringdom.org",
          "smtpUser": "info@ringdom.org",
          "hasImapPassword": true,
          "hasSmtpPassword": true
        }
      ],
      "validation": { "ok": true, "errors": [] }
    }

    Реалізація: loadCrmChannels() + validateCrmChannels() з features/email-crm/pipeline/imap/config.ts.


    Адмін — треди

    GET /api/admin/email/threads

    Список email-тредів.

    QueryТипОпис
    statusstringФільтр: new, ongoing, waiting, resolved або всі
    sourceChannelstringФільтрація за id чи назвою каналу (для мультискринькової підтримки)

    Відповідь: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Оновлення статусу треду.

    Body: { "id": "<threadId>", "status": "resolved" }

    GET /api/admin/email/threads/[id]

    Детальна інформація про тред: повідомлення, чернетки, відкриті задачі.

    Відповідь: { thread, messages, drafts, tasks }


    Адмін — чернетки

    GET /api/admin/email/drafts

    Чернетки до відправки (status: pending), найновіші першими.

    POST /api/admin/email/drafts/[id]/approve

    Затвердити чернетку до відправки (відмітка reviewer — user із сесії).

    POST /api/admin/email/drafts/[id]/reject

    Body: { "reason": "текстове пояснення (необов'язково)" }

    POST /api/admin/email/drafts/[id]/send

    Відправити затверджену чернетку через CRM SMTP-канал (EmailSenderService).

    Body (опціонально): { "toEmail": "...", "subject": "..." } — за замовчуванням з треду.

    Відповідь: { "success": true, "messageId": "<smtp-message-id>" }

    Email зберігається у email_messages + статус треду змінюється на waiting.


    Адмін — контакти

    GET /api/admin/email/contacts

    QueryОпис
    email, name, company, typeПараметри для пошуку

    POST /api/admin/email/contacts

    Body: { "email": "обовʼязково", "name?", "company?", "type?" }


    Адмін — задачі

    GET /api/admin/email/tasks

    QueryОпис
    statusopen, in_progress, overdue, completed і т.д.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — приклад див. у TaskCreateInput (task-service.ts).

    POST /api/admin/email/tasks/[id]/complete

    Body: { "completionNotes?": "text" }


    Адмін — аналітика

    GET /api/admin/email/analytics

    QueryЗначення
    range7d (за замовчуванням), 30d, 90d

    Відповідь: розподіл намірів/емоцій, costStats з email_api_usage, dailyStats, підсумки по чернетках/задачах.


    Cron — email processor

    POST або GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (обовʼязково)

    Body або query action:

    ActionОпис
    poll (default)pollInboundBatch() — забрати UNSEEN по каналах, обробити, закрити зʼєднання
    statusСтатистика процесора + IMAP (getEmailProcessor() для цієї дії)
    stopЗупинити IDLE listener
    startСтарт IDLE (потрібен EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksВиклик EmailTaskService.processOverdueTasks()

    Екземпляри процесора створюються окремо для кожної дії (не long-running-сервіс).

    Приклад:

    GET /api/cron/email-analytics

    Повертає 7-денний знімок дашборду (як admin analytics). Тільки cron-авторизація.

    Очищення токенів авторизації (пов'язано)

    GET/POST /api/cron/cleanup-email-tokens — видаляє прострочені email_login_tokens. Той самий pattern з CRON_SECRET. Документація — Ring Mailer; не відноситься до Email CRM напряму.


    Webhook — вхідна пошта

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET або HMAC-SHA256 hex у X-Email-Webhook-Signature по raw body.

    Body (JSON):

    Викликає EmailProcessor.ingestEvent() з uid: 0 (без позначки IMAP як прочитаного).


    Пов'язані документи

    Related documentation

    Email AI-CRM

    Передумова: налаштування операторів, секрети каналів, різниця Auth та CRM SMTP.

    Email AI-CRM architecture

    Деталі реалізації: EmailProcessor та jsonb-collection persist.

    Email AI-CRM developer guide

    Workflow: локальний poll + відправка чернетки (smoke test).

    Ring Mailer & RingdomX Mail

    Див. також: cron очистки токенів авторизації, SMTP_* plane.

    1. Документація
    2. /API-інтерфейс
    3. /Email AI-CRM API

    Оновлено 21 лип. 2026 р.3 хв прослуховування

    Email AI-CRM API

    Доступ адміністратора

    Всі маршрути /api/admin/email/* потребують аутентифікованої сесії platform admin (роль admin або superadmin).

    Адмін-інтерфейс

    Інтерфейс перегляду знаходиться за адресою /admin/crm/* (CrmAdminShell). API залишаються /api/admin/email/* — див. Email AI-CRM.

    Cron / webhook

    /api/cron/* та /api/webhooks/email/inbound використовують CRON_SECRET або WEBHOOK_EMAIL_SECRET — не user session. Якщо секрет відсутній — запит відхиляється.

    CRM SMTP ≠ Auth SMTP

    Відправка чернеток використовує EmailSenderService + канальний SMTP (CRM_CHANNEL_*). Для авторизаційних OTP використовується lib/mailer.ts / SMTP_*. Не плутайте це в технічній документації.

    Адмін — канали

    GET /api/admin/email/channels

    Тільки для читання: статус каналів CRM (без паролей). Використовується для фільтрації inbox за каналами в UI.

    Відповідь:

    json
    
    {
      "channels": [
        {
          "id": "primary",
          "name": "Primary",
          "flow": "standard",
          "mailbox": "INBOX",
          "imapHost": "mail.ringdom.org",
          "imapUser": "info@ringdom.org",
          "smtpHost": "mail.ringdom.org",
          "smtpUser": "info@ringdom.org",
          "hasImapPassword": true,
          "hasSmtpPassword": true
        }
      ],
      "validation": { "ok": true, "errors": [] }
    }

    Реалізація: loadCrmChannels() + validateCrmChannels() з features/email-crm/pipeline/imap/config.ts.


    Адмін — треди

    GET /api/admin/email/threads

    Список email-тредів.

    QueryТипОпис
    statusstringФільтр: new, ongoing, waiting, resolved або всі
    sourceChannelstringФільтрація за id чи назвою каналу (для мультискринькової підтримки)

    Відповідь: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Оновлення статусу треду.

    Body: { "id": "<threadId>", "status": "resolved" }

    GET /api/admin/email/threads/[id]

    Детальна інформація про тред: повідомлення, чернетки, відкриті задачі.

    Відповідь: { thread, messages, drafts, tasks }


    Адмін — чернетки

    GET /api/admin/email/drafts

    Чернетки до відправки (status: pending), найновіші першими.

    POST /api/admin/email/drafts/[id]/approve

    Затвердити чернетку до відправки (відмітка reviewer — user із сесії).

    POST /api/admin/email/drafts/[id]/reject

    Body: { "reason": "текстове пояснення (необов'язково)" }

    POST /api/admin/email/drafts/[id]/send

    Відправити затверджену чернетку через CRM SMTP-канал (EmailSenderService).

    Body (опціонально): { "toEmail": "...", "subject": "..." } — за замовчуванням з треду.

    Відповідь: { "success": true, "messageId": "<smtp-message-id>" }

    Email зберігається у email_messages + статус треду змінюється на waiting.


    Адмін — контакти

    GET /api/admin/email/contacts

    QueryОпис
    email, name, company, typeПараметри для пошуку

    POST /api/admin/email/contacts

    Body: { "email": "обовʼязково", "name?", "company?", "type?" }


    Адмін — задачі

    GET /api/admin/email/tasks

    QueryОпис
    statusopen, in_progress, overdue, completed і т.д.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — приклад див. у TaskCreateInput (task-service.ts).

    POST /api/admin/email/tasks/[id]/complete

    Body: { "completionNotes?": "text" }


    Адмін — аналітика

    GET /api/admin/email/analytics

    QueryЗначення
    range7d (за замовчуванням), 30d, 90d

    Відповідь: розподіл намірів/емоцій, costStats з email_api_usage, dailyStats, підсумки по чернетках/задачах.


    Cron — email processor

    POST або GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (обовʼязково)

    Body або query action:

    ActionОпис
    poll (default)pollInboundBatch() — забрати UNSEEN по каналах, обробити, закрити зʼєднання
    statusСтатистика процесора + IMAP (getEmailProcessor() для цієї дії)
    stopЗупинити IDLE listener
    startСтарт IDLE (потрібен EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksВиклик EmailTaskService.processOverdueTasks()

    Екземпляри процесора створюються окремо для кожної дії (не long-running-сервіс).

    Приклад:

    GET /api/cron/email-analytics

    Повертає 7-денний знімок дашборду (як admin analytics). Тільки cron-авторизація.

    Очищення токенів авторизації (пов'язано)

    GET/POST /api/cron/cleanup-email-tokens — видаляє прострочені email_login_tokens. Той самий pattern з CRON_SECRET. Документація — Ring Mailer; не відноситься до Email CRM напряму.


    Webhook — вхідна пошта

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET або HMAC-SHA256 hex у X-Email-Webhook-Signature по raw body.

    Body (JSON):

    Викликає EmailProcessor.ingestEvent() з uid: 0 (без позначки IMAP як прочитаного).


    Пов'язані документи

    Related documentation

    Email AI-CRM

    Передумова: налаштування операторів, секрети каналів, різниця Auth та CRM SMTP.

    Email AI-CRM architecture

    Деталі реалізації: EmailProcessor та jsonb-collection persist.

    Email AI-CRM developer guide

    Workflow: локальний poll + відправка чернетки (smoke test).

    Ring Mailer & RingdomX Mail

    Див. також: cron очистки токенів авторизації, SMTP_* plane.

    1. Документація
    2. /API-інтерфейс
    3. /Email AI-CRM API

    Оновлено 21 лип. 2026 р.3 хв прослуховування

    Email AI-CRM API

    Доступ адміністратора

    Всі маршрути /api/admin/email/* потребують аутентифікованої сесії platform admin (роль admin або superadmin).

    Адмін-інтерфейс

    Інтерфейс перегляду знаходиться за адресою /admin/crm/* (CrmAdminShell). API залишаються /api/admin/email/* — див. Email AI-CRM.

    Cron / webhook

    /api/cron/* та /api/webhooks/email/inbound використовують CRON_SECRET або WEBHOOK_EMAIL_SECRET — не user session. Якщо секрет відсутній — запит відхиляється.

    CRM SMTP ≠ Auth SMTP

    Відправка чернеток використовує EmailSenderService + канальний SMTP (CRM_CHANNEL_*). Для авторизаційних OTP використовується lib/mailer.ts / SMTP_*. Не плутайте це в технічній документації.

    Адмін — канали

    GET /api/admin/email/channels

    Тільки для читання: статус каналів CRM (без паролей). Використовується для фільтрації inbox за каналами в UI.

    Відповідь:

    json
    
    {
      "channels": [
        {
          "id": "primary",
          "name": "Primary",
          "flow": "standard",
          "mailbox": "INBOX",
          "imapHost": "mail.ringdom.org",
          "imapUser": "info@ringdom.org",
          "smtpHost": "mail.ringdom.org",
          "smtpUser": "info@ringdom.org",
          "hasImapPassword": true,
          "hasSmtpPassword": true
        }
      ],
      "validation": { "ok": true, "errors": [] }
    }

    Реалізація: loadCrmChannels() + validateCrmChannels() з features/email-crm/pipeline/imap/config.ts.


    Адмін — треди

    GET /api/admin/email/threads

    Список email-тредів.

    QueryТипОпис
    statusstringФільтр: new, ongoing, waiting, resolved або всі
    sourceChannelstringФільтрація за id чи назвою каналу (для мультискринькової підтримки)

    Відповідь: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Оновлення статусу треду.

    Body: { "id": "<threadId>", "status": "resolved" }

    GET /api/admin/email/threads/[id]

    Детальна інформація про тред: повідомлення, чернетки, відкриті задачі.

    Відповідь: { thread, messages, drafts, tasks }


    Адмін — чернетки

    GET /api/admin/email/drafts

    Чернетки до відправки (status: pending), найновіші першими.

    POST /api/admin/email/drafts/[id]/approve

    Затвердити чернетку до відправки (відмітка reviewer — user із сесії).

    POST /api/admin/email/drafts/[id]/reject

    Body: { "reason": "текстове пояснення (необов'язково)" }

    POST /api/admin/email/drafts/[id]/send

    Відправити затверджену чернетку через CRM SMTP-канал (EmailSenderService).

    Body (опціонально): { "toEmail": "...", "subject": "..." } — за замовчуванням з треду.

    Відповідь: { "success": true, "messageId": "<smtp-message-id>" }

    Email зберігається у email_messages + статус треду змінюється на waiting.


    Адмін — контакти

    GET /api/admin/email/contacts

    QueryОпис
    email, name, company, typeПараметри для пошуку

    POST /api/admin/email/contacts

    Body: { "email": "обовʼязково", "name?", "company?", "type?" }


    Адмін — задачі

    GET /api/admin/email/tasks

    QueryОпис
    statusopen, in_progress, overdue, completed і т.д.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — приклад див. у TaskCreateInput (task-service.ts).

    POST /api/admin/email/tasks/[id]/complete

    Body: { "completionNotes?": "text" }


    Адмін — аналітика

    GET /api/admin/email/analytics

    QueryЗначення
    range7d (за замовчуванням), 30d, 90d

    Відповідь: розподіл намірів/емоцій, costStats з email_api_usage, dailyStats, підсумки по чернетках/задачах.


    Cron — email processor

    POST або GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (обовʼязково)

    Body або query action:

    ActionОпис
    poll (default)pollInboundBatch() — забрати UNSEEN по каналах, обробити, закрити зʼєднання
    statusСтатистика процесора + IMAP (getEmailProcessor() для цієї дії)
    stopЗупинити IDLE listener
    startСтарт IDLE (потрібен EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksВиклик EmailTaskService.processOverdueTasks()

    Екземпляри процесора створюються окремо для кожної дії (не long-running-сервіс).

    Приклад:

    GET /api/cron/email-analytics

    Повертає 7-денний знімок дашборду (як admin analytics). Тільки cron-авторизація.

    Очищення токенів авторизації (пов'язано)

    GET/POST /api/cron/cleanup-email-tokens — видаляє прострочені email_login_tokens. Той самий pattern з CRON_SECRET. Документація — Ring Mailer; не відноситься до Email CRM напряму.


    Webhook — вхідна пошта

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET або HMAC-SHA256 hex у X-Email-Webhook-Signature по raw body.

    Body (JSON):

    Викликає EmailProcessor.ingestEvent() з uid: 0 (без позначки IMAP як прочитаного).


    Пов'язані документи

    Related documentation

    Email AI-CRM

    Передумова: налаштування операторів, секрети каналів, різниця Auth та CRM SMTP.

    Email AI-CRM architecture

    Деталі реалізації: EmailProcessor та jsonb-collection persist.

    Email AI-CRM developer guide

    Workflow: локальний poll + відправка чернетки (smoke test).

    Ring Mailer & RingdomX Mail

    Див. також: cron очистки токенів авторизації, SMTP_* plane.

    1. Документація
    2. /API-інтерфейс
    3. /Email AI-CRM API

    Оновлено 21 лип. 2026 р.3 хв прослуховування

    Owner Project Lab

    Див. також: адмінський shell замовлень CRM.

    bash
    
    curl -X POST "$BASE_URL/api/cron/email-processor" \
      -H "Authorization: Bearer $CRON_SECRET" \
      -H "Content-Type: application/json" \
      -d '{"action":"poll"}'
    json
    
    {
      "messageId": "<rfc5322-message-id>",
      "from": "sender@example.com",
      "fromName": "НЕОБОВ’ЯЗКОВО",
      "to": "info@example.com",
      "subject": "Тема листа",
      "bodyText": "Текст листа",
      "bodyHtml": "<div>опційно</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }

    Owner Project Lab

    Див. також: адмінський shell замовлень CRM.

    bash
    
    curl -X POST "$BASE_URL/api/cron/email-processor" \
      -H "Authorization: Bearer $CRON_SECRET" \
      -H "Content-Type: application/json" \
      -d '{"action":"poll"}'
    json
    
    {
      "messageId": "<rfc5322-message-id>",
      "from": "sender@example.com",
      "fromName": "НЕОБОВ’ЯЗКОВО",
      "to": "info@example.com",
      "subject": "Тема листа",
      "bodyText": "Текст листа",
      "bodyHtml": "<div>опційно</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }

    Owner Project Lab

    Див. також: адмінський shell замовлень CRM.

    bash
    
    curl -X POST "$BASE_URL/api/cron/email-processor" \
      -H "Authorization: Bearer $CRON_SECRET" \
      -H "Content-Type: application/json" \
      -d '{"action":"poll"}'
    json
    
    {
      "messageId": "<rfc5322-message-id>",
      "from": "sender@example.com",
      "fromName": "НЕОБОВ’ЯЗКОВО",
      "to": "info@example.com",
      "subject": "Тема листа",
      "bodyText": "Текст листа",
      "bodyHtml": "<div>опційно</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }