atteq API
  • Guides
  • Recipes
  • Cookbook
  • API Reference
Information
agents
    List AgentsgetCreate AgentpostDocument AttachmentsgetGet VersiongetEdit DraftpatchReplace Draft GraphputPublish VersionpostGet AgentgetDelete AgentdeleteCopy AgentpostGet DraftgetGet Agent MapgetPending ChangesgetList PlacementsgetRestore VersionpostList VersionsgetGet Mapget
voice_agent
    Open Browser CallpostEnd Browser CalldeleteGet Agent Test LinkgetGet Bridge CeilinggetSet Bridge Ceilingpatch
ai_profiles
    Get Ai Profile CapabilitiesgetList Live SettingsgetCreate Live SettingspostDelete Live SettingsdeleteUpdate Live SettingspatchList Llm SettingsgetCreate Llm SettingspostDelete Llm SettingsdeleteUpdate Llm SettingspatchList ProfilesgetCreate ProfilepostGet ProfilegetDelete ProfiledeleteUpdate ProfilepatchCopy ProfilepostSet Text SectionputSet Voice SectionputList Stt SettingsgetCreate Stt SettingspostDelete Stt SettingsdeleteUpdate Stt SettingspatchList Tts SettingsgetCreate Tts SettingspostDelete Tts SettingsdeleteUpdate Tts SettingspatchList Vad SettingsgetCreate Vad SettingspostDelete Vad SettingsdeleteUpdate Vad Settingspatch
analyst
    List Agent FindingsgetCall Back FindingpostDismiss FindingpostUndo Finding DismissaldeleteTeach FindingpostWatch FindingpostList Question ChartsgetList Tracked QuestionsgetCreate Tracked QuestionpostGet Question Search CostgetSearch For Tracked QuestionpostPropose Tracked QuestionpostDelete Tracked QuestiondeleteUpdate Tracked QuestionpatchGet Reading SwitchgetSet Reading SwitchputGet Agent Summaryget
analytics
    List ChartsgetCreate ChartpostPreview ChartpostGet ChartgetDelete ChartdeleteUpdate ChartpatchRun ChartpostList DatasetsgetList BoardsgetCreate BoardpostGet TraversalgetGet BoardgetDelete BoarddeleteUpdate Boardpatch
authentication
    List InvitationsgetInvite MemberpostRevoke InvitationdeleteResend InvitationpostList MembersgetRemove MemberdeleteGet Member Conversation AccessgetSet Member Conversation AccesspatchSet Member FlagspatchSet Member RolepatchGet OrganizationgetUpdate OrganizationpatchGet Role FlagsgetSet Role Flagspatch
automations
    List AutomationsgetCreate AutomationpostGet AutomationgetDelete AutomationdeleteUpdate AutomationpatchSet Automation EnabledputGet Automation MapgetRun AutomationpostList Automation RunsgetGet Automation Runget
billable-metrics
    List MetricsgetUsage SummarygetGet Metricget
outbound_calls
    Place CallpostList CampaignsgetCreate CampaignpostGet CampaigngetDelete CampaigndeleteUpdate CampaignpatchActivate CampaignpostLink CollectionpostAdd ContactspostAdd Contacts From CollectionpostRemove Contacts From CollectionpostSet Campaign HoursputPreview Campaign HourspostPause CampaignpostGet Campaign SummarygetExclude ContactpostInclude Contactpost
channels
    List ChannelsgetCreate ChannelpostList Thread SubjectsgetClose Channel ThreadpostList Thread DecisionsgetGet Thread Contact FilegetHand Thread To AgentpostList Thread MailgetGet Prepared ReplygetAsk Again For Prepared ReplypostDiscard Prepared ReplypostSend Prepared ReplypostReply On Channel ThreadpostGet ChannelgetDelete ChanneldeleteUpdate ChannelpatchSend On ChannelpostList Channel ThreadsgetList RostergetCreate Roster EntrypostGet Own Roster EntrygetGet Roster EntrygetDelete Roster EntrydeleteUpdate Roster EntrypatchAdd Roster AddresspostChange Roster AddressputRemove Roster Addressdelete
custom-data
    List CollectionsgetCreate CollectionpostList Collection NamesgetGet CollectiongetDelete CollectiondeleteUpdate CollectionpatchAdd FieldpostDelete FielddeleteUpdate FieldpatchImport RecordspostPlan ImportpostPropose ImportpostGet ImportgetList RecordsgetCreate RecordpostBulk Delete RecordspostBulk Set FieldpostCount RecordsgetList Records Of ContactgetDelete Records Of ContactdeleteGet RecordgetDelete RecorddeleteUpdate Recordpatch
connections
    List ConnectionsgetCreate ConnectionpostCreate Forwarded AddresspostCreate Mail ServerpostDiscover Mail ServerpostAuthorize Microsoft MailboxpostList ProvidersgetGet ConnectiongetDelete ConnectiondeleteUpdate ConnectionpatchGet Forwarded AddressgetCheck Forwarded AddresspostList Person GrantsgetSet Person GrantputRemove Person GrantdeleteGet Mail ServergetUpdate Mail ServerpatchList Mail Server FoldersgetEnter Mail Server PasswordputChange Mail Server ServersputTest Mail Server AgainpostGet Microsoft MailboxgetUpdate Microsoft MailboxpatchList Microsoft Mailbox FoldersgetConsent To Microsoft Mailbox WritespostWithdraw Microsoft Mailbox Writesdelete
custom-tools
    List Custom ToolsgetCreate Custom ToolpostGet Custom ToolgetDelete Custom TooldeleteGet Custom Tool DraftgetEdit Custom Tool DraftpatchPublish Custom ToolpostRestore Custom Tool VersionpostTry Custom ToolpostList Custom Tool Versionsget
rag
    List DocumentsgetUpload DocumentpostSearch DocumentspostGet DocumentgetDelete DocumentdeleteDownload DocumentgetReingest Documentpost
flows
    List FlowsgetCreate FlowpostGet FlowgetDelete FlowdeleteRename FlowpatchAdd Flow EdgepostDelete Flow EdgedeleteSet Entry SteppatchAdd SteppostDelete StepdeleteUpdate SteppatchTest FlowpostList Flow Testsget
dynamic_context
    Create GraphpostGet GraphgetDelete GraphdeleteAdd EdgepostDelete EdgedeleteAdd NodepostDelete NodedeleteUpdate NodepatchSet Rootput
inbox
    Get Inbox Open CountgetSet Inbox PreferencespatchGet Inbox RailgetCreate Inbox ViewpostDelete Inbox ViewdeleteUpdate Inbox Viewpatch
handoff
    Assign Threadpost
interactions
    List InteractionsgetCount InteractionsgetGet InteractiongetSet Conversation LabelspostGet TracegetGet TranscriptgetList LabelsgetCreate LabelpostDelete LabeldeleteUpdate Labelpatch
legal
    Agree To Processing AgreementpostAgree To TermspostLegal BoxesgetList Legal DocumentsgetRead Legal DocumentgetList Legal VersionsgetRead Legal VersiongetDownload Legal VersiongetOrganization Legal HistorygetOwn Legal HistorygetObject To SubprocessorspostWithdraw ObjectionpostLegal Pendingget
not-a-tool
    Agree To Processing AgreementpostAgree To TermspostObject To SubprocessorspostWithdraw Objectionpost
memory
    List MemoriesgetList Memory LinesgetCreate Memory LinepostDelete Memory LinedeleteUpdate Memory LinepatchList Memory PeoplegetGet Memory PersongetForget PersondeleteGet Memory SwitchgetSet Memory SwitchputWipe ContactdeleteGet Conversation MemorygetRecall MemoriespostGet MemorygetDelete MemorydeletePatch Memorypatch
notifications
    List InboxgetGet Unread CountgetMark ReadpostMark Unreaddelete
recipes
    List RecipesgetList Installed RecipesgetGet Installed RecipegetUninstall RecipedeleteSet Recipe EnabledputUpdate Recipe ParameterspatchUpdate RecipepostInstall Recipepost
