+status: DRAFT
+dateReceived: 2025-04-23
+discussionsTo: https://socialhub.activitypub.rocks/t/events-interoperability-validation-minimum-requirements-common-extensions/3849/
+---
+# FEP-8a8e: A common approach to using the Event object type
+
+## Summary
+
+ActivityStreams defines the [Object Type `Event`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-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](https://www.rfc-editor.org/rfc/rfc5545#section-3.8.5.3)
+- [RFC 5545 Section 3.8.4.5](https://www.rfc-editor.org/rfc/rfc5545#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](https://datatracker.ietf.org/doc/html/rfc2119.html).
+
+**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`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-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`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-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](https://www.w3.org/TR/activitystreams-core/#dates). The `startTime` is not *REQUIRED* in case an event is postponed and a `https://w3id.org/fep/8a8e/previousStartTime` is set instead.
+
+- [`endTime`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-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](https://www.w3.org/TR/activitystreams-core/#dates). The `endTime` *MUST* be a later date than the `startTime`. If the event is open-ended, it must include an end time at which applications (not humans) can treat the event as having ended.
+
+- [`organizers`](https://w3id.org/fep/8a8e/organizers)
+
+```json
+{
+ "@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](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](https://data.iana.org/time-zones/tz-link.html) (often called tz or zoneinfo, see [https://www.w3.org/TR/timezone/#time-zone-identifiers](https://www.w3.org/TR/timezone/#time-zone-identifiers)).
+
+
+
+```json
+{
+ "@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](https://www.w3.org/TR/activitystreams-vocabulary/#places). 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](https://schema.org/location) with some adjustments to better suite federated event handling:
+
+- Exclusion of `Text` as 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 `Place` or a `VirtualLocation`.
+
+#### 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:
+
+```json
+{
+ "@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`:
+
+```json
+{
+ "@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](https://schema.org/VirtualLocation).
+
+Applications *SHOULD* at least set and be able to make use of `name` and `url` properties.
+
+```json
+{
+ "@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.
+
+```json
+{
+ "@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](https://w3id.org/fep/8a8e/EventCancelled)
+- [EventMovedOnline](https://w3id.org/fep/8a8e/EventMovedOnline)
+- [EventPostponed](https://w3id.org/fep/8a8e/EventPostponed)
+- [EventRescheduled](https://w3id.org/fep/8a8e/EventRescheduled)
+- [EventScheduled](https://w3id.org/fep/8a8e/EventScheduled)
+- [EventTentative](https://w3id.org/fep/8a8e/EventTentative)
+
+> **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.
+
+```json
+{
+ "@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.
+
+```json
+{
+ "@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.
+
+```json
+{
+ "@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`](https://www.w3.org/ns/activitystreams#Event) *MAY* have an `attendees` collection. This is a list of all [`actor`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-actor)s that meet one or more of the following conditions, added as a [side effect](https://www.w3.org/TR/activitypub/#like-activity-inbox).
+
+- The actor has sent a [`Join`](https://www.w3.org/ns/activitystreams#Join) activity with this object as the [`object`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object) property that has been answered with an [`Accept`](https://www.w3.org/ns/activitystreams#Accept).
+- The actor has responded to an [`Invite`](https://www.w3.org/ns/activitystreams#Invite) activity from the `Event`'s owner (where the Event is specified as the `object` property) with an [`Accept`](https://www.w3.org/ns/activitystreams#Accept) activity.
+
+The `attendees` collection *MUST* be either an [`OrderedCollection`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-orderedcollection) or a [`Collection`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-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`](https://www.w3.org/ns/activitystreams#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 `width` and `height` gives receiving applications the most flexibility to choose the most appropriate one based on aspect ratio.
+
+```json
+{
+ "@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](`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
+
+```json
+{
+ "@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
+
+```json
+{
+ "@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](https://www.w3.org/TR/activitystreams-core/#actors), or [links](https://www.w3.org/TR/activitystreams-core/#link).
+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`.
+
+```json
+{
+ "@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 `Event`s *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 an `OrderedCollection` or 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 `Event` or one of its subtypes.
+ - **Time**: The `Event`'s `endTime` *MUST 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 `Actor` is included in the `Event`'s `organizers` collection.
+ - The `Actor` owns the `Event`, i.e., is part of the `Event`'s `attributedTo`.
+ - The `Event` is in the actor's `shares` collection, and the `Event` shares the same host with the `actor`. This use case is primarily intended to cover relay and group `Actor`s.
+
+## Terms
+
+Note that the terms `joinMode` and `externalParticipationUrl` are compatible with and also leaned on the extensions [defined by Mobilizon](https://docs.mobilizon.org/5.%20Interoperability/1.activity_pub/).
+
+
+ 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
+ - 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
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
+ - See also
+ - attendees
+ - Is defined by
+ - FEP-8a8e
+
+
+
+ {
+ "@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"},
+ ]
+ }
+
+
+
+
+
+ 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
+ - 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
+ - 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.
diff --git a/fep/8a8e/fep-8a8e.rdf b/fep/8a8e/fep-8a8e.rdf
new file mode 100644
index 0000000..eb9bac2
--- /dev/null
+++ b/fep/8a8e/fep-8a8e.rdf
@@ -0,0 +1,208 @@
+
+
+
+ The event moved online.
+
+ Indicates that the event was changed to allow online participation.
+
+
+
+
+
+
+ The event has been postponed.
+
+ The event has been postponed and no new date has been set. The event's previousStartTime should be set.
+
+
+
+
+
+
+
+ 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.
+
+
+ Join mode
+
+
+
+
+
+
+ Ordered collection of upcoming Events
+ An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first.
+
+
+
+
+
+
+ Attendees of an Event
+ 0
+
+
+
+
+ Whether an image is an (events) banner image.
+
+ Image is a banner image
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+ An eventStatus of an event represents its status; particularly useful when an event is cancelled or rescheduled.
+ 0
+ The events status is
+
+
+
+
+
+ EventStatusType is an enumeration type whose instances represent several states that an Event may be in.
+
+ 8a8e
+
+
+
+ https://w3id.org/fep/8a8e
+ CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
+
+ FEP-8a8e: A common approach to using the Event object type
+ 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.
+ André Menrath <andre.menrath@posteo.de>
+ les <lesion@autistici.org>
+ 2025-04-23
+
+
+
+ Whether to display the endTime
+ A property that defines whether the end time of an event should be displayed.
+
+
+
+
+
+
+ The event has been rescheduled.
+
+ The event's previousStartTime should be set to the old date and the startTime should be set to the event's new start date.
+
+
+
+
+
+
+
+
+ Required Join Visibility
+
+ 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).
+
+
+
+
+
+ The event previous start time.
+ The events previous start time is the old start time before an event got postponed or rescheduled.
+
+
+
+
+
+
+
+ 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
+
+
+ The category of an Event
+
+
+
+
+ A Collection of the Event's attendees
+
+
+
+
+ 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.
+
+
+
+
+ Organizers Collection
+
+
+
+ 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.
+
+
+
+ External participation URL
+
+
+
+
+ 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.
+
+
+
+
+ The event is currently being planned but not confirmed.
+ The event is tentative
+
+
+
+
+
+ The event has been cancelled.
+
+
+
+
+
+
+ The event has been cancelled.
+
+
+
+
+
+ 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.
+ An Event's Organizer Collection
+
+
+
+ The timezone of an Event
+ 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.
+
+
+
+
+
diff --git a/fep/8a8e/fep-8a8e.ttl b/fep/8a8e/fep-8a8e.ttl
new file mode 100644
index 0000000..d8297a2
--- /dev/null
+++ b/fep/8a8e/fep-8a8e.ttl
@@ -0,0 +1,187 @@
+@prefix as: .
+@prefix dc: .
+@prefix dcterms: .
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix schema: .
+@prefix xsd: .
+
+ a rdfs:Class ;
+ rdfs:label "A Collection of the Event's attendees"@en ;
+ rdfs: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.
+ """@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf as:OrderedCollection .
+
+ a rdfs:Class ;
+ rdfs:label "The event has been cancelled."@en ;
+ rdfs:comment "The event has been cancelled."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ,
+ ,
+ ;
+ rdfs:subClassOf .
+
+ a rdfs:Class ;
+ rdfs:label "The event moved online."@en ;
+ rdfs:comment "Indicates that the event was changed to allow online participation."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf .
+
+ a rdfs:Class ;
+ rdfs:label "The event has been postponed."@en ;
+ rdfs:comment "The event has been postponed and no new date has been set. The event's previousStartTime should be set."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf .
+
+ a rdfs:Class ;
+ rdfs:label "The event has been rescheduled."@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf .
+
+ a rdfs:Class ;
+ rdfs:label "8a8e"@en ;
+ rdfs:comment "EventStatusType is an enumeration type whose instances represent several states that an Event may be in."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf schema:EventStatusType .
+
+ a rdfs:Class ;
+ rdfs:label "The event is tentative"@en ;
+ rdfs:comment "The event is currently being planned but not confirmed."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf .
+
+ a rdfs:Class ;
+ rdfs:label "An Event's Organizer Collection"@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf as:Collection .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "The category of an Event"@en ;
+ rdfs: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
+"""@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:string .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "External participation URL"@en ;
+ 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.
+ """@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:anyURI .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "Image is a banner image"@en ;
+ rdfs:comment """
+ Whether an image is an (events) banner image.
+ """@en ;
+ rdfs:domain as:Image ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:boolean .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Join mode"@en ;
+ 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.
+ """@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:string .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "The event previous start time."@en ;
+ rdfs:comment "The events previous start time is the old start time before an event got postponed or rescheduled."@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:dateTime ;
+ rdfs:seeAlso ,
+ .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Required Join Visibility"@en ;
+ rdfs: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).
+ """@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:anyURI .
+
+ a owl:ObjectProperty ;
+ rdfs:label "The timezone of an Event"@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range rdfs:Literal .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Ordered collection of upcoming Events"@en ;
+ rdfs:comment "An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range as:OrderedCollection .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Attendees of an Event"@en ;
+ rdfs:comment ""@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range rdfs:Resource ;
+ owl:minCardinality "0"^^xsd:nonNegativeInteger .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "Whether to display the endTime"@en ;
+ rdfs:comment "A property that defines whether the end time of an event should be displayed."@en ;
+ rdfs:domain ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:boolean .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Organizers Collection"@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range .
+
+ a rdf:Property ;
+ rdfs:label "The events status is"@en ;
+ rdfs:comment "An eventStatus of an event represents its status; particularly useful when an event is cancelled or rescheduled."@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range ;
+ rdfs:seeAlso ,
+ ,
+ ,
+ ,
+ ,
+ ;
+ owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+ owl:minCardinality "0"^^xsd:nonNegativeInteger .
+
+ a owl:Ontology ;
+ dc:creator "André Menrath ",
+ "les " ;
+ dc:rights "CC0 1.0 Universal (CC0 1.0) Public Domain Dedication"@en ;
+ dcterms:abstract "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." ;
+ dcterms:dateSubmitted "2025-04-23"^^xsd:date ;
+ dcterms:identifier "https://w3id.org/fep/8a8e"^^xsd:anyURI ;
+ dcterms:license ;
+ dcterms:title "FEP-8a8e: A common approach to using the Event object type" .
+
diff --git a/fep/8a8e/isBannerImage/README.md b/fep/8a8e/isBannerImage/README.md
new file mode 100644
index 0000000..e7f6d31
--- /dev/null
+++ b/fep/8a8e/isBannerImage/README.md
@@ -0,0 +1,57 @@
+# 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](https://www.w3.org/ns/activitystreams#Image)
+
+rdfs:range
+: Boolean
+
+rdfs:isDefinedBy
+: [FEP‑8a8e](https://w3id.org/fep/8a8e)
+
+
+## Examples
+
+Example usage of isBannerImage
+
+```json{
+ "@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
+ }
+ ]
+}
+```
diff --git a/fep/8a8e/isBannerImage/isBannerImage.html b/fep/8a8e/isBannerImage/isBannerImage.html
new file mode 100644
index 0000000..4582c4f
--- /dev/null
+++ b/fep/8a8e/isBannerImage/isBannerImage.html
@@ -0,0 +1,61 @@
+
+
+
+isBannerImage
+
+
+
+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
+ }
+ ]
+}
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/isBannerImage/isBannerImage.jsonld b/fep/8a8e/isBannerImage/isBannerImage.jsonld
new file mode 100644
index 0000000..5c58417
--- /dev/null
+++ b/fep/8a8e/isBannerImage/isBannerImage.jsonld
@@ -0,0 +1,35 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/isBannerImage",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#DatatypeProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "\n Whether an image is an (events) banner image.\n "
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#domain": [
+ {
+ "@id": "https://www.w3.org/ns/activitystreams#Image"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "Image is a banner image"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "http://www.w3.org/2001/XMLSchema#boolean"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/isBannerImage/isBannerImage.rdf b/fep/8a8e/isBannerImage/isBannerImage.rdf
new file mode 100644
index 0000000..c11cec9
--- /dev/null
+++ b/fep/8a8e/isBannerImage/isBannerImage.rdf
@@ -0,0 +1,16 @@
+
+
+
+
+ Image is a banner image
+
+ Whether an image is an (events) banner image.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/isBannerImage/isBannerImage.ttl b/fep/8a8e/isBannerImage/isBannerImage.ttl
new file mode 100644
index 0000000..d202378
--- /dev/null
+++ b/fep/8a8e/isBannerImage/isBannerImage.ttl
@@ -0,0 +1,13 @@
+@prefix as: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix xsd: .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "Image is a banner image"@en ;
+ rdfs:comment """
+ Whether an image is an (events) banner image.
+ """@en ;
+ rdfs:domain as:Image ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:boolean .
\ No newline at end of file
diff --git a/fep/8a8e/joinMode/README.md b/fep/8a8e/joinMode/README.md
new file mode 100644
index 0000000..9f81188
--- /dev/null
+++ b/fep/8a8e/joinMode/README.md
@@ -0,0 +1,51 @@
+# 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`](https://w3id.org/fep/8a8e/externalParticipationUrl).
+
+rdfs:domain
+: [as:Event](https://www.w3.org/ns/activitystreams#Event)
+
+rdfs:range
+: A string
+
+rdfs:isDefinedBy
+: [FEP‑8a8e](https://w3id.org/fep/8a8e/)
+
+
+## Examples
+
+Example: restricted
+
+```json{
+ "@context": [
+ "https://w3id.org/fep/8a8e",
+ "https://www.w3.org/ns/activitystreams"
+ ],
+ "type": "Event",
+ "url": "http://example.org/events/1234",
+ "joinMode": "restricted"
+}
+```
+
+Example: external
+
+```json{
+ "@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"
+}
+```
diff --git a/fep/8a8e/joinMode/joinMode.html b/fep/8a8e/joinMode/joinMode.html
new file mode 100644
index 0000000..f15f7c4
--- /dev/null
+++ b/fep/8a8e/joinMode/joinMode.html
@@ -0,0 +1,58 @@
+
+
+
+joinMode
+
+
+
+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
+- 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"
+}
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/joinMode/joinMode.jsonld b/fep/8a8e/joinMode/joinMode.jsonld
new file mode 100644
index 0000000..9d4d6cc
--- /dev/null
+++ b/fep/8a8e/joinMode/joinMode.jsonld
@@ -0,0 +1,35 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/joinMode",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#ObjectProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "\n Indicator of how new members may be able to join an event.\n Accepted values: free, restricted, external, none, invite.\n If external, you must also set externalParticipationUrl.\n "
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#domain": [
+ {
+ "@id": "https://www.w3.org/ns/activitystreams#Event"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e/"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "Join mode"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "http://www.w3.org/2001/XMLSchema#string"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/joinMode/joinMode.rdf b/fep/8a8e/joinMode/joinMode.rdf
new file mode 100644
index 0000000..8354085
--- /dev/null
+++ b/fep/8a8e/joinMode/joinMode.rdf
@@ -0,0 +1,18 @@
+
+
+
+
+ Join mode
+
+ 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.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/joinMode/joinMode.ttl b/fep/8a8e/joinMode/joinMode.ttl
new file mode 100644
index 0000000..7d00cb6
--- /dev/null
+++ b/fep/8a8e/joinMode/joinMode.ttl
@@ -0,0 +1,15 @@
+@prefix as: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix xsd: .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Join mode"@en ;
+ 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.
+ """@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:string .
\ No newline at end of file
diff --git a/fep/8a8e/organizers/README.md b/fep/8a8e/organizers/README.md
new file mode 100644
index 0000000..b3a732b
--- /dev/null
+++ b/fep/8a8e/organizers/README.md
@@ -0,0 +1,50 @@
+# 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](https://w3id.org/fep/8a8e/OrganizersCollection) (SubType of of the Collection or OrderedCollection ActivityStreams Type) or `null`
+
+Required
+: Yes
+
+Functional
+: No
+
+Is defined by
+: [FEP-8a8e](https://w3id.org/fep/8a8e)
+
+
+## Examples
+
+Example usage of organizers
+
+```json
+ {
+ "@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." }
+ ]
+ }
+ }
+ ```
diff --git a/fep/8a8e/organizers/organizers.html b/fep/8a8e/organizers/organizers.html
new file mode 100644
index 0000000..4b07fcb
--- /dev/null
+++ b/fep/8a8e/organizers/organizers.html
@@ -0,0 +1,51 @@
+
+
+
+organizers
+
+
+
+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." }
+ ]
+ }
+ }
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/organizers/organizers.jsonld b/fep/8a8e/organizers/organizers.jsonld
new file mode 100644
index 0000000..1a99d84
--- /dev/null
+++ b/fep/8a8e/organizers/organizers.jsonld
@@ -0,0 +1,30 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/organizers",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#ObjectProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "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."
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "Organizers Collection"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "https://w3id.org/fep/8a8e/OrganizersCollection"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/organizers/organizers.rdf b/fep/8a8e/organizers/organizers.rdf
new file mode 100644
index 0000000..a96c8d1
--- /dev/null
+++ b/fep/8a8e/organizers/organizers.rdf
@@ -0,0 +1,13 @@
+
+
+
+
+ Organizers Collection
+ 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.
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/organizers/organizers.ttl b/fep/8a8e/organizers/organizers.ttl
new file mode 100644
index 0000000..cd1dacd
--- /dev/null
+++ b/fep/8a8e/organizers/organizers.ttl
@@ -0,0 +1,8 @@
+@prefix owl: .
+@prefix rdfs: .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Organizers Collection"@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range .
\ No newline at end of file
diff --git a/fep/8a8e/previousStartTime/README.md b/fep/8a8e/previousStartTime/README.md
new file mode 100644
index 0000000..aa04e8b
--- /dev/null
+++ b/fep/8a8e/previousStartTime/README.md
@@ -0,0 +1,22 @@
+# 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](https://www.w3.org/ns/activitystreams#Event)
+
+Range
+: [xsd:dateTime](https://www.w3.org/TR/xmlschema-2/#dateTime) (@vocab)
+
+See also
+: [EventPostponed](https://w3id.org/fep/8a8e/EventPostponed) | [EventRescheduled](https://w3id.org/fep/8a8e/EventRescheduled)
+
+Is defined by
+: [FEP-8a8e](https://w3id.org/fep/8a8e)
diff --git a/fep/8a8e/previousStartTime/previousStartTime.html b/fep/8a8e/previousStartTime/previousStartTime.html
new file mode 100644
index 0000000..891d218
--- /dev/null
+++ b/fep/8a8e/previousStartTime/previousStartTime.html
@@ -0,0 +1,28 @@
+
+
+
+previousStartTime
+
+
+
+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
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/previousStartTime/previousStartTime.jsonld b/fep/8a8e/previousStartTime/previousStartTime.jsonld
new file mode 100644
index 0000000..8444163
--- /dev/null
+++ b/fep/8a8e/previousStartTime/previousStartTime.jsonld
@@ -0,0 +1,43 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/previousStartTime",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#DatatypeProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "The events previous start time is the old start time before an event got postponed or rescheduled."
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#domain": [
+ {
+ "@id": "https://www.w3.org/ns/activitystreams#Event"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "The event previous start time."
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "http://www.w3.org/2001/XMLSchema#dateTime"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#seeAlso": [
+ {
+ "@id": "https://w3id.org/fep/8a8e/EventPostponed"
+ },
+ {
+ "@id": "https://w3id.org/fep/8a8e/EventRescheduled"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/previousStartTime/previousStartTime.rdf b/fep/8a8e/previousStartTime/previousStartTime.rdf
new file mode 100644
index 0000000..53495ab
--- /dev/null
+++ b/fep/8a8e/previousStartTime/previousStartTime.rdf
@@ -0,0 +1,16 @@
+
+
+
+
+ The event previous start time.
+ The events previous start time is the old start time before an event got postponed or rescheduled.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/previousStartTime/previousStartTime.ttl b/fep/8a8e/previousStartTime/previousStartTime.ttl
new file mode 100644
index 0000000..9c000fd
--- /dev/null
+++ b/fep/8a8e/previousStartTime/previousStartTime.ttl
@@ -0,0 +1,13 @@
+@prefix as: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix xsd: .
+
+ a owl:DatatypeProperty ;
+ rdfs:label "The event previous start time."@en ;
+ rdfs:comment "The events previous start time is the old start time before an event got postponed or rescheduled."@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:dateTime ;
+ rdfs:seeAlso ,
+ .
\ No newline at end of file
diff --git a/fep/8a8e/requiredJoinVisibility/README.md b/fep/8a8e/requiredJoinVisibility/README.md
new file mode 100644
index 0000000..e7b316a
--- /dev/null
+++ b/fep/8a8e/requiredJoinVisibility/README.md
@@ -0,0 +1,52 @@
+# 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](https://www.w3.org/ns/activitystreams#Event)
+
+Range
+: A list of any addressed targets, i.e. URIs (@list)
+
+Is defined by
+: [FEP-8a8e](https://w3id.org/fep/8a8e)
+
+
+## Examples
+
+Example usage of requiredJoinVisibility
+
+```json{
+ "@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"
+ ]
+}```
diff --git a/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.html b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.html
new file mode 100644
index 0000000..ec442a7
--- /dev/null
+++ b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.html
@@ -0,0 +1,57 @@
+
+
+
+requiredJoinVisibility
+
+
+
+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"
+ ]
+}
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.jsonld b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.jsonld
new file mode 100644
index 0000000..901f3bf
--- /dev/null
+++ b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.jsonld
@@ -0,0 +1,35 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/requiredJoinVisibility",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#ObjectProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "\n 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).\n "
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#domain": [
+ {
+ "@id": "https://www.w3.org/ns/activitystreams#Event"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "Required Join Visibility"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "http://www.w3.org/2001/XMLSchema#anyURI"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.rdf b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.rdf
new file mode 100644
index 0000000..c559b79
--- /dev/null
+++ b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.rdf
@@ -0,0 +1,16 @@
+
+
+
+
+ Required Join Visibility
+
+ 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).
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.ttl b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.ttl
new file mode 100644
index 0000000..56632d1
--- /dev/null
+++ b/fep/8a8e/requiredJoinVisibility/requiredJoinVisibility.ttl
@@ -0,0 +1,13 @@
+@prefix as: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix xsd: .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Required Join Visibility"@en ;
+ rdfs: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).
+ """@en ;
+ rdfs:domain as:Event ;
+ rdfs:isDefinedBy ;
+ rdfs:range xsd:anyURI .
\ No newline at end of file
diff --git a/fep/8a8e/timezone/README.md b/fep/8a8e/timezone/README.md
new file mode 100644
index 0000000..10cece6
--- /dev/null
+++ b/fep/8a8e/timezone/README.md
@@ -0,0 +1,43 @@
+# 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](https://w3id.org/fep/8a8e)
+
+Range
+: IANA Time Zone identifier
+
+Required
+: No
+
+Functional
+: No
+
+
+## Examples
+
+Example usage of timezone
+
+```json
+ {
+ "@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,
+ }
+ ```
diff --git a/fep/8a8e/timezone/timezone.html b/fep/8a8e/timezone/timezone.html
new file mode 100644
index 0000000..1ad8fc5
--- /dev/null
+++ b/fep/8a8e/timezone/timezone.html
@@ -0,0 +1,44 @@
+
+
+
+timezone
+
+
+
+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,
+ }
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/timezone/timezone.jsonld b/fep/8a8e/timezone/timezone.jsonld
new file mode 100644
index 0000000..3ac1125
--- /dev/null
+++ b/fep/8a8e/timezone/timezone.jsonld
@@ -0,0 +1,30 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/timezone",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#ObjectProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "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."
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "The timezone of an Event"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "http://www.w3.org/2000/01/rdf-schema#Literal"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/timezone/timezone.rdf b/fep/8a8e/timezone/timezone.rdf
new file mode 100644
index 0000000..65caa00
--- /dev/null
+++ b/fep/8a8e/timezone/timezone.rdf
@@ -0,0 +1,13 @@
+
+
+
+
+ The timezone of an Event
+ 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.
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/timezone/timezone.ttl b/fep/8a8e/timezone/timezone.ttl
new file mode 100644
index 0000000..316f06f
--- /dev/null
+++ b/fep/8a8e/timezone/timezone.ttl
@@ -0,0 +1,8 @@
+@prefix owl: .
+@prefix rdfs: .
+
+ a owl:ObjectProperty ;
+ rdfs:label "The timezone of an Event"@en ;
+ rdfs: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."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range rdfs:Literal .
\ No newline at end of file
diff --git a/fep/8a8e/upcomingEvents/README.md b/fep/8a8e/upcomingEvents/README.md
new file mode 100644
index 0000000..db19c29
--- /dev/null
+++ b/fep/8a8e/upcomingEvents/README.md
@@ -0,0 +1,38 @@
+# 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](https://w3id.org/fep/8a8e)
+
+
+## Examples
+
+Example usage of upcomingEvents
+
+```json
+ {
+ "@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" }
+ ]
+ }
+ }
+ ```
diff --git a/fep/8a8e/upcomingEvents/upcomingEvents.html b/fep/8a8e/upcomingEvents/upcomingEvents.html
new file mode 100644
index 0000000..e08cd9f
--- /dev/null
+++ b/fep/8a8e/upcomingEvents/upcomingEvents.html
@@ -0,0 +1,41 @@
+
+
+
+upcomingEvents
+
+
+
+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" }
+ ]
+ }
+ }
+
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/upcomingEvents/upcomingEvents.jsonld b/fep/8a8e/upcomingEvents/upcomingEvents.jsonld
new file mode 100644
index 0000000..8bc8cf8
--- /dev/null
+++ b/fep/8a8e/upcomingEvents/upcomingEvents.jsonld
@@ -0,0 +1,30 @@
+[
+ {
+ "@id": "https://w3id.org/fep/8a8e/upcomingEvents",
+ "@type": [
+ "http://www.w3.org/2002/07/owl#ObjectProperty"
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#comment": [
+ {
+ "@language": "en",
+ "@value": "An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first."
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#isDefinedBy": [
+ {
+ "@id": "https://w3id.org/fep/8a8e"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#label": [
+ {
+ "@language": "en",
+ "@value": "Ordered collection of upcoming Events"
+ }
+ ],
+ "http://www.w3.org/2000/01/rdf-schema#range": [
+ {
+ "@id": "https://www.w3.org/ns/activitystreams#OrderedCollection"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fep/8a8e/upcomingEvents/upcomingEvents.rdf b/fep/8a8e/upcomingEvents/upcomingEvents.rdf
new file mode 100644
index 0000000..05c2527
--- /dev/null
+++ b/fep/8a8e/upcomingEvents/upcomingEvents.rdf
@@ -0,0 +1,13 @@
+
+
+
+
+ Ordered collection of upcoming Events
+ An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first.
+
+
+
+
\ No newline at end of file
diff --git a/fep/8a8e/upcomingEvents/upcomingEvents.ttl b/fep/8a8e/upcomingEvents/upcomingEvents.ttl
new file mode 100644
index 0000000..b8658ea
--- /dev/null
+++ b/fep/8a8e/upcomingEvents/upcomingEvents.ttl
@@ -0,0 +1,9 @@
+@prefix as: .
+@prefix owl: .
+@prefix rdfs: .
+
+ a owl:ObjectProperty ;
+ rdfs:label "Ordered collection of upcoming Events"@en ;
+ rdfs:comment "An ActivityStreams OrderedCollection of Event objects that have a startTime property in the future, sorted by startTime with the earliest first."@en ;
+ rdfs:isDefinedBy ;
+ rdfs:range as:OrderedCollection .
\ No newline at end of file