## Update a sender

`client.Sender.Update(ctx, id, body) (*SenderUpdateResponse, error)`

**post** `/v1/senders/{id}`

Replaces a sender's pacing and returns the updated sender. Send exactly the sender's step types, with every value: read the sender first to change only some of them. Concurrent updates are last-write-wins.

Each step type must stay within the ceilings the workspace's own limits have, and `maxGapSeconds` can't be below `minGapSeconds`: `EMAIL` on an OAuth sender `dailyLimit` at least 1 and gaps 60 to 3600 seconds; `EMAIL` on an SMTP sender `dailyLimit` 1 to 100 and gaps 60 to 3600 seconds; `LINKEDIN_INVITE` `dailyLimit` 1 to 30 and gaps 120 to 3600 seconds; `LINKEDIN_MESSAGE` `dailyLimit` 1 to 60 and gaps 120 to 3600 seconds. Out-of-range values, or step types the sender doesn't send, return 400.

Returns 409 if the sender is archived; archived senders can be read but not updated.

**[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 update.

- `body SenderUpdateParams`

  - `Pacing param.Field[SenderUpdateParamsPacing]`

    The sender's new pacing, replacing all of its current values. Send exactly the step types the sender's channel sends: `EMAIL` for an email sender; `LINKEDIN_INVITE` and `LINKEDIN_MESSAGE` for a LinkedIn sender.

    - `Email SenderUpdateParamsPacingEmail`

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

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

      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.

### Returns

- `type SenderUpdateResponse 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 SenderUpdateResponseChannel`

    Whether this sender sends email or LinkedIn messages.

    - `const SenderUpdateResponseChannelEmail SenderUpdateResponseChannel = "EMAIL"`

    - `const SenderUpdateResponseChannelLinkedin SenderUpdateResponseChannel = "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 SenderUpdateResponseHealth`

    `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 SenderUpdateResponseHealthUnverified SenderUpdateResponseHealth = "UNVERIFIED"`

    - `const SenderUpdateResponseHealthHealthy SenderUpdateResponseHealth = "HEALTHY"`

    - `const SenderUpdateResponseHealthUnhealthy SenderUpdateResponseHealth = "UNHEALTHY"`

  - `HealthReason string`

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

  - `ObjectType SenderUpdateResponseObjectType`

    Always `sender`.

    - `const SenderUpdateResponseObjectTypeSender SenderUpdateResponseObjectType = "sender"`

  - `Owner string`

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

  - `Pacing SenderUpdateResponsePacing`

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

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

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

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

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

    - `const SenderUpdateResponseTransportSmtp SenderUpdateResponseTransport = "SMTP"`

    - `const SenderUpdateResponseTransportOAuth SenderUpdateResponseTransport = "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"),
  )
  senderUpdateResponse, err := client.Sender.Update(
    context.TODO(),
    "id",
    githubcomlightfldlightfieldgo.SenderUpdateParams{
      Pacing: githubcomlightfldlightfieldgo.SenderUpdateParamsPacing{

      },
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", senderUpdateResponse.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"
}
```
