## Mark a sender healthy

`client.Sender.MarkHealthy(ctx, id, body) (*SenderMarkHealthyResponse, error)`

**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](/using-the-api/scopes/):** `senders:update`

**[Rate limit category](/using-the-api/rate-limits/):** Write

### Parameters

- `id string`

  Unique identifier of the sender to mark healthy.

- `body SenderMarkHealthyParams`

  - `Body param.Field[SenderMarkHealthyParamsBody]`

### Returns

- `type SenderMarkHealthyResponse struct{…}`

  - `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 SenderMarkHealthyResponseChannel`

    Whether this sender sends email or LinkedIn messages.

    - `const SenderMarkHealthyResponseChannelEmail SenderMarkHealthyResponseChannel = "EMAIL"`

    - `const SenderMarkHealthyResponseChannelLinkedin SenderMarkHealthyResponseChannel = "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 SenderMarkHealthyResponseHealth`

    `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.

    - `const SenderMarkHealthyResponseHealthUnverified SenderMarkHealthyResponseHealth = "UNVERIFIED"`

    - `const SenderMarkHealthyResponseHealthHealthy SenderMarkHealthyResponseHealth = "HEALTHY"`

    - `const SenderMarkHealthyResponseHealthUnhealthy SenderMarkHealthyResponseHealth = "UNHEALTHY"`

  - `HealthReason string`

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

  - `ObjectType SenderMarkHealthyResponseObjectType`

    Always `sender`.

    - `const SenderMarkHealthyResponseObjectTypeSender SenderMarkHealthyResponseObjectType = "sender"`

  - `Owner string`

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

  - `Pacing SenderMarkHealthyResponsePacing`

    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 SenderMarkHealthyResponsePacingEmail`

      Email steps. Present only on an email sender.

      - `DailyLimit int64`

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

      - `MaxGapSeconds int64`

        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`.

      - `MinGapSeconds int64`

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

    - `LinkedinInvite SenderMarkHealthyResponsePacingLinkedinInvite`

      LinkedIn connection requests. Present only on a LinkedIn sender.

      - `DailyLimit int64`

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

      - `MaxGapSeconds int64`

        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`.

      - `MinGapSeconds int64`

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

    - `LinkedinMessage SenderMarkHealthyResponsePacingLinkedinMessage`

      LinkedIn messages. Present only on a LinkedIn sender.

      - `DailyLimit int64`

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

      - `MaxGapSeconds int64`

        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`.

      - `MinGapSeconds int64`

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

  - `ReplyToAddress string`

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

  - `Transport SenderMarkHealthyResponseTransport`

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

    - `const SenderMarkHealthyResponseTransportSmtp SenderMarkHealthyResponseTransport = "SMTP"`

    - `const SenderMarkHealthyResponseTransportOAuth SenderMarkHealthyResponseTransport = "OAUTH"`

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/Lightfld/lightfield-go"
  "github.com/Lightfld/lightfield-go/option"
)

func main() {
  client := githubcomlightfldlightfieldgo.NewClient(
    option.WithAPIKey("My API Key"),
  )
  senderMarkHealthyResponse, err := client.Sender.MarkHealthy(
    context.TODO(),
    "id",
    githubcomlightfldlightfieldgo.SenderMarkHealthyParams{

    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", senderMarkHealthyResponse.ID)
}
```

#### Response

```json
{
  "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"
}
```
