Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Email AI-CRM API

    Admin access

    All /api/admin/email/* routes require an authenticated platform admin session (admin or superadmin role).

    Admin UI paths

    Review UI lives at /admin/crm/* (CrmAdminShell). API paths stay /api/admin/email/* — see Email AI-CRM.

    Cron / webhook

    /api/cron/* and /api/webhooks/email/inbound use CRON_SECRET or WEBHOOK_EMAIL_SECRET — not user sessions. Fail-closed when secret missing.

    CRM SMTP ≠ Auth SMTP

    Draft send uses EmailSenderService + channel SMTP (CRM_CHANNEL_*). Auth OTP uses lib/mailer.ts / SMTP_*. Do not conflate the two in ops runbooks.

    Admin — channels

    GET /api/admin/email/channels

    Read-only CRM channel status (no passwords). Backs the inbox channel filter UI.

    Response:

    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": [] }
    }

    Implementation: loadCrmChannels() + validateCrmChannels() from features/email-crm/pipeline/imap/config.ts.


    Admin — threads

    GET /api/admin/email/threads

    List conversation threads.

    QueryTypeDescription
    statusstringFilter: new, ongoing, waiting, resolved, or omit for all
    sourceChannelstringFilter by channel id/name (multi-mailbox)

    Response: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Update thread status.

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

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

    Thread detail with messages, drafts, and open tasks.

    Response: { thread, messages, drafts, tasks }


    Admin — drafts

    GET /api/admin/email/drafts

    Pending drafts (status: pending), newest first.

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

    Approve draft for sending. Uses session user id as reviewer.

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

    Body: { "reason": "optional string" }

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

    Send approved draft via CRM channel SMTP (EmailSenderService).

    Body (optional): { "toEmail": "...", "subject": "..." } — defaults from thread.

    Response: { "success": true, "messageId": "<smtp-message-id>" }

    Persists outbound row in email_messages and updates thread status to waiting.


    Admin — contacts

    GET /api/admin/email/contacts

    QueryDescription
    email, name, company, typeSearch filters

    POST /api/admin/email/contacts

    Body: { "email": "required", "name?", "company?", "type?" }


    Admin — tasks

    GET /api/admin/email/tasks

    QueryDescription
    statusopen, in_progress, overdue, completed, etc.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — see TaskCreateInput in task-service.ts.

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

    Body: { "completionNotes?": "string" }


    Admin — analytics

    GET /api/admin/email/analytics

    QueryValues
    range7d (default), 30d, 90d

    Response: intent/sentiment distributions, costStats from email_api_usage, dailyStats, draft/task summaries.


    Cron — email processor

    POST or GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (fail-closed)

    Body or query action:

    ActionBehavior
    poll (default)pollInboundBatch() — fetch UNSEEN per channel, process, disconnect
    statusProcessor + IMAP stats (getEmailProcessor() for this action)
    stopStop IDLE listener
    startStart IDLE (requires EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksRun EmailTaskService.processOverdueTasks()

    Processor instances are constructed per action in the route handler (not a single top-level always-on instance).

    Example:

    GET /api/cron/email-analytics

    Returns 7-day dashboard snapshot (same shape as admin analytics). Cron-auth only.

    Auth token cleanup (related)

    GET/POST /api/cron/cleanup-email-tokens — purges expired email_login_tokens. Same fail-closed CRON_SECRET pattern. Documented under Ring Mailer; not an Email CRM route.


    Webhook — inbound email

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET or HMAC-SHA256 hex in X-Email-Webhook-Signature over raw body.

    Body (JSON):

    Calls EmailProcessor.ingestEvent() with uid: 0 (no IMAP mark-seen).


    Related documentation

    Related documentation

    Email AI-CRM

    Prerequisite: operator setup, channel secrets, Auth vs CRM SMTP.

    Email AI-CRM architecture

    Deep-dive: EmailProcessor and jsonb-collection persistence.

    Email AI-CRM developer guide

    Same-workflow: local poll + draft send smoke test.

    Ring Mailer & RingdomX Mail

    See-also: Auth cleanup-email-tokens cron and SMTP_* plane.

    Email AI-CRM API

    Admin access

    All /api/admin/email/* routes require an authenticated platform admin session (admin or superadmin role).

    Admin UI paths

    Review UI lives at /admin/crm/* (CrmAdminShell). API paths stay /api/admin/email/* — see Email AI-CRM.

    Cron / webhook

    /api/cron/* and /api/webhooks/email/inbound use CRON_SECRET or WEBHOOK_EMAIL_SECRET — not user sessions. Fail-closed when secret missing.

    CRM SMTP ≠ Auth SMTP

    Draft send uses EmailSenderService + channel SMTP (CRM_CHANNEL_*). Auth OTP uses lib/mailer.ts / SMTP_*. Do not conflate the two in ops runbooks.

    Admin — channels

    GET /api/admin/email/channels

    Read-only CRM channel status (no passwords). Backs the inbox channel filter UI.

    Response:

    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": [] }
    }

    Implementation: loadCrmChannels() + validateCrmChannels() from features/email-crm/pipeline/imap/config.ts.


    Admin — threads

    GET /api/admin/email/threads

    List conversation threads.

    QueryTypeDescription
    statusstringFilter: new, ongoing, waiting, resolved, or omit for all
    sourceChannelstringFilter by channel id/name (multi-mailbox)

    Response: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Update thread status.

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

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

    Thread detail with messages, drafts, and open tasks.

    Response: { thread, messages, drafts, tasks }


    Admin — drafts

    GET /api/admin/email/drafts

    Pending drafts (status: pending), newest first.

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

    Approve draft for sending. Uses session user id as reviewer.

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

    Body: { "reason": "optional string" }

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

    Send approved draft via CRM channel SMTP (EmailSenderService).

    Body (optional): { "toEmail": "...", "subject": "..." } — defaults from thread.

    Response: { "success": true, "messageId": "<smtp-message-id>" }

    Persists outbound row in email_messages and updates thread status to waiting.


    Admin — contacts

    GET /api/admin/email/contacts

    QueryDescription
    email, name, company, typeSearch filters

    POST /api/admin/email/contacts

    Body: { "email": "required", "name?", "company?", "type?" }


    Admin — tasks

    GET /api/admin/email/tasks

    QueryDescription
    statusopen, in_progress, overdue, completed, etc.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — see TaskCreateInput in task-service.ts.

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

    Body: { "completionNotes?": "string" }


    Admin — analytics

    GET /api/admin/email/analytics

    QueryValues
    range7d (default), 30d, 90d

    Response: intent/sentiment distributions, costStats from email_api_usage, dailyStats, draft/task summaries.


    Cron — email processor

    POST or GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (fail-closed)

    Body or query action:

    ActionBehavior
    poll (default)pollInboundBatch() — fetch UNSEEN per channel, process, disconnect
    statusProcessor + IMAP stats (getEmailProcessor() for this action)
    stopStop IDLE listener
    startStart IDLE (requires EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksRun EmailTaskService.processOverdueTasks()

    Processor instances are constructed per action in the route handler (not a single top-level always-on instance).

    Example:

    GET /api/cron/email-analytics

    Returns 7-day dashboard snapshot (same shape as admin analytics). Cron-auth only.

    Auth token cleanup (related)

    GET/POST /api/cron/cleanup-email-tokens — purges expired email_login_tokens. Same fail-closed CRON_SECRET pattern. Documented under Ring Mailer; not an Email CRM route.


    Webhook — inbound email

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET or HMAC-SHA256 hex in X-Email-Webhook-Signature over raw body.

    Body (JSON):

    Calls EmailProcessor.ingestEvent() with uid: 0 (no IMAP mark-seen).


    Related documentation

    Related documentation

    Email AI-CRM

    Prerequisite: operator setup, channel secrets, Auth vs CRM SMTP.

    Email AI-CRM architecture

    Deep-dive: EmailProcessor and jsonb-collection persistence.

    Email AI-CRM developer guide

    Same-workflow: local poll + draft send smoke test.

    Ring Mailer & RingdomX Mail

    See-also: Auth cleanup-email-tokens cron and SMTP_* plane.

    Email AI-CRM API

    Admin access

    All /api/admin/email/* routes require an authenticated platform admin session (admin or superadmin role).

    Admin UI paths

    Review UI lives at /admin/crm/* (CrmAdminShell). API paths stay /api/admin/email/* — see Email AI-CRM.

    Cron / webhook

    /api/cron/* and /api/webhooks/email/inbound use CRON_SECRET or WEBHOOK_EMAIL_SECRET — not user sessions. Fail-closed when secret missing.

    CRM SMTP ≠ Auth SMTP

    Draft send uses EmailSenderService + channel SMTP (CRM_CHANNEL_*). Auth OTP uses lib/mailer.ts / SMTP_*. Do not conflate the two in ops runbooks.

    Admin — channels

    GET /api/admin/email/channels

    Read-only CRM channel status (no passwords). Backs the inbox channel filter UI.

    Response:

    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": [] }
    }

    Implementation: loadCrmChannels() + validateCrmChannels() from features/email-crm/pipeline/imap/config.ts.


    Admin — threads

    GET /api/admin/email/threads

    List conversation threads.

    QueryTypeDescription
    statusstringFilter: new, ongoing, waiting, resolved, or omit for all
    sourceChannelstringFilter by channel id/name (multi-mailbox)

    Response: { threads: EmailThreadRecord[] }

    PATCH /api/admin/email/threads

    Update thread status.

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

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

    Thread detail with messages, drafts, and open tasks.

    Response: { thread, messages, drafts, tasks }


    Admin — drafts

    GET /api/admin/email/drafts

    Pending drafts (status: pending), newest first.

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

    Approve draft for sending. Uses session user id as reviewer.

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

    Body: { "reason": "optional string" }

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

    Send approved draft via CRM channel SMTP (EmailSenderService).

    Body (optional): { "toEmail": "...", "subject": "..." } — defaults from thread.

    Response: { "success": true, "messageId": "<smtp-message-id>" }

    Persists outbound row in email_messages and updates thread status to waiting.


    Admin — contacts

    GET /api/admin/email/contacts

    QueryDescription
    email, name, company, typeSearch filters

    POST /api/admin/email/contacts

    Body: { "email": "required", "name?", "company?", "type?" }


    Admin — tasks

    GET /api/admin/email/tasks

    QueryDescription
    statusopen, in_progress, overdue, completed, etc.

    POST /api/admin/email/tasks

    Body: { "threadId", "title", "taskType", ... } — see TaskCreateInput in task-service.ts.

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

    Body: { "completionNotes?": "string" }


    Admin — analytics

    GET /api/admin/email/analytics

    QueryValues
    range7d (default), 30d, 90d

    Response: intent/sentiment distributions, costStats from email_api_usage, dailyStats, draft/task summaries.


    Cron — email processor

    POST or GET /api/cron/email-processor

    Auth: Authorization: Bearer $CRON_SECRET (fail-closed)

    Body or query action:

    ActionBehavior
    poll (default)pollInboundBatch() — fetch UNSEEN per channel, process, disconnect
    statusProcessor + IMAP stats (getEmailProcessor() for this action)
    stopStop IDLE listener
    startStart IDLE (requires EMAIL_PROCESSOR_ALLOW_HTTP_START=true)
    mark-overdue-tasksRun EmailTaskService.processOverdueTasks()

    Processor instances are constructed per action in the route handler (not a single top-level always-on instance).

    Example:

    GET /api/cron/email-analytics

    Returns 7-day dashboard snapshot (same shape as admin analytics). Cron-auth only.

    Auth token cleanup (related)

    GET/POST /api/cron/cleanup-email-tokens — purges expired email_login_tokens. Same fail-closed CRON_SECRET pattern. Documented under Ring Mailer; not an Email CRM route.


    Webhook — inbound email

    POST /api/webhooks/email/inbound

    Auth: Authorization: Bearer $WEBHOOK_EMAIL_SECRET or HMAC-SHA256 hex in X-Email-Webhook-Signature over raw body.

    Body (JSON):

    Calls EmailProcessor.ingestEvent() with uid: 0 (no IMAP mark-seen).


    Related documentation

    Related documentation

    Email AI-CRM

    Prerequisite: operator setup, channel secrets, Auth vs CRM SMTP.

    Email AI-CRM architecture

    Deep-dive: EmailProcessor and jsonb-collection persistence.

    Email AI-CRM developer guide

    Same-workflow: local poll + draft send smoke test.

    Ring Mailer & RingdomX Mail

    See-also: Auth cleanup-email-tokens cron and SMTP_* plane.

    Owner Project Lab

    See-also: CRM orders desk sharing the admin shell.

    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": "Optional Name",
      "to": "info@example.com",
      "subject": "Subject line",
      "bodyText": "Plain text body",
      "bodyHtml": "<div>optional</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }

    Owner Project Lab

    See-also: CRM orders desk sharing the admin shell.

    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": "Optional Name",
      "to": "info@example.com",
      "subject": "Subject line",
      "bodyText": "Plain text body",
      "bodyHtml": "<div>optional</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }

    Owner Project Lab

    See-also: CRM orders desk sharing the admin shell.

    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": "Optional Name",
      "to": "info@example.com",
      "subject": "Subject line",
      "bodyText": "Plain text body",
      "bodyHtml": "<div>optional</div>",
      "date": "2026-06-10T12:00:00.000Z",
      "inReplyTo": "<parent-message-id>",
      "references": ["<ref1>", "<ref2>"]
    }
    1. Docs
    2. /API
    3. /Email AI-CRM API

    Updated Jul 21, 20263 min listen

    1. Docs
    2. /API
    3. /Email AI-CRM API

    Updated Jul 21, 20263 min listen

    1. Docs
    2. /API
    3. /Email AI-CRM API

    Updated Jul 21, 20263 min listen