“Activity Intents” extend the capabilities of an ActivityPub server beyond a user’s outbox, and enable direct interactions with content on the wider social web. They do this by publishing a machine-readable list of public URLs where users can perform key activities (such as Follow
, Like
, or Announce
) allowing other websites to initiate remote social interactions without cumbersome copying/pasting of URL strings.
The key words “MUST”, “SHOULD”, and “MAY” are to be interpreted as described in RFC2119.
For the purposes of this document, a “Home Server” is the location where a user is logged in, and that publishes the Actor’s Activity Intents via WebFinger. A “Remote Server” is another location on the Internet that the user wants to interact with, and that will request/receive those intents via WebFinger.
Most centralized social media services have widgets that allow users on the wider Internet to interact with their social services. These include “like” and “share” buttons that third-party websites embed into their content, and link users back to their corresponding social media account.
This is difficult to achieve in a federated environment.
There have been other attempts to make a “Share on Mastodon” button that performs a similar action on the Fediverse. But these tasks are implemented differently by different Fediverse servers. For example, Mastodon uses /share
, while Hubzilla uses /rpost
. Parameters to each application are often different, using variations of text
, title
, url
, and other values.
The lack of a unified standard has led developers to hard-code endpoints for each distinct application. This is brittle and vulnerable to changes by server authors. It also pins those URL endpoints, making them difficult for servers to change in the future without breaking an unknown number of “share” buttons out in the wild.
What is needed is a systematic way for each server to announce the endpoint URLs that they support.
In the most basic terms, Activity Intents expand on the common Fediverse use of WebFinger in FEP-4adb to include mappings between any Activity Type and the URL endpoint where that user can perform it. This expands and standardizes the “remote follow” workflow that was used by oStatus protocol, but has not been fully implemented by newer Fediverse applications and no longer has a public specification document.
When generating a WebFinger result for a user account, servers supporting Activity Intents SHOULD respond with one or more intent links in the “links” property. Activity Intent links MUST have rel
and template
properties. All others properties are ignored.
While the number and specific behavior of each Activity Intent is defined independently by each home server, to maximize compatibility home servers SHOULD publish all of the activities that they support. This gives remote servers the greatest opportunity to match as many activities as possible.
Here is an example response from a WebFinger server which includes three Activity Intents appended to the end of its links
property.
{
"subject": "acct:benpate@mastodon.social",
"aliases": [
"https://mastodon.social/@benpate",
"https://mastodon.social/users/benpate"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://mastodon.social/@benpate"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://mastodon.social/users/benpate"
},
{
"rel": "http://ostatus.org/schema/1.0/subscribe",
"template": "https://mastodon.social/authorize_interaction?uri={uri}"
},
{
"rel": "https://w3id.org/fep/3b86/Follow",
"template": "https://mastodon.social/authorize_interaction?uri={object}"
},
{
"rel": "https://w3id.org/fep/3b86/Create",
"template": "https://mastodon.social/share?uri={object}"
},
{
"rel": "https://w3id.org/fep/3b86/Like",
"template": "https://mastodon.social/intents/like?id={object}"
}
]
}
rel: Activity Intents use the https://w3id.org/fep/3b86/*
(as described in FEP-888d) to designate the kind of activity intent, where *
represents the particular Activity the user intends to perform. These relations – such as https://w3id.org/fep/3b86/Follow
, and https://w3id.org/fep/3b86/Create
– are listed in detail below.
template: Links use URI Templates as used in RFC-6415 to designate URLS and parameters to be injected by the caller – as in {uri}
or {name}
values. Note: WebFinger does not specify the template
parameter, but it is used here because 1) there’s a semantic benefit in identifying values not a links, but as link templates, and 2) it is already in use by oStatus, which should make it familiar to Fediverse developers.
Parameter names are chosen to correspond with Activity Vocabulary properties and may differ from parameters used by pre-existing implementations.
To prevent unrecognized properties from corrupting a workflow:
In all cases, Activity Intents intentionally use the property names defined in the W3C standard Activity Vocabulary. However, intents must fit into a URL, and must use commonly understood fields. So, Intent parameters can only use IDs – URL references to JSON-LD resources available elsewhere on the Internet.
In addition, remote servers MUST Percent Encode all values replaced in the URI Template.
Activity Intents MAY include additional query parameters on-success
and on-cancel
that allow home servers to return users to their original workflow on the remote server:
on-success - If present in the link template, this value identifies the action that the home server SHOULD take once the Activity Intent workflow is complete. If this parameter is missing, then the resulting page is left up to the home server to choose.
on-cancel - If present in the link template, this value identifies the action that the home server SHOULD take if they abort the Activity Intent workflow. If this parameter is missing, then the resulting page is left up to the home server to choose.
If the value of either on-success
or on-cancel
parameter is the string (close)
then the home server can assume that it is running in a pop-up window, and SHOULD close the current window.
If the value of either on-success
or on-cancel
query parameter is a valid URL, then the home server SHOULD redirect clients to the provided URL. When redirecting to a new URL, the home server MUST use an interstitial page that notified the user that they are being redirected, and displays the URL of the new page to them.
IMPORTANT! Unvalidated Redirects are a documented vulnerability that opens the home server up to phishing attacks.
To avoid a potential security vulnerability when handling on-success
and on-cancel
workflows, it is important that the home server: “Force all redirects to first go through a page notifying users that they are going off of your site, with the destination clearly displayed, and have them click a link to confirm.” (owasp.org)
The user’s home server is a trusted environment that manages the user’s sign-in status along with the rest of their social inbox and outbox. When the remote server links to an Activity Intent provided by the home server, the layout, fields, and UI are all determined by the home server
Remote servers MAY open Activity Intent links in many different environments, such as:
Home servers SHOULD build their UI with minimal assumptions so that the endpoint will fit well into as many environments as possible. Home servers may not be aware if the remote server opens the Activity Intent link in a separate popup window or not, so remote servers SHOULD include on-success
and on-cancel
parameters that redirect back to its own pages so that it can close the pop-up itself.
This intent corresponds to the ActivityStreams Accept activity and is defined using the link relation https://w3id.org/fep/3b86/Accept
.
The Accept intent publishes the API endpoint where the current user can “accept” the designated object.
{object}
- ID of the object that the user will accept when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform they abort the workflow.{
"rel": "https://w3id.org/fep/3b86/Accept",
"template": "https://server.org/intents/accept?objectId={object}"
}
This intent corresponds to the ActivityStreams Add activity and is defined using the link relation https://w3id.org/fep/3b86/Add
.
The Add intent publishes the API endpoint where the current user can add an object to the designated collection..
{object}
ID of the object that the user will add when they use this workflow.{target}
ID of the collection being added to.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Add",
"template": "https://server.org/intents/add?objectId={object}&targetId={target}"
}
This intent corresponds to the ActivityStreams Announce activity and is defined using the link relation https://w3id.org/fep/3b86/Announce
.
The Announce intent publishes the API endpoint where the current user can announce, or “boost” the provided document in their home server.
{object}
- ID of the document that the user will boost when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Announce",
"template": "https://server.org/intents/announce?objectId={object}"
}
This intent corresponds to the ActivityStreams Arrive activity and is defined using the link relation https://w3id.org/fep/3b86/Arrive
.
The Arrive intent publishes the API endpoint where the current user can indicate that they have arrived at a particular location from their home server.
{location}
- ID of the location object where the user will mark as “arrived” when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Arrive",
"template": "https://server.org/intents/arrive?hotelId={location}"
}
This intent corresponds to the ActivityStreams Block activity and is defined using the link relation https://w3id.org/fep/3b86/Block
.
The Block intent publishes the API endpoint where the current user can block the provided object from their home server.
{object}
- ID of the object (document, user, etc) that the user will block when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Block",
"template": "https://server.org/intents/block?userId={object}"
}
This intent corresponds to the ActivityStreams Create activity and is defined using the link relation https://w3id.org/fep/3b86/Create
.
The Create intent publishes the API endpoint where the current user can create a new post in their own outbox.
This is similar to the existing “share” endpoints supported by several Fediverse apps, where the user can create a new post in their inbox starting with some pre-populated content.
This Intent differs slightly from others in that it does not take an object ID as a parameter because it expects a the user’s home server to create a new object. Instead, the parameters for this Intent are meant to pre-populate into the new object that the user will create.
{type}
- (optional) Type of object to create (Note, Article, etc). Home servers can determine whether to use or ignore this value.{name}
- (optional) Name to pre-populate into the created object.{summary}
- (optional) Summary to pre-populate into the created object.{content}
- (optional) Text content to pre-populate into the created object.{inReplyTo}
- (optional)The ID of the ActivityStreams Document that the user is replying to.{attachment}
- (optional) ID of an object (such as a link or an image) that should be included in the created object.{tag}
- (optional) ID of an object (such as a tag definition) that should be referenced by the created object{startTime}
- (optional) a date-time that identifies the actual or expected starting time of the created object. RFC3339 format{endTime}
- (optional) a date-time that identifies the actual or expected ending time of the created object. RFC3339 format{describes}
(optional) the ID of an object to be described, when creating a Profile object.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Create",
"template": "https://mastodon.social/share?text={content}"
}
This intent corresponds to the ActivityStreams Delete activity and is defined using the link relation https://w3id.org/fep/3b86/Delete
.
The Delete intent publishes the API endpoint where the current user can initiate a “delete” request.
{object}
- ID of the object that the user will delete when they use this workflow.{origin}
- (optional) ID of the collection or context that the object will be deleted from.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Delete",
"template": "https://server.org/intents/Delete?objectId={object}"
}
This intent corresponds to the ActivityStreams Dislike activity and is defined using the link relation https://w3id.org/fep/3b86/Dislike
.
The Dislike intent publishes the API endpoint where the current user can initiate a “dislike” request.
{object}
- ID of the document that the user will dislike when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Dislike",
"template": "https://server.org/intent/dislike?objectId={object}"
}
This intent corresponds to the ActivityStreams Flag activity and is defined using the link relation https://w3id.org/fep/3b86/Flag
.
The Flag intent publishes the API endpoint where the current user can initiate a “flag” request, which is used to report inappropriate content.
{object}
- ID of the object (document, user, etc) that the user will flag when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Flag",
"template": "https://server.org/intent/flag?objectId={object}"
}
This intent corresponds to the ActivityStreams Follow activity and is defined using the link relation https://w3id.org/fep/3b86/Follow
.
The Follow intent publishes the API endpoint where the current user can initiate a “follow” request. This is similar to the remote follow workflow defined by oStatus that is still supported at various levels by several Fediverse apps, but is no longer formally documented.
{object}
- ID of the actor that the user will follow when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Follow",
"template": "https://mastodon.social/authorize_interaction?uri={object}"
}
This intent corresponds to the ActivityStreams Ignore activity and is defined using the link relation https://w3id.org/fep/3b86/Ignore
.
The Ignore intent publishes the API endpoint where the current user can initiate an “ignore” request, which is similar to a Block, and is used to ignore or mute various actors and objects online
{object}
- ID of the object that the user will mark “ignored” when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Ignore",
"template": "https://server.org/intents/ignore?objectId={object}"
}
This intent corresponds to the ActivityStreams Invite activity and is defined using the link relation https://w3id.org/fep/3b86/Invite
.
The Invite intent publishes the API endpoint where the current user can initiate an “invite” request, which is similar to an Offer, and is used to extend an invitation for the object to the target
{target}
- ID of the actor who will receive the invitation.{object}
- ID of the object (event, group, etc) that the actor will be invited to.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Invite",
"template": "https://server.org/intents/invite?actorId={object}&eventId={target}"
}
This intent corresponds to the ActivityStreams Join activity and is defined using the link relation https://w3id.org/fep/3b86/Join
.
The Join intent publishes the API endpoint where the current user can initiate a “join” request.
{object}
- ID of the object that the user will join when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Join",
"template": "https://server.org/intents/join?objectId={object}"
}
This intent corresponds to the ActivityStreams Leave activity and is defined using the link relation https://w3id.org/fep/3b86/Leave
.
The Leave intent publishes the API endpoint where the current user can initiate a “leave” request.
{object}
- ID of the object that the user will leave when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Leave",
"template": "https://server.org/intents/leave?objectId={object}"
}
This intent corresponds to the ActivityStreams Like activity and is defined using the link relation https://w3id.org/fep/3b86/Like
.
The Like intent publishes the API endpoint where the current user can like the current document.
{object}
- ID of the object that the user will mark as “liked” when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Like",
"template": "https://server.com/intents/like?objectId={object}"
}
This intent corresponds to the ActivityStreams Listen activity and is defined using the link relation https://w3id.org/fep/3b86/Listen
.
The Listen intent publishes the API endpoint where the current user can initiate a “listen” request.
{object}
- ID of the object that the user will mark as “listened” to when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Listen",
"template": "https://server.org/intents/listen?objectId={object}"
}
This intent corresponds to the ActivityStreams Move activity and is defined using the link relation https://w3id.org/fep/3b86/Move
.
The Move intent publishes the API endpoint where the current user can initiate a “move” request.
{object}
- ID of the object that the user will move when they use this workflow.{target}
- ID of the collection that the object will be moved to.{origin}
- (optional) ID of the collection that the object will be moved from.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Move",
"template": "https://server.org/intents/move?objectId={object}&destId={target}"
}
This intent corresponds to the ActivityStreams Offer activity and is defined using the link relation https://w3id.org/fep/3b86/Offer
.
The Offer intent publishes the API endpoint where the current user can initiate an “offer” request.
{object}
- ID of the object that the user will offer when they use this workflow.{target}
- ID of the actor that will receive the offer.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Offer",
"template": "https://server.org/intents/offer?objectId={object}&to={target}"
}
This intent corresponds to the ActivityStreams Question activity and is defined using the link relation https://w3id.org/fep/3b86/Question
.
The Question intent publishes the API endpoint where the current user can initiate an “question” workflow.
{name}
- The “name” property to pre-populate into the question the user will ask when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Question",
"template": "https://server.org/intents/question?name={name}"
}
This intent corresponds to the ActivityStreams Read activity and is defined using the link relation https://w3id.org/fep/3b86/Read
.
The Read intent publishes the API endpoint where the current user can initiate an “read” request.
{object}
- ID of the object that the user will mark as “read” when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Read",
"template": "https://server.org/intents/object?objectId={object}"
}
This intent corresponds to the ActivityStreams Reject activity and is defined using the link relation https://w3id.org/fep/3b86/Reject
.
The Reject intent publishes the API endpoint where the current user can initiate an “reject” request.
{object}
- ID of the object that the user will reject when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Reject",
"template": "https://server.org/intents/reject?offerId={object}"
}
This intent corresponds to the ActivityStreams Remove activity and is defined using the link relation https://w3id.org/fep/3b86/Remove
.
The Remove intent publishes the API endpoint where the current user can initiate a “remove” request.
{object}
- ID of the object that the user will remove when they use this workflow.{target}
- (optional) The ID of the collection that the object will be removed from.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Reject",
"template": "https://server.org/intents/reject?objectId={object}"
}
This intent corresponds to the ActivityStreams TentativeAccept activity, which itself is a specialization of the Accept activity and is defined using the link relation https://w3id.org/fep/3b86/TentativeAccept
.
The TentativeAccept intent publishes the API endpoint where the current user can initiate an “tentative accept” request, indicating that acceptance of the original offer is tentative.
{object}
- ID of the object that the user will tentatively accept when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/TentativeAccept",
"template": "https://server.org/intents/tentativeAccept?objectId={object}"
}
This intent corresponds to the ActivityStreams TentativeReject activity, which itself is a specialization of the Reject activity and is defined using the link relation https://w3id.org/fep/3b86/TentativeReject
.
The TentativeReject intent publishes the API endpoint where the current user can initiate an “tentative reject” request, indicating that rejection of the original offer is tentative.
{object}
- ID of the object that the user will tentatively reject when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/TentativeReject",
"template": "https://server.org/intents/tentativeReject?objectId={object}"
}
This intent corresponds to the ActivityStreams Travel activity and is defined using the link relation https://w3id.org/fep/3b86/Travel
.
The Travel intent publishes the API endpoint where the user can initiate a “travel” request.
{target}
- (optional) The ID of the location that the actor will travel to.{origin}
- (optional) The ID of the location that the actor will travel from.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Travel",
"template": "https://server.org/intents/travel?from={origin}&to={target}"
}
This intent corresponds to the ActivityStreams Undo activity and is defined using the link relation https://w3id.org/fep/3b86/Undo
.
The Undo intent publishes the API endpoint where the current user can initiate a “travel” request.
{object}
- ID of the activity that the actor will undo.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) URL to redirect users if they abort the workflow.{
"rel": "https://w3id.org/fep/3b86/Undo",
"template": "https://server.org/intents/undo?activityId={object}"
}
This intent corresponds to the ActivityStreams Update activity and is defined using the link relation https://w3id.org/fep/3b86/Update
.
The Update intent publishes the API endpoint where the user can initiate an “update” request.
{object}
- ID of the object that the actor will update when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/Update",
"template": "https://server.org/intents/update?objectId={object}"
}
This intent corresponds to the ActivityStreams View activity and is defined using the link relation https://w3id.org/fep/3b86/View
.
The View intent publishes the API endpoint where the current user can initiate an “update” request.
{object}
- ID of the object that the actor will mark as “viewed” when they use this workflow.{on-success}
- (optional) Workflow action to perform after the workflow completes.{on-cancel}
- (optional) Workflow action to perform if the user aborts the workflow.{
"rel": "https://w3id.org/fep/3b86/View",
"template": "https://server.org/intents/view?objectId={object}"
}
In addition to the activities defined in the Activity Vocabulary spec, this FEP defines a few additional intents that home severs SHOULD publish, and remote servers MAY implement.
This intent corresponds to the ActivityStreams Object definition, and is intended as a way for users to open an object from a remote server directly in their home server. This is analogous to copying the URL of the object in question, then pasting the URL into the search box of the user’s home server.
This intent only opens the object using the user’s home server. It does not trigger an ActivityPub activity. Because of this, it does not use the on-success
and on-cancel
workflows because there is no action to succeed, and no action to cancel.
{object}
- ID of the object that the actor will open in their home server when they use this workflow.{
"rel": "https://w3id.org/fep/3b86/Object",
"template": "https://server.org/intents/object?objectId={object}"
}
It is important to reiterate some key security practices to prevent Cross Site Request Forgery vulnerabilities.
GET
requests to Home Servers.Activity Intents includes the ability for home servers to redirect browsers to new URLs based on the on-success
and on-cancel
query parameters. If improperly implemented, this has the potential to expose an Unvalidated Redirect vulnerability, which can open the home server up to phishing attack.
To avoid a potential security vulnerability when handling on-success
and on-cancel
workflows, it is important that the home server: “Force all redirects to first go through a page notifying users that they are going off of your site, with the destination clearly displayed, and have them click a link to confirm.” (owasp.org)
There is another good description of this issue OAuth 2.0 Security Best Current Practice § 4.11. Open Redirection
This FEP provides the prerequisite information required for a “Home Server” publish Activity Intents for its Actors. It does not specify how “Remote Servers” will use this information - i.e., how they implement “share” and “like” buttons in their content.
Here is a brief example of the workflow as implemented by a remote server:
localStorage
)on-success
parameter to redirect the user back to the correct page on the remote server.
on-cancel
parameter to redirect the user back to the correct page on the remote server.Remote servers MAY also account for applications that do not publish Activity Intents, but whose endpoints are still well known. In this case, remote servers SHOULD use Activity Intents links if they are present, then fall back to older links (such as the oStatus /authorize_interaction
endpoint) if they are present, then fall back to hard-coded values (such as the Mastodon /share
endpoint) if no other values exist.
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
To the extent possible under law, the authors of this Fediverse Enhancement Proposal have waived all copyright and related or neighboring rights to this work.