Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Email

Send an email

Sends one email that a person wrote, now, from a mailbox of the business to one address or to up to 10 addresses. It can carry up to 5 files, 10 MB together. It is not part of a campaign: it has the signature of the mailbox and no footer. Troopy refuses an address on do-not-contact, a mailbox that is not active, and a mailbox without enough of its limit left for 24 hours. Each address counts as one email in that limit. The answer is the kept email: sent, failed with the reason, or unknown when it possibly went. Troopy does not send an unknown email again. Owners and admins also send from a teammate's own address: a t- box, with the signature and the daily cap of that address. That needs agents:read and agents:write too. Teammates cannot call this operation.

post/api/v1/emails

Authorization

HeaderAuthorization: Bearer <API key>
Or the headerX-API-Key: <API key>
API keyMake one in Troopy under Settings > API keys. It acts as you, in its workspace.

Other ways to call it

CLItroopy emails send
MCP toolNone. Call it over REST or with the CLI.
Rate limit20 calls in 60 seconds, for each key
RetriesSend an Idempotency-Key header. A retry with the same key gets the first answer back, and the operation runs one time.

Body

application/json
from*string

Where it goes from: an m- id of a mailbox, or the t- id of a teammate's own address (owners and admins)

to*string | array<string>

One email address, or a list of up to 10 addresses

subjectstring

Needed, except for an answer: an answer takes the subject of its email

At most 300 characters

body*string

At least 1 characters · At most 20000 characters

replyTostring

The email that it answers: a c- or d- id, or a t- id from the same teammate's address

attachmentsarray<object>

Up to 5 files, 10 MB together. Troopy sends them and keeps only their names and sizes

At most 5 items

3 properties
name*string

The name of the file, like proposal.pdf

At least 1 characters · At most 200 characters

typestring

Its media type, like application/pdf

At most 100 characters

content*string

The file, base64-encoded

At least 1 characters · At most 13400000 characters · base64

Response

201 · application/json
data*object
20 properties
id*string

The id of an email. c- is an email of a campaign or a reply to it. d- is an email that a person wrote, or an answer to it. t- is the mail of a teammate

kind*enum<string>

campaignreplydirectteammate

status*enum<string>

failed: an email of a person that did not go. unknown: one that possibly went, so Troopy does not send it again

receivedsentscheduleddraftfailedunknown

box*object | null

The mailbox, or the address of the teammate, that it came to or went from. Null for a draft with no mailbox yet

2 properties
id*string

The id of a box. m- is a mailbox of the business. t- is the own address of a teammate

address*string
party*object

Who it is from, for a received email. Who it is to, for the rest

2 properties
name*string | null
email*string
subject*string
preview*string

The start of its words, at most 160 characters

at*string

When it came or went. For a scheduled email or a draft, when it is due

campaign*object | null
2 properties
id*string

A 24-character id

name*string
teammate*object | null
2 properties
handle*string
name*string
spam*boolean
read*boolean

False for a received email that no person opened. True for every other email

labels*array<string>

The labels that people put on it

sort*enum<string> | null

For a reply: what it says. Null until someone sorts it, and for every other email

interestedquestionnot_nownot_interestedout_of_officeunsubscribewrong_person

bodystring

Only for one email: its words. The mail of a teammate has every code and link masked

maskedobject

Only for one email of a teammate: how many codes and links are masked in its words

2 properties
codes*integer
links*integer
errorstring

Only for one email of a person: what the mail server or a delivery report said, when not every address got the email

recipientsarray<string>

Only for an email of a person to more than one address: every address that it went to

attachmentsarray<object>

The files that went with an email of a person: their names and sizes. Troopy does not keep the files

3 properties
name*string
type*string
size*integer

In bytes

threadarray<object>

Only for one email: every email between the business and this address, the oldest first, with its words

19 properties
id*string

The id of an email. c- is an email of a campaign or a reply to it. d- is an email that a person wrote, or an answer to it. t- is the mail of a teammate

kind*enum<string>

campaignreplydirectteammate

status*enum<string>

failed: an email of a person that did not go. unknown: one that possibly went, so Troopy does not send it again

receivedsentscheduleddraftfailedunknown

box*object | null

The mailbox, or the address of the teammate, that it came to or went from. Null for a draft with no mailbox yet

2 properties
id*string

The id of a box. m- is a mailbox of the business. t- is the own address of a teammate

address*string
party*object

Who it is from, for a received email. Who it is to, for the rest

2 properties
name*string | null
email*string
subject*string
preview*string

The start of its words, at most 160 characters

at*string

When it came or went. For a scheduled email or a draft, when it is due

campaign*object | null
2 properties
id*string

A 24-character id

name*string
teammate*object | null
2 properties
handle*string
name*string
spam*boolean
read*boolean

False for a received email that no person opened. True for every other email

labels*array<string>

The labels that people put on it

sort*enum<string> | null

For a reply: what it says. Null until someone sorts it, and for every other email

interestedquestionnot_nownot_interestedout_of_officeunsubscribewrong_person

bodystring

Only for one email: its words. The mail of a teammate has every code and link masked

maskedobject

Only for one email of a teammate: how many codes and links are masked in its words

2 properties
codes*integer
links*integer
errorstring

Only for one email of a person: what the mail server or a delivery report said, when not every address got the email

recipientsarray<string>

Only for an email of a person to more than one address: every address that it went to

attachmentsarray<object>

The files that went with an email of a person: their names and sizes. Troopy does not keep the files

3 properties
name*string
type*string
size*integer

In bytes

Errors

400 invalid_inputFix the field named in detail. Each operation's schema is in /api/v1/openapi.json.
401 unauthorizedSend an API key as `Authorization: Bearer tr_live_...`. Create one in Troopy under Settings.
403 forbiddenThe key lacks a scope this operation needs, or its owner lacks the role. detail says which; create a key with the scope, or ask an organization owner or admin.
409 conflictThis Idempotency-Key was used for a different request, or that request is still running. Use a new key for a new request.
429 rate_limitedWait the number of seconds in Retry-After, then retry.