data-retention
    Get RetentiongetSet Retentionpatch
text
    Open ConversationpostClose ConversationpostAnswer ConfirmationpostGet Sent FilegetSend MessagepostSet Modepatch
tools
    List ToolsgetCreate ToolpostList BuiltinsgetImport Mcp ServerpostImport OpenapipostPreview Openapi ImportpostSuggest Tool ExamplespostGet ToolgetDelete TooldeleteUpdate ToolpatchTest ToolpostList Tool Testsget
trunks
    List Transfer DirectorygetCreate Transfer Directory EntrypostGet Transfer Directory EntrygetDelete Transfer Directory EntrydeleteUpdate Transfer Directory EntrypatchList TrunksgetCreate TrunkpostGet TrunkgetDelete TrunkdeleteUpdate TrunkpatchList Forward Recordsget
Schemas
powered by Zudoku
attek API
attek API

connections


List Connections

GET
/api/v1/connections

List this organization's connections, ordered by provider, then group, then name. Use when checking which connections exist, or finding one person's connection before adding or removing it. Every filter is optional and they combine: group, subject_number and subject_ref match exactly (a number in any spelling of the same international number), which is how your own system finds a person's connection before adding or removing it; search matches a fragment of the connection's name, number or reference.

List Connections › query Parameters

provider
​
group
​
subject_number
​
subject_ref
​
search
​

List Connections › Responses

Successful Response

​ConnectionOut[]
ConnectionOut
account_label
​string · required
capabilities
​GoogleCapability[] · readOnly · required

What a google connection may do, in the words the person picked from, and empty for every other provider.

scopes is on this shape too and stays: it is what the grant literally holds, including anything Google volunteered that this platform never asked about. But a scope URL is this module's vocabulary and not a person's, and connections.md is explicit that what a connection may do is offered "never as the provider's own vocabulary for the same thing" -- so the reading in the client's words travels with the row rather than leaving a dashboard to spell https://www.googleapis.com/auth/... back at them.

Enum values:
see_busy
see_appointments
manage_events
see_spreadsheets
manage_spreadsheets
see_presentations
manage_presentations
see_documents
created_at
​string · date-time · required
​required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
id
​string · uuid · required
products
​GoogleProduct[] · readOnly · required

Which Google products this connection is authorized for, and empty for every other provider -- which has no such division, rather than one this would have to invent a word for.

A reading of scopes and never a column, for the reason GoogleProduct gives: what a connection is for is what its grant reaches, so a stored copy would be a second place for one fact and the first of the two to go stale. Computed here rather than filled in by the service because every path that hands a connection out goes through this class, and one of them would eventually forget.

Enum values:
calendars
spreadsheets
presentations
documents
contacts
files
mail
provider
​string · required
scopes
​string[] · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
​
​
per_person
​boolean
Default: false
​
​
GET/api/v1/connections
curl /api/v1/connections \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "account_label": "account_label", "capabilities": [ "see_busy" ], "created_at": "2024-08-25T15:00:00Z", "external_account_id": "string", "forward_health": "waiting_for_forward", "granted_via": "pasted", "group": "string", "id": "00000000-0000-0000-0000-000000000000", "per_person": false, "products": [ "calendars" ], "provider": "provider", "scopes": [ "string" ], "status": "healthy", "status_reason": "string", "subject_number": "string", "subject_ref": "string", "updated_at": "2024-08-25T15:00:00Z" } ]
json
application/json

Create Connection

POST
/api/v1/connections

Register a connection: one authorization to one outside provider, held by the platform and pointed at by any number of tools. Use for every credential a tool needs to reach an outside system, including the API key of the client's own system (provider http_key, whose grant_secret is a JSON string with header, prefix and value). A tool never carries a credential: an HTTP tool whose configuration holds a key or an auth header is refused, so create the connection first and pass its id as the tool's connection_id. The secret is never returned.

When the account is one person's -- each salesperson with their own key to your CRM -- say on whose behalf it acts: a group of your own ("Sales CRM"), and the person's subject_number (a full international phone number) and/or subject_ref (their id in your system, at most 128 characters). A tool pointing at the group then runs with the key of whoever the conversation is with. A number or reference without a group is refused (422), and a second connection in the same group with the same number or reference is refused (409). These fields are believed because the key is your organization's: call this from your server, never from a browser or an app, which could claim to be anybody.

Create Connection › Request Body

A connection to add: the provider, the name the organization will know it by, what it may do, and the secret the provider gave you. `group`, `subject_number` and `subject_ref` say on whose behalf it acts, when it is one person's. The platform's own app (`provider: "app"`) is the one provider with no outside account: send no `grant_secret` and no `scopes`, only a name that is not blank and not already used by another app connection in the organization. Every other provider needs its secret.
ConnectionIn
account_label
​string · required
provider
​string · required
​
granted_via
​GrantedVia · enum

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
Default: pasted
​
per_person
​boolean
Default: false
scopes
​string[]
Default: []
​
​

Create Connection › Responses

Successful Response

ConnectionOut
account_label
​string · required
capabilities
​GoogleCapability[] · readOnly · required

What a google connection may do, in the words the person picked from, and empty for every other provider.

scopes is on this shape too and stays: it is what the grant literally holds, including anything Google volunteered that this platform never asked about. But a scope URL is this module's vocabulary and not a person's, and connections.md is explicit that what a connection may do is offered "never as the provider's own vocabulary for the same thing" -- so the reading in the client's words travels with the row rather than leaving a dashboard to spell https://www.googleapis.com/auth/... back at them.

Enum values:
see_busy
see_appointments
manage_events
see_spreadsheets
manage_spreadsheets
see_presentations
manage_presentations
see_documents
created_at
​string · date-time · required
​required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
id
​string · uuid · required
products
​GoogleProduct[] · readOnly · required

Which Google products this connection is authorized for, and empty for every other provider -- which has no such division, rather than one this would have to invent a word for.

A reading of scopes and never a column, for the reason GoogleProduct gives: what a connection is for is what its grant reaches, so a stored copy would be a second place for one fact and the first of the two to go stale. Computed here rather than filled in by the service because every path that hands a connection out goes through this class, and one of them would eventually forget.

