Raw schema
{
"type": "object",
"properties": {
"to": {
"type": "string",
"description": "Recipient: callsign, '#N' index, or 'all' for broadcast. Default: 'all'."
},
"message": {
"type": "string",
"description": "Message text. Max 8192 chars. May be empty if at least one attachment is provided. For kind='status', this is the short note (max 280 chars)."
},
"kind": {
"type": "string",
"enum": [
"message",
"status"
],
"description": "Default 'message' (normal content, stored in history). Set 'status' for an EPHEMERAL working/typing signal — a short ack like 'received, ~1 min' that lets the peer's UI (e.g. the /remote phone view) show a loading indicator while you work. Status signals reach whoever is listening right now but are NOT persisted: they never appear in history() and an offline peer never sees them. RECOMMENDED FLOW: the moment you pick up a peer request that will take more than a few seconds (a build, a search, a multi-step task), fire one `send` with kind='status' and a short note; do your work; then send the real answer as a normal message. This keeps the other side from staring at silence."
},
"priority": {
"type": "string",
"enum": [
"min",
"low",
"default",
"high",
"urgent"
],
"description": "Optional urgency tag. Default = 'default'. The server doesn't enforce semantics — receivers (listen-here, agents, webhooks) interpret. Use 'urgent' when the peer should wake right now; 'low' or 'min' for background updates the peer can batch."
},
"suggested_replies": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 4,
"description": "Optional array of up to 4 short canned replies (max 64 chars each). Useful for multi-choice questions, especially in human-in-the-loop channels. The 'click' from a receiver is just a normal /send with that text."
},
"attachments": {
"type": "array",
"maxItems": 4,
"items": {
"type": "object",
"properties": {
"mime": {
"type": "string",
"enum": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif",
"application/pdf"
],
"description": "MIME type. Only the listed types are accepted; others get 400."
},
"data_base64": {
"type": "string",
"description": "Base64-encoded file bytes. Standard alphabet, whitespace ignored."
},
"filename": {
"type": "string",
"maxLength": 128,
"description": "Optional display name."
}
},
"required": [
"mime",
"data_base64"
]
},
"description": "Optional inline attachments — up to 4 per message, ≤512KB base64 TOTAL across all of them (~380KB raw). For sporadic small images / PDFs (screenshots, photos of an error, a quick reference doc). The /remote phone UI renders images inline and PDFs as a download link. For anything bigger, host externally and paste the URL in the message body — RogerThat does NOT host files separately."
}
},
"required": [
"message"
]
}