POST /v1/replies/:id/send
/v1/replies/:id/sendApprove a Corty suggestion and send it via Smartlead. Closes the loop for agencies working in Make or Slack, and for external AI agents — no need to return to the SalesLobe UI.
This endpoint is governed by autonomy: depending on your API key's autonomy level, the reply is either sent immediately (200 "sent") or placed as a draft in the human review queue (202 "queued_for_review"). See External AI Agents.
Try it
/v1/replies/{id}/sendhttps://slazbvfvliieskvkjtav.supabase.co/functions/v1/api-gateway/v1/replies/{id}/sendEnter your API key above to send requests
Parameters
| Field | Type | Description | |
|---|---|---|---|
body | string | required | The reply text to send |
original_suggestion | string | optional | Corty's original suggestion — used for learning comparison |
edited | boolean | optional | Whether the suggestion was modified (default: false) |
Response (200) — sent immediately
Returned when your API key has sufficient autonomy level.
{
"status": "sent",
"sent": true,
"reply_id": "uuid",
"to_email": "john@acme.com",
"body": "Hey John, great that you're curious...",
"learned": true,
"sent_at": "2026-03-21T10:00:00Z"
}
Response (202) — queued for review
Default behavior for new agents/keys (autonomy level 0).
{
"status": "queued_for_review",
"reply_id": "uuid",
"suggestion_id": "uuid",
"replaced": false,
"reason": "no_active_autonomy_grant",
"docs": "external-agents"
}
The draft arrived successfully and sits in the SalesLobe review queue awaiting human approval. Don't retry — resending the same call is idempotent and returns the same 202 (one pending draft per reply; the latest draft wins). A repeat send returns "replaced": true with the same suggestion_id. See Autonomy Levels for the full level table.
reason | Meaning |
|---|---|
no_active_autonomy_grant | No active autonomy grant for this API key — all sends go to the review queue |
review_required_at_autonomy_level_<n> | A grant exists, but this level still requires human review before sending |
Returns 404 not_found if the reply doesn't exist. Returns 409 already_sent if this reply was already sent. Returns 502 smartlead_error if the Smartlead API fails.
Response (429) - send rate limits
The direct-send path (autonomy level 2+) is rate limited; the 202 queue path is not (it sends nothing). Both codes include a Retry-After header and are logged in the Decision Trail:
| Code | Limit | Retry-After |
|---|---|---|
send_rate_limit_exceeded | Max 5 sends per API key per minute | 60 seconds |
lead_recently_contacted | Same lead contacted within the last 15 minutes | 900 seconds |
See Rate Limits & Security for the X-RateLimit-* response headers.