Enum values:
calendars
spreadsheets
presentations
documents
contacts
files
mail
provider
​string · required
scopes
​string[] · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
​
​
per_person
​boolean
Default: false
​
​
POST/api/v1/connections
curl /api/v1/connections \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "account_label": "account_label", "grant_secret": "string", "granted_via": "pasted", "group": "string", "per_person": false, "provider": "provider", "scopes": [], "subject_number": "string", "subject_ref": "string" }'
Example Request Body
{ "account_label": "account_label", "grant_secret": "string", "granted_via": "pasted", "group": "string", "per_person": false, "provider": "provider", "scopes": [], "subject_number": "string", "subject_ref": "string" }
json
Example Responses
{ "account_label": "account_label", "capabilities": [ "see_busy" ], "created_at": "2024-08-25T15:00:00Z", "external_account_id": "string", "forward_health": "waiting_for_forward", "granted_via": "pasted", "group": "string", "id": "00000000-0000-0000-0000-000000000000", "per_person": false, "products": [ "calendars" ], "provider": "provider", "scopes": [ "string" ], "status": "healthy", "status_reason": "string", "subject_number": "string", "subject_ref": "string", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Create Forwarded Address

POST
/api/v1/connections/forwarded-email

Connect a dedicated email address of the organization -- the one its customers write to, never a person's own mailbox -- with no password and no grant. Answers the address to forward it to (forwarded_to), mails the address once so the forward can be proved when that mail comes back, and asks the mail service about the address's domain, whose state is shown and holds nothing back. Once the forward is proved (health is working), answers leave from forwarded_to under the sender's name -- the organization's name when none is set -- never as the address itself. An address is connected once, in one organization only (409).

Create Forwarded Address › Request Body

A dedicated address to connect (rule 50): the address its customers write to, the name the organization knows the connection by (the address itself when left out), and the two settings a recipient sees (email-threads.md rule 21): the sender's name -- the organization's name when left out (email-threads.md rule 28) -- and the subject of a conversation the organization starts.
ForwardedAddressIn
address
​string · required
​
​
​

Create Forwarded Address › Responses

Successful Response

Everything the connection's page shows (rules 51-57), and nothing secret: there is none. `forwarded_to` is the address the platform gave the connection -- what the client forwards to and what answers leave from, shown only inside the organization and to those it answers (rule 52). `confirmation_code` is the code the client's own mail provider sent to confirm a new forward (Gmail's), while the forward waits (rule 53); `confirmation_link` is the link that confirms it, where the provider's mail carries one instead or beside the code (rule 67), for the member to open. `dns_records` are what the client adds in the domain, and `domain_state` what the mail service last said of them -- shown, and holding nothing back: `health` never waits for it (rule 53). `on_disconnect` is what disconnecting leaves for the client to remove (rule 57), in English; the dashboard words it in its reader's language from `forwarded_to` and `domain` (#1722).
ForwardedAddressOut
account_label
​string · required
address
​string · required
​required
​required
​required
connection_id
​string · uuid · required
​DnsRecordOut[] · required
domain
​string · required
​required
domain_state
​DomainState · enum · required

What the platform's mail service last said of the address's domain.

unchecked until anybody asked; not_registered while the mail service holds no sending domain for it -- every client domain today, with no records to show, until per-client sending domains land (#1555); unverified while the records the client must add are not all found; verified once they are. Shown, and holding nothing back: no state lets or stops a send, since nothing leaves as the address -- answers leave from the address the platform gave the connection (rules 53-54, email-threads.md rule 28).

Enum values:
unchecked
not_registered
unverified
verified
​required
forwarded_to
​string · required
health
​ForwardHealth · enum · required

A forwarded address's health is its forward (rule 54): waiting for the forward, then working once it is proved, whatever its domain's state, which is DomainState and shown beside it -- or broken, when the connection is marked so.

Enum values:
waiting_for_forward
working
broken
​required
on_disconnect
​string · required
​required
​required
​required
​
POST/api/v1/connections/forwarded-email
curl /api/v1/connections/forwarded-email \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "account_label": "string", "address": "address", "new_subject": "string", "sender_name": "string" }'
Example Request Body
{ "account_label": "string", "address": "address", "new_subject": "string", "sender_name": "string" }
json
Example Responses
{ "account_label": "account_label", "address": "address", "check_note": "string", "confirmation_code": "string", "confirmation_code_at": "2024-08-25T15:00:00Z", "confirmation_link": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "dns_records": [ { "name": "name", "record_type": "record_type", "valid": true, "value": "value" } ], "domain": "domain", "domain_checked_at": "2024-08-25T15:00:00Z", "domain_state": "unchecked", "forward_proved_at": "2024-08-25T15:00:00Z", "forwarded_to": "forwarded_to", "health": "waiting_for_forward", "new_subject": "string", "on_disconnect": "on_disconnect", "proof_sent_at": "2024-08-25T15:00:00Z", "sender_name": "string", "status_reason": "string" }
json
application/json

Create Mail Server

POST
/api/v1/connections/mail-server

Connect a dedicated email address of the organization -- never a person's own mailbox -- with its mailbox's password, on the reading (IMAP) and sending (SMTP) servers you confirmed. An app password is recommended where the provider offers one. The password is sealed at once and never shown back; the connection is then tested (health testing): a test message is sent from the address to itself and looked for, for up to 10 minutes, and it works only once found -- or is refused with the reason. An address at Google or Microsoft is refused (422) with refusal: "signed_in_provider" and provider (google or microsoft); a server inside a private network or off the road's ports, or a body missing a field, is refused (422) naming no value; an address connected already is refused (409).

Create Mail Server › Request Body

A dedicated address to connect with its mailbox's password (rules 1-7): the address, the two servers the member confirmed, the user name those servers know the mailbox by (the address when left out), and the password -- sealed at once, never shown back. `account_label` is the name the organization knows the connection by (the address when left out); `sender_name` and `new_subject` are the two settings a recipient sees (email-threads.md rule 21). **Nothing here refuses** (rule 4): FastAPI's 422 carries each error's `input`, and for a missing field or a check over the whole body that input is the body, password and all. So every field has a default, no validator raises, and `mail_server` checks the body and refuses in words that name no value (`InvalidMailServerRequest`, 422). The schema still says which are required.
MailServerIn
​required
​password · writeOnly · required
​required
​required
​
​
​
​

Create Mail Server › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
POST/api/v1/connections/mail-server
curl /api/v1/connections/mail-server \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "account_label": "string", "address": "string", "new_subject": "string", "password": "********", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "username": "string" }'
Example Request Body
{ "account_label": "string", "address": "string", "new_subject": "string", "password": "********", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "username": "string" }
json
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

Discover Mail Server

POST
/api/v1/connections/mail-server/discover

Find the reading (IMAP) and sending (SMTP) servers of a dedicated address on a hosting or its own server, from what its domain or its provider publishes for mail apps -- to show and confirm before giving the password. Answers no servers when nothing is found (enter them by hand). An address whose mail is at Google or Microsoft is refused (422) with refusal: "signed_in_provider" and provider (google or microsoft) beside detail: connect it by signing in or forwarding.

Discover Mail Server › Request Body

The address whose servers to look for (rule 6).
MailServerDiscoverIn
address
​string · required

Discover Mail Server › Responses

Successful Response

The servers proposed for an address, for the member to see and confirm before giving the password (rule 6). `reading`/`sending` are `None` where nothing was found; `username` is what the source says the servers know the mailbox by, the address itself when it says nothing; `found_at` names the host the proposal was read from ("Found from <source>"), `None` with `source` `none`.
MailServerDiscoveryOut
address
​string · required
​required
​required
​required
source
​MailServerSource · enum · required

Where the proposed servers were found (rule 6): the domain's own autoconfig, Thunderbird's database of providers (by the domain, or by the provider its mail goes to), the domain's SRV records, or nowhere -- the member enters them.

Enum values:
autoconfig
provider_database
srv
none
username
​string · required
POST/api/v1/connections/mail-server/discover
curl /api/v1/connections/mail-server/discover \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "address": "address" }'
Example Request Body
{ "address": "address" }
json
Example Responses
{ "address": "address", "found_at": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sending": { "host": "host", "port": 0, "security": "tls" }, "source": "autoconfig", "username": "username" }
json
application/json

Authorize Microsoft Mailbox

POST
/api/v1/connections/microsoft-mailbox/authorize

Begin connecting a dedicated address's Microsoft mailbox, work or personal, by signing in as that mailbox itself -- never as a person who can open it. Answers the page to open, valid for ten minutes, and the approval page to pass on to an administrator if Microsoft asks for one. atteq asks only to read the mail that reaches the mailbox and to send as it. The sign-in must be finished in the browser that called this: the answer sets a short-lived cookie the callback requires.

Authorize Microsoft Mailbox › Request Body

Begin signing in a dedicated address's mailbox (rule 59): the address the client names -- the sign-in must come back as exactly that mailbox's primary address (rule 61) -- the name the organization knows it by (the address when left out), and the subject of a conversation the organization starts (email-threads.md rule 21).
MailboxAuthorizeIn
address
​string · required
​
​

Authorize Microsoft Mailbox › Responses

Successful Response

Where the browser goes next -- Microsoft's consent screen, carrying a sealed `state` that expires in ten minutes (rule 63) -- and the approval page to pass on to an administrator should Microsoft ask for one (rule 62).
MailboxAuthorizeOut
admin_approval_url
​string · required
admin_note
​string · required
url
​string · required
POST/api/v1/connections/microsoft-mailbox/authorize
curl /api/v1/connections/microsoft-mailbox/authorize \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "account_label": "string", "address": "address", "new_subject": "string" }'
Example Request Body
{ "account_label": "string", "address": "address", "new_subject": "string" }
json
Example Responses
{ "admin_approval_url": "admin_approval_url", "admin_note": "admin_note", "url": "url" }
json
application/json

