activitypub.md 4.5 KB
Newer Older
1 2 3 4 5
---
title: ActivityPub compliance
description: What objects and properties of the ActivityPub spec Mastodon supports
menu:
  docs:
6
    parent: development
7 8 9 10 11
    weight: 5
---

## APIs

12 13 14
- Mastodon supports the server-to-server part of the [ActivityPub spec](https://www.w3.org/TR/activitypub/).
- It implements the [HTTP signatures spec](https://tools.ietf.org/html/draft-cavage-http-signatures-10) for authentication of inbox deliveries.
- Mastodon also supports [Linked Data Signatures](https://w3c-dvcg.github.io/ld-signatures/) for forwarded payloads.
15 16 17

## Restrictions

18 19
- All object IDs must use the `https://` schema.
- Servers must offer a [WebFinger](https://tools.ietf.org/html/rfc7033) endpoint for turning usernames into actors.
20
- `Application`, `Group`, `Organization`, `Person`, `Service` are valid actors.
21
- Activities attributed to an actor must have an ID on the same host as the actor.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

## Activities

|Supported activity|Supported objects|Notes|
|------------------|-----------------|-----|
|`Accept`|`Follow`|The `object` of the `Follow` is expected to be an actor from the receiving server|
|`Add`|`Note`|Only the actor's own objects and only to the actor's featured collection URI as `target`|
|`Announce`|`Object`|Any object supported by `Create` is supported here|
|`Block`|`Object`|The `object` is expected to point to an actor from the receiving server|
|`Create`|`Note`, `Article`, `Image`, `Video`||
|`Delete`|`Object`|Only the actor's own objects will be deleted, such as anything created before
|`Flag`|`Object`|The `object` is expected to point to one or multiple objects originating on the receiving server|
|`Follow`|`Object`|The `object` is expected to point to an actor from the receiving server|
|`Like`|`Object`|The `object` is expected to be something created on the receiving server|
|`Move`|`Object`|Only the actor's own actor object can be moved to another actor object at `target`|
|`Reject`|`Follow`|The `object` of the `Follow` is expected to be an actor from the receiving server|
|`Remove`|`Note`|Only the actor's own objects and only from the actor's featured collection URI as `origin`|
|`Undo`|`Accept`, `Announce`, `Block`, `Follow`, `Like`||
|`Update`|`Object`|Only the actor's own actor object can be updated|

## Extensions
### Featured collection

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:

```json
{
  "@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:

```json
{
  "@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:

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
```json
{
  "@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
      ]
    }
  ]
}
```