documentation/content/en/development/activitypub.md

4.7 KiB

title description menu
ActivityPub compliance What objects and properties of the ActivityPub spec Mastodon supports
docs
parent weight
development 5

APIs

Restrictions

  • All object IDs must use the https:// schema.
  • Servers must offer a WebFinger endpoint for turning usernames into actors.
  • Activities attributed to an actor must have an ID on the same host as the actor.

Activities

Supported activity Supported objects
Accept Follow
Add Note
Announce Object
Block Object
Create Note, Article, Image, Video, Page
Delete Object
Flag Object
Follow Object
Like Object
Move Object
Reject Follow
Remove Note
Undo Accept, Announce, Block, Follow, Like
Update Object

As far as the Create activity is concerned, only Note is a first-class citizen in Mastodon, because Mastodon is a microblogging engine. For other types of supported objects, Mastodon internally creates a toot representation, for example, an Article or Page becomes a toot with the name and url of the original object, as users are expected to navigate to the original URL to read the article with rich text formatting. For Image and Video objects, the name is likewise used to fill the content of the toot, with the original file attached to the toot.

The Flag activity allows reporting content on another server, and its object can be either one or more actors, or one or more objects attributed to various actors. The Add and Remove activities only work with featured collections. The Delete activity can be used to delete all local data of the sender when the object of it is the sender. The Update activity can only be used to update the profile of the sender. Likewise, the Move activity allows re-assigning followers from the sender (object) to another actor (target), but only if the other actor references the sender in the alsoKnownAs property.

Extensions

What is known in Mastodon as "pinned toots", or statuses that are always featured at the top of people's profiles, is implemented using an extra property featured on the actor object that points to a Collection of objects. Example:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
        
    {
      "toot": "http://joinmastodon.org/ns#",
      "featured": {
        "@id": "toot:featured",
        "@type": "@id"
      }
    }
  ],

  "id": "https://example.com/@alice",
  "type": "Person",
  "featured": "https://example.com/@alice/collections/featured"
}

Custom emojis

Mastodon supports arbitrary emojis, that is, small images uploaded by admins and invokable via shortcodes. For this, an Emoji type is used. These emojis are listed in the tag property just like Mention and Hashtag objects, since they are entities that affect how the text is rendered. Example:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
        
    {
      "toot": "http://joinmastodon.org/ns#",
      "Emoji": "toot:Emoji"
    }
  ],

  "id": "https://example.com/@alice/hello-world",
  "type": "Note",
  "content": "Hello world :Kappa:",
  "tag": [
    {
      "id": "https://example.com/emoji/123",
      "type": "Emoji",
      "name": ":Kappa:",
      "icon": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://example.com/files/kappa.png"
      }
    }
  ]
}

Focal points

Mastodon supports setting a focal point on uploaded images, so that wherever that image is displayed, the focal point stays in view. This is implemented using an extra property focalPoint on the Image objects. The property is simply an array of two floating points between 0 and 1. Example:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
        
    {
      "toot": "http://joinmastodon.org/ns#",
      "focalPoint": {
        "@container": "@list",
        "@id": "toot:focalPoint"
      }
    }
  ],

  "id": "https://example.com/@alice/hello-world",
  "type": "Note",
  "content": "A picture attached!",
  "attachment": [
    {
      "type": "Image",
      "mediaType": "image/png",
      "url": "https://example.com/files/cats.png",
      "focalPoint": [
        0.55,
        0.43
      ]
    }
  ]
}