List Providers

GET
/api/v1/connections/providers

Which providers declare something for every connection of theirs: whether a connection of each may be per person (connections.md rule 34). Use before offering a per-person connection, to know which providers allow one. A provider not listed declares nothing, and may not be per person.

List Providers › Responses

200

Successful Response

​ProviderOut[]
What one provider this slice names declares for every connection of it (rule 34) -- read by the create dialog so it offers "one key for each person" where the declaration says so, rather than from a list of its own (#1137). `provider` is free text, so a slug absent from the answer declares nothing and may not be per person, which `ConnectionIn` refuses alike.
ProviderOut
per_person
​boolean · required
provider
​string · required
GET/api/v1/connections/providers
curl /api/v1/connections/providers \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "per_person": true, "provider": "provider" } ]
json
application/json

Get Connection

GET
/api/v1/connections/{connection_id}

Read one connection of this organization: the provider and authorized account, its scopes, on whose behalf it acts (group, number, reference) or whether it holds one grant per roster entry, and its health with the reason. The credential itself is never returned.

Get Connection › path Parameters

connection_id
​string · uuid · required

Get Connection › Responses

Successful Response

ConnectionOut
account_label
​string · required
capabilities
​GoogleCapability[] · readOnly · required

What a google connection may do, in the words the person picked from, and empty for every other provider.

scopes is on this shape too and stays: it is what the grant literally holds, including anything Google volunteered that this platform never asked about. But a scope URL is this module's vocabulary and not a person's, and connections.md is explicit that what a connection may do is offered "never as the provider's own vocabulary for the same thing" -- so the reading in the client's words travels with the row rather than leaving a dashboard to spell https://www.googleapis.com/auth/... back at them.

Enum values:
see_busy
see_appointments
manage_events
see_spreadsheets
manage_spreadsheets
see_presentations
manage_presentations
see_documents
created_at
​string · date-time · required
​required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
id
​string · uuid · required
products
​GoogleProduct[] · readOnly · required

Which Google products this connection is authorized for, and empty for every other provider -- which has no such division, rather than one this would have to invent a word for.

A reading of scopes and never a column, for the reason GoogleProduct gives: what a connection is for is what its grant reaches, so a stored copy would be a second place for one fact and the first of the two to go stale. Computed here rather than filled in by the service because every path that hands a connection out goes through this class, and one of them would eventually forget.

Enum values:
calendars
spreadsheets
presentations
documents
contacts
files
mail
provider
​string · required
scopes
​string[] · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
​
​
per_person
​boolean
Default: false
​
​
GET/api/v1/connections/{connection_id}
curl /api/v1/connections/:connection_id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "capabilities": [ "see_busy" ], "created_at": "2024-08-25T15:00:00Z", "external_account_id": "string", "forward_health": "waiting_for_forward", "granted_via": "pasted", "group": "string", "id": "00000000-0000-0000-0000-000000000000", "per_person": false, "products": [ "calendars" ], "provider": "provider", "scopes": [ "string" ], "status": "healthy", "status_reason": "string", "subject_number": "string", "subject_ref": "string", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Delete Connection

DELETE
/api/v1/connections/{connection_id}

Delete a provider connection permanently. Use when the credential should stop existing, such as for a person who has left. Refused while a tool or a channel still uses it; the refusal names each one, to repoint or remove first. For a person who has left, this is how your own system removes their key: a tool pointing at their group then finds no connection for them and fails naming the group, rather than using anybody else's. A Google account's authorization is withdrawn at Google as well; the delete goes through even when Google refuses or cannot be reached. A signed-in mailbox takes nothing more at once; Microsoft offers no way to withdraw atteq there, so the mailbox or its administrator removes it.

Delete Connection › path Parameters

connection_id
​string · uuid · required

Delete Connection › Responses

Successful Response

No data returned
DELETE/api/v1/connections/{connection_id}
curl /api/v1/connections/:connection_id \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Update Connection

PATCH
/api/v1/connections/{connection_id}

Change a provider connection's settings. Use when an existing connection's group or subject needs to change, not its secret. An explicit null on group, subject_number or subject_ref clears it; a subject left without a group is refused (422), and one another connection in the group already acts for is a conflict (409). Call it from your server, never from a browser.

Update Connection › path Parameters

connection_id
​string · uuid · required

Update Connection › Request Body

Partial edit — only provided fields change (`model_dump(exclude_unset=True)`). Rotating `grant_secret` also clears any prior broken status — a fresh grant is presumed good until proven otherwise, mirroring `mark_healthy`. There is deliberately no `granted_via` here: how an account was authorized is a fact about the authorization, and a fresh secret through the same door is still that door. Re-authorizing by a *different* door is a different grant.
ConnectionUpdate
​
​
​
​
​
​

Update Connection › Responses

Successful Response

ConnectionOut
account_label
​string · required
capabilities
​GoogleCapability[] · readOnly · required

What a google connection may do, in the words the person picked from, and empty for every other provider.

scopes is on this shape too and stays: it is what the grant literally holds, including anything Google volunteered that this platform never asked about. But a scope URL is this module's vocabulary and not a person's, and connections.md is explicit that what a connection may do is offered "never as the provider's own vocabulary for the same thing" -- so the reading in the client's words travels with the row rather than leaving a dashboard to spell https://www.googleapis.com/auth/... back at them.

Enum values:
see_busy
see_appointments
manage_events
see_spreadsheets
manage_spreadsheets
see_presentations
manage_presentations
see_documents
created_at
​string · date-time · required
​required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
id
​string · uuid · required
products
​GoogleProduct[] · readOnly · required

Which Google products this connection is authorized for, and empty for every other provider -- which has no such division, rather than one this would have to invent a word for.

A reading of scopes and never a column, for the reason GoogleProduct gives: what a connection is for is what its grant reaches, so a stored copy would be a second place for one fact and the first of the two to go stale. Computed here rather than filled in by the service because every path that hands a connection out goes through this class, and one of them would eventually forget.

