_, err := client.Reply(ctx, event, nevo.ReplyParams{
Text: "Got it. We're on it.",
})
Reply returns a ReplyReceipt:
type ReplyReceipt struct {
ReplyID string
AcceptedAt time.Time
}
Email params
_, err := client.Reply(ctx, event, nevo.ReplyParams{
Text: "Plain-text body (required).",
HTML: "<p>Optional rich body.</p>",
Subject: "Optional subject override (defaults to 'Re: <original>').",
CC: []string{"ops@acme.com"},
BCC: []string{"archive@acme.com"},
})
Slack params
Slack replies only accept Text. HTML, Subject, CC, and BCC are rejected as invalid for Slack.
_, err := client.Reply(ctx, event, nevo.ReplyParams{Text: "👀 on it."})
Per-channel validation
The SDK validates params against the channel type before the network call:
// event.Type == nevo.EventWebhookReceived
_, err := client.Reply(ctx, event, nevo.ReplyParams{Text: "hi"})
// err → *nevo.UnsupportedChannelError
// event.Type == nevo.EventSlackEvent
_, err := client.Reply(ctx, event, nevo.ReplyParams{Text: "hi", Subject: "oops"})
// err → *nevo.RequestError
Today, email and slack channels accept replies. webhook and cron do not.
Limits
Email replies are capped to protect customer domain reputation:
| Field | Limit |
|---|---|
CC + BCC | 5 addresses combined. |
Subject | 512 characters. |
Text | 256 KB. |
Exceeding any cap returns *nevo.RequestError with one of the codes
too_many_recipients, subject_too_long, body_too_large.
Threading
Email: no action needed. Nevo stamps In-Reply-To + References and adds
a Re: prefix unless you override Subject.
Slack: also automatic. Replies to a top-level @mention start a thread
under it; replies to threaded messages post into the same thread.
Errors
All reply errors implement nevo.Error with IsTransient() bool:
var (
authErr *nevo.AuthError
reqErr *nevo.RequestError
netErr *nevo.NetworkError
srvErr *nevo.ServerError
)
_, err := client.Reply(ctx, event, nevo.ReplyParams{Text: "hi"})
switch {
case errors.As(err, &authErr):
// Terminal — token rejected.
case errors.As(err, &reqErr):
// 4xx — don't retry.
case errors.As(err, &netErr), errors.As(err, &srvErr):
// Transient — SDK already retried internally; your code may requeue.
}
See Errors for the full hierarchy.