Replies

Send a response on the channel the event arrived on.

_, 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:

FieldLimit
CC + BCC5 addresses combined.
Subject512 characters.
Text256 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.