Enum values:
calendars
spreadsheets
presentations
documents
contacts
files
mail
provider
​string · required
scopes
​string[] · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
​
​
per_person
​boolean
Default: false
​
​
PATCH/api/v1/connections/{connection_id}
curl /api/v1/connections/:connection_id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "account_label": "string", "grant_secret": "string", "group": "string", "scopes": [ "string" ], "subject_number": "string", "subject_ref": "string" }'
Example Request Body
{ "account_label": "string", "grant_secret": "string", "group": "string", "scopes": [ "string" ], "subject_number": "string", "subject_ref": "string" }
json
Example Responses
{ "account_label": "account_label", "capabilities": [ "see_busy" ], "created_at": "2024-08-25T15:00:00Z", "external_account_id": "string", "forward_health": "waiting_for_forward", "granted_via": "pasted", "group": "string", "id": "00000000-0000-0000-0000-000000000000", "per_person": false, "products": [ "calendars" ], "provider": "provider", "scopes": [ "string" ], "status": "healthy", "status_reason": "string", "subject_number": "string", "subject_ref": "string", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Get Forwarded Address

GET
/api/v1/connections/{connection_id}/forwarded-email

Read a forwarded address's state: its health (waiting for the forward, working once the forward is proved, or broken), the address to forward it to and answer from, the code the client's mail provider sent to confirm the forward while it waits, the DNS records and whether the mail service found them -- shown, never holding the connection back.

Get Forwarded Address › path Parameters

connection_id
​string · uuid · required

Get Forwarded Address › Responses

Successful Response

Everything the connection's page shows (rules 51-57), and nothing secret: there is none. `forwarded_to` is the address the platform gave the connection -- what the client forwards to and what answers leave from, shown only inside the organization and to those it answers (rule 52). `confirmation_code` is the code the client's own mail provider sent to confirm a new forward (Gmail's), while the forward waits (rule 53); `confirmation_link` is the link that confirms it, where the provider's mail carries one instead or beside the code (rule 67), for the member to open. `dns_records` are what the client adds in the domain, and `domain_state` what the mail service last said of them -- shown, and holding nothing back: `health` never waits for it (rule 53). `on_disconnect` is what disconnecting leaves for the client to remove (rule 57), in English; the dashboard words it in its reader's language from `forwarded_to` and `domain` (#1722).
ForwardedAddressOut
account_label
​string · required
address
​string · required
​required
​required
​required
connection_id
​string · uuid · required
​DnsRecordOut[] · required
domain
​string · required
​required
domain_state
​DomainState · enum · required

What the platform's mail service last said of the address's domain.

unchecked until anybody asked; not_registered while the mail service holds no sending domain for it -- every client domain today, with no records to show, until per-client sending domains land (#1555); unverified while the records the client must add are not all found; verified once they are. Shown, and holding nothing back: no state lets or stops a send, since nothing leaves as the address -- answers leave from the address the platform gave the connection (rules 53-54, email-threads.md rule 28).

Enum values:
unchecked
not_registered
unverified
verified
​required
forwarded_to
​string · required
health
​ForwardHealth · enum · required

A forwarded address's health is its forward (rule 54): waiting for the forward, then working once it is proved, whatever its domain's state, which is DomainState and shown beside it -- or broken, when the connection is marked so.

Enum values:
waiting_for_forward
working
broken
​required
on_disconnect
​string · required
​required
​required
​required
​
GET/api/v1/connections/{connection_id}/forwarded-email
curl /api/v1/connections/:connection_id/forwarded-email \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "address": "address", "check_note": "string", "confirmation_code": "string", "confirmation_code_at": "2024-08-25T15:00:00Z", "confirmation_link": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "dns_records": [ { "name": "name", "record_type": "record_type", "valid": true, "value": "value" } ], "domain": "domain", "domain_checked_at": "2024-08-25T15:00:00Z", "domain_state": "unchecked", "forward_proved_at": "2024-08-25T15:00:00Z", "forwarded_to": "forwarded_to", "health": "waiting_for_forward", "new_subject": "string", "on_disconnect": "on_disconnect", "proof_sent_at": "2024-08-25T15:00:00Z", "sender_name": "string", "status_reason": "string" }
json
application/json

Check Forwarded Address

POST
/api/v1/connections/{connection_id}/forwarded-email/check

Check a forwarded address's proof again: mail the address once more while its forward waits (at most once a minute, and 20 times a day for the organization), and ask the mail service to look for the domain's records. Always answers the current state; check_note says what was not done and why, the mail service refusing or unreachable included.

Check Forwarded Address › path Parameters

connection_id
​string · uuid · required

Check Forwarded Address › Responses

Successful Response

Everything the connection's page shows (rules 51-57), and nothing secret: there is none. `forwarded_to` is the address the platform gave the connection -- what the client forwards to and what answers leave from, shown only inside the organization and to those it answers (rule 52). `confirmation_code` is the code the client's own mail provider sent to confirm a new forward (Gmail's), while the forward waits (rule 53); `confirmation_link` is the link that confirms it, where the provider's mail carries one instead or beside the code (rule 67), for the member to open. `dns_records` are what the client adds in the domain, and `domain_state` what the mail service last said of them -- shown, and holding nothing back: `health` never waits for it (rule 53). `on_disconnect` is what disconnecting leaves for the client to remove (rule 57), in English; the dashboard words it in its reader's language from `forwarded_to` and `domain` (#1722).
ForwardedAddressOut
account_label
​string · required
address
​string · required
​required
​required
​required
connection_id
​string · uuid · required
​DnsRecordOut[] · required
domain
​string · required
​required
domain_state
​DomainState · enum · required

What the platform's mail service last said of the address's domain.

unchecked until anybody asked; not_registered while the mail service holds no sending domain for it -- every client domain today, with no records to show, until per-client sending domains land (#1555); unverified while the records the client must add are not all found; verified once they are. Shown, and holding nothing back: no state lets or stops a send, since nothing leaves as the address -- answers leave from the address the platform gave the connection (rules 53-54, email-threads.md rule 28).

Enum values:
unchecked
not_registered
unverified
verified
​required
forwarded_to
​string · required
health
​ForwardHealth · enum · required

A forwarded address's health is its forward (rule 54): waiting for the forward, then working once it is proved, whatever its domain's state, which is DomainState and shown beside it -- or broken, when the connection is marked so.

Enum values:
waiting_for_forward
working
broken
​required
on_disconnect
​string · required
​required
​required
​required
​
POST/api/v1/connections/{connection_id}/forwarded-email/check
curl /api/v1/connections/:connection_id/forwarded-email/check \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "address": "address", "check_note": "string", "confirmation_code": "string", "confirmation_code_at": "2024-08-25T15:00:00Z", "confirmation_link": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "dns_records": [ { "name": "name", "record_type": "record_type", "valid": true, "value": "value" } ], "domain": "domain", "domain_checked_at": "2024-08-25T15:00:00Z", "domain_state": "unchecked", "forward_proved_at": "2024-08-25T15:00:00Z", "forwarded_to": "forwarded_to", "health": "waiting_for_forward", "new_subject": "string", "on_disconnect": "on_disconnect", "proof_sent_at": "2024-08-25T15:00:00Z", "sender_name": "string", "status_reason": "string" }
json
application/json

List Person Grants

GET
/api/v1/connections/{connection_id}/grants

Read which roster entries hold a grant on a per-person connection, and whether each still works. Use when showing who already has a key on a per-person connection -- every entry's for an owner or an admin, your own for a member. Never a secret.

List Person Grants › path Parameters

connection_id
​string · uuid · required

List Person Grants › Responses

Successful Response

​PersonGrantOut[]
Which roster entry holds a grant on a per-person connection, and whether it still works -- never the secret. `display_name` is the entry's, so a broken grant says whose it is (rule 36).
PersonGrantOut
created_at
​string · date-time · required
display_name
​string · required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
roster_entry_id
​string · uuid · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
GET/api/v1/connections/{connection_id}/grants
curl /api/v1/connections/:connection_id/grants \ --header 'Authorization: Bearer <token>'
Example Responses
[ { "created_at": "2024-08-25T15:00:00Z", "display_name": "display_name", "granted_via": "pasted", "roster_entry_id": "00000000-0000-0000-0000-000000000000", "status": "healthy", "status_reason": "string", "updated_at": "2024-08-25T15:00:00Z" } ]
json
application/json

Set Person Grant

PUT
/api/v1/connections/{connection_id}/grants/{roster_entry_id}

Set or replace one roster entry's grant on a per-person connection. Use when pushing or updating one employee's own key on a per-person connection: an owner or an admin for anyone, a member for themselves. With an API key the caller has its creator's role, so the client's own system can push each employee's key with a key an owner or an admin made -- from your server, never from a browser or an app. grant_secret is what the provider takes (for http_key, a JSON string with header, prefix and value). The secret is never shown back; a replaced grant is healthy again.

Set Person Grant › path Parameters

connection_id
​string · uuid · required
roster_entry_id
​string · uuid · required

Set Person Grant › Request Body

One roster entry's grant on a per-person connection (connections.md rule 35): the secret the provider gave that person, in the provider's own shape -- for `http_key`, the JSON object `header`, `prefix`, `value` with **their** key. Setting it again replaces it and clears a broken state; it is never shown back.
PersonGrantIn
grant_secret
​string · minLength: 1 · required

Set Person Grant › Responses

Successful Response

Which roster entry holds a grant on a per-person connection, and whether it still works -- never the secret. `display_name` is the entry's, so a broken grant says whose it is (rule 36).
PersonGrantOut
created_at
​string · date-time · required
display_name
​string · required
granted_via
​GrantedVia · enum · required

Which door the grant arrived by.

The spec's "a grant can arrive by more than one door, and the connection is the same whichever it came through": this is the record of the door, and nothing in this slice or above it branches on it.

Enum values:
pasted
embedded_signup
roster_entry_id
​string · uuid · required
status
​HealthStatus · enum · required

Whether the grant is currently usable.

Enum values:
healthy
broken
​required
updated_at
​string · date-time · required
PUT/api/v1/connections/{connection_id}/grants/{roster_entry_id}
curl /api/v1/connections/:connection_id/grants/:roster_entry_id \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "grant_secret": "grant_secret" }'
Example Request Body
{ "grant_secret": "grant_secret" }
json
Example Responses
{ "created_at": "2024-08-25T15:00:00Z", "display_name": "display_name", "granted_via": "pasted", "roster_entry_id": "00000000-0000-0000-0000-000000000000", "status": "healthy", "status_reason": "string", "updated_at": "2024-08-25T15:00:00Z" }
json
application/json

Remove Person Grant

DELETE
/api/v1/connections/{connection_id}/grants/{roster_entry_id}

Remove one roster entry's grant from a per-person connection. Use when an employee's key should stop working, under the same rule of who may. A grant obtained through Google's consent screen is withdrawn at Google as well.

Remove Person Grant › path Parameters

connection_id
​string · uuid · required
roster_entry_id
​string · uuid · required

Remove Person Grant › Responses

Successful Response

No data returned
DELETE/api/v1/connections/{connection_id}/grants/{roster_entry_id}
curl /api/v1/connections/:connection_id/grants/:roster_entry_id \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Get Mail Server

GET
/api/v1/connections/{connection_id}/mail-server

Read a mailbox-on-its-own-server connection's state: being tested, working, refused by its test or broken, with the reason and the server meant; its servers; when it was proved and last read; and its sent folder.

Get Mail Server › path Parameters

connection_id
​string · uuid · required

Get Mail Server › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
GET/api/v1/connections/{connection_id}/mail-server
curl /api/v1/connections/:connection_id/mail-server \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

Update Mail Server

PATCH
/api/v1/connections/{connection_id}/mail-server

Change the name recipients see as the sender, or the subject of a conversation the organization starts (null clears one; with no sender name, recipients see the organization's name), or the folder read instead of the inbox: the id of one folder from the mailbox's own list, null for the inbox. A changed folder is read from that moment on, never what it held before; junk is always read. A folder not on the list is refused (422). Also what atteq does in the mailbox once a conversation answered its mail: acts_in_mailbox, file it in answered_folder (one folder of the list other than the folder read, null files nothing), mark it read (mark_answered_read). The first reply after switching on also files that conversation's older mail still in the folder read. atteq never deletes mail, and neither is charged.

Update Mail Server › path Parameters

connection_id
​string · uuid · required

Update Mail Server › Request Body

The two settings a recipient sees (email-threads.md rule 21), changed with no new test, `null` clearing one; and the folder read (rule 35), the `id` of one of the mailbox's own folders as the platform last listed them (`MailFoldersOut`), `null` for the inbox -- read from that moment on, never what it held before. An omission keeps each. Acting in the mailbox (email-threads.md rule 36; mail-server.md rule 12), as on a signed-in mailbox but with no consent to ask -- the password already reaches it: `acts_in_mailbox`, `answered_folder` (the `id` of one folder of the list other than the folder read, `null` files nothing) and `mark_answered_read`. Neither is charged. `filing_folders`, as on a signed-in mailbox (`MailboxUpdate`), out of the same list (mail-handling.md rule 10).
MailServerUpdate
acts_in_mailbox
​boolean
Default: false
​
​
mark_answered_read
​boolean
Default: false
​
​
​

Update Mail Server › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
PATCH/api/v1/connections/{connection_id}/mail-server
curl /api/v1/connections/:connection_id/mail-server \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "acts_in_mailbox": false, "answered_folder": "string", "filing_folders": [ "string" ], "mark_answered_read": false, "new_subject": "string", "read_folder": "string", "sender_name": "string" }'
Example Request Body
{ "acts_in_mailbox": false, "answered_folder": "string", "filing_folders": [ "string" ], "mark_answered_read": false, "new_subject": "string", "read_folder": "string", "sender_name": "string" }
json
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

List Mail Server Folders

GET
/api/v1/connections/{connection_id}/mail-server/folders

List the mailbox's own folders that may be read instead of the inbox, as atteq last read them from its server (when it was proved, and every few minutes while it is read): each with its id, name and where it sits, and when the list was read. Junk, sent mail, drafts, deleted mail and the inbox itself are never listed.

List Mail Server Folders › path Parameters

connection_id
​string · uuid · required

List Mail Server Folders › Responses

Successful Response

The mailbox's own folders a client may choose from (email-threads.md rule 35), and when the list was read: the inbox is read while none is chosen and is not listed; junk, sent mail, drafts, deleted mail, the outbox and the folders inside them are never offered. At most `MAIL_FOLDERS_OFFERED_MOST`. `listed_at` is `None` on a mailbox on its own server not yet listed.
MailFoldersOut
​MailFolderOut[] · required
​required
GET/api/v1/connections/{connection_id}/mail-server/folders
curl /api/v1/connections/:connection_id/mail-server/folders \ --header 'Authorization: Bearer <token>'
Example Responses
{ "folders": [ { "id": "id", "name": "name", "path": "path" } ], "listed_at": "2024-08-25T15:00:00Z" }
json
application/json

Enter Mail Server Password

PUT
/api/v1/connections/{connection_id}/mail-server/password

Enter a mailbox's password again -- after it was changed at the provider, or when the connection asks for it. Sealed at once, never shown back; the connection is tested again and reads or sends nothing until the test passes, then reads on from where it last read.

Enter Mail Server Password › path Parameters

connection_id
​string · uuid · required

Enter Mail Server Password › Request Body

The mailbox's password, entered again (rules 14, 17): sealed at once and tested before anything is read or sent with it. Refuses nothing itself (`MailServerIn`'s reason).
MailServerPasswordIn
​password · writeOnly · required

Enter Mail Server Password › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
PUT/api/v1/connections/{connection_id}/mail-server/password
curl /api/v1/connections/:connection_id/mail-server/password \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "password": "********" }'
Example Request Body
{ "password": "********" }
json
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

