send_setup_mail #
Generated automatically from the published contract sources.
Build metadata: Registered in this build. Registration describes the default dispatcher in this build. It does not guarantee that a caller has the required credential or grant, that a tool is listed for that connection, or that the required service is configured.
A script calls this action over HTTPS at POST https://turnzero.ai/api/v1/actions/send_setup_mail, with a bearer credential and the action's payload as the JSON body.
Contract description #
Send the setup email once to each builder account you list that has not connected an AI coding tool, one to fifty a call, and read each account's outcome by name. Super-admin (platform operator) only. The messages count in the invitation window, five builder-realm messages an hour, so a long list takes several hourly calls. The production estate alone sends; the development estate refuses the call.
Access and action metadata #
{
"name": "send_setup_mail",
"resource": "account",
"tier": "reversible",
"grant": "super_admin",
"summary": "Super-admin: send the setup email once to each builder account you list that has not connected an AI coding tool, one to fifty accounts a call. The answer gives each account's outcome by name: `sent`, `already_sent`, `connected`, `synthetic`, `unbilled`, `suspended`, `no_such_account`, or the send's outcome. The messages count in the builder invitation window of five an hour, beside the invitations and the setup-mail pass. The production estate alone sends; the development estate refuses the call `setup_mail_production_only`. The answer lists accounts and outcomes, never an address.",
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": true
}
}
MCP catalog entry #
{
"name": "send_setup_mail",
"title": "Send setup email",
"tier": "reversible",
"scenario": "API-L0-12",
"summary": "Send the setup email once to each builder account you list that has not connected an AI coding tool, one to fifty a call, and read each account's outcome by name. Super-admin (platform operator) only. The messages count in the invitation window, five builder-realm messages an hour, so a long list takes several hourly calls. The production estate alone sends; the development estate refuses the call.",
"owners": [
"ACS-L0-08",
"ACS-L0-23"
]
}
request #
| JSON pointer | Description and constraints |
|---|---|
| "" (root) | Type: object Required fields: ["accounts"] Additional properties: false |
| / |
The accounts to send the setup email to, by id, from `list_accounts` or `list_sign_up_clicks`: one to fifty. You get one answer for each. Type: array Minimum items: 1 Maximum items: 50 |
| / |
Type: string Minimum length: 1 |
response #
| JSON pointer | Description and constraints |
|---|---|
| "" (root) | Type: object Required fields: ["contract_version","results","sent"] Additional properties: false |
| / |
Required value: 1 |
| / |
One entry per distinct account you list, in the order you list them. Type: array |
| / |
Type: object Required fields: ["account","outcome"] Additional properties: false |
| / |
Type: string |
| / |
An account with the outcome `sent` was sent the email at every verified address whose domain takes mail. One with `already_sent` was claimed before, by this action or the pass: sent, or settled `no_address`, `undeliverable`, or `not_sent`, and it is never sent again. One with `connected` has connected an AI coding tool. One with `synthetic`, `unbilled`, or `suspended` is that kind of account. The answer `no_such_account` means no builder account exists under the id. The answer `window_full` means the invitation window has no room this hour, and the account stays unclaimed for a later call. The answers `no_address` and `undeliverable` mean the account holds no verified address, or none whose domain takes mail. The answer `no_sender` means the plane holds no sender. The answer `not_sent` means the provider refused the message or the send passed its bound. The answer `failed` means a store read failed before the claim. Allowed values: ["sent","already_sent","connected","synthetic","unbilled","suspended","no_such_account","window_full","no_address","undeliverable","no_sender","not_sent","failed"] |
| / |
The count of accounts with the outcome `sent`. Type: integer Minimum: 0 |
| / |
Type: string |
Complete payload contract #
{
"request": {
"type": "object",
"required": [
"accounts"
],
"properties": {
"accounts": {
"type": "array",
"minItems": 1,
"maxItems": 50,
"items": {
"type": "string",
"minLength": 1
},
"description": "The accounts to send the setup email to, by id, from `list_accounts` or `list_sign_up_clicks`: one to fifty. You get one answer for each."
}
},
"additionalProperties": false
},
"response": {
"type": "object",
"required": [
"contract_version",
"results",
"sent"
],
"properties": {
"contract_version": {
"const": 1
},
"results": {
"type": "array",
"description": "One entry per distinct account you list, in the order you list them.",
"items": {
"type": "object",
"required": [
"account",
"outcome"
],
"properties": {
"account": {
"type": "string"
},
"outcome": {
"enum": [
"sent",
"already_sent",
"connected",
"synthetic",
"unbilled",
"suspended",
"no_such_account",
"window_full",
"no_address",
"undeliverable",
"no_sender",
"not_sent",
"failed"
],
"description": "An account with the outcome `sent` was sent the email at every verified address whose domain takes mail. One with `already_sent` was claimed before, by this action or the pass: sent, or settled `no_address`, `undeliverable`, or `not_sent`, and it is never sent again. One with `connected` has connected an AI coding tool. One with `synthetic`, `unbilled`, or `suspended` is that kind of account. The answer `no_such_account` means no builder account exists under the id. The answer `window_full` means the invitation window has no room this hour, and the account stays unclaimed for a later call. The answers `no_address` and `undeliverable` mean the account holds no verified address, or none whose domain takes mail. The answer `no_sender` means the plane holds no sender. The answer `not_sent` means the provider refused the message or the send passed its bound. The answer `failed` means a store read failed before the claim."
}
},
"additionalProperties": false
}
},
"sent": {
"type": "integer",
"minimum": 0,
"description": "The count of accounts with the outcome `sent`."
},
"detail": {
"type": "string"
}
},
"additionalProperties": false
}
}
Shared contracts #
- Refusals: every refusal, by surface, with its cause and its remedy
- schemas/wire_error.schema.json
- schemas/wire_errors.json
- schemas/action_payloads.json (includes shared shapes)
- management_api_contract.md