move to 2.5.5
[anni] / docs / development / API / differences_in_mastoapi_responses.md
1 # Differences in Mastodon API responses from vanilla Mastodon
2
3 A Pleroma instance can be identified by "<Mastodon version> (compatible; Pleroma <version>)" present in `version` field in response from `/api/v1/instance`
4
5 ## Flake IDs
6
7 Pleroma uses 128-bit ids as opposed to Mastodon's 64 bits. However, just like Mastodon's ids, they are lexically sortable strings
8
9 ## Timelines
10
11 Adding the parameter `with_muted=true` to the timeline queries will also return activities by muted (not by blocked!) users.
12
13 Adding the parameter `exclude_visibilities` to the timeline queries will exclude the statuses with the given visibilities. The parameter accepts an array of visibility types (`public`, `unlisted`, `private`, `direct`), e.g., `exclude_visibilities[]=direct&exclude_visibilities[]=private`.
14
15 Adding the parameter `reply_visibility` to the public and home timelines queries will filter replies. Possible values: without parameter (default) shows all replies, `following` - replies directed to you or users you follow, `self` - replies directed to you.
16
17 Adding the parameter `instance=lain.com` to the public timeline will show only statuses originating from `lain.com` (or any remote instance).
18
19 Home, public, hashtag & list timelines accept these parameters:
20
21 - `only_media`: show only statuses with media attached
22 - `local`: show only local statuses
23 - `remote`: show only remote statuses
24
25 ## Statuses
26
27 - `visibility`: has additional possible values `list` and `local` (for local-only statuses)
28
29 Has these additional fields under the `pleroma` object:
30
31 - `local`: true if the post was made on the local instance
32 - `conversation_id`: the ID of the AP context the status is associated with (if any)
33 - `direct_conversation_id`: the ID of the Mastodon direct message conversation the status is associated with (if any)
34 - `in_reply_to_account_acct`: the `acct` property of User entity for replied user (if any)
35 - `content`: a map consisting of alternate representations of the `content` property with the key being its mimetype. Currently, the only alternate representation supported is `text/plain`
36 - `spoiler_text`: a map consisting of alternate representations of the `spoiler_text` property with the key being its mimetype. Currently, the only alternate representation supported is `text/plain`
37 - `expires_at`: a datetime (iso8601) that states when the post will expire (be deleted automatically), or empty if the post won't expire
38 - `thread_muted`: true if the thread the post belongs to is muted
39 - `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint.
40 - `parent_visible`: If the parent of this post is visible to the user or not.
41 - `pinned_at`: a datetime (iso8601) when status was pinned, `null` otherwise.
42
43 The `GET /api/v1/statuses/:id/source` endpoint additionally has the following attributes:
44
45 - `content_type`: The content type of the status source.
46
47 ## Scheduled statuses
48
49 Has these additional fields in `params`:
50
51 - `expires_in`: the number of seconds the posted activity should expire in.
52
53 ## Media Attachments
54
55 Has these additional fields under the `pleroma` object:
56
57 - `mime_type`: mime type of the attachment.
58
59 ### Attachment cap
60
61 Some apps operate under the assumption that no more than 4 attachments can be returned or uploaded. Pleroma however does not enforce any limits on attachment count neither when returning the status object nor when posting.
62
63 ### Limitations
64
65 Pleroma does not process remote images and therefore cannot include fields such as `meta` and `blurhash`. It does not support focal points or aspect ratios. The frontend is expected to handle it.
66
67 ## Accounts
68
69 The `id` parameter can also be the `nickname` of the user. This only works in these endpoints, not the deeper nested ones for following etc.
70
71 - `/api/v1/accounts/:id`
72 - `/api/v1/accounts/:id/statuses`
73
74 `/api/v1/accounts/:id/statuses` endpoint accepts these parameters:
75
76 - `pinned`: include only pinned statuses
77 - `tagged`: with tag
78 - `only_media`: include only statuses with media attached
79 - `with_muted`: include statuses/reactions from muted accounts
80 - `exclude_reblogs`: exclude reblogs
81 - `exclude_replies`: exclude replies
82 - `exclude_visibilities`: exclude visibilities
83
84 Endpoints which accept `with_relationships` parameter:
85
86 - `/api/v1/accounts/:id`
87 - `/api/v1/accounts/:id/followers`
88 - `/api/v1/accounts/:id/following`
89 - `/api/v1/mutes`
90
91 Has these additional fields under the `pleroma` object:
92
93 - `ap_id`: nullable URL string, ActivityPub id of the user
94 - `background_image`: nullable URL string, background image of the user
95 - `tags`: Lists an array of tags for the user
96 - `relationship` (object): Includes fields as documented for Mastodon API https://docs.joinmastodon.org/entities/relationship/
97 - `is_moderator`: boolean, nullable,  true if user is a moderator
98 - `is_admin`: boolean, nullable, true if user is an admin
99 - `confirmation_pending`: boolean, true if a new user account is waiting on email confirmation to be activated
100 - `hide_favorites`: boolean, true when the user has hiding favorites enabled
101 - `hide_followers`: boolean, true when the user has follower hiding enabled
102 - `hide_follows`: boolean, true when the user has follow hiding enabled
103 - `hide_followers_count`: boolean, true when the user has follower stat hiding enabled
104 - `hide_follows_count`: boolean, true when the user has follow stat hiding enabled
105 - `settings_store`: A generic map of settings for frontends. Opaque to the backend. Only returned in `/api/v1/accounts/verify_credentials` and `/api/v1/accounts/update_credentials`
106 - `chat_token`: The token needed for Pleroma shoutbox. Only returned in `/api/v1/accounts/verify_credentials`
107 - `deactivated`: boolean, true when the user is deactivated
108 - `allow_following_move`: boolean, true when the user allows automatically follow moved following accounts
109 - `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
110 - `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
111 - `notification_settings`: object, can be absent. See `/api/v1/pleroma/notification_settings` for the parameters/keys returned.
112 - `accepts_chat_messages`: boolean, but can be null if we don't have that information about a user
113 - `favicon`: nullable URL string, Favicon image of the user's instance
114
115 ### Source
116
117 Has these additional fields under the `pleroma` object:
118
119 - `show_role`: boolean, nullable, true when the user wants his role (e.g admin, moderator) to be shown
120 - `no_rich_text` - boolean, nullable, true when html tags are stripped from all statuses requested from the API
121 - `discoverable`: boolean, true when the user allows external services (search bots) etc. to index / list the account (regardless of this setting, user will still appear in regular search results)
122 - `actor_type`: string, the type of this account.
123
124 ## Conversations
125
126 Has an additional field under the `pleroma` object:
127
128 - `recipients`: The list of the recipients of this Conversation. These will be addressed when replying to this conversation.
129
130 ## GET `/api/v1/conversations`
131
132 Accepts additional parameters:
133
134 - `recipients`: Only return conversations with the given recipients (a list of user ids). Usage example: `GET /api/v1/conversations?recipients[]=1&recipients[]=2`
135
136 ## Account Search
137
138 Behavior has changed:
139
140 - `/api/v1/accounts/search`: Does not require authentication
141
142 ## Search (global)
143
144 Unlisted posts are available in search results, they are considered to be public posts that shouldn't be shown in local/federated timeline.
145
146 ## Notifications
147
148 Has these additional fields under the `pleroma` object:
149
150 - `is_seen`: true if the notification was read by the user
151
152 ### Move Notification
153
154 The `type` value is `move`. Has an additional field:
155
156 - `target`: new account
157
158 ### EmojiReact Notification
159
160 The `type` value is `pleroma:emoji_reaction`. Has these fields:
161
162 - `emoji`: The used emoji
163 - `account`: The account of the user who reacted
164 - `status`: The status that was reacted on
165
166 ### ChatMention Notification (not default)
167
168 This notification has to be requested explicitly.
169
170 The `type` value is `pleroma:chat_mention`
171
172 - `account`: The account who sent the message
173 - `chat_message`: The chat message
174
175 ### Report Notification (not default)
176
177 This notification has to be requested explicitly.
178
179 The `type` value is `pleroma:report`
180
181 - `account`: The account who reported
182 - `report`: The report
183
184 ## GET `/api/v1/notifications`
185
186 Accepts additional parameters:
187
188 - `exclude_visibilities`: will exclude the notifications for activities with the given visibilities. The parameter accepts an array of visibility types (`public`, `unlisted`, `private`, `direct`). Usage example: `GET /api/v1/notifications?exclude_visibilities[]=direct&exclude_visibilities[]=private`.
189 - `include_types`: will include the notifications for activities with the given types. The parameter accepts an array of types (`mention`, `follow`, `reblog`, `favourite`, `move`, `pleroma:emoji_reaction`, `pleroma:chat_mention`, `pleroma:report`). Usage example: `GET /api/v1/notifications?include_types[]=mention&include_types[]=reblog`.
190
191 ## DELETE `/api/v1/notifications/destroy_multiple`
192
193 An endpoint to delete multiple statuses by IDs.
194
195 Required parameters:
196
197 - `ids`: array of activity ids
198
199 Usage example: `DELETE /api/v1/notifications/destroy_multiple/?ids[]=1&ids[]=2`.
200
201 Returns on success: 200 OK `{}`
202
203 ## POST `/api/v1/statuses`
204
205 Additional parameters can be added to the JSON body/Form data:
206
207 - `preview`: boolean, if set to `true` the post won't be actually posted, but the status entity would still be rendered back. This could be useful for previewing rich text/custom emoji, for example.
208 - `content_type`: string, contain the MIME type of the status, it is transformed into HTML by the backend. You can get the list of the supported MIME types with the nodeinfo endpoint.
209 - `to`: A list of nicknames (like `lain@soykaf.club` or `lain` on the local server) that will be used to determine who is going to be addressed by this post. Using this will disable the implicit addressing by mentioned names in the `status` body, only the people in the `to` list will be addressed. The normal rules for post visibility are not affected by this and will still apply.
210 - `visibility`: string, besides standard MastoAPI values (`direct`, `private`, `unlisted`, `local` or `public`) it can be used to address a List by setting it to `list:LIST_ID`.
211 - `expires_in`: The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour.
212 - `in_reply_to_conversation_id`: Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`.
213
214 ## GET `/api/v1/statuses`
215
216 An endpoint to get multiple statuses by IDs.
217
218 Required parameters:
219
220 - `ids`: array of activity ids
221
222 Usage example: `GET /api/v1/statuses/?ids[]=1&ids[]=2`.
223
224 Returns: array of Status.
225
226 The maximum number of statuses is limited to 100 per request.
227
228 ## PATCH `/api/v1/accounts/update_credentials`
229
230 Additional parameters can be added to the JSON body/Form data:
231
232 - `no_rich_text` - if true, html tags are stripped from all statuses requested from the API
233 - `hide_followers` - if true, user's followers will be hidden
234 - `hide_follows` - if true, user's follows will be hidden
235 - `hide_followers_count` - if true, user's follower count will be hidden
236 - `hide_follows_count` - if true, user's follow count will be hidden
237 - `hide_favorites` - if true, user's favorites timeline will be hidden
238 - `show_role` - if true, user's role (e.g admin, moderator) will be exposed to anyone in the API
239 - `default_scope` - the scope returned under `privacy` key in Source subentity
240 - `pleroma_settings_store` - Opaque user settings to be saved on the backend.
241 - `skip_thread_containment` - if true, skip filtering out broken threads
242 - `allow_following_move` - if true, allows automatically follow moved following accounts
243 - `also_known_as` - array of ActivityPub IDs, needed for following move
244 - `pleroma_background_image` - sets the background image of the user. Can be set to "" (an empty string) to reset.
245 - `discoverable` - if true, external services (search bots) etc. are allowed to index / list the account (regardless of this setting, user will still appear in regular search results).
246 - `actor_type` - the type of this account.
247 - `accepts_chat_messages` - if false, this account will reject all chat messages.
248 - `language` - user's preferred language for receiving emails (digest, confirmation, etc.)
249
250 All images (avatar, banner and background) can be reset to the default by sending an empty string ("") instead of a file.
251
252 ### Pleroma Settings Store
253
254 Pleroma has mechanism that allows frontends to save blobs of json for each user on the backend. This can be used to save frontend-specific settings for a user that the backend does not need to know about.
255
256 The parameter should have a form of `{frontend_name: {...}}`, with `frontend_name` identifying your type of client, e.g. `pleroma_fe`. It will overwrite everything under this property, but will not overwrite other frontend's settings.
257
258 This information is returned in the `/api/v1/accounts/verify_credentials` endpoint.
259
260 ## Authentication
261
262 *Pleroma supports refreshing tokens.*
263
264 ### POST `/oauth/token`
265
266 You can obtain access tokens for a user in a few additional ways.
267
268 #### Refreshing a token
269
270 To obtain a new access token from a refresh token, pass `grant_type=refresh_token` with the following extra parameters:
271
272 - `refresh_token`: The refresh token.
273
274 #### Getting a token with a password
275
276 To obtain a token from a user's password, pass `grant_type=password` with the following extra parameters:
277
278 - `username`: Username to authenticate.
279 - `password`: The user's password.
280
281 #### Response body
282
283 Additional fields are returned in the response:
284
285 - `id`: The primary key of this token in Pleroma's database.
286 - `me` (user tokens only): The ActivityPub ID of the user who owns the token.
287
288 ## Account Registration
289
290 `POST /api/v1/accounts`
291
292 Has these additional parameters (which are the same as in Pleroma-API):
293
294 - `fullname`: optional
295 - `bio`: optional
296 - `captcha_solution`: optional, contains provider-specific captcha solution,
297 - `captcha_token`: optional, contains provider-specific captcha token
298 - `captcha_answer_data`: optional, contains provider-specific captcha data
299 - `token`: invite token required when the registrations aren't public.
300 - `language`: optional, user's preferred language for receiving emails (digest, confirmation, etc.), default to the language set in the `userLanguage` cookies or `Accept-Language` header.
301
302 ## Instance
303
304 `GET /api/v1/instance` has additional fields
305
306 - `max_toot_chars`: The maximum characters per post
307 - `chat_limit`: The maximum characters per chat message
308 - `description_limit`: The maximum characters per image description
309 - `poll_limits`: The limits of polls
310 - `upload_limit`: The maximum upload file size
311 - `avatar_upload_limit`: The same for avatars
312 - `background_upload_limit`: The same for backgrounds
313 - `banner_upload_limit`: The same for banners
314 - `background_image`: A background image that frontends can use
315 - `pleroma.metadata.features`: A list of supported features
316 - `pleroma.metadata.federation`: The federation restrictions of this instance
317 - `pleroma.metadata.fields_limits`: A list of values detailing the length and count limitation for various instance-configurable fields.
318 - `pleroma.metadata.post_formats`: A list of the allowed post format types
319 - `vapid_public_key`: The public key needed for push messages
320
321 ## Push Subscription
322
323 `POST /api/v1/push/subscription`
324 `PUT /api/v1/push/subscription`
325
326 Permits these additional alert types:
327
328 - pleroma:chat_mention
329 - pleroma:emoji_reaction
330
331 ## Markers
332
333 Has these additional fields under the `pleroma` object:
334
335 - `unread_count`: contains number unread notifications
336
337 ## Streaming
338
339 ### Chats
340
341 There is an additional `user:pleroma_chat` stream. Incoming chat messages will make the current chat be sent to this `user` stream. The `event` of an incoming chat message is `pleroma:chat_update`. The payload is the updated chat with the incoming chat message in the `last_message` field.
342
343 ### Remote timelines
344
345 For viewing remote server timelines, there are `public:remote` and `public:remote:media` streams. Each of these accept a parameter like `?instance=lain.com`.
346
347 ### Follow relationships updates
348
349 Pleroma streams follow relationships updates as `pleroma:follow_relationships_update` events to the `user` stream.
350
351 The message payload consist of:
352
353 - `state`: a relationship state, one of `follow_pending`, `follow_accept` or `follow_reject`.
354
355 - `follower` and `following` maps with following fields:
356   - `id`: user ID
357   - `follower_count`: follower count
358   - `following_count`: following count
359
360 ## User muting and thread muting
361
362 Both user muting and thread muting can be done for only a certain time by adding an `expires_in` parameter to the API calls and giving the expiration time in seconds.
363
364 ## Not implemented
365
366 Pleroma is generally compatible with the Mastodon 2.7.2 API, but some newer features and non-essential features are omitted. These features usually return an HTTP 200 status code, but with an empty response. While they may be added in the future, they are considered low priority.
367
368 ### Suggestions
369
370 *Added in Mastodon 2.4.3*
371
372 - `GET /api/v1/suggestions`: Returns an empty array, `[]`
373
374 ### Trends
375
376 *Added in Mastodon 3.0.0*
377
378 - `GET /api/v1/trends`: Returns an empty array, `[]`
379
380 ### Identity proofs
381
382 *Added in Mastodon 2.8.0*
383
384 - `GET /api/v1/identity_proofs`: Returns an empty array, `[]`
385
386 ### Featured tags
387
388 *Added in Mastodon 3.0.0*
389
390 - `GET /api/v1/featured_tags`: Returns HTTP 404