Skip to main content
PATCH
/
api
/
email
/
accounts
/
{id}
/
retry-warmup
Retry Inbox Warmup
curl --request PATCH \
  --url https://app.puffle.ai/api/email/accounts/{id}/retry-warmup \
  --header 'Authorization: Bearer <token>'
{
  "account": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "type": "email",
    "email_address": "jsmith@example.com",
    "daily_limit": 4503599627370495,
    "created_at": "2023-11-07T05:31:56Z",
    "updated_at": "2023-11-07T05:31:56Z",
    "agentmail_inbox_id": "<string>",
    "email_domains": {
      "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "domain": "<string>",
      "status": "<string>"
    }
  }
}
CLI:
puffle email account retry-warmup --id <id>

Overview

Retry path for inboxes whose initial warmup-enable call failed after the DB row was already written. The route:
  1. Loads the account and verifies ownership (plus pulls its linked email_domains row for context).
  2. Gates on status: "pending" AND warmup_status: "not_started" — any other combination returns 409.
  3. Calls the warmup enablement path (idempotent; already-warming emails are accepted as success).
  4. Transitions the row to status: "warming" / warmup_status: "warming" via compare-and-swap, so concurrent retries can’t double-apply.

AI agent notes

Warmup is a multi-day process. A successful retry only moves the account into warming — it still has to accrue reputation over ~2–3 weeks before it graduates to active and can send. Track progress via getWarmupAnalytics.Idempotent. If warmup was already running from a prior partial attempt, the retry still returns 200 and transitions the DB row forward. Safe to call until success.Gate carefully. Retry is only valid when status === "pending" AND warmup_status === "not_started". If the account already warmed up, banned out, or graduated to active, this endpoint returns 409 — use getWarmupAnalytics to read current state instead.Status-vs-502 split.
  • 502 means the warmup provider rejected the call — try again after a short backoff.
  • 500 with the message “Warmup was enabled but failed to update account status” means the provider accepted but our DB write failed. Safe to retry immediately; a second warmup call is a no-op.
Chains with: getWarmupAnalytics to watch reputation climb; launchCampaign once status === "active".

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string
required

Supabase UUID of the email account. Must be owned by the caller and currently in status: pending + warmup_status: not_started.

Minimum string length: 1

Response

Warmup re-enabled. Returns the refreshed account row.

account
object
required

Account row after the retry. On success, status is warming and warmup_status is warming.