---
title: "Send the account-bootstrap email"
method: POST
path: "/api/v1/accounts/{id}/send"
tags: ["Accounts"]
---

# Send the account-bootstrap email

`POST /api/v1/accounts/{id}/send`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/accounts/{id}/send`
- Auth: none declared

Deliver the verification email that POST /api/v1/accounts deliberately withheld. Public endpoint — the session id is the bearer secret, the same model as the poll route.

One session sends at most one message. The material backing the send is claimed atomically when the send is ATTEMPTED — so two concurrent calls cannot both deliver — and a failed delivery hands it back, returning `email_sent: false` so the call can be retried. A repeat after a delivered send answers 410.

This is not an anti-abuse measure and does not claim to be one: whoever is willing to make two requests is not stopped by it. Volume is bounded by the per-identity budget on the create call and by the recipient's own decline link. What the split removes is the case where creating a session and mailing a stranger were the same act.

## Path parameters

- `id` string, required: Account session ID

## Response `200`

Send attempted. `email_sent` reports the outcome; `email_error` is present when delivery failed.

- object
  - `id` string, required
  - `channel` string, required
  - `email_sent` boolean, required
  - `email_error` string

## Other responses

- `400`: Invalid session id, session not pending, or a channel that dispatches nothing (`channel_not_email`)
- `401`: `invalid_api_key` — the request presented an API key the API no longer accepts; nothing is claimed or sent. Requests without a `pk_` bearer never receive it.
- `404`: Session not found or not an account-bootstrap session
- `410`: `already_sent` — the material backing this session's send is gone. Either the email was delivered, or the attempt was interrupted after the material was claimed and before it could be handed back (a failed restore, or the process dying mid-send), in which case nothing was sent. The two are indistinguishable from here, so do not report a delivery to the user on the strength of this response — start a new session instead. A session the recipient CANCELLED, or one that expired, answers 404 rather than 410: the session is removed before its send material is.
- `429`: Either the IP rate limit, or `identity_declined` — the owner of this address used the "this wasn't me" link in a recent message and must not be emailed again until the cooldown lapses. `identity_declined` means DO NOT RETRY on behalf of the same address; ask the person directly instead.
- `503`: The session state (`send_material_unavailable`) or the decline check (`decline_check_unavailable`) could not be read. Nothing was sent — retry rather than treating either as a completed send.

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/6b8d61ee354f?raw)
