Skip to Content
Browse the Docs▾

Send an email card

POST/api/v1/review/{id}/send

Approve and send an email draft or reply Revnu wrote, optionally with an edited reply body. This sends real email.

This is the only route that sends email, and it sends only what Revnu drafted: cards whose sourceType is gmail_draft (an outreach email) or gmail_reply (a reply in a live conversation). They go through here rather than /answer because sending holds a one-shot delivery lease, so a retry never sends twice.

curl -X POST -H "Authorization: Bearer $REVNU_API_TOKEN" \
  -H "content-type: application/json" \
  -d '{"body":"Thanks Priya, Thursday at 2 works."}' \
  https://revnu.com/api/v1/review/k97…/send

Body

Field Meaning
body Optional, replies (gmail_reply) only. Send this text instead of the draft. Cannot be empty if present. A body on a gmail_draft card is a 400: a draft always sends the copy that was reviewed.

Responses

200 { "ok": true, "data": { "outcome": "sent", "queued": false, "messageId": "<id>" } } once the provider accepted it; messageId is the delivery receipt. When the mailbox paces its sending, the email is queued instead: data has queued: true and, once the queue has placed it, leavesAt (ISO 8601) and timing. A provider refusal is also a 200, as { "ok": false, "error": { "kind", "detail" } }; kind is one of rate_limited, out_of_credits, not_found, network, upstream_5xx, schema_drift, bad_input, missing_key or budget_exhausted. The full shape is in /openapi.json. 409 if the card was already handled or is not an email card. 503 delivery_pending with a Retry-After header if the provider's answer was lost: the send is fenced for reconciliation rather than risked twice, so wait and retry the same call. 503 unavailable, also with Retry-After, when the delivery service could not be reached.

Frequently Asked Questions

Can I send my own email through the API?

This route sends a draft or reply Revnu wrote, with your edits to a reply at most, so every email that goes out has been through Revnu and your approval. There's no route for an email you composed yourself.

Do replies ever send on their own?

No. A reply inside a live conversation always waits for a person to send it, whatever the approval settings say.

Which scope does this need?

review:write. A token without it gets 403 with requiredScope in the body. GET /me shows a token's scopes.

Are responses cached?

No. Every response is Cache-Control: no-store, so what you read is current.