fep

FEP-8a8e: A common approach to using the Event object type

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:

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:

{
  "@context": "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](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 startTime and endTime property 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://www.w3.org/ns/activitystreams",
    {
      "timezone": "http://www.w3.org/2006/time#timezone"
    }
  ],
  "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:

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://www.w3.org/ns/activitystreams",
    {
      "address": "https://schema.org/address"
    }
  ],
  "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:

Note https://w3id.org/fep/8a8e/eventStatus is almost identical to https://schema.org/eventStatus, however it has an additional status type for the event being tentative, which is leaned on iCalendar’s TENTATIVE.

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 externalParticipationUrl could also be a mailto-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://www.w3.org/ns/activitystreams",
    {
      "attendees": {
        "@id": "https://w3id.org/fep/8a8e/attendees",
        "@type": "https://www.w3.org/TR/activitystreams-vocabulary/#dfn-collection"
      }
    }
  ],
  "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 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.

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 width and height gives 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:

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://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://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://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:

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": "Actor",
      "upcomingEvents": {
        "type": "Collection",
        "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#Collection with the addition that the items may also include https://schema.org/Person or https://schema.org/Organization.
Subclass of
Object</dd>
See also
organizers
Is defined by
FEP-8a8e
</dl>
    
    {
      "@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." }
      ]
    }
    
  
</section>

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 null this 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://w3id.org/fep/8a8e",
        "https://www.w3.org/ns/activitystreams",
        {
          "sc": "http://schema.org#",
        }
      ],
      "type": "Event",
      "organizers": {
        "type": "OrganizersCollection",
        "totalItems": 4,
        "items": [
          { "type": "Actor", "name": "ActivityPub Group Actor", "id": "https://example.org/actors/group1"},
          { "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#Collection with the addition that the items may also include https://schema.org/Person or https://schema.org/Organization. The items of the AttendeesCollection are 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.
The items MAY be filtered on privileges of an authenticated user or as appropriate when no authentication is given. This collection *SHOULD* have the totalItems set in any case.
Subclass of
Object</dd>
See also
attendees
Is defined by
FEP-8a8e
</dl>
    
    {
      "@context": [
        "https://w3id.org/fep/8a8e",
        "https://www.w3.org/ns/activitystreams",
        {
          "sc": "https://schema.org#"
        }
      ]
      "type": "AttendeesCollection",
      "totalItems": 2,
      "context": "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"},
      ]
    }
    
  
</section>

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": "https://w3id.org/fep/8a8e/OrganizersCollection",
        "totalItems": 4,
        "items": [
          { "type": "Actor", "name": "ActivityPub Group Actor", "id": "https://example.org/actors/group1"},
          { "type": "Link", "href": "https://organizer1.example.org"},
          { "type": "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</a>
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. If external, you must also set externalParticipationUrl.
rdfs:domain
as:Event
rdfs:range
A string</a>
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 Join activity related to the event. This can include individual actors, groups, the as:Public collection, or any other URI. The Join activity must be addressed accordingly (e.g., using to, cc, bto, or audience).
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-with-alice/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 joinMode is set to external.
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"
  ],
  "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",
      "witdh": 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

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](https://nlnet.nl/) and [NGI Zero](https://nlnet.nl/NGI0/). Thanks are also expressed to the people at OFFDEM who laid out [the beginnings of this document](https://event-federation.eu/2024/02/10/fediversity-at-o%e2%82%84ffdem/). 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.