Change Mail Server Servers

PUT
/api/v1/connections/{connection_id}/mail-server/servers

Change a mailbox's reading or sending server, or its user name, with its password given again for them. The connection is tested again and reads or sends nothing until the test passes.

Change Mail Server Servers › path Parameters

connection_id
​string · uuid · required

Change Mail Server Servers › Request Body

The two servers and the user name, changed (rule 17). **The password comes with them**: a password is sent only to a server the member confirmed for it (rule 6), so changing a server is giving the password again. Refuses nothing itself (`MailServerIn`'s reason).
MailServerServersIn
​password · writeOnly · required
​required
​required
​

Change Mail Server Servers › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
PUT/api/v1/connections/{connection_id}/mail-server/servers
curl /api/v1/connections/:connection_id/mail-server/servers \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "password": "********", "reading": { "host": "host", "port": 0, "security": "tls" }, "sending": { "host": "host", "port": 0, "security": "tls" }, "username": "string" }'
Example Request Body
{ "password": "********", "reading": { "host": "host", "port": 0, "security": "tls" }, "sending": { "host": "host", "port": 0, "security": "tls" }, "username": "string" }
json
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

Test Mail Server Again

POST
/api/v1/connections/{connection_id}/mail-server/test

Test a mailbox's connection again with what it holds -- after a server's certificate was fixed, or when a server could not be reached or the test message did not arrive. It reads or sends nothing until the test passes.

Test Mail Server Again › path Parameters

connection_id
​string · uuid · required

Test Mail Server Again › Responses

Successful Response

