Skip to content

API routes

This page lists every route of the REST API, by area. Paths start with /api/v1. Send a token as Authorization: Bearer <token>; see REST API for sign-in, errors and conventions, and Tokens and scopes for what each scope allows.

The same routes, with their parameters and response shapes, are in the interactive reference at /api/v1/docs (the OpenAPI document is /api/v1/openapi.json), for people signed in to the web app who may make API tokens; see Interactive reference.

Sign-in, account and sessions

Scope: a signed-in session.

Route Description
GET /api/v1/auth/config Which sign-in methods are offered on the server.
POST /api/v1/auth/login Sign in with email and password; starts a cookie session.
POST /api/v1/auth/logout Sign out of this session.
GET /api/v1/auth/session Like GET /me, but answers {"authenticated": false} with 200 when you are signed out.
GET /api/v1/auth/oidc/start Start sign-in at your OIDC provider; next is the page to open afterwards.
GET /api/v1/auth/native-config The sign-in settings for the Android apps (app=notes for the Notes app's redirect address). No sign-in needed.
POST /api/v1/auth/oidc/native Sign in from an Android app with an ID token from your OIDC provider; starts a device session.
POST /api/v1/auth/native/logout Sign out of an Android app's device session.
POST /api/v1/auth/handover A one-time hand-over token, so another Mailr app on the same phone can sign in without a second sign-in.
POST /api/v1/auth/handover/redeem Exchange a hand-over token for a device session of the Notes app.
GET /api/v1/auth/oidc/callback The return address after sign-in at your OIDC provider. Register ${MAILR_BASE_URL}/api/v1/auth/oidc/callback as the redirect URI.
POST /api/v1/auth/signup Create an account (only when MAILR_ALLOW_SIGNUP is on).
GET /api/v1/app/releases The Android apps offered on this server, with version, size and SHA-256. No sign-in needed.
GET /api/v1/app/{app}.apk Download the APK of mailr or notes. No sign-in needed.
GET /api/v1/me Your account: name, email, role and settings, and setup (whether a mail account is connected, the setup guide's status, whether a calendar is there, and the setup address).
PATCH /api/v1/me Change your name.
GET /api/v1/me/imap The IMAP server name, ports and user name for other mail apps.
POST /api/v1/me/imap/app-password Create a new IMAP app password (shown once).
GET /api/v1/me/dav The server address and user name for calendar and contacts apps, and your DAV app passwords.
POST /api/v1/me/dav/app-passwords Create a DAV-only app password (shown once), with an iOS/macOS profile that holds it.
DELETE /api/v1/me/dav/app-passwords/{pid} Delete a DAV app password.
POST /api/v1/me/password Change your password. Other sessions end and API tokens are revoked; with sign_out_mail_apps (default true), the IMAP password is replaced and the DAV app passwords are deleted.
POST /api/v1/me/sign-out-everywhere End every other session, revoke every API token, replace the IMAP password and delete the DAV app passwords. This session stays.
GET /api/v1/me/sessions Your signed-in browsers and devices.
DELETE /api/v1/me/sessions/{sid} Sign a browser or device out.
DELETE /api/v1/me/recovery-review Dismiss "Review after signing out" (what a sign-out everywhere, password change or reset took back).
PATCH /api/v1/me/settings Change settings (send only the keys you change).

Setup guide

Scope: a signed-in session (API tokens are refused with 403). See Your first sign-in: the setup guide.

Route Description
GET /api/v1/onboarding The guide's progress (status, step, steps done or skipped), whether Ambrose can chat, and the phone links. A new account is given its prepared defaults here.
PUT /api/v1/onboarding Move to a step, mark steps done or skipped, finish (status: done) or close (dismissed).
POST /api/v1/onboarding/restart Open the guide again at the start.
POST /api/v1/onboarding/chat The next turn of the quick chat ({messages} → {reply, done}); your access policy's chat model. Nothing is saved.
POST /api/v1/onboarding/chat/summary What was learned from the chat, as a proposal to review. Nothing is saved.
POST /api/v1/onboarding/about Save what you approved: About-you fields, notes to remember and your signature.

Mail accounts connected by an administrator

See Users → Connect a member's mail account. A signed-in admin session only, never a token; for every change but the setting, accounts.admin_connect must be on.

Route Description
GET /api/v1/admin/managed-accounts The setting (enabled) and every account an administrator connected (no passwords).
PUT /api/v1/admin/managed-accounts Turn the setting on or off ({enabled}).
GET /api/v1/admin/users/{uid}/accounts The accounts an administrator connected for this person, and the ones they disconnected.
POST /api/v1/admin/users/{uid}/accounts/test Sign in to the servers as the person's account would.
POST /api/v1/admin/users/{uid}/accounts Connect an IMAP/SMTP account for the person (reconnect: true for one they disconnected).
DELETE /api/v1/admin/users/{uid}/accounts/{cid} Remove an account an administrator connected; its mail stays.

Invites

See Users → Invite someone. An admin session is required for the admin routes; no sign-in is required for the other two.

Route Description
POST /api/v1/admin/invites Make an invite ({email, name?, days?, defaults?}): the link and the phone link, shown once.
GET /api/v1/admin/invites The invites, newest first, without their links.
DELETE /api/v1/admin/invites/{iid} Withdraw an invite.
GET /api/v1/invites/{token} The data for the invite page: the address, the name, whether it is still open, how to sign in.
POST /api/v1/invites/{token}/accept Use the invite: signed in as its address, or (with password sign-in) with {password} for a new or unused account.

Imports

Scope: a signed-in session (API tokens are refused with 403). See Notes, Calendar and People.

Route Description
POST /api/v1/imports/preview Read uploaded files ({kind: keep \| ics \| vcf, blobs, calendar?}) and count what would come in. Nothing is written.
POST /api/v1/imports Run the import; its counts and its id are returned.
GET /api/v1/imports Your recent imports (kind= to filter).
POST /api/v1/imports/{bid}/undo Take a whole import back.

Mail

Scope: read; label, delete or send for actions; draft for drafts.

Route Description
GET /api/v1/attachments Attachments of the messages a search matches, newest first.
GET /api/v1/bulk/{job_id} Progress of a bulk action on many conversations.
GET /api/v1/cleanup/groups Mail grouped for a cleanup (by: sender, domain, list or category), in a scope (where, older_than_days, uncategorised, bulk_only, include_*).
GET /api/v1/cleanup/preview Exactly what an action on one group changes: conversations, messages, 20 samples, what is left alone.
POST /api/v1/cleanup/apply Archive, label, trash, mark read, set a category on, or keep one group (expect: the previewed count). Large groups are run as a bulk job. Signed-in users only.
POST /api/v1/cleanup/rule A filter for a group's future mail.
POST /api/v1/cleanup/suggest Ask your sorting model for categories of uncategorised groups, tonight or now. Suggestions only.
GET /api/v1/cleanup/suggest The state of the last suggestion run.
GET /api/v1/changes What changed since a state token, for offline caches.
GET /api/v1/compose/reply Recipients, subject and quoted text for a reply, reply all or forward.
GET /api/v1/conversations List conversations: a view, a label or a search (q), paged.
POST /api/v1/conversations/actions Act on conversations: archive, delete, read, star, label, move, snooze, mute, category, show in tab, follow-up and more.
POST /api/v1/conversations/merge Merge conversations into one.
GET /api/v1/conversations/{cid} One conversation with its messages.
POST /api/v1/conversations/{cid}/split Split messages out into a new conversation.
POST /api/v1/drafts Save a new draft.
PUT /api/v1/drafts/{mid} Update a draft. Send base_version (the version you read) to have changes saved meanwhile merged in; an overlapping change is answered with 409 (see Live editing).
GET /api/v1/drafts/{mid} Read a draft, with its version.
DELETE /api/v1/drafts/{mid} Discard a draft.
GET /api/v1/live/{kind}/{item} The current version and editable content of a draft, event, task, memory or filter (kind: draft, event, task, memory, rule).
POST /api/v1/live/typing Report typing from an open editor (signed-in apps only), so that an assistant write is held until the user pauses.
GET /api/v1/identities/default The address you send from by default.
GET /api/v1/labels Your labels with unread and total counts.
POST /api/v1/labels Create a label (nest it with / in the name).
POST /api/v1/labels/colours Recolour several labels at once, or apply a colour scheme.
PATCH /api/v1/labels/{lid} Rename, recolour, nest or hide a label.
DELETE /api/v1/labels/{lid} Delete a label (the mail stays).
POST /api/v1/messages/actions Act on single messages instead of whole conversations.
GET /api/v1/messages/{mid} One message: headers, people, attachments.
GET /api/v1/messages/{mid}/attachments/{part} Download an attachment. download=1 always downloads it; thumb=1 returns a large image as a small copy (320 pixels on its long side, without metadata), as the Attachments view shows it.
GET /api/v1/messages/{mid}/attachments/{part}/email An attached email as the reader shows it: its headers, its body as safe HTML (images=allowed to show remote images) and its files, numbered as parts of the outer message.
GET /api/v1/messages/{mid}/body The message body as safe HTML.
GET /api/v1/messages/{mid}/cid/{cid} An inline image of the message.
GET /api/v1/messages/{mid}/images/{h} A remote image of the message, fetched through the image proxy.
GET /api/v1/messages/{mid}/raw The original message source (.eml).
POST /api/v1/messages/{mid}/unsubscribe Unsubscribe from a mailing list (one-click when the sender supports it).
GET /api/v1/outbox Messages waiting to send: in the undo window, scheduled, or waiting for approval. active=true: what has not left yet (queued to go within a minute, sending, waiting for approval, not sent this week) and what left in the last two minutes, each with its draft_id.
POST /api/v1/outbox/{oid}/approve Approve a held message.
POST /api/v1/outbox/{oid}/cancel Cancel a message before it is sent (undo send).
POST /api/v1/outbox/{oid}/reject Reject a held message.
POST /api/v1/outbox/{oid}/send-now Send a scheduled or held message now.
POST /api/v1/outbox/{oid}/retry Put a message that was not sent back in the queue, to go now.
POST /api/v1/send Send a message, now or at send_at.
GET /api/v1/subscriptions Your mailing lists and bulk senders, one row each (sort, filter, q), with volume, reading and the unsubscribe method.
GET /api/v1/subscriptions/unsubscribe How unsubscribing from one (key) would work, before anything is sent.
POST /api/v1/subscriptions/unsubscribe Unsubscribe from one ({key}): a one-click request or an unsubscribe mail. Signed-in users only; agents use the unsubscribe tool.
GET /api/v1/subscriptions/preview What Archive all or Label would change for one subscription.
POST /api/v1/subscriptions/actions archive_all, label, auto_archive, remove_auto_archive, keep or unkeep one subscription. Signed-in users only.
POST /api/v1/uploads Upload a file to attach or an image to insert.
GET /api/v1/uploads/{blob} An uploaded image.

Inbox layouts

Scope: read, rules to change.

Route Description
GET /api/v1/layouts Your inbox layouts and the presets.
PUT /api/v1/layouts Save your custom layouts.
POST /api/v1/layouts/preview Count what a section you are editing would show.
GET /api/v1/layouts/show-in-tab The tabs "Show in tab" offers for conversation_ids, and the tab they show in now.
GET /api/v1/layouts/{layout_id}/counts Counts and indicators for every tab of a layout.
GET /api/v1/inbox/count The number by Inbox: unread mail in the active layout's first tab, or in the whole Inbox (the inbox_count setting).
GET /api/v1/counts Every number shown in the sidebar, in one answer: for each view (Inbox, Drafts, Spam, Trash, Snoozed, Scheduled, each label and the rest) its unread and total, counted as in that view's list, plus the Inbox number. The same numbers are sent on the live stream after each change.

Filters and forwarding

Scope: rules.

Route Description
GET /api/v1/forwarding Your forwarding addresses.
POST /api/v1/forwarding Add a forwarding address; a confirmation code is sent to it.
POST /api/v1/forwarding/verify Confirm a forwarding address with its code.
DELETE /api/v1/forwarding/{email} Remove a forwarding address.
GET /api/v1/rules Your filters, in order.
POST /api/v1/rules Create a filter from a search and its actions.
POST /api/v1/rules/import-gmail Import filters exported from Gmail (XML).
POST /api/v1/rules/preview Show the mail a filter's search matches.
POST /api/v1/rules/reorder Change the order filters run in.
PATCH /api/v1/rules/{rid} Change a filter.
DELETE /api/v1/rules/{rid} Delete a filter.
POST /api/v1/rules/{rid}/apply Apply a filter to mail you already have.

Identities

Scope: read, rules to change.

Route Description
GET /api/v1/identities Your send-as addresses and signatures.
POST /api/v1/identities Add a send-as address.
PATCH /api/v1/identities/{iid} Change a send-as address: name, signature, default.
DELETE /api/v1/identities/{iid} Remove a send-as address.

Templates

Scope: read, draft to change.

Route Description
GET /api/v1/templates Your templates.
POST /api/v1/templates Create a template.
GET /api/v1/templates/{tid} One template.
PATCH /api/v1/templates/{tid} Change a template.
DELETE /api/v1/templates/{tid} Delete a template.
POST /api/v1/templates/{tid}/expand A template with its variables filled for a draft's recipients.

Pictures

Route Description
GET /api/v1/avatars/{email} A person's picture: from their address book card, an address of a user of this server (that address's picture, else that user's account picture), or looked up when sender_pictures is on.
PUT /api/v1/identities/{iid}/avatar Set the picture of one of your addresses.
GET /api/v1/identities/{iid}/avatar The picture of one of your addresses.
DELETE /api/v1/identities/{iid}/avatar Remove the picture of one of your addresses.
PUT /api/v1/people/{email}/avatar Set a person's picture.
DELETE /api/v1/people/{email}/avatar Remove a person's picture.
GET /api/v1/me/picture Your account picture (a session, or a token with read or profile).
GET /api/v1/users/me/avatar The same picture at a stable address for integrations (a token with profile is enough).
GET /api/v1/me/picture/info Whether you have an account picture, where it came from, and its version.
PUT /api/v1/me/picture Upload your account picture (multipart file; signed-in user only).
DELETE /api/v1/me/picture Remove your account picture.
POST /api/v1/me/picture/use-sign-in Use the picture from your sign-in provider.
GET /api/v1/pictures/local Hashed addresses of this server's users that have a picture, so that /avatars/{email} is requested only for those.
GET /api/v1/me/picture/providers Per sending address: whether mail from it is sent through Google or Microsoft, and whether its domain belongs to a shared mailbox provider.
POST /api/v1/me/picture/publish-check Ask Gravatar and Libravatar whether they have a picture for each of your addresses, or for those in {"identity_ids": [...]}.
POST /api/v1/me/picture/bimi-check Check the BIMI requirements of one sending address's domain ({"identity_id": …}). Admins only.

People, groups and contacts

Scope: read.

Route Description
GET /api/v1/address-books Your connected address books.
POST /api/v1/address-books/sync Read the address books now (they are only read, never written).
GET /api/v1/contacts/places Postal addresses from your contacts, for an event's location.
GET /api/v1/groups Your contact groups, including suggestions.
POST /api/v1/groups Create a contact group.
POST /api/v1/groups/suggestions/refresh Look for new group suggestions now.
GET /api/v1/groups/{gid} One group with its members.
PATCH /api/v1/groups/{gid} Rename a group or change its members.
DELETE /api/v1/groups/{gid} Delete a group.
POST /api/v1/groups/{gid}/accept Accept a suggested group.
POST /api/v1/groups/{gid}/dismiss Dismiss a suggested group.
GET /api/v1/people Find people you correspond with, best match first.
GET /api/v1/people/blocked Your blocked senders.
GET /api/v1/people/{email} A person's profile: details, history, recent conversations.
POST /api/v1/people/{email}/block Block a sender: their mail is moved to Spam.
DELETE /api/v1/people/{email}/block Unblock a sender.

The Screener

Scope: read to list, label to decide. An API token's decision is always held for approval (class mail.screener). Changing the settings and Screen again require a signed-in session (no token).

Route Description
GET /api/v1/screener The first-time senders waiting in the Screener, newest first, with the latest message's subject and preview, the number of messages waiting, who a decision covers (an address or a domain) and the authentication hint.
POST /api/v1/screener/{sid}/decide Allow, block (to Spam or Trash) or label a sender (decision, block_to, label_id or feed). The mail waiting is moved at once; the decision also applies to later mail.
DELETE /api/v1/screener/{sid} Screen a sender again: undo a decision.
GET /api/v1/screener/settings Whether the Screener is on, the accounts it covers, and the decisions you made.
PUT /api/v1/screener/settings Turn the Screener on or off (when it is off, the waiting mail is moved to the Inbox), and choose its accounts.
POST /api/v1/people/{email}/suggestions/{sid}/accept Accept a contact detail found in their mail (a title, a phone number).
POST /api/v1/people/{email}/suggestions/{sid}/dismiss Dismiss a suggested contact detail.

Scope: read.

Route Description
POST /api/v1/conversations/{cid}/deadline/dismiss Mark a detected deadline as not a deadline.
GET /api/v1/conversations/{cid}/summary The short summary of a conversation (computed when missing).
POST /api/v1/decisions/{did}/accept Accept a suggestion (a label or a category).
POST /api/v1/decisions/{did}/reject Reject a suggestion.
GET /api/v1/spam/domains Domains (or addresses) whose mail is moved to Spam because you reported their mail as spam.
DELETE /api/v1/spam/domains/{key} Stop sending a learned domain's mail to Spam (scope rules).
POST /api/v1/intel/backfill Sort older mail you already have.
GET /api/v1/intel/importance/review Mail judged important or not in the last day, for your review.
POST /api/v1/intel/reembed Build missing passages and re-embed mail with the current embedding model.
POST /api/v1/intel/retriage Sort recent mail again (categories and signals).
GET /api/v1/intel/status Sorting and embedding progress for your mail.
POST /api/v1/intel/train Retrain your label and importance models now.
POST /api/v1/intel/lab Run every sorting decision on some emails with the rules and each sorting model, side by side. Nothing is stored. Session only.
GET /api/v1/intel/lab/endpoints The sorting models the lab may use for you.
GET /api/v1/messages/{mid}/body-highlight The message body with a quoted passage highlighted (for citations).
GET /api/v1/messages/{mid}/decisions Every sorting decision on a message, with its reason.
GET /api/v1/messages/{mid}/explain Why each filter and standing order was or was not applied to a message.
POST /api/v1/messages/{mid}/importance Your own verdict on a message: important or not.
GET /api/v1/messages/{mid}/reply-suggestions Three short suggested replies to a personal email.
POST /api/v1/messages/{mid}/translate The message's text in another language.
GET /api/v1/passages/search The passages of mail that best answer a question.
GET /api/v1/search/semantic Search by meaning and keywords, ranked per conversation.
GET /api/v1/smart Counts of the smart lists (needs reply, waiting, deadlines).
GET /api/v1/smart/{name} The conversations of one smart list.
GET /api/v1/suggestions Pending label suggestions.

Mail accounts (connectors)

Route Description
GET /api/v1/connectors Your mail accounts.
POST /api/v1/connectors Add a mail account (or a Speakr account).
POST /api/v1/connectors/discover Find the server settings for an address (presets and autodiscovery).
GET /api/v1/connectors/presets The known providers and their settings.
POST /api/v1/connectors/test Test account settings before you save them.
POST /api/v1/connectors/uploads Upload an mbox or Maildir archive to import.
GET /api/v1/connectors/{cid} One account with its sync state. An IMAP account in mirror mode (Keep in sync) has sent_copies: the setting, whether it is active, whether the provider saves its own copy (provider_saves), and the number of sent messages that could not be saved there (failed).
PATCH /api/v1/connectors/{cid} Change an account: name, settings, mode, days before deletion at the provider, local-only, and for an IMAP account save_sent (auto, on or off; see Sent mail at the provider).
DELETE /api/v1/connectors/{cid} Remove an account from Mailr. Mail already delivered from it stays.
POST /api/v1/connectors/{cid}/arm-deletion Turn on deletion at the provider for an account in store mode (Mailr keeps the mail), after its checks pass.
POST /api/v1/connectors/{cid}/disarm-deletion Turn deletion at the provider off again.
POST /api/v1/connectors/{cid}/pause Pause an account's sync.
POST /api/v1/connectors/{cid}/resume Resume a paused account.
POST /api/v1/connectors/{cid}/resync Scan the account again from scratch; mail already stored is skipped.
POST /api/v1/connectors/{cid}/sync Sync an account now.
POST /api/v1/connectors/{cid}/sent-copies/retry Try again to save the sent messages that could not be saved in the provider's Sent folder (IMAP accounts in mirror mode). Answers {"queued": n}. Session only.
POST /api/v1/connectors/{cid}/sent-backfill Copy the account's past sent mail that is missing in the provider's Sent folder, or count it (dry_run, the default), optionally since a date. A run already going for the account is returned. Session only.
GET /api/v1/connectors/{cid}/sent-backfill The newest count or copy for this account, or {"status": "none"}.
GET /api/v1/connectors/{cid}/sent-backfill/{job_id} The progress of one count or copy: done, total and, when finished, result (total, present, copied, failed).
POST /api/v1/connectors/{cid}/migration Copy a connected CalDAV account into your Mailr calendar: a preview (dry_run) or the copy. Session only.
GET /api/v1/connectors/{cid}/migration The newest preview or copy for this account, or {"status": "none"}.
GET /api/v1/connectors/{cid}/migration/{job_id} The progress of one preview or copy.
POST /api/v1/connectors/{cid}/migration/cutover After a copy: make the copies your defaults, hide the account's copied calendars, or both. Nothing changes on the account's server.

Calendar

Scope: read, calendar to change.

Route Description
GET /api/v1/calendar/accounts Your CalDAV accounts.
PATCH /api/v1/calendar/accounts/{cid} Change a CalDAV account.
DELETE /api/v1/calendar/accounts/{cid} Remove a CalDAV account from Mailr (its data stays on the server).
POST /api/v1/calendar/accounts/{cid}/check Test a CalDAV account's connection.
GET /api/v1/calendar/agenda Events and tasks for a range, for the side panel and agendas.
GET /api/v1/calendar/calendars Your calendars and task lists.
POST /api/v1/calendar/collections Create a calendar or a task list.
POST /api/v1/calendar/collections/reorder Change the order of calendars or task lists.
PATCH /api/v1/calendar/collections/{calendar_id} Rename, recolour, show or hide a calendar or list; set its default reminders.
DELETE /api/v1/calendar/collections/{calendar_id} Delete a calendar or list (confirmed with its name).
GET /api/v1/calendar/collections/{calendar_id}/export Download a calendar or list as one .ics file.
GET /api/v1/calendar/collections/{calendar_id}/shares Who a calendar is shared with, at which level, and who else you can add. Signed-in only.
PUT /api/v1/calendar/collections/{calendar_id}/shares/{user_id} Share a calendar with a person, or change their level (view, edit, share). Signed-in only.
DELETE /api/v1/calendar/collections/{calendar_id}/shares/{user_id} Stop sharing a calendar with a person. Signed-in only.
GET /api/v1/calendar/share-notices Calendars people shared with you since you last dismissed the notice.
DELETE /api/v1/calendar/share-notices Dismiss those notices.
POST /api/v1/calendar/connect Connect a CalDAV account.
GET /api/v1/calendar/defaults Your default calendar and default task list.
PUT /api/v1/calendar/defaults Set your default calendar or task list.
GET /api/v1/calendar/delta Everything changed since a cursor, for offline caches.
POST /api/v1/calendar/events Create an event (guests get invitations).
GET /api/v1/calendar/events/search Events in a range, optionally matching words.
GET /api/v1/calendar/events/{uid} One event, with its repeat rule and exceptions.
PATCH /api/v1/calendar/events/{uid} Change an event, one occurrence, or this and following.
DELETE /api/v1/calendar/events/{uid} Delete an event or an occurrence.
POST /api/v1/calendar/events/{uid}/cancel Cancel a meeting you organise; guests get a cancellation.
POST /api/v1/calendar/events/{uid}/counter/accept Accept a guest's proposed new time.
POST /api/v1/calendar/events/{uid}/counter/decline Decline a guest's proposed new time.
GET /api/v1/calendar/events/{uid}/ics Download one event as an .ics file.
POST /api/v1/calendar/events/{uid}/move Move an event to another calendar.
GET /api/v1/calendar/events/{uid}/prep The meeting prep of an event occurrence (?occurrence=).
POST /api/v1/calendar/events/{uid}/prep/summary A short summary of the meeting prep, written by your assistant model.
POST /api/v1/calendar/events/{uid}/rsvp Answer an invitation already in your calendar.
POST /api/v1/calendar/find-time Free slots in your calendars inside working hours, best first. With people, the busy times of people in your groups who share their free/busy are added.
GET /api/v1/calendar/freebusy Your busy times in a range (no titles).
GET /api/v1/calendar/household/freebusy The busy times of people in your groups who share their free/busy (signed-in person only).
POST /api/v1/calendar/from-message Suggest an event or task from an email (nothing is saved).
POST /api/v1/calendar/from-message/confirm Save the event or task made from an email, linked to it.
POST /api/v1/calendar/import Import the events of an .ics file into a calendar.
POST /api/v1/calendar/subscriptions Subscribe to a calendar link ({url, name?, refresh_hours?}); fetched now and then on a schedule, read-only.
GET /api/v1/calendar/subscriptions Your calendar links.
PATCH /api/v1/calendar/subscriptions/{cid} Rename a calendar link or change how often it is fetched.
POST /api/v1/calendar/subscriptions/{cid}/refresh Fetch a calendar link now.
DELETE /api/v1/calendar/subscriptions/{cid} Remove a calendar link and its events.
PUT /api/v1/calendar/phone-calendars/{key} Replace a phone calendar's busy times inside a window ({name, color?, device?, details?, window_start, window_end, busy: [{id, start, end, all_day, title?, location?}]}); key is 32 lowercase hex characters, each id 24. Times only by default. With details: true each entry may also carry title and location (each at most 300 characters); without it an entry with a title or place is refused (422). Any other field is refused (422). A snapshot with details false also removes the titles and places stored for that calendar outside the window. At most 5,000 entries and a 400-day window. Answers {stored, synced_at}. Session, or a token with the calendar scope.
GET /api/v1/calendar/phone-calendars Your phone calendars: [{key, name, color, device, synced_at, count, stale, details}]; details is true for a calendar that sends titles and places.
DELETE /api/v1/calendar/phone-calendars/{key} Remove a phone calendar and all its blocks.
POST /api/v1/calendar/invite-reply Answer an invitation in an email (Yes, Maybe, No).
GET /api/v1/calendar/search Search events and tasks with words and operators.
POST /api/v1/calendar/sync Sync your calendars now.
GET /api/v1/calendar/sync-status When each calendar account last synced.
GET /api/v1/conversations/{cid}/links Events, tasks and recordings linked to a conversation.
GET /api/v1/messages/{mid}/invite The invitation in an email, with your answer and conflicts.
POST /api/v1/messages/{mid}/itip/apply Apply a calendar change from this email that was kept back because its sender could not be verified (signed-in user only).

Tasks

Scope: read, calendar to change.

Route Description
GET /api/v1/tasks List tasks: a smart list (today, overdue, upcoming…), a list, a tag or a search.
POST /api/v1/tasks Create a task or a subtask.
POST /api/v1/tasks/bulk One action on many tasks: complete, reschedule, move, tag, priority, delete.
GET /api/v1/tasks/counts Open tasks per smart list, list and tag.
GET /api/v1/tasks/tags Your task tags with their colours.
PATCH /api/v1/tasks/tags/{name} Rename or recolour a tag on every task.
DELETE /api/v1/tasks/tags/{name} Remove a tag from every task.
GET /api/v1/tasks/{uid} One task.
PATCH /api/v1/tasks/{uid} Change a task; complete or reopen it.
DELETE /api/v1/tasks/{uid} Delete a task (with cascade=true, its subtasks too).
POST /api/v1/tasks/{uid}/move Move a task to another list, under a parent, or to a new place in the order.
POST /api/v1/tasks/{uid}/skip Skip one occurrence of a repeating task.

Notes and checklists

Scope: a signed-in session. API tokens cannot use these routes yet. A note's id starts with n; items and sections have UUIDs. Every change is answered with an undo: the request for taking it back.

Route Description
GET /api/v1/notes Your notes and tables as cards: Notes, Lists, Tables, Archive, Trash or one label (view, label, sort), and your labels.
POST /api/v1/notes Create a note or a checklist; lines are read by the item grammar.
POST /api/v1/notes/capture Add items from one line: #List picks the checklist, Name: a section.
POST /api/v1/notes/quick "New note…": with #List first, items are added to that list; anything else becomes a text note.
POST /api/v1/notes/{note_id}/presence Say that you have a shared note open (here, every 15 s) or closed it (left).
GET /api/v1/notes/search Search notes and tables (q, with is:list, is:table, label:, color:, section:, in:trash and more).
GET /api/v1/notes/export A zip of every note: Markdown files and notes.json.
GET /api/v1/notes/sync Notes changed since a time, with their items (since).
POST /api/v1/notes/from-email A note or a checklist from a conversation, linked to it.
POST /api/v1/notes/from-recording A text note from a recording (title, date, people, summary, action items), linked to it.
GET /api/v1/notes/templates The templates: the starters, then your own.
POST /api/v1/notes/templates Make a template from its content (kind, name, content).
DELETE /api/v1/notes/templates/{template_id} Delete one of your templates.
POST /api/v1/notes/from-template A new note, list or table from a template (template, title, labels).
GET /api/v1/notes/linked The notes linked to a conversation, an event, a task or a recording.
POST /api/v1/notes/trash/empty Delete every note and table in Trash forever.
GET /api/v1/notes/labels Your note labels with their counts.
POST /api/v1/notes/labels Create a note label.
PATCH /api/v1/notes/labels/{name} Rename, recolour or move a note label.
DELETE /api/v1/notes/labels/{name} Delete a note label; the notes stay.
POST /api/v1/notes/labels/restore Put a deleted label back on its notes (the undo of a delete).
GET /api/v1/notes/{note_id} One note with its sections and items in display order.
PATCH /api/v1/notes/{note_id} Change the title, text, colour or switches; send base_version to merge.
DELETE /api/v1/notes/{note_id} Move a note to Trash; with forever=true, it is deleted from Trash.
POST /api/v1/notes/{note_id}/restore Restore a note from Trash.
POST /api/v1/notes/{note_id}/duplicate Make a copy of a note.
POST /api/v1/notes/{note_id}/convert Turn a text note into a checklist, or back (to).
PUT /api/v1/notes/{note_id}/state Your own pin, archive, labels and place in the grid.
GET /api/v1/notes/{note_id}/export One note as Markdown.
POST /api/v1/notes/{note_id}/revert Apply the undo of an item or section change.
POST /api/v1/notes/{note_id}/items Add items: lines, item objects or usual items; duplicates are merged.
PATCH /api/v1/notes/{note_id}/items/{item_id} Check, uncheck or edit an item.
DELETE /api/v1/notes/{note_id}/items/{item_id} Delete an item.
POST /api/v1/notes/{note_id}/items/{item_id}/move Move an item, or move it to another section.
POST /api/v1/notes/{note_id}/items/{item_id}/to-task Make a task from an item.
DELETE /api/v1/notes/{note_id}/items/{item_id}/task Delete the task made from an item.
POST /api/v1/notes/{note_id}/items/clear-checked Delete the checked items of a list.
POST /api/v1/notes/{note_id}/items/uncheck-all Uncheck every item of a list.
POST /api/v1/notes/{note_id}/sections Add a section.
PATCH /api/v1/notes/{note_id}/sections/{section_id} Rename, move, collapse a section, set its order, or reset its learned order.
DELETE /api/v1/notes/{note_id}/sections/{section_id} Delete a section, keeping its items or not (items).
GET /api/v1/notes/{note_id}/usual The usual items of a list, and the ones you hid.
POST /api/v1/notes/{note_id}/usual/{key}/dismiss Hide a usual item for a while, or for good.
DELETE /api/v1/notes/{note_id}/usual/{key}/dismiss Show a hidden usual item again.
GET /api/v1/notes/{note_id}/revisions The saved versions of a note.
GET /api/v1/notes/{note_id}/revisions/{rev} One saved version with its content.
POST /api/v1/notes/{note_id}/revisions/{rev}/restore Restore a saved version.
POST /api/v1/notes/{note_id}/revisions/checkpoint End an editing session, so the next change starts a new version.
POST /api/v1/notes/{note_id}/links Link a note to a conversation, an event, a task or a recording.
DELETE /api/v1/notes/{note_id}/links/{link_id} Remove a link.
PUT /api/v1/notes/{note_id}/reminders Your reminders on the note (at: times with their zone; with none, they are removed).
POST /api/v1/notes/{note_id}/save-template Save the note or the list as a template (name).
GET /api/v1/notes/{note_id}/shares Who the note is shared with, at which level, and who you may add.
PUT /api/v1/notes/{note_id}/shares/{principal} Share with a person (their user id) or one of your groups (group:<name>) at view, edit or share, or change the level. For a person outside your groups who is not on the note yet, also send email, the address a people search showed. Without it, the id is answered as an unknown person (404).
DELETE /api/v1/notes/{note_id}/shares/{principal} Stop sharing with a person or a group.
DELETE /api/v1/notes/{note_id}/shares/me Remove a note shared with you from your notes; it stays for the others.
POST /api/v1/notes/{note_id}/shares/me Add a note you removed back (the undo).
POST /api/v1/notes/{note_id}/move-to-group Move your note into one of your groups (group), or out of its group (group: null).
GET /api/v1/notes/share-notices Notes and tables people shared with you since you last dismissed the notice.
DELETE /api/v1/notes/share-notices Dismiss the notice.

The sharing routes take a signed-in session only, never an API token.

Tables

Scope: a signed-in session. With an API token, tables are reached through Ambrose's table tools with the notes scope (Tools). A table's id starts with t; rows have UUIDs. Every change is answered with an undo; most undos are POST …/revert with the change's batch.

Route Description
GET /api/v1/tables Your tables as cards: Tables, Archive, Trash or one label (view, label).
POST /api/v1/tables Create a table with its columns (or a template), and optional first rows.
GET /api/v1/tables/linked The tables linked to an email, event, task or recording, and the rows with a link to it in a link cell.
POST /api/v1/tables/import Preview a CSV file (preview), or import it into a new table.
GET /api/v1/tables/sync The phone's changes since a time (since), as GET /notes/sync: changed and shared tables, rows added, changed or deleted, tables in Trash, and every table you see now.
GET /api/v1/tables/{table_id} One table with its columns and views.
PATCH /api/v1/tables/{table_id} Rename, describe, recolour, mark local-only or choose the primary column; send base_version to merge.
DELETE /api/v1/tables/{table_id} Move a table to Trash; with forever=true, it is deleted from Trash.
POST /api/v1/tables/{table_id}/restore Restore a table from Trash.
POST /api/v1/tables/{table_id}/duplicate Make a copy, with or without rows (rows).
PUT /api/v1/tables/{table_id}/state Your own pin, archive, labels and place in the Notes grid, and the date column on your calendar (calendar_column).
GET /api/v1/tables/calendar The dated rows of the tables you put on your calendar, from start to end.
POST /api/v1/tables/{table_id}/presence Say that you have a shared table open, or closed it.
GET /api/v1/tables/{table_id}/rows The rows of a view in its order, with groups, footers and link titles (view, spec, q, offset, limit).
POST /api/v1/tables/{table_id}/rows Add one row or many; typed values, or text to read (parse).
POST /api/v1/tables/{table_id}/rows/bulk Set a column on many rows, fill down, paste a range, or delete many rows.
POST /api/v1/tables/{table_id}/rows/restore Bring back deleted rows.
GET /api/v1/tables/{table_id}/rows/{row_id} One row with its link titles and the rows that link to it.
PATCH /api/v1/tables/{table_id}/rows/{row_id} Change cells; send base_version to merge per cell.
DELETE /api/v1/tables/{table_id}/rows/{row_id} Delete a row (restorable for 30 days).
POST /api/v1/tables/{table_id}/rows/{row_id}/duplicate Copy a row below itself.
POST /api/v1/tables/{table_id}/rows/{row_id}/move Move a row in the manual order.
GET /api/v1/tables/{table_id}/rows/{row_id}/changes A row's changes and each cell's earlier values.
POST /api/v1/tables/{table_id}/rows/{row_id}/restore Put a row, or one cell, back as it was after a change.
GET /api/v1/tables/{table_id}/deleted-rows Deleted rows with who deleted them and when.
POST /api/v1/tables/{table_id}/columns Add a column.
PATCH /api/v1/tables/{table_id}/columns/{col_id} Rename, retype (with a preview), change options or settings, move or resize a column.
DELETE /api/v1/tables/{table_id}/columns/{col_id} Delete a column (restorable for 30 days with its values).
POST /api/v1/tables/{table_id}/columns/{col_id}/restore Bring back a deleted column.
GET /api/v1/tables/{table_id}/columns/{col_id}/targets What a link cell can point at, by title (q).
GET /api/v1/tables/{table_id}/deleted-columns Deleted columns with their value counts.
POST /api/v1/tables/{table_id}/views Save a view (new, or over an existing one).
PATCH /api/v1/tables/{table_id}/views/{view_id} Change a view's sort, filters, group, hidden columns, footers or name.
DELETE /api/v1/tables/{table_id}/views/{view_id} Delete a view (not the last one).
POST /api/v1/tables/{table_id}/stats Totals and counts for a view or a filter, optionally per group.
GET /api/v1/tables/{table_id}/export.csv The current view or the whole table as CSV (scope, bom).
GET /api/v1/tables/{table_id}/export.xlsx The whole table or the current view (scope=view) as an Excel workbook with typed cells.
GET /api/v1/tables/export.xlsx Up to 20 whole tables (ids, comma-separated) in one workbook, one sheet each.
POST /api/v1/tables/{table_id}/import Append the rows of a CSV file; columns are matched by name.
GET /api/v1/tables/{table_id}/changes The table's changes in sessions, newest first.
POST /api/v1/tables/{table_id}/restore-point Restore the whole table to a moment in the last 30 days (preview first).
POST /api/v1/tables/{table_id}/revert Take back the changes of one batch (the undo of every table change).
POST /api/v1/tables/{table_id}/links Link a table to a conversation, an event, a task or a recording.
DELETE /api/v1/tables/{table_id}/links/{link_id} Remove a link.
POST /api/v1/tables/{table_id}/save-template Save the table's columns as a template (name).
GET /api/v1/tables/{table_id}/shares Who the table is shared with, as for notes.
PUT /api/v1/tables/{table_id}/shares/{principal} Share a table, or change a level, as for notes.
DELETE /api/v1/tables/{table_id}/shares/{principal} Stop sharing a table with a person or a group.
DELETE /api/v1/tables/{table_id}/shares/me Remove a table shared with you from your notes.
POST /api/v1/tables/{table_id}/shares/me Add a table you removed back (the undo).
POST /api/v1/tables/{table_id}/move-to-group Move your table into one of your groups, or out of its group.

Reminders and browser push

Route Description
POST /api/v1/push/webpush Turn on browser push for this browser.
DELETE /api/v1/push/webpush Turn off browser push for this browser.
GET /api/v1/push/webpush/key The VAPID key for subscribing a browser to push.
POST /api/v1/reminders/act A button on a browser push notification: snooze, done or dismiss. No session: the signed token in the request names you and the reminder.
GET /api/v1/reminders/active Reminders that fired and are waiting, and snoozes that came due.
GET /api/v1/today What today holds in one answer: events, tasks due, missed reminders, mail waiting on a reply, approvals (date= for another day).
GET /api/v1/activity What you, Ambrose and your agents changed, and your administrator's changes to your account, newest first, each with its undo request (signed-in person only).
POST /api/v1/activity/{entry_id}/undone Mark an Activity entry undone after its undo request was sent.
POST /api/v1/reminders/add Add a one-off reminder some minutes before an event.
POST /api/v1/reminders/handle Dismiss reminders.
GET /api/v1/reminders/settings Your reminder defaults.
PUT /api/v1/reminders/settings Change your reminder defaults.
POST /api/v1/reminders/snooze Snooze a task or event reminder.
GET /api/v1/reminders/state Reminder changes since a time, so every device stays in step. With kinds=e,t,n, note reminders are included.

Phone push targets

Route Description
GET /api/v1/push/targets Your phones registered for push, Mailr's VAPID key, and server: the server's own ntfy (MAILR_NTFY_URL) for the phone's setup.
POST /api/v1/push/targets Register a phone for push (UnifiedPush).
DELETE /api/v1/push/targets/{tid} Remove a push target.
GET /api/v1/admin/push-setup Admins: what a new member does for push on Android, and counts of people per push server. See Member setup.
POST /api/v1/push/targets/{tid}/test Send a test notification.

Assistant: orders, memory, skills, dictation

Scope: read, memory or rules to change.

Route Description
GET /api/v1/assistant/entities People, organisations, projects and places known to Ambrose.
POST /api/v1/assistant/entities Add one.
GET /api/v1/assistant/entities/{eid} One, with its memories.
PATCH /api/v1/assistant/entities/{eid} Change one.
DELETE /api/v1/assistant/entities/{eid} Delete one.
GET /api/v1/assistant/memories Ambrose's memories about you and your work, and its suggestions. With ids=1,2, only those notes are returned (the Used memories line).
GET /api/v1/assistant/memories/learning How learning from mail went: the last passes, with messages read, new suggestions and an error code.
POST /api/v1/assistant/memories Add a memory.
POST /api/v1/assistant/memories/learn Learn from your recent sent mail now (results arrive as suggestions).
PATCH /api/v1/assistant/memories/{mid} Change a note.
DELETE /api/v1/assistant/memories/{mid} Delete a note.
POST /api/v1/assistant/memories/{mid}/accept Accept a suggested note.
POST /api/v1/assistant/memories/{mid}/reject Dismiss a suggested note.
GET /api/v1/assistant/orders Your standing orders and routines.
POST /api/v1/assistant/orders Create a standing order or routine.
POST /api/v1/assistant/orders/preview Test an order on recent mail before you save it.
PATCH /api/v1/assistant/orders/{oid} Change, pause or resume an order. The built-in order takes only enabled and permission (ask or allow).
DELETE /api/v1/assistant/orders/{oid} Delete an order (never the built-in one).
POST /api/v1/assistant/orders/{oid}/move Move an order up or down (direction); the top one is applied first.
POST /api/v1/assistant/orders/{oid}/run Run an order now.
POST /api/v1/assistant/orders/{oid}/test Ask whether an order would apply to one conversation (nothing is changed).
GET /api/v1/assistant/profile Ambrose's information about you (About you).
PUT /api/v1/assistant/profile Change About you.
GET /api/v1/assistant/recall The notes Ambrose would recall for a request.
POST /api/v1/messages/{mid}/invite/link Give an event already in your calendar the invitation's identity (uid: the event), so the organiser's updates reach it.
POST /api/v1/messages/{mid}/invite/unlink Undo of the link: your event as it was.
POST /api/v1/messages/{mid}/itip/remove Remove the event an organiser cancelled from your calendar; its copy is kept for Undo.
POST /api/v1/messages/{mid}/itip/restore Undo of the removal.
POST /api/v1/calendar/events/{uid}/revert Undo an organiser change applied from your forward (message_id: the forward).
POST /api/v1/messages/{mid}/event-change Close a suggested move: status applied or dismissed.
GET /api/v1/assistant/trusted-addresses Your addresses trusted to speak for you, addresses that look like yours, and the addresses handled by another assistant. Signed-in users only.
POST /api/v1/assistant/trusted-addresses Add an address of yours; a confirmation code is mailed to it. Signed-in users only.
PUT /api/v1/assistant/trusted-addresses/mode For older app versions: with off, the order Follow my forwarded notes is turned off; with ask or allow, it is turned on with that permission.
DELETE /api/v1/assistant/trusted-addresses/{tid} Remove an address.
POST /api/v1/assistant/trusted-addresses/{tid}/confirm Confirm an address with its code.
POST /api/v1/assistant/trusted-addresses/{tid}/resend Send a new confirmation code.
GET /api/v1/assistant/runs Recent runs of your standing orders and routines.
GET /api/v1/assistant/skills Your skills.
POST /api/v1/assistant/skills Create a skill.
GET /api/v1/assistant/skills/resolve What the /name words in a prompt refer to.
POST /api/v1/assistant/skills/restore-builtins Bring back built-in skills you deleted.
POST /api/v1/assistant/skills/test Try a skill on a sample text.
GET /api/v1/assistant/skills/{sid} One skill.
PATCH /api/v1/assistant/skills/{sid} Change a skill.
DELETE /api/v1/assistant/skills/{sid} Delete a skill.
POST /api/v1/assistant/skills/{sid}/duplicate Copy a skill.
POST /api/v1/assistant/skills/{sid}/reset Restore a built-in skill's original text.
POST /api/v1/assistant/transcribe Turn a short voice clip into text (dictation). The clip is not stored.
GET /api/v1/conversations/{cid}/brief The brief a standing order left on a conversation.

Assistant chat and agent tools

Scope: depends on the tool.

Route Description
POST /api/v1/agent/chat Send a message to Ambrose; the answer is streamed back. local_only: true keeps the chat on the local model.
POST /api/v1/agent/chat/{session_id}/stop Stop Ambrose's current answer.
GET /api/v1/agent/chat/{session_id}/stream Reconnect to an answer that is still streaming.
POST /api/v1/agent/draft Help me write: draft a message or edit the current draft.
GET /api/v1/agent/commands The chat's slash commands, with what each does in your language.
GET /api/v1/agent/sessions Your past chats. With q, the chats whose title, questions or answers match, each with a snippet.
GET /api/v1/agent/sessions/{session_id} One past chat.
PATCH /api/v1/agent/sessions/{session_id} Rename a chat (title; when empty, the chat's short title, or else its first question, is used).
POST /api/v1/agent/sessions/{session_id}/retitle Make a new short title for a chat from its first question.
GET /api/v1/agent/reviews/{rid} A bulk review's progress: how many conversations are done and set aside, and its review card once ready.
POST /api/v1/agent/reviews/{rid}/stop Stop a bulk review after the batch in progress; what it decided so far is kept.
POST /api/v1/agent/reviews/{rid}/resume Continue a stopped or failed bulk review where it stopped.
GET /api/v1/agent/review-choices The moves you chose on review cards, remembered per sender (sender, move, count, when), latest first. Signed-in apps only.
DELETE /api/v1/agent/review-choices/{cid} Forget one remembered choice: that sender's mail goes to the model again in later reviews.
DELETE /api/v1/agent/review-choices Forget every remembered choice.
DELETE /api/v1/agent/sessions/{session_id} Delete a chat.
GET /api/v1/agent/tools The agent tools your token may call.
POST /api/v1/agent/tools/{name} Call one agent tool by name.
POST /api/v1/context Gather a conversation, its people and related mail into one bundle for a reply.

Approvals and permission rules

Route Description
GET /api/v1/approvals Actions waiting for approval, and recent decisions.
GET /api/v1/approvals/{aid} One approval request.
POST /api/v1/approvals/{aid}/decide Approve or deny a request (scope: once, session or always). With except_ids, a review card or a cleanup plan is approved without those conversations. With changes (conversation id → trash, archive, read, keep or label:<id>), a review card is approved with your own moves for conversations it showed. Session only.
POST /api/v1/approvals/decide-many Decide several waiting requests from one requester at once (Allow all). Session only.
POST /api/v1/approvals/grants/{rule_id}/undo Undo a grant made from a card: the rule is deleted, and the requests it decided that have not started wait again.
GET /api/v1/permissions Your permission rules for Ambrose and agents.
POST /api/v1/permissions Add a permission rule.
GET /api/v1/permissions/effective What each tool may do for a token or Ambrose: allow, ask or deny.
PATCH /api/v1/permissions/{rid} Change a permission rule.
DELETE /api/v1/permissions/{rid} Delete a permission rule.

API tokens and audit log

Scope: a signed-in session.

Route Description
GET /api/v1/audit The audit log of everything agents did with your tokens.
GET /api/v1/tokens Your API tokens.
POST /api/v1/tokens Create a token (shown once).
PATCH /api/v1/tokens/{tid} Rename a token or change its scopes.
DELETE /api/v1/tokens/{tid} Revoke a token.

Models per user

Route Description
GET /api/v1/me/models The model used for each assistant task, and the models available to choose from.
PUT /api/v1/me/models/{task} Choose your model for a task.
GET /api/v1/me/local-models Local models only for me: the household rule, your choice, the result, and whether the switch is locked.
PUT /api/v1/me/local-models Turn Local models only for me on or off.
GET /api/v1/me/model-use Per feature, which model did the work, local or hosted, and how often in the last days days (at most 90).

Recordings (Speakr)

Scope: recordings.

Route Description
POST /api/v1/integrations/speakr/{hook}/webhook The address for Speakr's notices of new or changed recordings.
POST /api/v1/speakr/connectors/{cid}/webhook Turn on Speakr's webhook for this account.
DELETE /api/v1/speakr/connectors/{cid}/webhook Turn the webhook off.
POST /api/v1/speakr/connectors/{cid}/webhook/test Test the webhook.
GET /api/v1/speakr/events/last-time The recording of the last meeting in a series.
GET /api/v1/speakr/events/recordings Recordings linked to (or suggested for) an event.
GET /api/v1/speakr/folders Your Speakr folders.
GET /api/v1/speakr/linked-conversations Conversations linked to recordings.
POST /api/v1/speakr/links Link a recording to an event, a conversation or a task.
DELETE /api/v1/speakr/links/{link_id} Remove a link.
GET /api/v1/speakr/mail-card The recording card shown on a conversation.
GET /api/v1/speakr/participants Everyone who appears in your recordings, grouped by person.
POST /api/v1/speakr/participants/dismiss Hide a participant name.
POST /api/v1/speakr/participants/merge Merge two participant names into one person.
POST /api/v1/speakr/participants/rename Rename a participant in every recording.
POST /api/v1/speakr/participants/separate Separate a name from a merged person.
GET /api/v1/speakr/people/recordings Recordings a person took part in.
GET /api/v1/speakr/recordings Your recordings, newest first.
POST /api/v1/speakr/recordings Upload a new recording to Speakr with its title, participants and date.
GET /api/v1/speakr/recordings/{cid}/{rid} One recording.
PATCH /api/v1/speakr/recordings/{cid}/{rid} Change a recording's title, participants, notes or tags.
POST /api/v1/speakr/recordings/{cid}/{rid}/action-items Propose the action items of a recording.
GET /api/v1/speakr/recordings/{cid}/{rid}/events Meetings mentioned in a recording.
POST /api/v1/speakr/recordings/{cid}/{rid}/follow-up Draft the follow-up email of a meeting.
GET /api/v1/speakr/recordings/{cid}/{rid}/notes A recording's notes.
GET /api/v1/speakr/recordings/{cid}/{rid}/people The people in a recording, matched to your contacts.
POST /api/v1/speakr/recordings/{cid}/{rid}/share Create a share link to a recording.
GET /api/v1/speakr/recordings/{cid}/{rid}/shares A recording's share links.
DELETE /api/v1/speakr/recordings/{cid}/{rid}/shares/{share_id} Revoke a share link.
GET /api/v1/speakr/recordings/{cid}/{rid}/speakers The speakers of a recording.
GET /api/v1/speakr/recordings/{cid}/{rid}/summary A recording's summary.
POST /api/v1/speakr/recordings/{cid}/{rid}/tasks Create tasks from chosen action items.
GET /api/v1/speakr/recordings/{cid}/{rid}/transcript A recording's transcript, or part of it.
GET /api/v1/speakr/search Search recordings by words.
POST /api/v1/speakr/speakers/{cid}/person Say who a speaker is.
DELETE /api/v1/speakr/speakers/{cid}/person Forget who a speaker is.
GET /api/v1/speakr/status Whether you have a Speakr account connected.
GET /api/v1/speakr/tags Your Speakr tags.
GET /api/v1/speakr/tasks/recordings Recordings a task came from or is linked to.
POST /api/v1/speakr/upload Send an audio or video attachment to Speakr.

Administration

Scope: a signed-in admin session. API tokens are refused, except an admin's token with the tls scope for the two /admin/tls routes.

Route Description
GET /api/v1/admin/models Model endpoints.
POST /api/v1/admin/models Add a model endpoint.
GET /api/v1/admin/phone-apps The Android apps offered on this server: the version downloaded to phones, the previous one, and the oldest version the server answers.
POST /api/v1/admin/phone-apps/{app} Publish a release APK of mailr or notes (multipart field file).
POST /api/v1/admin/phone-apps/{app}/rollback Make the previous version current again.
PUT /api/v1/admin/phone-apps/notes/min-version The oldest Notes app version the server answers ({"min_version": "1.1.0"}; empty for no limit). Older Notes apps get 426.
GET /api/v1/admin/onboarding/presets Prepared defaults for new users (by email or group).
POST /api/v1/admin/onboarding/presets Prepare a new user.
PUT /api/v1/admin/onboarding/presets/{pid} Change what is prepared.
DELETE /api/v1/admin/onboarding/presets/{pid} Remove a preparation.
GET /api/v1/admin/models/defaults The server's model for each task, and the model for local-only mail.
PUT /api/v1/admin/models/defaults/{task} Set the server's model for a task.
POST /api/v1/admin/models/probe List the models served by an endpoint, before you save it.
PATCH /api/v1/admin/models/{eid} Change a model endpoint.
DELETE /api/v1/admin/models/{eid} Remove a model endpoint.
POST /api/v1/admin/models/{eid}/probe List the models a saved endpoint serves.
POST /api/v1/admin/models/{eid}/test Send one tiny request to an endpoint: the time it took, or the error in plain words.
GET /api/v1/admin/policies Server-wide policies.
PUT /api/v1/admin/policies Change server-wide policies.
GET /api/v1/admin/access Access policies, the identity-provider groups seen at sign-in, and what a policy can hold.
POST /api/v1/admin/access/policies Add an access policy.
PUT /api/v1/admin/access/policies/{pid} Change an access policy.
DELETE /api/v1/admin/access/policies/{pid} Delete an access policy.
GET /api/v1/admin/users/{uid}/access A user's groups and the access that results.
PUT /api/v1/admin/users/{uid}/groups Assign policy groups to a password-only account. An account managed by the identity provider takes its groups from the provider (409).
GET /api/v1/admin/calendars Whether everyone gets the built-in Mailr calendar, and how many users have it.
PUT /api/v1/admin/calendars Turn the built-in calendar on for everyone, or only for some groups, or off. Nothing is deleted when it is turned off.
POST /api/v1/admin/calendars/phone-check Check from the server that the public calendar address is reachable and restricted.
GET /api/v1/admin/calendars/groups Every known group with its members and its calendars.
POST /api/v1/admin/calendars/groups Create a group calendar.
PATCH /api/v1/admin/calendars/groups/{cid} Change a group calendar.
GET /api/v1/admin/calendars/groups/{cid}/export A group calendar as one .ics file.
DELETE /api/v1/admin/calendars/groups/{cid} Delete a group calendar and everything in it, for every member (confirm must be its name).
GET /api/v1/admin/models/local-policy The household rule for hosted models: each person chooses, or local models only for everyone.
PUT /api/v1/admin/models/local-policy Change the household rule for hosted models.
GET /api/v1/admin/websearch The web search providers and page readers in the order they are tried. See Web search.
POST /api/v1/admin/websearch/providers Add a search provider or a page reader.
PATCH /api/v1/admin/websearch/providers/{pid} Change a provider or a page reader.
DELETE /api/v1/admin/websearch/providers/{pid} Remove a provider or a page reader.
POST /api/v1/admin/websearch/providers/{pid}/test One test search with a saved provider.
POST /api/v1/admin/websearch/test One test search with unsaved settings.
GET /api/v1/admin/diagnostics Every readiness check with its plain name, backup, push, background work, account health, model health and trusted proxies. With ?refresh=true, the checks are run now.
GET /api/v1/admin/status Health of the app, worker, mail store, queues and connectors.
GET /api/v1/admin/tls The IMAP certificate in use.
PUT /api/v1/admin/tls Install a certificate for IMAP.
GET /api/v1/admin/users Find users.
POST /api/v1/admin/users Add a user.
PATCH /api/v1/admin/users/{uid} Change a user: name, role, disabled.
DELETE /api/v1/admin/users/{uid} Remove a user and their data.
POST /api/v1/admin/users/{uid}/password Set a user's password.

System

Route Description
GET /api/v1/events A live stream (server-sent events) of changes to your mail, calendar and reminders.
GET /api/v1/health A health check for monitoring (no sign-in needed).
GET /api/v1/i18n/messages The texts of the server's error codes in a language (lang=de), with English for missing texts; an error response carries its code and params beside the English detail (no sign-in needed).
GET /api/v1/i18n/languages The languages the server has texts for (no sign-in needed).
GET /api/v1/health/egress For a monitor: 200 while the VPN egress for remote content works, 503 otherwise. The kind of failure is shown only with the monitor token (X-Health-Token) or to an admin.
GET /api/v1/errors/config The browser's error-reporting settings, or {"dsn": null} while error reporting is off (no sign-in needed).
POST /api/v1/errors/envelope The web app's error reports, cleaned of personal data and passed on to the configured error server (no sign-in needed).
GET /api/v1/health/ready Readiness checks for monitoring: database, mail store, worker, sync, export, backup target and push; 503 when a required one fails (no sign-in needed). See Monitoring.
GET /api/v1/health/live Liveness, the app container's healthcheck: 200 while the database and the mail store answer, 503 otherwise (no sign-in needed). See Monitoring.