Skip to content

Get Mailbox Warmup Analytics

GET
/mailboxes/{mailbox_id}/warmup

Get live warmup analytics for a single mailbox.

Wraps the existing GET /warmup/{mailbox_id}/analytics flow so MCP (API-key auth) can read warmup engagement / reputation without going through cookie-based session auth.

Behavior: - Looks up the mailbox in the API user’s org schema. 404 if missing or deleted. Tenant isolation comes from the per-org schema bind, NOT from a row-level predicate. - Hits the configured warmup provider (Instantly or SmartLead) over HTTP — slow (~300-800ms typical). For warm bulk reads use list_mailboxes and check the cheap DB-level warmup_status. - Returns {success, warmup_enabled, provider, analytics, warmup_settings} — same shape as the internal /warmup/{id}/analytics endpoint.

Backwards-compat: this is a brand-new route. The internal /warmup/{id}/analytics (cookie auth) is unchanged.

Historical bug (fixed 2026-05-24, same root cause as list_mailboxes above): the previous implementation appended (t.org_id = :org_id OR m.created_by = :user_id) to the WHERE. Both halves match zero rows in prod — mailboxes.team_id is NULL on every row (no team pinning) and mailboxes.created_by stores email strings, not propelauth UUIDs. Result: every warmup-analytics call 404’d even for mailboxes that list_mailboxes happily returned. Dropping the predicate restores parity; schema bind is the tenant boundary.

Authorizations

Parameters

Path Parameters

mailbox_id
required
integer

Header Parameters

X-Target-Org-Id
Any of:
string

Responses

200

Successful Response

object
data
required
object
key
additional properties
any
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string