Everything the connection's page shows (rules 2, 10, 12-15), and never the password. `testing_since` and `probe_sent_at` while it is tested; `proved_at` the first proof, from which its mail is the platform's (email-threads.md rule 29); `working_since` the latest; `unread_before`, after a break longer than the read-back bound, the moment before which mail was not read; `last_read_at` when its mailbox was last read (rule 13). `sent_folder` is where a copy of what it sends is filed, `None` where the server names none -- answers are then kept only on the platform (rule 12) -- and `last_copy_failed_at` when the latest copy could not be filed. `on_disconnect` is what disconnecting leaves to the client at the provider (rule 15).
MailServerOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
​required
connection_id
​string · uuid · required
​required
​required
​required
​MailFolderOut[] · required
health
​MailServerHealth · enum · required

What the connection shows (rules 10, 13, 17): being tested, working, refused by its last test (the values kept for the member to correct), or broken in use. Only working reads or sends.

Enum values:
testing
working
refused
broken
​required
​required
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
​required
​required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​MailServerEndpoint · required

One server: its name, its port and how the connection to it is encrypted (rule 2). Checked by the service, not here (MailServerIn's reason): the name is a host name or an IP literal (mail_host), the port one of the road's (READING_PORTS, SENDING_PORTS).

​required
​required
​required
​required
username
​string · required
​required
POST/api/v1/connections/{connection_id}/mail-server/test
curl /api/v1/connections/:connection_id/mail-server/test \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "broken_at": "2024-08-25T15:00:00Z", "connection_id": "00000000-0000-0000-0000-000000000000", "fault": "reading_refused", "fault_host": "string", "files_mail": true, "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "testing", "junk_folder": "string", "last_acted_at": "2024-08-25T15:00:00Z", "last_copy_failed_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "new_subject": "string", "on_disconnect": "on_disconnect", "probe_sent_at": "2024-08-25T15:00:00Z", "proved_at": "2024-08-25T15:00:00Z", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "reading": { "host": "host", "port": 0, "security": "tls" }, "sender_name": "string", "sending": { "host": "host", "port": 0, "security": "tls" }, "sent_folder": "string", "status_reason": "string", "testing_since": "2024-08-25T15:00:00Z", "unread_before": "2024-08-25T15:00:00Z", "username": "username", "working_since": "2024-08-25T15:00:00Z" }
json
application/json

Get Microsoft Mailbox

GET
/api/v1/connections/{connection_id}/microsoft-mailbox

Read a signed-in mailbox's state: its address, whether it works or broke and why, since when its mail is taken, the moment before which mail was not read after a long break, and where atteq is removed at Microsoft.

Get Microsoft Mailbox › path Parameters

connection_id
​string · uuid · required

Get Microsoft Mailbox › Responses

Successful Response

What a signed-in mailbox's page shows (rules 59-65), and nothing secret. `consented_at` is the moment its mail is taken from (email-threads.md rule 23); `unread_before`, set after a break longer than the read-back bound, is the moment before which mail was not read (rule 27); `on_disconnect` is where the client or their administrator removes the platform at Microsoft (rule 65), in English -- the dashboard words it in its reader's language (#1722).
MailboxOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
connection_id
​string · uuid · required
consented_at
​string · date-time · required
​MailFolderOut[] · required
health
​MailboxHealth · enum · required

A signed-in mailbox works from the moment of consent and breaks only on the provider's word (rule 64).

Enum values:
working
broken
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
on_opt_out
​string · required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
scopes
​string[] · required
​required
​required
working_since
​string · date-time · required
write_consent
​WriteConsent · enum · required

Microsoft's second consent, to change mail (connections.md rule 60): never asked, given, or refused by Microsoft since -- which stops the acting and nothing else (email-threads.md rule 37).

Enum values:
none
granted
lapsed
​required
​required
​
​
​
​
mirrors_drafts
​boolean
Default: false
GET/api/v1/connections/{connection_id}/microsoft-mailbox
curl /api/v1/connections/:connection_id/microsoft-mailbox \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "consented_at": "2024-08-25T15:00:00Z", "draft_failed_at": "2024-08-25T15:00:00Z", "draft_failure": "string", "drafts_unavailable": "string", "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "working", "last_acted_at": "2024-08-25T15:00:00Z", "last_drafted_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "mirrors_drafts": false, "new_subject": "string", "on_disconnect": "on_disconnect", "on_opt_out": "on_opt_out", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "scopes": [ "string" ], "status_reason": "string", "unread_before": "2024-08-25T15:00:00Z", "working_since": "2024-08-25T15:00:00Z", "write_consent": "none", "write_consented_at": "2024-08-25T15:00:00Z", "write_lapsed_at": "2024-08-25T15:00:00Z" }
json
application/json

Update Microsoft Mailbox

PATCH
/api/v1/connections/{connection_id}/microsoft-mailbox

Change the subject of a conversation the organization starts from the mailbox (null clears it), or the folder read instead of the inbox: the id of one folder from the mailbox's own list, null for the inbox. A changed folder is read from that moment on, never what it held before; junk is always read. A folder not on the list is refused (422). Also what atteq does in the mailbox once a conversation answered its mail: file it in answered_folder (one folder of the list other than the folder read, null files nothing), mark it read (mark_answered_read); acts_in_mailbox false stops both and forgets the permission to change mail, true needs that permission given first (409). The first reply after switching on also files that conversation's older mail still in the folder read. atteq never deletes mail, and neither is charged.

Update Microsoft Mailbox › path Parameters

connection_id
​string · uuid · required

Update Microsoft Mailbox › Request Body

The settings a signed-in mailbox has beside the burst window: the subject of a conversation the organization starts (email-threads.md rule 21; the sender's name is the one Microsoft holds), `null` clearing it; and the folder read (rule 35), the `id` of one of the mailbox's own folders (`MailFoldersOut`), `null` for the inbox. Changing the folder reads it from that moment on, never what it held before. Acting in the mailbox (rules 36-37): `acts_in_mailbox` true needs the second consent given first (409 otherwise), and false is opting out, which forgets that consent; `answered_folder`, the `id` of one of the mailbox's own folders other than the folder read, files the mail a thread answered there, `null` files nothing; `mark_answered_read` marks it read. Neither is charged. `filing_folders` (mail-handling.md rule 10): the `id`s of the mailbox's own folders a thread flow may file into, at most `FILING_FOLDERS_MOST`, none the folder read; the list given replaces the one held, `null` or `[]` lists none. The prepared reply in the mailbox (mail-handling.md rules 12-19): `mirrors_drafts` true needs the same second consent (409 otherwise) and keeps a thread's prepared reply in the mailbox's drafts too; false stops writing, replacing and removing them, leaving the drafts already there. The second consent is forgotten only once neither `acts_in_mailbox` nor `mirrors_drafts` is on. Not charged (rule 20).
MailboxUpdate
acts_in_mailbox
​boolean
Default: false
​
​
mark_answered_read
​boolean
Default: false
mirrors_drafts
​boolean
Default: false
​
​

Update Microsoft Mailbox › Responses

Successful Response

What a signed-in mailbox's page shows (rules 59-65), and nothing secret. `consented_at` is the moment its mail is taken from (email-threads.md rule 23); `unread_before`, set after a break longer than the read-back bound, is the moment before which mail was not read (rule 27); `on_disconnect` is where the client or their administrator removes the platform at Microsoft (rule 65), in English -- the dashboard words it in its reader's language (#1722).
MailboxOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
connection_id
​string · uuid · required
consented_at
​string · date-time · required
​MailFolderOut[] · required
health
​MailboxHealth · enum · required

A signed-in mailbox works from the moment of consent and breaks only on the provider's word (rule 64).

Enum values:
working
broken
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
on_opt_out
​string · required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
scopes
​string[] · required
​required
​required
working_since
​string · date-time · required
write_consent
​WriteConsent · enum · required

Microsoft's second consent, to change mail (connections.md rule 60): never asked, given, or refused by Microsoft since -- which stops the acting and nothing else (email-threads.md rule 37).

Enum values:
none
granted
lapsed
​required
​required
​
​
​
​
mirrors_drafts
​boolean
Default: false
PATCH/api/v1/connections/{connection_id}/microsoft-mailbox
curl /api/v1/connections/:connection_id/microsoft-mailbox \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "acts_in_mailbox": false, "answered_folder": "string", "filing_folders": [ "string" ], "mark_answered_read": false, "mirrors_drafts": false, "new_subject": "string", "read_folder": "string" }'
Example Request Body
{ "acts_in_mailbox": false, "answered_folder": "string", "filing_folders": [ "string" ], "mark_answered_read": false, "mirrors_drafts": false, "new_subject": "string", "read_folder": "string" }
json
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "consented_at": "2024-08-25T15:00:00Z", "draft_failed_at": "2024-08-25T15:00:00Z", "draft_failure": "string", "drafts_unavailable": "string", "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "working", "last_acted_at": "2024-08-25T15:00:00Z", "last_drafted_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "mirrors_drafts": false, "new_subject": "string", "on_disconnect": "on_disconnect", "on_opt_out": "on_opt_out", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "scopes": [ "string" ], "status_reason": "string", "unread_before": "2024-08-25T15:00:00Z", "working_since": "2024-08-25T15:00:00Z", "write_consent": "none", "write_consented_at": "2024-08-25T15:00:00Z", "write_lapsed_at": "2024-08-25T15:00:00Z" }
json
application/json

