FEP-8a8e: A common approach to using the Event object type¶
| Authors | Status | Date received | Tracking issue | Discussions | Repository |
|---|---|---|---|---|---|
| André Menrath andre.menrath@posteo.de, les lesion@autistici.org | DRAFT |
2025-04-23 | #565 | Discussions | codeberg |
Summary¶
ActivityStreams defines the Object Type Event. In real-world applications, the event object immediately showed the need for extension. Applications featuring Event objects have often chosen to add additional attributes and clarifications (i.e., interpretations) in order to implement their particular use case. This proposal clarifies and extends the ActivityPub standard to address the needs that have arisen in real-world implementations.
This includes guidelines for the minimal interoperable event, handling of RSVP ("répondez s'il vous plaît", i.e., attendee management, and side effects), attendee capacities, physical location addresses, virtual locations, timezone, and clarification of how to control the visibility of events in federation.
These differences in how the aforementioned features are implemented have led to fragmentation in how events are published, discovered, and managed across platforms.
What is not covered¶
We do not cover recurrence, multiple-scheduled, and connected events.
For more information on that, check out for example: - RFC 5545 Section 3.8.5.3 - RFC 5545 Section 3.8.4.5
History¶
Fediverse applications, such as Mobilizon, Friendica, Gancio, and Hubzilla, have adopted varying approaches for handling ActivityPub events. Their different aims and the varying use cases have led to fragmentation in how events are published, discovered, and managed across federation.
Friendica and Hubzilla, for instance, follow the example set by ActivityStreams 2.0, using Invite for events, which seems to be very suited for smaller, more private gatherings, such as a birthday party. Invite seems natural when visibility is intentionally limited. On the other hand, applications like Mobilizon or Gancio have a focus on announcing public events and therefore chose to make use of the Create activity. Maybe another reason was that using creates eases interoperability with applications that do not support the Invite activity (yet). Furthermore, this may be justified because public events should as well be discoverable by anonymous actors, even by people who do not have an account in the Fediverse. This is achieved through federated event calendars, which are assembled by the instance administrators, who can add various federated event sources by following federated ActivityPub actors.
Within Mobilizon, for historical and internal reasons, the federated visibility of events is currently still controlled by whether a Group has published the Event or not, and whether the Event has also been announced at least once, rather than using to/cc (e.g., like Mastodon's "public silent"). In federation with other applications, this and other discrepancies led to issues, which have proven to be huge blockers. That's why this FEP sets out to define a common ground.
Requirements¶
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this specification are to be interpreted as described in RFC-2119.
The context of attributes: Attributes that have no context prefix are to be interpreted as being in the https://www.w3.org/ns/activitystreams context.
Object Type Event¶
The ActivityStreams specification already defines an object type Event which is inheriting all properties from the base Object, so some properties useful for describing an event are already specified, but some others are missing, and an enhanced specification will help.
For an Event at least the following properties are REQUIRED:
-
name: A simple, human-readable, plain-text title for the event. HTML markup MUST NOT be included. Values for the name MUST NOT be an empty string and the name MAY be expressed using multiple language-tagged values. -
startTime: The date and time describing the moment the event began or is scheduled to begin in the format as specified in the Activity Stream 2.0 specification. ThestartTimeis not REQUIRED in case an event is postponed and ahttps://w3id.org/fep/8a8e/previousStartTimeis set instead. -
endTime: The date and time when the event ends or is scheduled to end in the format as specified in the Activity Stream 2.0 specification. TheendTimeMUST be a later date than thestartTime. If the event is open-ended, it must include an end time at which applications (not humans) can treat the event as having ended.
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/foo",
"name": "New years party",
"startTime": "2014-12-31T23:00:00Z",
"endTime": "2015-01-01T06:00:00Z",
"organizers": null
}
Events with Open End¶
If the event is open-ended, or the endTime is not intended to be displayed to humans, the https://w3id.org/fep/8a8e/displayEndTime attribute SHOULD be used and set to false.
Receiving an Event with an endTime set and no https://w3id.org/fep/8a8e/displayEndTime set, it MUST be treated as if https://w3id.org/fep/8a8e/displayEndTime is set to true, requiring the endTime to be displayed.
If an Event is received with no endTime set, the Event MUST be treated as if https://w3id.org/fep/8a8e/displayEndTime were set to false to avoid misleading users. In such cases, the receiving application MAY infer an appropriate endTime based on its requirements.
Time zone¶
This section is non-normative.
The https://w3id.org/fep/8a8e/timezone property is introduced to support time zone information for events, enabling consistent handling of local "wall times".
It is important to note that the "time-offset" component in
startTimeandendTimeproperty does not correlate to time-zones, and while times that include the "time-offset" component work well for timestamps, they cannot be reliably converted to and from local "wall times" without additional information and processing.
https://www.w3.org/TR/activitystreams-core/#dates
For this reason, if the Event is primarily conducted in a single specific time-zone, the application SHOULD set the https://w3id.org/fep/8a8e/timezone.
In case the https://w3id.org/fep/8a8e/timezone property is specified it MUST be a specific IANA time zone identifier included in the IANA Time Zone Database (often called tz or zoneinfo, see https://www.w3.org/TR/timezone/#time-zone-identifiers).
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/foo",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00+01:00",
"endTime": "2015-01-01T04:00:00+01:00",
"timezone": "Europe/Rome"
}
Location¶
ActivityStreams provides a flexible framework for representing locations, as outlined in this section of the specification. However, its flexibility can sometimes lead to ambiguity.
This section aims to establish a clear and consistent format for representing the locations of events, whether they are physical, virtual, or mixed.
Rather than creating a new schema, this specification adopts the location property from Schema.org with some adjustments to better suite federated event handling:
-
Exclusion of
Textas a valid type: Unlike the original Schema.org definition, Text is not a permitted type for location and MUST NOT be used. If only a name is required to describe a location, the Place type can be used. -
Support for multiple locations: To specify mixed-format events (e.g., hybrid online and offline events), the location property can contain an array of locations. Each entry in the array can represent either a physical
Placeor aVirtualLocation.
Physical¶
For adding information about a physical location of an Event the Place object within the events location property SHOULD be extended via the attribute address which is of type https://schema.org/address or https://schema.org/Place MAY be used directly.
This allows the address to be given as a simple text input as well as a structured https://schema.org/PostalAddress. Applications MUST be able to transmogrify both incoming address types to their internal representation.
It is RECOMMENDED to always provide geolocation data via longitude and latitude, as filtering by these properties is crucial in federation.
Note Even if users do not provide this data directly, attempting to look up the geolocation of a physical location once on the source side can save a lot of resources caused by multiple lookups on the receivers in federation.
Example with pure text address:
{
"@context": [
"https://schema.org",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00+01:00",
"endTime": "2015-01-01T04:00:00+01:00",
"location": {
"type": "Place",
"name": "Foo Bar",
"address": "15 Fediverse Street, 8010 Fediverse Town, Austria",
"latitude": 47.06829,
"longitude": 15.45634
}
}
Example with address of type https://schema.org/PostalAddress:
{
"@context": [
"https://schema.org",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"location": {
"id": "",
"type": "Place",
"name": "Foo Bar",
"address": {
"type": "PostalAddress",
"addressCountry": "Austria",
"addressLocality": "Fediverse Town",
"addressRegion": "Steiermark",
"postalCode": "8010",
"streetAddress": "15 Fediverse Street"
},
"latitude": 47.077892,
"longitude": 15.460744
}
}
Virtual¶
An online Location SHOULD be represented by using a type VirtualLocation as specified in https://schema.org/VirtualLocation.
Applications SHOULD at least set and be able to make use of name and url properties.
{
"@context": [
"https://schema.org",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "Fediverse Moderation Meeting",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"location": {
"type": "VirtualLocation",
"name": "Jitsi Meet Meeting Link",
"url": "https://jitsi.example.org/fediverse-moderation-meeting"
}
}
Hybrid¶
Using multiple entries in location makes it easy to define multiple virtual and physical locations.
When not supporting multiple entries in location applications MUST use the first supported item.
{
"@context": [
"https://schema.org",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "Discussion about the Fediverse",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"location": [
{
"type": "Place",
"name": "Fediverse University",
"url": "https://university.example.com",
"address": "15 Fediverse Street, 1337 Fediverse Town, Fediverse Country"
},
{
"type": "VirtualLocation",
"name": "Big Blue Button Participation Link",
"url": "https://bbb.example.com/meeting-room-1"
},
{
"type": "VirtualLocation",
"name": "Live Stream",
"url": "https://peertube.example.com/fediverse-discussion"
}
]
}
Event status¶
To indicate the status of an Event, the https://w3id.org/fep/8a8e/eventStatus property MUST be used. As a fallback, it is RECOMMENDED to also support the status property, especially for incoming remote events, which might contain a value from https://www.w3.org/2002/12/cal/ical#status.
The possible values for the https://w3id.org/fep/8a8e/eventStatus are:
- EventCancelled
- EventMovedOnline
- EventPostponed
- EventRescheduled
- EventScheduled
- EventTentative
Note
https://w3id.org/fep/8a8e/eventStatusis almost identical tohttps://schema.org/eventStatus, however it has an additional status type for the event being tentative, which is leaned on iCalendar'sTENTATIVE.
RSVP (Attendee Management)¶
Not handling RSVP¶
If the event creator or the event creator's application does not handle joins via ActivityPub it MUST always respond to Join activities with an Ignore response, where the attribute object MUST either contain the ID of the Join activity, or contain a Join object with the target being set to the event-objects ID, where the former is preferred.
This SHOULD be made clear beforehand by setting https://w3id.org/fep/8a8e/joinMode to none.
Signaling how joins are handled¶
If an application does not handle joins of an Event via ActivityPub, but knows of an external URL which handles the attendee management https://w3id.org/fep/8a8e/joinMode SHOULD be set to external. If joinMode is set to external, also https://w3id.org/fep/8a8e/externalParticipationUrl SHOULD be set.
Note This is compatible with Mobilizon's definition of
joinMode, but it is not identical.
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/foo",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"joinMode": "external",
"externalParticipationUrl": "https://example.org/foo#register"
}
Note
externalParticipationUrlcould also be amailto-URI, which is a way of handling event participants that is still used quite frequently by many organizers.
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/fediverse-workshop",
"organizers": null,
"name": "Fediverse Workshop",
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2025-01-01T04:00:00-08:00",
"joinMode": "external",
"externalParticipationUrl": "mailto:fediverse-workshop@example.org"
}
Indicating visibility and target audience of RSVP requests¶
Who the participants of an event are should possibly not be public, but should, for example, only be visible to the organisers of the event, in other cases also to other confirmed participants, or, for example, completely anonymously. An Event SHOULD provide information about the visibility scope of valid Join requests targeting the event via utilizing https://w3id.org/fep/8a8e/requiredJoinVisibility.
Showing RSVP status via ActivityPub¶
To specify the maximum number of attendees for an Event, applications SHOULD use the https://schema.org/maximumAttendeeCapacity.
Remaining attendee capacity SHOULD be shown indirectly via using the Collection https://w3id.org/fep/8a8e/attendees. This is a list of all event attendees. Every Actor that has accepted an Invite containing the Event as an object or which Join targeting the Event has been accepted is added as a side effect. Note that also other object types other than Actor (and it's subclasses) might be part of that collection, e.g. when an application allows for attendees to register by e-mail. In that case using https://schema.org/Person or https://schema.org/Organization is RECOMMENDED. The attendees collection MUST be either an OrderedCollection or a Collection and MAY be filtered by the privileges of an authenticated user, or as appropriate if no authentication is given.
{
"@context": [
"https://schema.org",
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/foo-bar-party",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"maximumAttendeeCapacity": 100,
"attendees": {
"type": "Collection",
"id": "https://example.org/foo-bar-party/attendees",
"totalItems": 84
}
}
Attendees Collection¶
Every Event MAY have an attendees collection. This is a list of all actors that meet one or more of the following conditions, added as a side effect.
- The actor has sent a
Joinactivity with this object as theobjectproperty that has been answered with anAccept. - The actor has responded to an
Inviteactivity from theEvent's owner (where the Event is specified as theobjectproperty) with anAcceptactivity.
The attendees collection MUST be either an OrderedCollection or a Collection and MAY be filtered on privileges of an authenticated user or as appropriate when no authentication is given. This collection MAY have the totalItems set regardless of authentication. If https://schema.org/maximumAttendeeCapacity is used totalItems SHOULD be public to disclose remaining capacity.
Event Banner and Poster Images¶
Flyer¶
If the event has an image in the style of a flyer or a share-pic which is representing the whole event (i.e., is also containing at least the name and start-date in the image) this image SHOULD be set using the image attribute.
Banner¶
If the Event has a particular banner image, this image SHOULD be set as the first attachment of type Image (type Document is also valid but not RECOMMENDED). To indicate that an image from within the attachment attribute of an Event should be preferred over the flyer/share-pic image(s) within image attribute, for the use of list pages and header images, the attribute https://w3id.org/fep/8a8e/isBannerImage SHOULD be set.
Federated event calendars usually have thumbnail images with fixed aspect ratios. Therefore, https://docs.joinmastodon.org/spec/activitypub/#focalPoint SHOULD be set.
Note Providing multiple versions of banner images and specifying
widthandheightgives receiving applications the most flexibility to choose the most appropriate one based on aspect ratio.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"toot": "http://joinmastodon.org/ns#",
"focalPoint": {
"@container": "@list",
"@id": "toot:focalPoint"
}
}
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"image": {
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://example.com/images/new-year-party-flyer.png",
"focalPoint": [
-0.55,
0.43
]
}
}
Event Categories¶
Federated event platforms benefit from a shared understanding of general event categories. These categories serve a distinct purpose from user-generated tags or hashtags. While hashtags are typically entered freely and reflect a specific language, event categories are drawn from a limited, generalized set, making them more suitable for tasks like filtering events in aggregated or joined calendars.
To represent categories, this FEP introduces the property https://w3id.org/fep/8a8e/category.
In most cases, a single category should be sufficient. However, multiple categories may be included when relevant. Applications SHOULD utilize at least the following recommended set of event categories:
- ARTS
- AUTO_BOAT_AIR
- BOOK_CLUBS
- BUSINESS
- CAUSES
- CLIMATE_ENVIRONMENT
- COMMUNITY
- COMEDY
- CRAFTS
- CREATIVE_JAM
- DIY_MAKER_SPACES
- FAMILY_EDUCATION
- FASHION_BEAUTY
- FESTIVALS
- FILM_MEDIA
- FOOD_DRINK
- GAMES
- INCLUSIVE_SPACES
- LANGUAGE_CULTURE
- LEARNING
- LGBTQ
- MEETING
- MEDITATION_WELLBEING
- MOVEMENTS_POLITICS
- MUSIC
- NETWORKING
- OUTDOORS_ADVENTURE
- PARTY
- PERFORMING_VISUAL_ARTS
- PETS
- PHOTOGRAPHY
- SCIENCE_TECH
- SPIRITUALITY_RELIGION_BELIEFS
- SPORTS
- THEATRE
- WORKSHOPS_SKILL_SHARING
Note Implementing applications may extend this list or allow user-generated categories. However, such additions may not be understood by all consuming platforms and could default to a generic or "unknown" category.
Example of an event with a single category¶
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/event/1",
"name": "Demonstration againt fascism",
"startTime": "2014-05-01T12:00:00-08:00",
"startTime": "2014-05-01T18:00:00-08:00",
"organizer": null,
"category": "MOVEMENTS_POLITICS"
}
Example of an event with multiple categories¶
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/open-mic-jam",
"name": "Open Mic Jam at Sunny's",
"startTime": "2014-12-12T20:00:00-08:00",
"endTime": "2014-12-12T23:00:00-08:00",
"organizer": null,
"category": [
"MUSIC",
"CREATIVE_JAM"
]
}
Discoverability¶
Fediverse applications that feature Event objects MAY provide public calendars, search functions or grouped visualization pages (e.g., for tags or categories) that display events from multiple federated sources.
In both cases these MUST never include events from federation that do not have https://www.w3.org/ns/activitystreams#Public (also as:Public or Public is valid) set in to. However, they MAY appear within a local representation of a remote actor, if Public set in cc.
The discoverability of an incoming event from federation MUST NOT be controlled by the type of the actor set in attributedTo or by the Activity the event was received (e.g., Announce, Create).
Organizers Collection¶
Events SHOULD indicate their organizers by using https://w3id.org/fep/8a8e/organizers.
The organizers collection helps provide clarity about the event's management, supports federated discovery, and improves interoperability across platforms.
The value of the organizers field MUST be either an OrderedCollection or a Collection.
The items within this collection MAY include actors, or links.
If the organizer is not an ActivityPub entity (e.g., a website or organization without an actor), it is recommended to either use a Link or https://schema.org/Person or https://schema.org/Organization.
{
"@context": [
"https://schema.org",
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/foo-bar-party",
"name": "New Year's Party",
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"organizers": {
"type": "OrganizersCollection",
"id": "https://example.org/foo-bar-party/organizers",
"totalItems": 3,
"first": {
"type": "CollectionPage",
"partOf": "https://example.org/foo-bar-party/organizers",
"items": [
"https://example.social/users/johnmastodon",
"https://example.org/somewebsite",
{
"type": "Organization",
"id": "https://example.events/actors/eventorganizer",
"context": "https://example.events/actors/eventorganizer/accept/example.org-foo-bar-party-offer"
}
]
}
}
}
Explicit Non-Disclosure¶
If the event’s organizers are intentionally not disclosed, the organizers field MUST be set to null, have totalItems: 0, or contain an empty items array. This explicitly indicates a deliberate choice to withhold organizer information and takes precedence over any assumptions about organizers based on other fields. In such a case, when receiving an event, clients MUST NOT infer organizers from other event data.
Fallback to attributedTo¶
If the organizers property is omitted, it MAY be inferred that the actors in the attributedTo property are the event's organizers. For events with multiple organizers, it is RECOMMENDED to provide an organizers collection to avoid and ensure compatibility with applications that do not support arrays in attributedTo.
Upcoming Events Collection for Actors¶
Every actor that has published Events SHOULD have a https://w3id.org/fep/8a8e/upcomingEvents collection to list their future or ongoing events. This collection MUST follow these rules:
-
Collection Type:
The collection MUST be anOrderedCollectionor one of its subtypes. -
Ordering: Events MUST be ordered in ascending order by their
startTime, with the earliest events appearing first. -
Items:
Each item in the collection MUST meet the following criteria: - Type: The item MUST be of type
Eventor one of its subtypes. - Time: The
Event'sendTimeMUST NOT be earlier than the current time, i.e., the event is ongoing or scheduled in the future. - Actor Involvement: At least one of the following conditions MUST apply:
- The
Actoris included in theEvent'sorganizerscollection. - The
Actorowns theEvent, i.e., is part of theEvent'sattributedTo. - The
Eventis in the actor'ssharescollection, and theEventshares the same host with theactor. This use case is primarily intended to cover relay and groupActors.
- The
Terms¶
Note that the terms joinMode and externalParticipationUrl are compatible with and also leaned on the extensions defined by Mobilizon.
displayEndTime
- URI
https://w3id.org/fep/8a8e/displayEndTime- Label
- Whether to display the endTime
- Comment
- A property that defines whether the end time of an event should be displayed.
- Domain
- displayEndTime
- Range
- Boolean
- Is defined by
- FEP-8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"displayEndTime": false
}
upcomingEvents
- URI
https://w3id.org/fep/8a8e/upcomingEvents- Label
- Ordered collection of upcoming Events
- Comment
- An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first.
- Range
- An OrderedCollection (@id)
- Is defined by
- FEP-8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Organization",
"upcomingEvents": {
"type": "OrderedCollection",
"items": [
{ "type": "Event", "startTime": "2025-06-01T12:00:00Z" },
{ "type": "Event", "startTime": "2025-07-15T15:30:00Z" }
]
}
}
OrganizersCollection
- URI
https://w3id.org/fep/8a8e/OrganizersCollection- Label
- An Event's Organizer Collection
- Comment
- Inherits all properties from
https://www.w3.org/ns/activitystreams#Collectionwith the addition that theitemsmay also includehttps://schema.org/Personorhttps://schema.org/Organization. - Subclass of
- Object
- See also
- organizers
- Is defined by
- FEP-8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams",
{
"sc": "http://schema.org/"
}
],
"type": "OrganizersCollection",
"items": [
{ "type": "Group", "name": "ActivityPub Group Actor", "id": "https://example.org/actors/group1"},
{ "type": "Link", "href": "https://organizer1.example.org"},
{ "type": "sc:Person", "name": "Alice" },
{ "type": "Organization", "name": "Event Co." }
]
}
organizers
- URI
https://w3id.org/fep/8a8e/organizers- Label
- Organizers Collection
- Comment
- An ActivityStreams Collection collection that lists the entities that are disclosed to as organizers of an event. If set to
nullthis explicitly indicates a deliberate choice to withhold organizer information. - Range
- OrganizersCollection (SubType of of the Collection or OrderedCollection ActivityStreams Type) or
null - Required
- Yes
- Functional
- No
- Is defined by
- FEP-8a8e
{
"@context": [
"https://schema.org",
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams",
{
"sc": "http://schema.org/"
}
],
"type": "Event",
"organizers": {
"type": "OrganizersCollection",
"totalItems": 4,
"items": [
{ "type": "Person", "name": "ActivityPub Person Actor", "id": "https://example.org/actors/1"},
{ "type": "Link", "href": "https://organizer1.example.org"},
{ "type": "sc:Person", "name": "Alice" },
{ "type": "sc:Organization", "name": "Event Co." }
]
}
}
AttendeesCollection
- URI
https://w3id.org/fep/8a8e/AttendeesCollection- Label
- A Collection of the Event's attendees
- Comment
-
Inherits all properties from
https://www.w3.org/ns/activitystreams#Collectionwith the addition that theitemsmay also includehttps://schema.org/Personorhttps://schema.org/Organization. The items of theAttendeesCollectionare entities that are confirmed attendees by an Events organizer(s). It contains all ActivityPub actors that meet one or more of the following conditions, added as a side effect.- The actor has sent a Join activity with this object as the object property that has been answered with an Accept.
- The actor has responded to an Invite activity from the Event's owner (where the Event is specified as the object property) with an Accept activity.
- Subclass of
- Object
- See also
- attendees
- Is defined by
- FEP-8a8e
{
"@context": [
"https://schema.org",
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams",
{
"sc": "https://schema.org/"
}
],
"type": "AttendeesCollection",
"totalItems": 2,
"id": "https://example.org/events/alice-birthday-party"
"items": [
{ "type": "Person", "name": "Bob", "id": "https://example.org/actors/bob"},
{ "type": "sc:Person", "name": "Alice", "email": "alice@example.org"}
]
}
attendees
- URI
https://w3id.org/fep/8a8e/attendees- Label
- Attendees of an Event
- Comment
- Is defined by
- FEP-8a8e
- Range
- Collection (ActivityStreams Type)
- Required
- No
- Functional
- No
{
"@context": [
"https://schema.org",
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams",
{
"sc": "https://schema.org#"
}
],
"type": "Event",
"attendees": {
"type": "OrganizersCollection",
"totalItems": 4,
"items": [
{ "type": "Person", "name": "ActivityPub Person", "id": "https://example.org/actors/1"},
{ "type": "Link", "href": "https://organizer1.example.org"},
{ "type": "sc:Person", "name": "Alice" },
{ "type": "sc:Organization", "name": "Event Co." }
]
}
}
timezone
- URI
https://w3id.org/fep/8a8e/timezone- Label
- The timezone of an Event
- Comment
- Indicates the timezone for which the time(s) indicated in the event are given. The value provided should be among those listed in the IANA Time Zone Database.
- Is defined by
- FEP-8a8e
- Range
- IANA Time Zone identifier
- Required
- No
- Functional
- No
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/events/new-years-party",
"name": "New years party",
"startTime": "2014-12-31T23:00:00Z",
"endTime": "2015-01-01T06:00:00Z",
"timezone": "Europe/Vienna",
"organizers": null
}
joinMode
- URI
https://w3id.org/fep/8a8e/joinMode- rdfs:label
- Join mode
- rdfs:comment
-
Indicator of how new members may be able to join an event.
Accepted values:
free,restricted,external,none,invite. Ifexternal, you must also setexternalParticipationUrl. - rdfs:domain
- as:Event
- rdfs:range
- A string
- rdfs:isDefinedBy
- FEP‑8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"url": "http://example.org/events/1234",
"joinMode": "restricted"
}
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"url": "http://example.org/events/1234",
"joinMode": "external",
"externalParticipationUrl": "https://www.escample.org/events/1234/participate"
}
requiredJoinVisibility
- Label
- Required Join Visibility
- Comment
-
Specifies the minimum audience that must be addressed in a valid
Joinactivity related to the event. This can include individual actors, groups, theas:Publiccollection, or any other URI. TheJoinactivity must be addressed accordingly (e.g., usingto,cc,bto, oraudience). - Domain
- as:Event
- Range
- A list of any addressed targets, i.e. URIs (@list)
- Is defined by
- FEP-8a8e
{
"@context": [
"https://schema.org",
"https://https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"id": "https://example.org/yoga-workshop",
"name": "Yoga Workshop with Alice and Bob",
"startTime": "2014-12-12T18:00:00-08:00",
"endTime": "2014-12-12T19:30:00-08:00",
"attributedTo": "https://example.org/groups/fediyoga",
"organizers": {
"type": "OrganizersCollection",
"id": "https://example.org/yoga-workshop/organizers",
"totalItems": 3,
"first": {
"type": "CollectionPage",
"partOf": "https://example.org/yoga-workshop/organizers",
"items": [
"https://example.org/users/bob",
"https://example.org/users/alice",
"https://example.org/groups/fediyoga"
]
},
"joinMode": "restricted",
"requiredJoinVisibility": [
"https://example.org/yoga-workshop/organizers"
]
}
externalParticipationUrl
- URI
https://w3id.org/fep/8a8e/externalParticipationUrl- rdfs:label
- External participation URL
- rdfs:comment
-
A URL that points to an external platform where people can join the event or where they can buy tickets for the event. Required if
joinModeis set toexternal. - rdfs:domain
- as:Event
- rdfs:range
- xsd:anyURI
- rdfs:isDefinedBy
- FEP‑8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"type": "Event",
"url": "http://example.org/events/1234",
"joinMode": "external",
"externalParticipationUrl": "https://www.meetup.com/somegroup/events/00000/"
}
isBannerImage
- URI
https://w3id.org/fep/8a8e/isBannerImage- rdfs:label
- Image is a banner image
- rdfs:comment
- Whether an image is an (events) banner image.
- rdfs:domain
- as:Image
- rdfs:range
- Boolean
- rdfs:isDefinedBy
- FEP‑8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams",
{
"toot": "http://joinmastodon.org/ns#",
"focalPoint": {
"@container": "@list",
"@id": "toot:focalPoint"
}
}
],
"type": "Event",
"id": "https://example.org/new-year-party",
"name": "New years party",
"organizers": null,
"startTime": "2014-12-31T23:00:00-08:00",
"endTime": "2015-01-01T04:00:00-08:00",
"image": {
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://example.com/images/new-year-party-flyer.png",
"focalPoint": [
-0.55,
0.43
]
},
"attachment": [
{
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://example.com/images/new-year-party-banner.png",
"width": 1000,
"height": 500,
"isBannerImage": true
}
]
}
eventStatus
- URI
https://w3id.org/fep/8a8e/eventStatus- Label
- The events status is
- Comment
- An eventStatus of an event represents its status; particularly useful when an event is cancelled or rescheduled.
- Domain
- Event
- Range
- EventStatusType (@vocab)
- Required
- No
- Functional
- Yes
- See also
- EventCancelled | EventScheduled | EventTentative | EventMovedOnline | EventPostponed | EventRescheduled
- Is defined by
- FEP-8a8e
{
"@context": [
"https://w3id.org/fep/8a8e",
"https://www.w3.org/ns/activitystreams"
],
"id": "https://domain.example/events/0",
"type": "Event",
"eventStatus": "EventScheduled"
}
EventStatusType
- URI
https://w3id.org/fep/8a8e/8a8e- Label
- 8a8e
- Comment
- EventStatusType is an enumeration type whose instances represent several states that an Event may be in.
- Subclass of
- https://schema.org/EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventScheduled
- URI
https://w3id.org/fep/8a8e/EventScheduled- Label
- The event is scheduled.
- Comment
- The event is normally scheduled and planned.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventCancelled
- URI
https://w3id.org/fep/8a8e/EventPostponed- Label
- The event has been postponed.
- Comment
- The event has been postponed and no new date has been set. The event's previousStartTime should be set.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventRescheduled
- URI
https://w3id.org/fep/8a8e/EventRescheduled- Label
- The event has been rescheduled.
- Comment
- The event's previousStartTime should be set to the old date and the startTime should be set to the event's new start date.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventCancelled
- URI
- EventPostponed | EventRescheduled
https://w3id.org/fep/8a8e/EventCancelled- Label
- The event has been cancelled.
- Comment
- The event has been cancelled.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventCancelled
- URI
https://w3id.org/fep/8a8e/EventCancelled- Label
- The event has been cancelled.
- Comment
- The event has been cancelled.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventTentative
- URI
https://w3id.org/fep/8a8e/EventTentative- Label
- The event is tentative
- Comment
- The event is currently being planned but not confirmed.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
EventMovedOnline
- URI
https://w3id.org/fep/8a8e/EventMovedOnline- Label
- The event moved online.
- Comment
- Indicates that the event was changed to allow online participation.
- Subclass of
- EventStatusType
- See also
- eventStatus
- Is defined by
- FEP-8a8e
previousStartTime
- URI
https://w3id.org/fep/8a8e/previousStartTime- Label
- The event previous start time.
- Comment
- The events previous start time is the old start time before an event got postponed or rescheduled.
- Domain
- Event
- Range
- xsd:dateTime (@vocab)
- See also
- EventPostponed | EventRescheduled
- Is defined by
- FEP-8a8e
category
- URI
https://w3id.org/fep/8a8e/category- Label
- The category of an Event
- Comment
- Recommended event categories include:
ARTS,AUTO_BOAT_AIR,BOOK_CLUBS,BUSINESS,CAUSES,CLIMATE_ENVIRONMENT,COMMUNITY,COMEDY,CRAFTS,CREATIVE_JAM,DIY_MAKER_SPACES,FAMILY_EDUCATION,FASHION_BEAUTY,FESTIVALS,FILM_MEDIA,FOOD_DRINK,GAMES,INCLUSIVE_SPACES,LANGUAGE_CULTURE,LEARNING,LGBTQ,MEETING,MEDITATION_WELLBEING,MOVEMENTS_POLITICS,MUSIC,NETWORKING,OUTDOORS_ADVENTURE,PARTY,PERFORMING_VISUAL_ARTS,PETS,PHOTOGRAPHY,SCIENCE_TECH,SPIRITUALITY_RELIGION_BELIEFS,SPORTS,THEATRE,WORKSHOPS_SKILL_SHARING - Domain
- Event
- Range
- xsd:string (@list)
- Is defined by
- FEP-8a8e
Credits¶
This work would not have been possible without the support of NLnet foundation and NGI Zero.
Thanks are also expressed to the people at OFFDEM who laid out the beginnings of this document.
Special thanks go to Laurin Weger, who was available for many time-consuming discussions. Further thanks go to the Cloudfest Hackathon 2025 for providing space and a platform for further discussion of this FEP and especially to Andreas Heigl for his rich feedback and ideas.
Copyright¶
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.