Skip to content

Mark a sender healthy

POST/v1/senders/{id}/mark_healthy

Clears a health reason that sending recorded, so the sender can be picked for new sends again, and returns the updated sender. A sender with nothing to clear is returned unchanged.

Clears healthReason BOUNCE_THRESHOLD, RATE_LIMIT, INVITE_LIMIT on an email sender, and RATE_LIMIT, INVITE_LIMIT, UNKNOWN on a LinkedIn sender. Clearing BOUNCE_THRESHOLD turns bounce protection off until hard bounces recur. Contacts the sender paused on their own resume once it can send again, unless another sender they are pinned to still cannot. Sequences an earlier LinkedIn limit deactivated stay deactivated until they are resumed.

Returns 409 for any other health reason, which clears only once its cause is fixed, for example reconnecting the account or fixing DNS; for an archived sender; or when the sender’s health changed while the request ran.

Required scope: senders:update

Rate limit category: Write

Path ParametersExpand Collapse
id: string

Unique identifier of the sender to mark healthy.

Body ParametersJSONExpand Collapse
body: optional object { }
ReturnsExpand Collapse
SenderMarkHealthyResponse object { id, archivedAt, channel, 9 more }
id: string

Unique identifier of the sender.

archivedAt: string

When the sender was archived, or null if it is active. Archived senders never send.

channel: "EMAIL" or "LINKEDIN"

Whether this sender sends email or LinkedIn messages.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

When the sender was created.

emailAddress: string

The address email from this sender is sent from. Null for LinkedIn senders, or when the connected account has no address.

health: "UNVERIFIED" or "HEALTHY" or "UNHEALTHY"

HEALTHY can send. UNHEALTHY cannot send until healthReason is resolved. UNVERIFIED means no health verdict yet: an email sender in this state cannot send until it passes a health check, while a LinkedIn sender is never health-checked, so a working LinkedIn sender is usually UNVERIFIED and can send.

One of the following:
"UNVERIFIED"
"HEALTHY"
"UNHEALTHY"
healthReason: string

Why the sender is UNHEALTHY or UNVERIFIED, for example ACCOUNT_DISCONNECTED, BOUNCE_THRESHOLD or INVITE_LIMIT; null when healthy.

objectType: "sender"

Always sender.

owner: string

Member ID of the person who owns this sender, or null when no workspace membership can be resolved.

pacing: object { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How this sender paces each step type it sends, keyed by sequence step type: EMAIL for an email sender; LINKEDIN_INVITE and LINKEDIN_MESSAGE for a LinkedIn sender.

EMAIL: optional object { dailyLimit, maxGapSeconds, minGapSeconds }

Email steps. Present only on an email sender.

dailyLimit: number

Most sends of this step type in any rolling 24 hours.

minimum-9007199254740991
maximum9007199254740991
maxGapSeconds: number

Upper bound of the minimum spacing, in seconds. Before each send, a minimum spacing is drawn at random between minGapSeconds and this value, and the send waits until that long after the previous one. Sends can be further apart, for example outside the send window or once dailyLimit is reached. Null means the minimum spacing is always minGapSeconds.

minimum-9007199254740991
maximum9007199254740991
minGapSeconds: number

Lower bound of the minimum spacing between two of its sends, in seconds.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: optional object { dailyLimit, maxGapSeconds, minGapSeconds }

LinkedIn connection requests. Present only on a LinkedIn sender.

dailyLimit: number

Most sends of this step type in any rolling 24 hours.

minimum-9007199254740991
maximum9007199254740991
maxGapSeconds: number

Upper bound of the minimum spacing, in seconds. Before each send, a minimum spacing is drawn at random between minGapSeconds and this value, and the send waits until that long after the previous one. Sends can be further apart, for example outside the send window or once dailyLimit is reached. Null means the minimum spacing is always minGapSeconds.

minimum-9007199254740991
maximum9007199254740991
minGapSeconds: number

Lower bound of the minimum spacing between two of its sends, in seconds.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: optional object { dailyLimit, maxGapSeconds, minGapSeconds }

LinkedIn messages. Present only on a LinkedIn sender.

dailyLimit: number

Most sends of this step type in any rolling 24 hours.

minimum-9007199254740991
maximum9007199254740991
maxGapSeconds: number

Upper bound of the minimum spacing, in seconds. Before each send, a minimum spacing is drawn at random between minGapSeconds and this value, and the send waits until that long after the previous one. Sends can be further apart, for example outside the send window or once dailyLimit is reached. Null means the minimum spacing is always minGapSeconds.

minimum-9007199254740991
maximum9007199254740991
minGapSeconds: number

Lower bound of the minimum spacing between two of its sends, in seconds.

minimum-9007199254740991
maximum9007199254740991
replyToAddress: string

SMTP senders only: the connected mailbox replies are sent to and read from. Null for other senders.

transport: "SMTP" or "OAUTH"

How an email sender sends: SMTP through its own mail server, OAUTH through its connected Google or Microsoft account. Null for LinkedIn senders.

One of the following:
"SMTP"
"OAUTH"

Mark a sender healthy

curl https://api.lightfield.app/v1/senders/$ID/mark_healthy \
    -X POST \
    -H 'Lightfield-Version: 2026-03-01' \
    -H "Authorization: Bearer $API_KEY"
{
  "id": "id",
  "archivedAt": "archivedAt",
  "channel": "EMAIL",
  "createdAt": "createdAt",
  "emailAddress": "emailAddress",
  "health": "UNVERIFIED",
  "healthReason": "healthReason",
  "objectType": "sender",
  "owner": "owner",
  "pacing": {
    "EMAIL": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    },
    "LINKEDIN_INVITE": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    },
    "LINKEDIN_MESSAGE": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    }
  },
  "replyToAddress": "replyToAddress",
  "transport": "SMTP"
}
Returns Examples
{
  "id": "id",
  "archivedAt": "archivedAt",
  "channel": "EMAIL",
  "createdAt": "createdAt",
  "emailAddress": "emailAddress",
  "health": "UNVERIFIED",
  "healthReason": "healthReason",
  "objectType": "sender",
  "owner": "owner",
  "pacing": {
    "EMAIL": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    },
    "LINKEDIN_INVITE": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    },
    "LINKEDIN_MESSAGE": {
      "dailyLimit": -9007199254740991,
      "maxGapSeconds": -9007199254740991,
      "minGapSeconds": -9007199254740991
    }
  },
  "replyToAddress": "replyToAddress",
  "transport": "SMTP"
}