Skip to content

JMAP capabilities

JMAP is extensible: mail, calendars, contacts and the other kinds of data are each defined by their own specification. A client therefore needs to know which extensions a server supports before it uses them. A JMAP server announces each extension it supports as a capability, identified by a URI, in the session resource at /jmap/session.

The session lists the capabilities at two levels. Under capabilities, it lists those of the server as a whole, with the server-wide limits. Under each account in accounts, it lists those available for that account. A client uses a capability only when it appears for the account, and it names the capability in the using list of each request.

The following table lists the capabilities that Stalwart advertises, with the specification behind each and the settings that limit it:

CapabilitySpecificationProvidesLimited by
urn:ietf:params:jmap:coreRFC 8620Requests, uploads, downloads, pushJMAP limits
urn:ietf:params:jmap:mailRFC 8621Mailboxes, messages, threads, searchMessage and mailbox limits
urn:ietf:params:jmap:submissionRFC 8621Sending messages, identities
urn:ietf:params:jmap:vacationresponseRFC 8621Automatic replies
urn:ietf:params:jmap:mail:sharedraft-ietf-jmap-mail-sharingSharing mailboxes with other accounts
urn:ietf:params:jmap:emailpushdraft-ietf-jmap-emailpushMessage contents in push notificationsmaxPushSize on the Jmap object
urn:ietf:params:jmap:contactsRFC 9610Address books and contactsmaxAddressBooksPerCard on the AddressBook object
urn:ietf:params:jmap:contacts:parseRFC 9610Parsing vCard filesparseLimitContact
urn:ietf:params:jmap:calendarsdraft-ietf-jmap-calendarsCalendars and eventsmaxCalendarsPerEvent, maxAttendees and maxExpandedQueryDuration on the Calendar object
urn:ietf:params:jmap:calendars:parsedraft-ietf-jmap-calendarsParsing iCalendar filesparseLimitEvent
urn:ietf:params:jmap:principalsRFC 9670Users, groups and resources the account can share with
urn:ietf:params:jmap:principals:ownerRFC 9670The principal that owns each account
urn:ietf:params:jmap:principals:availabilitydraft-ietf-jmap-calendarsFree/busy informationmaxAvailabilityDuration on the Calendar object
urn:ietf:params:jmap:filenodedraft-ietf-jmap-filenodeFiles and folders
urn:ietf:params:jmap:sieveRFC 9661Sieve scriptsLimits on the SieveUserInterpreter object
urn:ietf:params:jmap:blobRFC 9404Blob upload, copying and lookupmaxRequestSize, maxMethodCalls
urn:ietf:params:jmap:quotaRFC 9425The account’s quotas
urn:ietf:params:jmap:websocketRFC 8887JMAP over WebSocketWebSocket settings on the Jmap object
urn:ietf:params:jmap:webpush-vapidRFC 9749VAPID for push subscriptionsAdvertised while webPushKey is set
urn:ietf:params:jmap:metadatadraft-ietf-jmap-metadataObject metadataThe Metadata object; advertised only when it enables at least one data type
urn:stalwart:jmapStalwartThe configuration and management APIPermissions of the account

The limits that a capability publishes, such as maxSizeUpload and maxObjectsInGet in core, are taken from the settings named in the last column.

A capability appears for an account only when the user holds the permission to use it. For example, jmapEmailGet is required for mail, mail:share and emailpush, jmapEmailSubmissionCreate for submission, jmapCalendarEventGet for calendars, jmapContactCardGet for contacts, jmapFileNodeGet for filenode, jmapSieveScriptGet for sieve, and jmapMetadataGet for metadata. Four capabilities need no such permission: websocket, principals, principals:availability and urn:stalwart:jmap are listed for every account. Permissions lists all of them.

Some capabilities make sense only for the user’s own account. For an account shared with the user by another user, submission, vacationresponse, sieve, quota and emailpush are therefore not listed. A request authenticated with an OAuth token lists only the capabilities its scopes allow.

Besides the errors of RFC 8620, the calendar extension can return the method error expandDurationTooLarge, when a query asks to expand recurring events over a longer period than maxExpandedQueryDuration.