List Microsoft Mailbox Folders

GET
/api/v1/connections/{connection_id}/microsoft-mailbox/folders

List the signed-in mailbox's own folders that may be read instead of the inbox, read at Microsoft now: each with its id, name and where it sits. The inbox itself, junk, sent mail, drafts, deleted mail and the outbox are never listed. 502 when Microsoft could not be asked.

List Microsoft Mailbox Folders › path Parameters

connection_id
​string · uuid · required

List Microsoft Mailbox Folders › Responses

Successful Response

The mailbox's own folders a client may choose from (email-threads.md rule 35), and when the list was read: the inbox is read while none is chosen and is not listed; junk, sent mail, drafts, deleted mail, the outbox and the folders inside them are never offered. At most `MAIL_FOLDERS_OFFERED_MOST`. `listed_at` is `None` on a mailbox on its own server not yet listed.
MailFoldersOut
​MailFolderOut[] · required
​required
GET/api/v1/connections/{connection_id}/microsoft-mailbox/folders
curl /api/v1/connections/:connection_id/microsoft-mailbox/folders \ --header 'Authorization: Bearer <token>'
Example Responses
{ "folders": [ { "id": "id", "name": "name", "path": "path" } ], "listed_at": "2024-08-25T15:00:00Z" }
json
application/json

Consent To Microsoft Mailbox Writes

POST
/api/v1/connections/{connection_id}/microsoft-mailbox/write-consent

Begin switching on atteq filing and marking read, in a signed-in Microsoft mailbox, the mail its conversations answered -- or, with for_drafts, keeping each conversation's prepared reply in the mailbox's drafts too: Microsoft asks, on its own screen and apart from the first sign-in, for permission to change the mailbox's mail, signed in as that same mailbox; one permission serves both. Answers the page to open, valid for ten minutes, and the approval page to pass on should the administrator have to approve it. Once on, a conversation's first reply also files its older mail still in the folder read. atteq never deletes mail but its own unchanged drafts. Finish in the browser that called this: the answer sets a short-lived cookie the callback requires.

Consent To Microsoft Mailbox Writes › path Parameters

connection_id
​string · uuid · required

Consent To Microsoft Mailbox Writes › query Parameters

for_drafts
​boolean
Default: false

Consent To Microsoft Mailbox Writes › Responses

Successful Response

Where the browser goes next -- Microsoft's consent screen, carrying a sealed `state` that expires in ten minutes (rule 63) -- and the approval page to pass on to an administrator should Microsoft ask for one (rule 62).
MailboxAuthorizeOut
admin_approval_url
​string · required
admin_note
​string · required
url
​string · required
POST/api/v1/connections/{connection_id}/microsoft-mailbox/write-consent
curl /api/v1/connections/:connection_id/microsoft-mailbox/write-consent \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "admin_approval_url": "admin_approval_url", "admin_note": "admin_note", "url": "url" }
json
application/json

Withdraw Microsoft Mailbox Writes

DELETE
/api/v1/connections/{connection_id}/microsoft-mailbox/write-consent

Stop atteq filing and marking read mail in a signed-in Microsoft mailbox, and keeping prepared replies in its drafts -- those already there stay -- and forget its permission to change mail. Reading and sending go on. The answer says where that permission is removed at Microsoft too.

Withdraw Microsoft Mailbox Writes › path Parameters

connection_id
​string · uuid · required

Withdraw Microsoft Mailbox Writes › Responses

Successful Response

What a signed-in mailbox's page shows (rules 59-65), and nothing secret. `consented_at` is the moment its mail is taken from (email-threads.md rule 23); `unread_before`, set after a break longer than the read-back bound, is the moment before which mail was not read (rule 27); `on_disconnect` is where the client or their administrator removes the platform at Microsoft (rule 65), in English -- the dashboard words it in its reader's language (#1722).
MailboxOut
account_label
​string · required
​required
​required
acts_in_mailbox
​boolean · required
address
​string · required
​AnsweredFolderOut · required

The folder the mail a thread answered is filed in (email-threads.md rule 36): id as MailFolderOut gives it and its name, both None while nothing is filed.

​required
connection_id
​string · uuid · required
consented_at
​string · date-time · required
​MailFolderOut[] · required
health
​MailboxHealth · enum · required

A signed-in mailbox works from the moment of consent and breaks only on the provider's word (rule 64).

Enum values:
working
broken
​required
​required
mark_answered_read
​boolean · required
​required
on_disconnect
​string · required
on_opt_out
​string · required
​ReadFolderOut · required

The folder a mailbox is read in (email-threads.md rule 35): id and name of the one chosen instead of the inbox, both None while the inbox is read; since when the choice last changed -- what reached the folder before it is never read -- None while it never did.

​required
scopes
​string[] · required
​required
​required
working_since
​string · date-time · required
write_consent
​WriteConsent · enum · required

Microsoft's second consent, to change mail (connections.md rule 60): never asked, given, or refused by Microsoft since -- which stops the acting and nothing else (email-threads.md rule 37).

Enum values:
none
granted
lapsed
​required
​required
​
​
​
​
mirrors_drafts
​boolean
Default: false
DELETE/api/v1/connections/{connection_id}/microsoft-mailbox/write-consent
curl /api/v1/connections/:connection_id/microsoft-mailbox/write-consent \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
{ "account_label": "account_label", "act_failed_at": "2024-08-25T15:00:00Z", "act_failure": "string", "acts_in_mailbox": true, "address": "address", "answered_folder": { "id": "string", "name": "string" }, "answered_folder_lost": "string", "connection_id": "00000000-0000-0000-0000-000000000000", "consented_at": "2024-08-25T15:00:00Z", "draft_failed_at": "2024-08-25T15:00:00Z", "draft_failure": "string", "drafts_unavailable": "string", "filing_folders": [ { "id": "id", "name": "name", "path": "path" } ], "health": "working", "last_acted_at": "2024-08-25T15:00:00Z", "last_drafted_at": "2024-08-25T15:00:00Z", "last_read_at": "2024-08-25T15:00:00Z", "mark_answered_read": true, "mirrors_drafts": false, "new_subject": "string", "on_disconnect": "on_disconnect", "on_opt_out": "on_opt_out", "read_folder": { "id": "string", "name": "string", "since": "2024-08-25T15:00:00Z" }, "read_folder_lost": "string", "scopes": [ "string" ], "status_reason": "string", "unread_before": "2024-08-25T15:00:00Z", "working_since": "2024-08-25T15:00:00Z", "write_consent": "none", "write_consented_at": "2024-08-25T15:00:00Z", "write_lapsed_at": "2024-08-25T15:00:00Z" }
json
application/json

custom-datacustom-tools