This specification introduces a data model to support the publication of data describing opportunities for people to engage in physical activities ("opportunity data"). This model covers description of activities, as well as the events and locations in which they take place.
The specification is intended to support the publication of opportunity data as open data for anyone to access, use and share. It will also guide reusers of opportunity data, introducing them to the key concepts relevant to that sector.
The model may also be useful in guiding the development of both new and existing booking systems and applications that consume opportunity data.
The specification is an output of the [OpenActive Community Group](http://www.w3.org/community/openactive/) and serves as a common reference point for other specifications and outputs of that activity.
Developers looking for a quick primer on the model and how to use it to structure opportunity data may want to refer to the [[Publishing-Opportunity-Data]] primer which provides a number of additional examples.
The data model introduced in this document has been mapped to existing standards and vocabularies, including SKOS ([[SKOS]]) and the Schema.org ([[SCHEMA-ORG]]) types and properties. This existing work provides a useful existing framework around which the [OpenActive Community Group](http://www.w3.org/community/openactive/) can build additional data standards.
Examples are in light khaki boxes, with khaki left border, and with a numbered "Example" header in khaki. Examples are always informative. The content of the example is in monospace font and may be syntax colored.
__Developing a standard activity list__
This specification doesn't place any requirements on how applications manage or use Physical Activities or Activity Lists. There is no requirement that applications that implement this specification must adopt a single standardised list, or agree on standard groupings. The intention here is to just capture a useful model that can represent the variety of data currently in use.
However there are benefits to the physical activity sector in convergence on a standard list of activities in order to improve discovery, reporting, etc. The OpenActive Community Group are developing a standard list as a separate activity. For more information see [[OpenActive-Activity-List]].
There are a variety of ways to categorise and describe events. This includes restrictions on attendance, aspect of suitability for different audiences and fitness levels, and a mixture of pre-requisites such as the need for certain qualifications, membership or equipment.
The initial version of this specification prioritises capturing the essential elements of describing an event. The structured information about time, place and activity is supplemented with some basic descriptive properties. This also includes the ability to add "tags" to an event to capture a variety of categorisation elements. Future versions of this specification will use experience working with real-world data to decide the best approach of formalising these categories.
__Applications must not publish personal data without permission__
This specification provides a data model for publishing information about individual people, e.g. coaches, volunteers, etc. However applications MUST respect privacy and data protection laws and must not publish data about individuals without their consent.
The ability to publish this type of data has been included because event organisers often choose to publicly share some information about themselves to help advertise an event. E.g. their name and some background on their qualifications or experience. But this information MUST not be published as open data without getting the consent of the individual concerned.
The concept of an Offer is taken from Schema.org, which itself references the [Good Relations](http://www.heppnetz.de/projects/goodrelations/) vocabulary for ecommerce. The data model described in a later section is not intended as a complete specification. The concept is introduced in this version of specification to highlight the support available in Schema.org for associating offers with events. Later versions of the specification will explore the area of booking in more detail.
In the following sections all referenced terms have been qualified using their namespace prefix. This highlights the source vocabulary in which they have been defined. Terms have also been linked to their definitions.
The examples in each section use [[JSON-LD]] syntax and reference the [OpenActive JSON-LD context](https://openactive.io/ns/oa.jsonld) defined by [[OpenActive-Vocabulary]], which is accessible at `https://openactive.io/` when using an `Accept` header that includes `application/ld+json`.
The context removes the need to use explicit namespace prefixes in the JSON documents. The context also maps the JSON-LD [`@type`](https://www.w3.org/TR/json-ld/#specifying-the-type) and [`@id`](https://www.w3.org/TR/json-ld/#node-identifiers) properties to simple keys (`type` and `id`). This further limits the amount of JSON-LD syntax exposed to developers.
| Concept | Mapping | Notes |
|---|---|---|
| Activity List | [`skos:ConceptScheme`](https://www.w3.org/2009/08/skos-reference/skos.html#ConceptScheme) | Activity lists are controlled vocabularies and map well to the definition of a SKOS Concept Scheme. |
| Physical Activity | [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Individual Physical Activities can be represented as individual SKOS concepts |
| Event | [`schema:Event`](https://schema.org/Event) | Schema.org provides a well defined model for Events with properties that cover many of the core requirements for opportunity data. This specification defines some additional types of Event and properties for describing them in the context of publishing opportunity data. |
| Place | [`schema:Place`](https://schema.org/Place) | As well as the general definition of a Place, Schema.org defines sub-types including [`schema:EventVenue`](https://schema.org/EventVenue) and [`schema:SportsActivityLocation`](https://schema.org/SportsActivityLocation) which can be used where appropriate |
| Facility Use | [`schema:FacilityUse`](https://schema.org/FacilityUse) | Products that describe opportunities to use facilities in a location |
| Organization | [`schema:Organization`](https://schema.org/Organization) | Covers all types of organisations, including companies, clubs, etc |
| Person | [`schema:Person`](https://schema.org/Person) | An individual person |
| Brand | [`schema:Brand`](https://schema.org/Brand) | The brand used to describe a programme of activities. |
| Offer | [`schema:Offer`](https://schema.org/Offer) | Schema.org provides an existing model for describing offers to pay to participate in an Event. |
{
"@context": "https://openactive.io/",
"type": "Event",
"id": "http://host.opportunity-data.com/id/12345",
"url": "http://my-leisure-centre.example.org/events/1",
"name": "Tai chi Class"
}
In the above example the `@id` property provides a unique identifier across
the hosting application. But the public URL for the Event uses a separate,
customer-specific domain.
## Required and Optional Properties
The following sections include more detail about the properties available to
describe each type of resource. Some properties are considered to be essential
to ensure the provision of a minimally useful set of information about each
resource. These REQUIRED properties
MUST be provided.
All other properties are considered to be OPTIONAL.
Some properties have been marked as RECOMMENDED.
Publishers SHOULD provide these properties if it is
feasible to do so, as they will improve the quality and usability of their data.
Where data is not available to populate RECOMMENDED and
OPTIONAL properties, publishers
MUST exclude these from their data. Published data
MUST not include properties with null values, empty
strings or empty arrays.
Data publishers MAY include additional properties,
e.g. from Schema.org or other vocabularies when helpful to describe their data.
See the section on **Extending the Model** for more information.
Applications that consume opportunity data MUST ignore
any properties that they don't understand. This allows data publishing practices
within the sector to evolve as required.
## Controlled Vocabularies
When the value of a property might be one of a fixed set of values, it can be useful
to publish that list of values as a "controlled vocabulary".
This allows a publisher to publish the list of values, with supporting documentation
and definitions in a machine-readable format. We use the existing [[SKOS]]
standard as a means of publishing these vocabularies.
A number of properties in this data model allow data publishers to use values
from a controlled vocabulary, e.g. `oa:activity`, `oa:level`, `oa:category`, etc.
Publishers SHOULD publish the controlled vocabularies referenced from
their data in a machine-readable format, under an open licence.
The OpenActive Community group MAY create and recommend the use of specific
controlled vocabularies to help improve the consistency of how data is published.
Publishers SHOULD use values from standard vocabularies where available.
For example, the community group is developing a controlled vocabulary that defines
a standard activity list. Values from this vocabulary can be used in the `oa:activity`
property.
The OpenActive Community Group may decide to define and recommend
some controlled vocabularies for use in these properties. At present the
values of these properties are left deliberately open to encourage publication
of open data that may inform future standardisation.
## Describing Events (schema:Event
)
The Schema.org [`schema:Event`](https://schema.org/Event) type corresponds to the definition of Event given earlier in this specification. The properties and relationships associated with the [`schema:Event`](https://schema.org/Event) type can all be used to describe events.
The following table illustrates how the essential aspects of describing an event map to existing Schema.org properties and/or properties defined in the OpenActive Vocabulary.
| Property | Status | Type | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Identifies the object as being an Event |
| `@id` | RECOMMENDED | URI | A URI providing a unique, stable identifier for the resource |
| [`schema:url`](https://schema.org/url) | REQUIRED | URI | Link to a web page (or section of a page) that describes the event |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:name`](https://schema.org/name) | REQUIRED | String | The name of the event |
| [`schema:description`](https://schema.org/description) | RECOMMENDED | String | A free text description of the event |
| [`schema:image`](https://schema.org/image) | OPTIONAL | Array of [`schema:ImageObject`](https://schema.org/ImageObject) | One or more images or photos that depicts the event, e.g. a photo taken at a previous event |
| [`schema:startDate`](https://schema.org/startDate) | RECOMMENDED | String |
The start date and time of the event. Can be specified as a [`schema:Date`](https://schema.org/Date) or [`schema:DateTime`](https://schema.org/DateTime). While this property is marked as OPTIONAL, a data publisher MUST provide either a [`schema:startDate`](https://schema.org/startDate) or at least one [`schema:eventSchedule`](https://pending.schema.org/eventSchedule) for an event. |
| [`schema:endDate`](https://schema.org/endDate) | RECOMMENDED | String |
The end date and time of the event. Can be specified as a [`schema:Date`](https://schema.org/Date) or [`schema:DateTime`](https://schema.org/DateTime) It is RECOMMENDED that publishers provide either an [`schema:endDate`](https://schema.org/endDate) or a [`schema:duration`](https://schema.org/duration) for an event. |
| [`schema:duration`](https://schema.org/duration) | RECOMMENDED | String | The duration of the event given in [[ISO8601]] format. Durations MUST NOT be zero length. If duration is unknown it should be omitted. A duration MUST be provided if both a start and end date are available. |
| [`schema:location`](https://schema.org/location) | REQUIRED | [`schema:Place`](https://schema.org/Place) | The location at which the event will take place. Or, in the case of events that may span multiple locations, the initial meeting or starting point. |
| [`schema:organizer`](https://schema.org/organizer) | REQUIRED | [`schema:Person`](https://schema.org/Person) or [`schema:Organization`](https://schema.org/Organization) | The person or organization responsible for running an event. An organizer might be an [`schema:Organization`](https://schema.org/Organization) or a [`schema:Person`]((https://schema.org/Person). |
| [`schema:contributor`](https://schema.org/contributor) | RECOMMENDED | Array of [`schema:Person`](https://schema.org/Person) | One or more people, e.g. a coach, staff member or volunteer who will be helping to run the event. |
| [`schema:maximumAttendeeCapacity`](https://schema.org/maximumAttendeeCapacity) | RECOMMENDED | Integer | The maximum capacity of the event |
| [`schema:remainingAttendeeCapacity`](https://schema.org/remainingAttendeeCapacity) | RECOMMENDED | Integer | The number of places that are still available for the event |
| [`schema:eventStatus`](https://schema.org/eventStatus) | RECOMMENDED | [`schema:EventStatusType`](https://schema.org/EventStatusType) | The status of an event. Can be used to indicate rescheduled or cancelled events |
| [`schema:subEvent`](https://schema.org/subEvent) | OPTIONAL | Array of [`schema:Event`](https://schema.org/Event) | Relates a parent event to one or more child events. Properties describing the parent event can be assumed to apply to the child, unless otherwise specified. A child event might be a specific instance of an Event within a schedule |
| [`schema:superEvent`](https://schema.org/superEvent) | OPTIONAL | [`schema:Event`](https://schema.org/Event) | Relates a child event to a parent event. Properties describing the parent event can be assumed to apply to the child, unless otherwise specified. A parent event might specify a recurring schedule, of which the child event is one specific instance |
| `schema:eventSchedule` | Array of OPTIONAL | [`schema:Schedule`](https://pending.schema.org/Schedule) | A schedule defines a repeating time period used to describe a regularly occurring Event. |
| [`oa:schedulingNote`](https://openactive.io/schedulingNote) | OPTIONAL | String | Provides a note from an organizer relating to how this Event is scheduled. For example "This event doesn't run during school holidays", or "This is a regular weekly session". Where possible publishers SHOULD provide machine-readable descriptions of schedules via the `schema:eventSchedule` property. |
| [`oa:activity`](https://openactive.io/activity) | REQUIRED | Array of [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Specifies one or more physical activities that will take place during an event. The activities SHOULD ideally be taken from an activity list. |
| [`oa:category`](https://openactive.io/category) | OPTIONAL | Array of String or [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Provides a set of tags that help categorise and describe an event, e.g. its intensity, purpose, etc. |
| [`oa:ageRange`](https://openactive.io/ageRange) | RECOMMENDED | [`schema:QuantitativeValue`](https://schema.org/QuantitativeValue) | Indicates that an event is suitable for a specific age range. Specified as a [QuantitativeValue](https://schema.org/QuantitativeValue) with [minValue](https://schema.org/minValue) and [maxValue](https://schema.org/maxValue) properties |
| [`oa:genderRestriction`](https://openactive.io/genderRestriction) | OPTIONAL | [`oa:GenderRestrictionType`](https://openactive.io/GenderRestrictionType) | Indicates that an event is restricted to Male, Female or a Mixed audience. Values should be one of the three URIs defined by this specification (see below). |
| [`oa:programme`](https://openactive.io/programme) | OPTIONAL | [`schema:Brand`](https://schema.org/Brand) | Indicates that an event will be organised according to a specific Programme |
| [`oa:attendeeInstructions`](https://openactive.io/attendeeInstructions) | OPTIONAL | String | Provides additional notes and instructions for event attendees. E.g. more information on how to find the event, what to bring, etc. |
| [`oa:leader`](https://openactive.io/leader) | OPTIONAL | Array of [`schema:Person`](https://schema.org/Person) | Refers to a person (`schema:Person`) who will be leading an event. E.g. a coach. This is a more specific role than an organiser or a contributor |
| [`oa:accessibilitySupport`](https://openactive.io/accessibilitySupport) | OPTIONAL | Array of String or [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Used to specify the types of disabilities or impairments that are supported at an event |
| [`oa:accessibilityInformation`](https://openactive.io/accessibilitySupport) | OPTIONAL | String | Provide additional, specific documentation for participants about how disabilities are, or can be supported at the Event. |
| [`oa:isCoached`](https://openactive.io/isCoached) | OPTIONAL | Boolean | A boolean property that indicates whether an Event will be coached. This flag allows an Event to be marked as being coached without having to specify a named individual as a coach. This addresses both privacy concerns and also scenarios where the actual coach may only be decided on the day. If this property is not specified then consumers SHOULD assume a value of undefined |
| [`oa:level`](https://openactive.io/level) | RECOMMENDED | Array of String or [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | A general purpose property for specifying the suitability of an event for different participant “levels”. E.g. beginner/intermediate/advanced. Or in the case of martial arts, specific belt requirements. Values SHOULD ideally be drawn from a controlled vocabulary. |
| [`oa:meetingPoint`](https://openactive.io/meetingPoint) | OPTIONAL | String | Instructions for the attendees of an Event about where they should meet the organizer or leader at the start of the event. Some larger locations may have several possible meeting points, so this property provides additional more specific directions. |
| [`schema:isAccessibleForFree`](https://schema.org/isAccessibleForFree) | OPTIONAL | Boolean | Indicates that an Event is free to attend. If an Event is bookable in advance, then publishers SHOULD also define a zero priced [`schema:Offer`](https://schema.org/Offer). If the only [`schema:Offer`](https://schema.org/Offer) for an Event is zero priced, then publishers SHOULD include this property with a value of `true`. |
| [`schema:offers`](https://schema.org/offers) | RECOMMENDED | Array of [`schema:Offer`](https://schema.org/Offer) | Provides one or more offers to book and participate in an Event |
| [`schema:potentialAction`](https://schema.org/potentialAction) | OPTIONAL | Array of [`schema:Action`](https://schema.org/Action) | Provides one or more actions that can be carried out on this Event, e.g. through interacting with an API or other service. The [[Open-Booking-API]] defines a `ReserveAction`. |
The following example shows a simple event description, including its start time and duration:
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"attendeeInstructions": "Please wear trainers and comfortable clothing",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M"
}
This basic description can be improved by providing information about its location and organizer.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"attendeeInstructions": "Please wear trainers and comfortable clothing",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"organizer": [{
"type": "Organization",
"url": "http://example.org/orgs/bristol-tai-chi",
"name": "Bristol Tai Chi"
}],
"location": {
"type": "Place",
"name": "ExampleCo Gym",
"address": {
"type": "PostalAddress",
"streetAddress": "1 High Street",
"addressLocality": "Bristol",
"addressCountry": "GB",
"addressRegion": "Somerset",
"postalCode": "BS1 4SD"
}
}
}
### Relating events to Physical Activities
The [`oa:activity`](https://openactive.io/activity) property allows an event to be associated with one or more Physical Activities. The Physical Activities used to describe an event SHOULD be drawn from a standard Activity List, e.g. the OpenActive Activity List ([[OpenActive-Activity-List]]).
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"activity": [{
"id": "https://openactive.io/activity-list#c16df6ed-a4a0-4275-a8c3-1c8cff56856f",
"type": "Concept",
"prefLabel": "Tai Chi",
"inScheme": "https://openactive.io/activity-list"
}]
}
Applications could include additional information, e.g. alternate labels for convenience of consumers.
### Describing event availabilitySchema.org provides a couple of basic properties for describing the maximum ([`schema:maximumAttendeeCapacity`](https://schema.org/maximumAttendeeCapacity)) and remaining capacity ([`schema:remainingAttendeeCapacity`](https://schema.org/remainingAttendeeCapacity)) for an [`schema:Event`](https://schema.org/Event).
These properties can be used to provide some basic availability information for scheduled events. These are illustrated in the following example which states that a Tai chi class can be attended by up to 20 people and that there are 4 spaces remaining.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"maximumAttendeeCapacity": 20,
"remainingAttendeeCapacity": 4
}
### Indicating the status of an event
An [`schema:Event`](https://schema.org/Event) may occasionally be rescheduled or cancelled. Schema.org provides the [`schema:eventStatus`](https://schema.org/eventStatus) property for indicating the current status of an event.
The property can have several standardised values which are defined by the [`schema:EventStatusType`](https://schema.org/EventStatusType) enumeration. The property values should therefore be one of the following URIs:
* Cancelled: `https://schema.org/EventCancelled` * Postponed: `https://schema.org/EventPostponed` * Rescheduled: `https://schema.org/EventRescheduled` * Scheduled: `https://schema.org/EventScheduled`If the status property is not provided then applications SHOULD assume a default value of `https://schema.org/EventScheduled`.
The following example shows a Tai chi class that has been cancelled:
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"eventStatus": "https://schema.org/EventCancelled"
}
### Categorising events
The [`oa:category`](https://openactive.io/category) property can be used to associate an Event with one or more tags that provide some extra context about an event. This might include general information on the intensity and suitability. While this property can be used to add any arbitrary tags to an Event, a common use case is the need to tag an event as being suitable for a specific type of audience, e.g. Beginners. Where this information is available, the [`oa:level`](https://openactive.io/level) property can be used in preference to [`oa:category`](https://openactive.io/category).
If an application does not distinguish between different types of tags associated with an Event, then it SHOULD use the more general [`oa:category`](https://openactive.io/category) property.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"category": [
"Suitable For All", "Low Intensity"
],
"level": [{
"type": "Concept",
"prefLabel": "Beginner"
}]
}
Category tags can be specified as either a simple array of string values or as Concepts. This allows publishers to include values from a controlled vocabulary if they use one in their application.
### Adding programmes (`schema:Brand`) Events can be associated with a Programme using the [`oa:programme`](https://openactive.io/programme) property. A programme is a [`schema:Brand`](https://schema.org/Brand) object.| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Brand |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:name`](https://schema.org/name) | REQUIRED | String | The name of the programme |
| [`schema:url`](https://schema.org/url) | REQUIRED | URL | A URL to the homepage or other page about the programme |
| [`schema:description`](https://schema.org/description) | RECOMMENDED | String | A description of the programme |
| [`schema:logo`](https://schema.org/logo) | RECOMMENDED | [`schema:ImageObject`](https://schema.org/ImageObject) | Logo for the programme |
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Back to Netball",
"description": "A slightly more energetic way to get back in to Netball if you’ve had a break from the sport or for those who’d like to give something new a go. This is based on the traditional 7 a-side netball game and involves running and jumping. It’s a fun light hearted session, where we do netball skills (a bit of fitness – not too much!) and match play. We have players of all ages and abilities ranging from players in their 20’s through to 50’s!",
"attendeeInstructions": "Just wear proper trainers, comfy clothes and bring a drink.",
"startDate": "2017-04-01T08:00:00Z",
"duration": "PT60M",
"programme": {
"type": "Brand",
"name": "Back to Netball",
"url": "https://www.englandnetball.co.uk/backtonetball/",
"description": "Running across England since 2010, over 60,000 women have taken part in Back to Netball and realised the benefits of getting involved.",
"logo": {
"type": "ImageObject",
"url": "http://hertsnetball.co.uk/js/plugins/imagemanager/files/B2N_logo.jpg"
}
}
}
### Describing the audience suitability of events
There are a variety of ways in which the suitability of an event for specific audiences can be expressed. This includes specifying that an event is:
* suited for a specific age range * suited for people with specific levels of experience ([`oa:level`](https://openactive.io/level)) * restricted to a male, female or mixed audience #### Age rangesAge ranges are specified using the [`oa:ageRange`](https://openactive.io/ageRange) property. The value is a [`schema:QuantitativeValue`](https://schema.org/QuantitativeValue) which should have [minValue](https://schema.org/minValue) or [maxValue](https://schema.org/maxValue) properties. These properties specify an inclusive minimum and maximum age range for participants.
Data publishers using the [`oa:ageRange`](https://openactive.io/ageRange) property MUST ensure that it has:
* a `type` of [`schema:QuantitativeValue`](https://schema.org/QuantitativeValue) * at least one of the `minValue` or `maxValue`propertiesData consumers SHOULD assume that:
* if there is no `ageRange` property for an Event, then the event is suitable for adults only. E.g. as if the `minValue` has been specified as `18` * if an `ageRange` is provided without a `minValue` property, then there is no minimum age for the `Event` * if an `ageRange` is provided without a `maxValue` property, then there is no maximum age for the `Event` * if an `ageRange` is provided with a `minValue` of 0, and there is no `maxValue` property then the Event is suitable for allThe following example illustrates how to specify an Event that is suitable for people aged 60 or over.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"ageRange": {
"type": "QuantitativeValue",
"minValue": 60
}
}
The following example illustrates an Event that is suitable for all ages. This is indicated by providing an `minValue` property with a value of zero and no `maxValue` property.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Exercise in the park",
"ageRange": {
"type": "QuantitativeValue",
"minValue": 0
}
}
#### Gender restrictions
Attendance at some events is limited to certain audiences. For example a female only gym class. The [`oa:genderRestriction`](https://openactive.io/genderRestriction) property can be used to specify these restrictions.
Data publishers using this property MUST use one of the following values:
* `https://openactive.io/NoRestriction` indicating that the event has no restrictions * `https://openactive.io/MaleOnly` indicating that the event is restricted to the male gender * `https://openactive.io/FemaleOnly` indicating that the event is restricted to the female genderIf the `genderRestriction` property is not supplied for an Event, then data consumers SHOULD NOT assume a default value, the value should be treated as `null`. When searching or filtering for gender restricted Events, data consumers SHOULD remove Events with a `null` value.
Invalid values for the `genderRestriction` property SHOULD be treated as `null`.
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Gym class",
"genderRestriction": "https://openactive.io/FemaleOnly"
}
The community group is aware of both the issues that arise from defining standard terms for gender and the inclusivity issues that might arise from restricting participation in events.
We have standardised these terms to reflect the ways that events are currently described. However there are many additional considerations that relate to how gender is described and the ways that events might be advertised and run in order for people to feel safe and included.
We encourage the community to reflect on the approach outlined here and experiment with alternative options. We have outlined some of these options and welcome feedback on how we can improve this area of the specification.
This specification defines several ways to capture information from organisers about the types of support they provide for people with disabilities or other impairments. This includes:
* listing the types of disability or impairment that are, or can be accommodated at an event using the [`oa:accessibilitySupport`](https://openactive.io/accessibilitySupport) property * providing additional notes for participants using the [`oa:accessibilityInformation`](https://openactive.io/accessibilityInformation) propertyExamples of using these are shown below:
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"accessibilitySupport": ["Hearing Impairment", "Visual Impairment"],
"accessibilityInformation": "The location is fully accessible, please contact the organiser if you have questions"
}
### Parent-child relationships between Events
Events are often related to one another in parent-child relationships. For
example a whole day event (the parent) might consist of a programme of
shorter events such as individual races that take place at
different times of the day (the children).
This type of relationship between events can be described using the
[`schema:subEvent`](https://schema.org/subEvent) and [`schema:superEvent`](https://schema.org/superEvent)
properties. Note on each occasion within this specification that a relationship is
represented using [`schema:subEvent`](https://schema.org/subEvent], the inverse is also
possible using [`schema:superEvent`](https://schema.org/superEvent) and conformance rules MUST be adapted accordingly.
{
"@context": "https://openactive.io/",
"type": "HeadlineEvent",
"url": "http://www.example.org/events/1",
"name": "Aquathlon Day",
"description": "A day of aquathlon races",
"startDate": "2018-09-01T09:00:00-05:00",
"endDate": "2018-09-01T17:00:00-05:00",
"duration": "P1D",
"subEvent": [
{
"type": "Event",
"url": "http://www.example.org/events/2",
"name": "Aquathlon Sprint",
"startDate": "2018-09-01T10:00:00-05:00"
},
{
"type": "Event",
"url": "http://www.example.org/events/2",
"name": "Aquathlon Long Course",
"startDate": "2018-09-01T14:00:00-05:00"
}
]
}
The `HeadlineEvent` type used in this example is described in the following
section.
When not otherwise specified on the child event, a consumer MAY assume that
some properties that describe the parent (`schema:superEvent`) event also
apply to the child. This might include properties such as the location,
organizer or audience suitability of an Event. This is referred to as "__property inheritance__".
Some properties are never inherited. These properties are `@type`, `@id`, `schema:url`,
`schema:identifier` and `schema:eventSchedule`. A consumer MUST NOT assume that
these properties apply to child events.
If a child Event provides a property with the same name as its parent
(e.g. `startDate`) then consumers MUST use the value provided for the child and
not that of the parent.
By default the `offers` property, listing the Offers available to participate in
an Event are also not inherited. Consumers MUST NOT assume that any Offers
provided for a parent event are automatically applicable to child events. However
some types of event MAY allow for inheritance of offers. This is discussed in the
following sections.
### Types of event
[`schema:Event`](https://schema.org/Event) provides a useful default type for
describing Events.
However in practice it can be useful to distinguish between some specific types
of Event. This gives data consumers more context that can help them index and
recommended Events to potential participants. Recognising additional types of
Event can also be useful in defining additional conformance and validation
rules that guide how data is published and used.
This specification defines several sub-types of Event. These are described in
the following sections. Unless otherwise specified:
* all of the properties defined for [`schema:Event`](https://schema.org/Event)
can applied to each sub-type
* properties have the same status (e.g. REQUIRED) as for the generic type
* the property inheritance rules defined in the previous section apply to each
sub-type
Where publishers are unsure whether a sub-type applies they SHOULD use the
generic [`schema:Event`](https://schema.org/Event) type. Publishers MUST NOT use
any of these sub-types to describe other forms of Event.
When data consumers encounter a new sub-type of Event, they SHOULD treat it as if
it were of the generic [`schema:Event`](https://schema.org/Event) type. New sub-types
might be defined in future versions of this specification or as custom types by
individual publishers.
#### Regular sessions (`SessionSeries` and `ScheduledSession`)
Many organisers run regularly scheduled Events, e.g. a weekly exercise class or
a monthly ride of a cycle club.
These can be thought of as two distinct types of Event:
* [`oa:SessionSeries`](https://openactive.io/SessionSeries) - the overall series of events, e.g. Wednesday Yoga
* [`oa:ScheduledSession`](https://openactive.io/ScheduledSession) - the individual sessions, e.g. Wednesday Yoga
on 5th September 2018
The following example illustrates how these types are used.
{
"@context": "https://openactive.io/",
"type": "SessionSeries",
"url": "http://www.example.org/events/1",
"name": "Wednesday Yoga",
"description": "Yoga on a Wednesday",
"startDate": "2018-01-01",
"endDate": "2018-12-31"
"subEvent": [
{
"type": "ScheduledSession",
"url": "http://www.example.org/events/2",
"startDate": "2018-09-05T18:00:00-05:00",
"endDate": "2018-09-05T19:00:00-05:00",
"duration": "PT1H"
},
...
]
}
Publishers SHOULD use the [`oa:SessionSeries`](https://openactive.io/SessionSeries) type for describing Events that
occur on a regular schedule. The child events of
a [`oa:SessionSeries`](https://openactive.io/SessionSeries) provided in a [`schema:subEvent`](https://schema.org/subEvent) property MUST all be
of the [`oa:ScheduledSession`](https://openactive.io/ScheduledSession) type.
As an [`oa:SessionSeries`](https://openactive.io/SessionSeries) is intended to be
a parent for other events, then it MUST have either a [`schema:eventSchedule`](https://pending.schema.org/eventSchedule) which
describes the schedule for the subevents, OR must be explicitly associated with
those events via a [`schema:subEvent`](https://schema.org/subEvent) (or [`schema:superEvent`](https://schema.org/superEvent))
property.
Where an [`schema:eventSchedule`](https://pending.schema.org/eventSchedule) is provided for
a [`oa:SessionSeries`](https://openactive.io/SessionSeries) then it MUST include a
[`oa:scheduledEventType`](https://openactive.io/scheduledEventType) property with a value
of [`oa:ScheduledSession`](https://openactive.io/ScheduledSession)
In addition to the above, there are some other changes that apply to these type
that override conformance rules defined for [`schema:Event`](https://schema.org/Event).
For an [`oa:ScheduledSession`](https://openactive.io/ScheduledSession):
* it MUST NOT have either a [`schema:eventSchedule`](https://pending.schema.org/eventSchedule) or a [`schema:subEvent`](https://schema.org/subEvent). They are individual instances
of events.
* the `schema:startDate` property is REQUIRED. This will either be explicitly provided or derived as part of generating it
from a `Schedule`
* The `schema:url` property is RECOMMENDED
* The `schema:eventStatus` property is RECOMMENDED
* The `schema:description`, `schema:image`, `schema:organizer`, `oa:ageRange`, `oa:genderRestriction` and `oa:level` properties
are OPTIONAL. This information can be provided and inherited from the parent `oa:SessionSeries`
For an [`oa:SessionSeries`](https://openactive.io/SessionSeries):
* it MUST NOT have a [`schema:remainingAttendeeCapacity`](https://schema.org/remainingAttendeeCapacity). They are a series of sessions so do not have capacity themselves.
* The `schema:maximumAttendeeCapacity` property is OPTIONAL
* The `schema:startDate` and `schema:endDate` properties are OPTIONAL
* The `schema:eventStatus` property is OPTIONAL
In addition to the normal rules around property inheritance, data consumers
MAY also assume that Offers provided for a [`oa:SessionSeries`](https://openactive.io/SessionSeries) also apply to
their child events, of type [`oa:ScheduledSession`](https://openactive.io/ScheduledSession).
This is in the only time that Offers may be inherited between types. This is
permitted here as the parent Event exists to describe a series of sessions. The
individual sessions MAY have additional properties and consumers MUST use these
where provided.
#### Headline events (`HeadlineEvent`)
The ability to describe parent-child relationships between Events provides a
useful way to publish an event programme for a whole day or multi-day event,
such as a mass participation event, family fun day, etc.
To help distinguish programmed events from the "headline" event itself, this
specification defines the [`oa:HeadlineEvent`](https://openactive.io/HeadlineEvent)
type.
{
"@context": "https://openactive.io/",
"type": "HeadlineEvent",
"url": "http://www.example.org/events/1",
"name": "Aquathlon Day",
"description": "A day of aquathlon races",
"startDate": "2018-09-01T09:00:00-05:00",
"endDate": "2018-09-01T17:00:00-05:00",
"duration": "P1D",
"subEvent": [
{
"type": "Event",
"url": "http://www.example.org/events/2",
"name": "Aquathlon Sprint",
"startDate": "2018-09-01T10:00:00-05:00"
},
{
"type": "Event",
"url": "http://www.example.org/events/3",
"name": "Aquathlon Long Course",
"startDate": "2018-09-01T14:00:00-05:00"
}
]
}
The [`oa:HeadlineEvent`](https://openactive.io/HeadlineEvent) is mainly
provided as a means for data consumers to treat these types of events differently
from [`oa:SessionSeries`](https://openactive.io/HeadlineEvent).
For example a web application might display a
[`oa:HeadlineEvent`](https://openactive.io/HeadlineEvent) with a custom page
that includes a summary of its programme of activities.
A [`oa:HeadlineEvent`](https://openactive.io/HeadlineEvent) is an event in
its own right, and MUST NOT have an `schema:eventSchedule` property. Publishers
MUST provide a `schema:startDate`.
As with the generic type, any Offers provided for a
[`oa:HeadlineEvent`](https://openactive.io/HeadlineEvent) apply to that
Event, they are not inherited by individual child events. However a publisher
MAY provide Offers for individual events in the programme if they are individually
ticketed.
#### Courses (`CourseInstance`)
Schema.org defines a [`Course`](https://pending.schema.org/Course) as an education
course that is run at different times and places. The course might consist of one or
more individual classes.
These instances of a course are described using the
[`schema:CourseInstance`](https://pending.schema.org/CourseInstance) type.
Publishers SHOULD use the [`schema:CourseInstance`](https://pending.schema.org/CourseInstance)
type when describing courses of any duration.
{
"@context": "https://openactive.io/",
"type": "CourseInstance",
"url": "http://www.example.org/events/1",
"name": "Sailing Course",
"description": "A ten week sailing course",
"startDate": "2018-08-30",
"endDate": "2018-11-08"
"subEvent": [
{
"type": "Event",
"url": "http://www.example.org/events/2",
"startDate": "2018-08-30T09:00:00-05:00",
"endDate": "2018-08-30T10:00:00-05:00",
"duration": "PT1H"
},
...
]
}
A [`schema:CourseInstance`](https://pending.schema.org/CourseInstance) MUST have
either a `subEvent` property AND/or an `eventSchedule` property that provides
information about the individual classes.
Child events of a [`schema:CourseInstance`](https://pending.schema.org/CourseInstance)
SHOULD be of the generic `schema:Event` type.
A participant will typically pay to attend a whole course. So, as with the
generic type, any Offers provided for a [[`schema:CourseInstance`](https://pending.schema.org/CourseInstance)
apply to the whole course any not the individual classes. However a publisher
MAY provide Offers for individual events in the programme if they are individually
ticketed.
{
"@context": "https://openactive.io/",
"type": "EventSeries",
"url": "http://www.example.org/events/1",
"name": "Swim For Adults",
"description": "Adult swimming session",
"activity": [{
"type": "Concept",
"prefLabel": "Swimming"
}],
"subEvent": [
{
"type": "SessionSeries",
"url": "http://www.example.org/events/2",
"name": "Swim For Adults",
"location": {
"type": "Place",
"name": "ExampleCo Gym"
...
},
"eventSchedule": [
{
"type": "Schedule",
"startDate": "2017-01-01",
"endDate": "2017-12-31",
"repeatFrequency": "P1W",
"byDay": [ "https://schema.org/Wednesday" ],
"startTime": "19:00",
"endTime": "20:00",
"duration": "PT1H",
"scheduledEventType": "ScheduledSession"
}
]
},
{
"type": "SessionSeries",
"url": "http://www.example.org/events/2",
"name": "Swim For Adults",
"location": {
"type": "Place",
"name": "A. N. Other Gym"
...
},
"eventSchedule": [
{
"type": "Schedule",
"startDate": "2017-01-01",
"endDate": "2017-12-31",
"repeatFrequency": "P1W",
"byDay": [ "https://schema.org/Thursday" ],
"startTime": "18:00",
"endTime": "20:00",
"duration": "PT2H",
"scheduledEventType": "ScheduledSession"
}
]
}
]
}
The [`schema:EventSeries`](https://pending.schema.org/EventSeries) type can be used
as a parent for any type of event, including the generic [`schema:Event`](https://www.schema.org/Event)
type.
The `schema:location`, `schema:startDate` and `schema:endDate` propertes are
only RECOMMENDED.
This specification relies on some pending changes to Schema.org that will add recurrence rules to Events. The [proposal](https://github.com/schemaorg/schemaorg/pull/1693) has been accepted, but is not yet formally part of the model.
We expect that this proposal will become part of Schema.org in due course. This process will be driven by implementation experience and feedback from the community. On that basis we have included the terms in specification. The following section is written on that basis. However both publishers and consumers should be aware that this is an area that may change in future versions.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | `Schedule` |
| [`schema:repeatFrequency`](https://pending.schema.org/repeatFrequency) | REQUIRED | String | The frequency of the events, specified as an [[ISO8601]] duration, e.g. day, week, month |
| [`schema:startDate`](https://schema.org/startDate) | RECOMMENDED | String | Specifies the [`schema:Date`](https://schema.org/Date) from which the schedule is active |
| [`schema:endDate`](https://schema.org/startDate) | RECOMMENDED | String | Specifies the [`schema:Date`](https://schema.org/Date) at which the schedule ends. |
| [`schema:startTime`](https://schema.org/startTime) | REQUIRED | String | Specifies the [`schema:Time`](https://schema.org/Time) at which the Events will take place. |
| [`schema:endTime`](https://schema.org/endTime) | REQUIRED | String | Specifies the [`schema:Time`](https://schema.org/Time) at which the Events will end |
| [`schema:duration`](https://schema.org/duration) | RECOMMENDED | String | Specifies the duration of the Event as an [[ISO8601]] duration. Durations MUST NOT be zero length. If duration is unknown it should be omitted. A duration MUST be provided if both a start and end date are available. |
| [`schema:byDay`](https://pending.schema.org/byDay) | OPTIONAL | Array of [`schema:DayOfWeek`](https://schema.org/DayOfWeek) or Array of String | Lists the day(s) of the week during which the Events will take place. When using string values, this MUST conform to iCal BYDAY rule. |
| [`schema:byMonth`](https://pending.schema.org/byMonth) | OPTIONAL | Array of Integers | Lists the month(s) of the year during which the Events will take place. January is the first month |
| [`schema:byMonthDay`](https://pending.schema.org/byMonthDay) | OPTIONAL | Array of Integers | Lists the day(s) of the month on which an Event will take place |
| [`schema:repeatCount`](https://pending.schema.org/repeatCount) | OPTIONAL | Number | Specifies that an Event will repeat the specified number of times |
| [`schema:exceptDate`](https://pending.schema.org/exceptDate) | OPTIONAL | Array of [`Date`](https://schema.org/Date) or [`DateTime`](https://schema.org/DateTime) | Defines a list of [`Date`](https://schema.org/Date) or [`DateTime`](https://schema.org/DateTime) during which a scheduled Event will not take place. The property allows exceptions to a Schedule to be specified. If an exception is specified as a [`DateTime`](https://schema.org/DateTime) then only the event that would have started at that specific date and time should be excluded from the schedule. If an exception is specified as a [`Date`](https://schema.org/Date) then any event that is scheduled for that 24 hour period should be excluded from the schedule. This allows a whole day to be excluded from the schedule without having to itemise every scheduled event. |
| [`oa:scheduledEventType`](https://openactive.io/scheduledEventType) | REQUIRED | String | Specifies the type that a data consumer should assign to Events that are generated from this schedule. |
| [`oa:urlTemplate`](https://openactive.io/urlTemplate) | RECOMMENDED | String | An [[RFC6570]] compliant URI template that can be used to generate a unique URL (`schema:url`) for every event described by the schedule (see below for more information). This property is REQUIRED if the data provider wants to provide participants with a unique URL to book to attend an event. |
| [`oa:idTemplate`](https://openactive.io/idTemplate) | RECOMMENDED | String | An [[RFC6570]] compliant URI template that can be used to generate a unique identifier (`@id`) for every event described by the schedule (see below for more information). This property is REQUIRED if the data provider is supporting third-party booking via the [[Open-Booking-API]]. |
{
"@context": "https://openactive.io/",
"type": "SessionSeries",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"duration": "PT60M",
"eventSchedule": [
{
"type": "Schedule",
"startDate": "2017-01-01",
"endDate": "2017-12-31",
"repeatFrequency": "P1W",
"byDay": [ "https://schema.org/Wednesday" ],
"startTime": "19:00",
"endTime": "20:00",
"duration": "PT1H",
"scheduledEventType": "ScheduledSession"
}
]
}
#### Partial schedules
There are cases when a system may only capture partial information about event
scheduling from its organizers, e.g. only that an event will run every Wednesday
but not its specific timing. Perhaps because these may
vary or the organizer needs to regularly confirm that events will actually run.
While information on partial schedules can be provided as text via
the [`oa:schedulingNote`](https://openactive.io/schedulingNote) property, it
would be useful to have this in machine readable format where possible.
To support this publishers SHOULD use the [`oa:PartialSchedule`](https://openactive.io/PartialSchedule) type
for publishing partially defined schedules. This type is identical to `schema:Schedule` but has no
required properties.
Publishers providing a [`oa:PartialSchedule`](https://openactive.io/PartialSchedule) MUST provide information on
the actual events as they are confirmed via the [`subEvent`](https://schema.org/subEvent) property.
Publishers that are able to provide the required detail for a more complete
`schema:Schedule` SHOULD use that instead.
schema:Place
)
This specification recommends use of the [`schema:Place`](https://schema.org/Place)
and [`schema:SportsActivityLocation`](https://schema.org/SportsActivityLocation)
types for describing locations.
The [`schema:location`](https://schema.org/location) property can be used to
relate an [`schema:Event`](https://schema.org/Event)
or [`oa:FacilityUse`](https://openactive.io/FacilityUse) to a Place.
The following table lists a number of properties that can be used to
describe a [`schema:Place`](https://schema.org/Place).
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | A type of Place as defined by Schema.org |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:url`](https://schema.org/url) | RECOMMENDED | URI | A URL to a web page (or section of a page) that describes the Place |
| [`schema:name`](https://schema.org/name) | REQUIRED | String | The name of the Place |
| [`schema:description`](https://schema.org/description) | RECOMMENDED | String | A free text description of the Place |
| [`schema:image`](https://schema.org/image) | OPTIONAL | Array of [`schema:ImageObject`](https://schema.org/ImageObject) | One or more images or photos that depicts the Place |
| [`schema:address`](https://schema.org/address) | RECOMMENDED | String or [`schema:PostalAddress`](https://schema.org/PostalAddress) | The street address of the location, expressed as a [`schema:PostalAddress`](https://schema.org/PostalAddress). Where possible publishers MUST specify an address as an object. Publishers MUST only use a String value if all have is a generic location name, e.g. "In Victoria Park, near the lake" |
| [`schema:geo`](https://schema.org/geo) | RECOMMENDED | [`schema:GeoCoordinates`](https://schema.org/GeoCoordinates) | The geographic co-ordinates, specified as a latitude and longitude of a Place |
| [`schema:containedInPlace`](https://schema.org/containedInPlace) | OPTIONAL | [`schema:Place`](https://schema.org/Place) | Indicates that this Place is part of a larger location. Can be used to allow, e.g. a pitch or other facility to be related to a parent location such as a Leisure Centre |
| [`schema:containsPlace`](https://schema.org/containsPlace) | OPTIONAL | Array of [`schema:Place`](https://schema.org/Place) | Relates a Place to one or more other locations and facilities that it contains. |
| [`schema:telephone`](https://schema.org/telephone) | RECOMMENDED | String | A contact telephone number for the location, e.g. for enquiries |
| [`schema:openingHoursSpecification`](https://schema.org/openingHoursSpecification) | RECOMMENDED | Array of [`schema:OpeningHoursSpecification`](https://schema.org/OpeningHoursSpecification) | Specifies the opening hours of a location. The value of this property is a [`schema:OpeningHoursSpecification`](https://schema.org/OpeningHoursSpecification). |
| [`schema:amenityFeature`](https://schema.org/amenityFeature) | RECOMMENDED | Array of [`schema:LocationFeatureSpecification`](https://schema.org/LocationFeatureSpecification) | Used to indicate whether specific amenities are available at a location. The value of this property will be an array of [`schema:LocationFeatureSpecification`](https://schema.org/LocationFeatureSpecification) objects. See "Describing Amenities" for more information. |
{
"@context": "https://openactive.io/",
"type": "Place",
"url": "http://www.better.org.uk/leisure-centre/banes/bath-sports-and-leisure-centre",
"name": "Bath Sports and Leisure Centre",
"address": {
"type": "PostalAddress",
"streetAddress": "North Parade Road",
"addressLocality": "Bath",
"addressRegion": "Somerset",
"postalCode": "BA2 4ET",
"addressCountry": "GB"
},
"telephone": "+44 (0)1225 486905"
}
### Describing Addresses
Schema.org provides the following properties for publishing address data using the [`schema:PostalAddress`](https://schema.org/PostalAddress) type.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | PostalAddress |
| [`schema:streetAddress`](https://schema.org/streetAddress) | REQUIRED | String | Street address |
| [`schema:addressLocality`](https://schema.org/addressLocality) | REQUIRED | String | Town or other area |
| [`schema:addressRegion`](https://schema.org/addressRegion) | REQUIRED | String | Region |
| [`schema:postalCode`](https://schema.org/postalCode) | REQUIRED | String | Postcode |
| [`schema:addressCountry`](https://schema.org/addressCountry) | REQUIRED | String | ISO 3166-1 alpha-2 country code |
{
"@context": "https://openactive.io/",
"type": "PostalAddress",
"streetAddress": "North Parade Road",
"addressLocality": "Bath",
"addressRegion": "Somerset",
"postalCode": "BA2 4ET",
"addressCountry": "GB"
}
### Describing Geographic Location
A more precise geographical location can be provided for a [`schema:Place`](https://schema.org/Place) by adding a [`schema:geo`](https://schema.org/geo) property. The value of this property is a is a [`schema:GeoCoordinates`](https://schema.org/GeoCoordinates) object.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | `GeoCoordinates` |
| [`schema:latitude`](https://schema.org/latitude) | REQUIRED | Number | Latitude |
| [`schema:longitude`](https://schema.org/longitude) | REQUIRED | Number | Longitude |
{
"@context": "https://openactive.io/",
"type": "Place",
"url": "http://www.better.org.uk/leisure-centre/banes/bath-sports-and-leisure-centre",
"name": "Bath Sports and Leisure Centre",
"address": {
"type": "PostalAddress",
"streetAddress": "North Parade Road",
"addressLocality": "Bath",
"addressRegion": "Somerset",
"postalCode": "BA2 4ET",
"addressCountry": "GB"
},
"telephone": "+44 (0)1225 486905",
"geo": {
"type": "GeoCoordinates",
"latitude": 51.3816123,
"longitude": -2.3544367
}
}
### Describing Amenities
It can be useful to describe the amenities (e.g. characteristics, services or other features) available at a location.
Schema.org provides the [`schema:amenityFeature`](https://schema.org/amenityFeature) property for specifying an list of amenities that are available or unavailable at a specific [`schema:Place`](https://schema.org/Place). The value of a the property is an array of objects that describe the individual amenities.
To improve consistency in how amenities are published, this specification defines some common types of amenities:
* [`ChangingFacilities`](https://openactive.io/ChangingFacilities)
* [`Showers`](https://openactive.io/Showers)
* [`Toilets`](https://openactive.io/Toilets)
* [`Lockers`](https://openactive.io/Lockers)
* [`Towels`](https://openactive.io/Towels)
* [`Creche`](https://openactive.io/Creche)
* [`Parking`](https://openactive.io/Parking)
* [`BabyChanging`](https://openactive.io/BabyChanging)
Publishers SHOULD use one of these types when applicable. If there is no pre-defined type then data publishers MUST use the more generic [`schema:LocationFeatureSpecification`](https://schema.org/LocationFeatureSpecification) type.
This avoids the need for data consumers to have to rely on the `name` value to identify common amenities that may otherwise be named differently (e.g. "Changing Rooms, "Changing Facilities", etc).
{
"@context": "https://openactive.io/",
"type": "Place",
"amenityFeature": [
{
"type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
}
]
}
Publishers MUST include the `type`, `name` and `value` properties for each amenity. A `value` of `false` indicates that a specific amenity is not available.
Additional information MAY be provided about each of the amenities, using properties from the [`schema:LocationFeatureSpecification`](https://schema.org/LocationFeatureSpecification) type. For example, specifying opening hours ([`schema:hoursAvailable`](https://schema.org/hoursAvailable)) or to add a description ([`schema:description`](https://schema.org/description)).
The list of pre-defined amenties MAY be revised in future specifications based on feedback from the community.
In the meantime additional types of amenities can be specified using the more generic [`schema:LocationFeatureSpecification`](https://schema.org/LocationFeatureSpecification) type as shown below:
{
"@context": "https://openactive.io/",
"type": "Place",
"amenityFeature": [
{
"type": "LocationFeatureSpecification",
"name": "Outdoor seating",
"value": true
}
]
}
### Describing Facilities at a Location
Facilities such as swimming pools, courts, etc available at a location can
be expressed using the containment properties
([`schema:containedInPlace`](https://schema.org/containedInPlace)
and [`schema:containsPlace`](https://schema.org/containsPlace)). The following example illustrates how to describe that a Leisure Centre includes a gym:
{
"@context": "https://openactive.io/",
"type": "Place",
"url": "http://www.better.org.uk/leisure-centre/banes/bath-sports-and-leisure-centre",
"name": "Bath Sports and Leisure Centre",
"address": {
"type": "PostalAddress",
"streetAddress": "North Parade Road",
"addressLocality": "Bath",
"addressRegion": "Somerset",
"postalCode": "BA2 4ET",
"addressCountry": "GB"
},
"containsPlace": [{
"type": "SportsActivityLocation",
"url": "http://www.better.org.uk/leisure-centre/banes/bath-sports-and-leisure-centre/gym",
"name": "Gym"
}]
}
## Describing Organisers (schema:Person
and schema:Organization
)
Applications must not publish personal data without permission
While the schema:Person
type allows a variety of information to be published about a
person, applications MUST not publish this information as open data without consent.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Person or Organization |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:url`](https://schema.org/url) | RECOMMENDED for Organization. OPTIONAL for Person | URL | A URL to the homepage or other page about the organisation |
| [`schema:name`](https://schema.org/name) | REQUIRED for Organization. OPTIONAL for Person. | String | The name of the organisation |
| [`schema:description`](https://schema.org/description) | OPTIONAL | String | A description of the organisation |
| [`schema:logo`](https://schema.org/logo) | OPTIONAL | [`schema:ImageObject`](https://schema.org/ImageObject) | Logo for the organization |
| [`schema:telephone`](https://schema.org/telephone) | RECOMMENDED for Organization. OPTIONAL for Person. | String | Telephone number of the organization or person. |
| [`schema:sameAs`](https://schema.org/sameAs) | RECOMMENDED for Organization. OPTIONAL for Person. | Array of String | Lists the URL(s) of the official social media profile pages associated with the organization or person. |
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"startDate": "2017-03-22T20:00:00-05:00",
"duration": "PT60M",
"organizer": [{
"type": "Organization",
"url": "http://example.org/clubs/1",
"name": "Bath Tai Chi Club",
"logo": [{
"type": "ImageObject",
"url": "http://www.example.org/clubs/1/logo.png"
}]
}]
}
## Describing Activity Lists (skos:ConceptScheme
) and Physical Activity (skos:Concept
)
List of Physical Activities are controlled vocabularies published using the types and properties defined by the [SKOS](https://www.w3.org/TR/skos-primer/) standard. That
standard covers all the requirements [outlined in the concept model](#physical-activities), allowing:
* activities to be organised into hierarchies to capture broader-narrow relationships, e.g. "Martial Arts" and "Judo"
* sharing of alternative labels to support search and indexing
* the sharing of standard codes to support data integration
The [[OpenActive-Activity-List]] provides an openly licensed standard activity list that can be used by publishers. But where a publisher needs to publish their own list, then they can use the properties defined in the SKOS specification, as follows:
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | ConceptScheme |
| `@id` | REQUIRED | URL | A URI providing a unique identifier for the resource |
| [`schema:url`](https://schema.org/url) | REQUIRED | URL | A URL that links to the Activity List |
| [`dc:title`](http://purl.org/dc/terms/title) | REQUIRED | String | Title of the Activity List |
| [`schema:description`](https://schema.org/description) | RECOMMENDED | String | Description of the activity list |
| [`dc:license`](http://purl.org/dc/terms/license) | RECOMMENDED | Reference to the license under which the activity list has been published | |
| [`oa:concept`](https://www.openactive.org/ns#concept) | REQUIRED | Array of [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | List of concepts that make up the list |
{
"@context": "https://openactive.io/",
"type": "ConceptScheme",
"id": "http://www.example.org/activity-list",
"url": "http://www.example.org/activity-list",
"title": "Activity List",
"description": "An example activity list",
"concept": [{
"type": "Concept",
"prefLabel": "Martial Arts",
"narrower": {
"type": "Concept",
"prefLabel": "Tai Chi"
}
}]
}
### Describing Physical Activities
The following properties from the [[SKOS]] specification can be used to describe physical activities.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Concept |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource. If the activity is defined in a openly licensed activity list, then publishers SHOULD provide it's unique identifier. |
| [`skos:prefLabel`](https://www.w3.org/2009/08/skos-reference/skos.html#prefLabel) | REQUIRED | String | Preferred label for referring to the physical activity. The preferred labels should be used when publishing data about the activities involved in an event. |
| [`skos:altLabel`](https://www.w3.org/2009/08/skos-reference/skos.html#altLabel) | OPTIONAL | Array of String | Alternative labels for the physical activity |
| [`skos:inScheme`](https://www.w3.org/2009/08/skos-reference/skos.html#inScheme) | RECOMMENDED | URI | Refers to the Activity List in which this physical activity is defined. If an `@id` property is provided then publishers SHOULD provide this property to identify the activity list which defines the activity. |
| [`skos:broader`](https://www.w3.org/2009/08/skos-reference/skos.html#broader) | OPTIONAL | Array of URI | Where an Activity List is organised as a hierarchy of activities, this property can be used to refer to a parent or broader term. E.g. "Martial Arts" is broader than "Tai Chi". |
| [`skos:narrower`](https://www.w3.org/2009/08/skos-reference/skos.html#narrower) | OPTIONAL | Array of URI | Where an Activity List is organised as a hierarchy of activities, this property can be used to refer to a child or narrower term. E.g. "Tai Chi" is a narrower term of "Martial Arts" |
| [`skos:notation`](https://www.w3.org/2009/08/skos-reference/skos.html#notation) | OPTIONAL | String | Provides a unique code or identifier for an activity |
{
"@context": "https://openactive.io/",
"type": "Concept",
"id": "http://www.example.org/activity-list#tai-chi",
"prefLabel": "Tai Chi",
"altLabel": ["Tai-Chi"],
"inScheme": "http://www.example.org/activity-list"
}
## Describing Offers (schema:Offer
)
To indicate that a `schema:Event` is only available to paid attendees, opportunity data provides may include details of the offers available to participants. The [`schema:Offer`](https://schema.org/Offer) type provides some basic properties for indicating the price and availability of Offers.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Offer |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:name`](https://schema.org/name) | RECOMMENDED | String | The name of the offer suitable for display to participants |
| [`schema:url`](https://schema.org/url) | REQUIRED | URL | A URL that a user can click on to start a booking process for this offer |
| [`schema:price`](https://schema.org/price) | REQUIRED | Number | The offer price available to participants |
| [`schema:priceCurrency`](https://schema.org/priceCurrency) | RECOMMENDED | String | The currency of the offer price. Specified as a 3-letter ISO 4217 value. If an Offer has a zero price, then this property is not required. Otherwise the currency MUST be specified. |
| [`oa:ageRange`](https://openactive.io/ageRange) | RECOMMENDED | [`schema:QuantitativeValue`](https://schema.org/QuantitativeValue) | Indicates that an Offer is applicable to a specific age range. Specified as a [QuantitativeValue](https://schema.org/QuantitativeValue) with [minValue](https://schema.org/minValue) and [maxValue](https://schema.org/maxValue) properties. |
| [`oa:advanceBooking`](https://openactive.io/advanceBooking) | OPTIONAL | [`oa:RequiredStatusType`](https://openactive.io/RequiredStatusType) | Indicates whether to accept this offer, a participant must book in advance, whether they must pay on attending, or have option to do either. Values MUST be one of the three URIs defined by this specification (see below). |
| [`oa:prepayment`](https://openactive.io/prepayment) | OPTIONAL | [`oa:RequiredStatusType`](https://openactive.io/RequiredStatusType) | Indicates whether to accept this offer, a participant must pay in advance, pay when attending, or have the option to do either. Values MUST be one of the three URIs defined by this specification (see below). |
{
"@context": "https://openactive.io/",
"type": "Event",
"url": "http://www.example.org/events/1",
"name": "Tai chi Class",
"description": "A tai chi class intended for beginners",
"duration": "PT60M",
"offers": [{
"type": "Offer",
"name": "Single session",
"price": 5,
"priceCurrency": "GBP"
}]
}
| Value | `oa:advanceBooking` | `oa:prepayment` |
|---|---|---|
| https://openactive.io/Required | Participants must book in advance | Participants must pay in advance |
| https://openactive.io/Optional | Participants have the option to book in advance | Participants may pay in advance or pay on arrival |
| https://openactive.io/Unavailable | Advance booking is not available. Users must turn up | Prepayment is not available. Users may be able to book in advance but must pay on the door |
oa:Slot
)
A Slot is an opportunity to use a facility at a specific time and for a
specified duration. A Slot is therefore a specific type of Event, although
it has a more constrained set of properties.
A series of Slots describes a calendar during which a facility is available
for use.
Slots are always associated with a [`oa:FacilityUse`](https://openactive.io/FacilityUse)
product which may link to more detail about the facility on offer and the costs
for hire.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | Slot |
| `@id` | RECOMMENDED | URI | A URI providing a unique identifier for the resource |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`oa:facilityUse`](https://openactive.io/facilityUse) | REQUIRED | String |
Links a specific Slot with the |
| [`schema:startDate`](https://schema.org/startDate) | REQUIRED | String |
The start date and time of the slot. Can be specified as a [`schema:Date`](https://schema.org/Date) or [`schema:DateTime`](https://schema.org/DateTime). |
| [`schema:endDate`](https://schema.org/endDate) | OPTIONAL | String |
The end date and time of the event. Can be specified as a [`schema:Date`](https://schema.org/Date) or [`schema:DateTime`](https://schema.org/DateTime) |
| [`schema:duration`](https://schema.org/duration) | REQUIRED | String | The duration of the event given in [[ISO8601]] format. Durations MUST NOT be zero length. |
| [`schema:offers`](https://schema.org/offers) | RECOMMENDED | Array of [`schema:Offer`](https://schema.org/Offer) | Describes offers to book and use this specific slot. If unspecified, then a client SHOULD use offers associated with the related Facility Use. |
| [`oa:remainingUses`](https://openactive.io/remainingUses) | REQUIRED | Number |
Used to indicate the availability of this Slot. Where a Slot describes the opportunity to use a single facility this property should have a value of 0 or 1. Where a Slot describes the opportunity to use one of several facilities, which will be allocated during booking, then the property specific how many such facilities are remaining, and may then have a value greater than 1. |
| [`oa:maximumUses`](https://openactive.io/maximumUses) | RECOMMENDED | Number |
Where a Slot describes the opportunity to use one of several facilities, which will be allocated during booking, then this value can be used to indicate how many facilities might be available. |
oa:FacilityUse
, oa:IndividualFacilityUse
)
A Facility Use is a subclass of [`schema:Product`](https://schema.org/Product). It describes an opportunity to use either one of
a group of facilities (oa:FacilityUse
) or a individual facility
(oa:IndividualFacilityUse
).
The opportunity to use a facility is divided into a calendar of Slots, which
allow a participant to use that facility for a specified time and duration.
| Property | Status | Format | Notes |
|---|---|---|---|
| `@type` | REQUIRED | String | `FacilityUse` or `IndividualFacilityUse` |
| `@id` | REQUIRED | URI | A URI providing a unique identifier for the resource |
| [`schema:url`](https://schema.org/url) | URL | REQUIRED | A URL to a web page (or section of a page) that describes the product |
| [`schema:identifier`](https://schema.org/identifier) | OPTIONAL | Number, String, [`schema:PropertyValue`](https://schema.org/PropertyValue) or an array of [`schema:PropertyValue`](https://schema.org/PropertyValue) | A local identifier for the resource. |
| [`schema:name`](https://schema.org/name) | REQUIRED | String | The name of the product or service |
| [`schema:description`](https://schema.org/description) | RECOMMENDED | String | A free text description of the product or service |
| [`schema:provider`](https://schema.org/provider) | REQUIRED | [`schema:Organization`](https://schema.org/Organization) | The organisation responsible for providing the facility |
| [`schema:image`](https://schema.org/image) | RECOMMENDED | Array of [`schema:ImageObject`](https://schema.org/ImageObject) | One or more images or photos that depicts the facility or equipment |
| [`oa:activity`](https://openactive.io/activity) | REQUIRED | Array of [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Specifies the physical activity or activities that can be performed when the facility is used. The activities SHOULD ideally be taken from an activity list. |
| [`schema:location`](https://schema.org/location) | REQUIRED | [`schema:Place`](https://schema.org/Place) | The location of the facility being used. This will either be a generic location, e.g. a leisure centre or sports hall for equipment or more temporary spaces, or a specific schema:SportsActivityLocation when describing opportunities to use
a specific identifiable facility (oa:IndividualFacilityUse ) |
| [`oa:accessibilitySupport`](https://openactive.io/accessibilitySupport) | OPTIONAL | Array of String or [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Used to specify the types of disabilities or impairments that are supported at a facility |
| [`oa:accessibilityInformation`](https://openactive.io/accessibilitySupport) | OPTIONAL | String | Provide additional, specific documentation for participants about how disabilities are, or can be supported at a facility. |
| [`oa:attendeeInstructions`](https://openactive.io/attendeeInstructions) | OPTIONAL | String | Provides additional notes and instructions for users of a facility. E.g. more information on how to find it, what to bring, etc. |
| [`oa:category`](https://openactive.io/category) | OPTIONAL | Array of String or [`skos:Concept`](https://www.w3.org/2009/08/skos-reference/skos.html#Concept) | Provides a set of tags that help categorise and describe a facility. |
| [`schema:event`](https://schema.org/events) | RECOMMENDED | Array of oa:Slot |
An array of one or more upcoming slots (oa:Slot ) during which the product can be used. E.g. a list of hourly slots during which a
football pitch might be hired. Only minimal information need be provided about each event, e.g. identifiers, start time, duration,
event status, and any associated offers. This will be sufficient to allow data users to build a timetable of slots, with an availability
status, price, etc. |
| [`schema:offers`](https://schema.org/offers) | OPTIONAL | Array of [`schema:Offer`](https://schema.org/Offer) | Describes one ore more generic offers to use a facility, e.g to indicate it is available for a set price, or may be used for free. Where offers might vary based on time of day (e.g. peak pricing) then this information should be associated with the specific event ("slot") |
| [`schema:hoursAvailable`](https://schema.org/hoursAvailable) | OPTIONAL | Array of [`schema:OpeningHoursSpecification`](https://schema.org/OpeningHoursSpecification) | Specifies the hours during which this product is available. The value of this property is a schema:OpeningHoursSpecification. |
| [`oa:individualFacilityUse`](https://openactive.io/individualFacilityUse) | OPTIONAL | Array of [`oa:IndividualFacilityUse`](https://openactive.io/IndividualFacilityUse) | Links a oa:FacilityUse product, describing a general opportunity to, e.g. book and play tennis at a leisure centre with an array of oa:IndividualFacilityUse products that provide a more detailed description about an opportunity to book, e.g. individual tennis courts. This allows a platform to publish both a general product and time-table as well as more detailed
products for individual facilities. |
| [`oa:aggregateFacilityUse`](https://openactive.io/aggregateFacilityUse) | OPTIONAL | [`oa:FacilityUse`](https://openactive.io/FacilityUse) | Inverse of the [`oa:individualFacilityUse`](https://openactive.io/individualFacilityUse) property. Related an
oa:IndividualFacilityUse (e.g. an opportunity to play tennis on a specific court) to a oa:FacilityUse (e.g. an opportunity to play tennis at a specific location). |
| [`schema:potentialAction`](https://schema.org/potentialAction) | OPTIONAL | Array of [`schema:Action`](https://schema.org/Action) | Provides one or more actions that can be carried out on this FacilityUse, e.g. through interacting with an API or other service. The [[Open-Booking-API]] defines a `ReserveAction`. |
{
"@context": "https://openactive.io/",
"type": "FacilityUse",
"url": "http://www.example.org/facility-use/1",
"name": "Example Leisure Centre Table Tennis",
"description": "Table tennis tables are available to hire for thirty minute slots",
"activity": "Table Tennis",
"provider": {
"type": "Organization",
"name": "Leisure Centre Ltd"
},
"location": {
"type": "Place",
"name": "Example Leisure Centre",
"address": {
"type": "PostalAddress",
"streetAddress": "1 High Street",
"addressLocality": "Bristol",
"addressRegion": "Somerset",
"postalCode": "BS1 4SD",
"addressCountry": "GB"
}
},
"offers": [
{
"type": "Offer",
"name": "30 minute hire",
"price": 10,
"priceCurrency": "GBP"
}
],
"event": [
{
"type": "Slot",
"id": "http://www.example.org/facility-use/slots/1",
"facilityUse": "http://www.example.org/facility-use/1",
"startDate": "2018-03-01T10:00:00Z",
"duration": "PT30M",
"remainingUses": 1,
"maximumUses": 4
},
{
"type": "Slot",
"id": "http://www.example.org/facility-use/slots/2",
"facilityUse": "http://www.example.org/facility-use/1",
"startDate": "2018-03-01T11:00:00Z",
"duration": "PT30M",
"remainingUses": 3,
"maximumUses": 4,
"offers": [
{
"type": "Offer",
"name": "30 minute hire",
"price": 15,
"priceCurrency": "GBP"
}
]
}
]
}
The following example shows how to use the data model to publish opportunities
to hire a specific tennis court. As this is an oa:IndividualFacilityUse
the location property provides more detail on the location. The example describes
two Slots, but the second is no longer available.
{
"@context": "https://openactive.io/",
"type": "IndividualFacilityUse",
"url": "http://www.example.org/facility-use/2",
"name": "Play Tenns on the Main Tennis Court",
"description": "Tennis courts are available for 30 min sessions",
"image": [
{
"type": "ImageObject",
"url": "http://example.org/images/1.jpg"
}
],
"activity": "Tennis",
"provider": {
"type": "Organization",
"name": "Leisure Centre Ltd"
},
"location": {
"type": "SportsActivityLocation",
"name": "Main Tennis Court",
"containedInPlace": {
"type": "Place",
"name": "Example Leisure Centre",
"address": {
"type": "PostalAddress",
"streetAddress": "1 High Street",
"addressLocality": "Bristol",
"addressRegion": "Somerset",
"postalCode": "BS1 4SD",
"addressCountry": "GB"
}
}
},
"event": [
{
"type": "Slot",
"id": "http://www.example.org/facility-use/slots/1",
"facilityUse": "http://www.example.org/facility-use/1",
"startDate": "2018-03-01T10:00:00Z",
"duration": "PT30M",
"remainingUses": 1,
"maximumUses": 1
},
{
"type": "Slot",
"id": "http://www.example.org/facility-use/slots/1",
"facilityUse": "http://www.example.org/facility-use/1",
"startDate": "2018-03-01T11:00:00Z",
"duration": "PT30M",
"remainingUses": 0,
"maximumUses": 1
}
]
}
The community group feels that the data model proposed in this section adequately covers the primary use cases relating to publishing data on opportunities to hire and use facilities
However we recognise that there may be some consequences on the volume of data shared via [RPDE feeds](https://www.openactive.io/realtime-paged-data-exchange/). Specifically, for multi-use facilities the booking of mutually exclusive configurations will end up increasing the volume of updates that need to be communicated to users.
The community group has documented this issue and [requests feedback from publishers and users](https://github.com/openactive/modelling-opportunity-data/issues/73) based on implementation feedback before deciding how to address the issue.
{
"@context": [
"https://openactive.io/",
"https://example.org/custom.jsonld"
],
"type": "Event",
"ext:myCustomProperty": "foo"
}
Publishers MUST NOT use unprefixed property and type
names.
Using a separate context and prefixed names will help to clarify for users when
a dataset is referencing one or more extensions.
#### Beta Namespace
The [[OpenActive-Beta-Namespace]] provides a custom namespace that can be used
by publishers experimenting with new properties that are likely to be added to
the core specification.
It is defined as a convenience to help document properties that are in active
testing and review by the community. Publishers SHOULD NOT
assume that properties in the `beta` namespace will either be added to the core
specification or be included in the namespace over the long term.
Publishers needing additional custom properties SHOULD
define their own namespace.


Xbox Black Friday deals are live now — here are the best discounts on Xbox One consoles and games, Business Insider - Business Insider Singapore
by Christian de Looper, Joe Osborne, Business Insider USXbox
- The Xbox One X and Xbox One S are among the most powerful gaming consoles out there.
- The consoles and their games are getting impressive discounts for Black Friday at Best Buy, Walmart, and Microsoft.
- You can check out the rest of our Black Friday and Cyber Monday coverage on Insider Picks for more great deals.
Black Friday is nearly here, and it’s set to be the best time of the year to buy gaming devices – including the PlayStation 4, and, of course, the Microsoft Xbox One.
The Xbox One is the most powerful gaming console on the market, so you’ll get beautifully detailed graphics, awesomely long storylines, and many great games.
Interested in getting the Xbox for less? Plenty of retailers have announced their Black Friday deals, and they’re live now so you can get shopping.
Here are the best Black Friday Xbox deals we found.
5 best Xbox Black Friday deals in 2019:
- Xbox One X 1TB with “Star Wars: Jedi Fallen Order” for $349.99 (originally $499.99) [You save $150], available at Walmart
- Xbox One S 1TB with “Star Wars: Jedi Fallen Order” + $40 gift card for $199 (originally $299) [You save $100], available at Target
- Xbox One S 1TB All-Digital Edition for $149.99 (originally $249.99) [You save $100], available at Best Buy
- Xbox One S 1TB with two controllers for $199.99 (originally $279.99) [You save $80], available at Costco
- Save up to 80% on Xbox One games like “Gears 5” and “NBA 2K20” [You save up to 80%], available at GameStop
Xbox One X 1TB with ‘Star Wars: Jedi Fallen Order’
This deal is available now until December 2.
If you’re looking for the most powerful version of the Xbox, then the Xbox One X is the way to go. This console can output video at a hefty 4K, so you’ll be able to play games in stunning detail.
Not only that, but this bundle comes with the highly-anticipated and already well-reviewed “Star Wars: Jedi Fallen Order,” so you’ll be able to get started playing as soon as you get your console. This bundle normally costs $499.99, but it’s on sale for Black Friday for an impressive $150 off, bringing the total to $349.99.

Perhaps you don’t want or need an Xbox that supports 4K – in which case, it’s worth considering the Xbox One S bundle, which also comes with “Star Wars: Jedi Fallen Order.”
The Xbox One S is still a very capable console and will display beautifully vivid games – even if they’re not in 4K. While the bundle normally costs $299.99, on Black Friday, you can get it for only $199.99 – $100 off the normal price.

Don’t like the idea of having to buy physical copies of video games? The Xbox One S All-Digital Edition is the Xbox console for you. This console doesn’t have a disc reader at all, but the trade-off is that it’s a little cheaper than other Xbox One consoles. Safe to say, if you really only plan on buying digital copies of games anyway, this may well be the way to go. Just know that you can’t take advantage of used games.
Get the Xbox One S 1TB All-Digital Edition from GameStop, $149.99 (originally $249.99) [You save $100]
Get the Xbox One S 1TB All-Digital Edition from Best Buy, $149.99 (originally $249.99) [You save $100]
Xbox One S 1TB with two controllers
This deal started on November 24.
If you prefer to play video games with friends, then you might need a second controller – in which case this bundle is for you. The bundle doesn’t come with any games, but you will get the Xbox One S console with two controllers – and that’s perfect for those who like playing local multiplayer games.
Get the Xbox One S 1TB bundle with 2 wireless controllers from Microsoft, $199.99 (originally $279.99) [You save $80]
Save up to 80% on Xbox One games
This deal is available now until December 2.
Once you have an Xbox One console, you might want to get a few games for it, and Microsoft has a range of discounts on games. You’ll get up to a whopping 80% off Xbox One games, including recent titles, like “Gears 5” and “NBA 2K20,” on GameStop’s store. These deals apply to both digital and physical games, so you’ll need to be willing to download your games instead of own physical copies.
Save up to 80% on Xbox One games like “Gears 5” and “NBA 2K20” [You save up to 80%], available at GameStop
Xbox One controllers
The Xbox One console can support up to four wireless controllers connected at once, so the console begs to be played with friends and family on the couch. However, those controllers are more expensive than ever, especially if you haven’t purchased a new console in more than a few years. Luckily, there are plenty of Xbox One controller deals for Black Friday, saving you $20 or more this season.

Thankfully, yes. Many of the best console deals may come from other retailers, but Microsoft still offers some excellent Xbox One deals of its own. Microsoft’s own deals are available now until December 2.
Will “Jedi: Fallen Order” be on sale for Black Friday?
Sadly, “Star Wars: Jedi Fallen Order” is not available at a discount on its own – but it is available on sale bundled with an aforementioned Xbox One console.
Does GameStop have Black Friday deals?
GameStop has a range of Black Friday deals of its own. These deals include console deals and game deals.
See more Black Friday sales and deals
- The absolute best Black Friday deals of 2019
- The best tech deals of Black Friday 2019
- Kohl’s Black Friday deals 2019
- Amazon Black Friday deals 2019
- Walmart Black Friday deals 2019
- Target Black Friday deals 2019
- The best mattress deals on Black Friday 2019


{% extends "wagtailadmin/base.html" %} {% block titletag %}Delete {{ page.title }}{% endblock %} {% block bodyclass %}menu-explorer{% endblock %} {% block content %} {% include "wagtailadmin/shared/header.html" with title="Delete" subtitle=page.title %}
Are you sure you want to delete this page? {% if descendant_count %}This will also delete {{ descendant_count }} subpage{{ descendant_count|pluralize }}.{% endif %}
{% if page.live %}Alternatively you can unpublish the page. This removes the page from public view and you can edit or publish it again later.
{% endif %}


One of my motivations for learning and using Node is the desire to consolidate the "linguistic" toolset I use for programming. That is, for example, I get tired of declaring an associative array one way in PHP, and in another with javascript (in fact they're objects in javascript!). I prefer the syntax of javascript over PHP (usually), and javascript does not have a sunset looming in the horizon (this, too, is arguable given small business' infatuation with Wordpress). I don't believe that Node is a better tool than PHP for every job/task. I don't think the reader needs me to discuss this any further, so I'll stop at that.
I have had a few applications that made use of the fact that Nodejs is asynchronous, and I have really appreciated this aspect of it. The vast majority of my work until now, on the other hand, has not absolutely required asynchronicity. I've made the decision to make Javascript/Node/NPM etc. my programming base. Even if my next job involves 90% PHP legacy code maintenance, I'm going to continue to solidfy my grasp of Javascript programming for Web/Mobile/Desktop; even if I am doing it in my spare time.
I have used Node to:
- In conjunction with Nginx, Node is serving the files for this very website you're looking at.
- Automate Server-side Configurations, SSL Certificates, and DNS through Shell Scripts Written in Node (NPM package ShellJS)
- Create Websites Using Handlebars and EJS HTML Templating Systems
- Handle Web Requests Asynchronously in a Webscraper which Uses CheerioJs
- Save Data in MySQL Asynchronously


%= circled_title(1, "Create BOSH release") %>
We are going to use a simple BOSH release that deploys a sinatra server.
$ git clone https://github.com/mariash/learn-bosh-release learn-bosh-release
$ cd learn-bosh-release
$ bosh create release
Upload generated release to Director:
$ bosh upload release
Check uploaded releases:
$ bosh releases
Acting as user 'admin' on 'Bosh Lite Director'
+------------+----------+-------------+
| Name | Versions | Commit Hash |
+------------+----------+-------------+
| learn-bosh | 0+dev.1 | 1867f1d2 |
+------------+----------+-------------+
Releases total: 1
Learn more:


-
Google, Microsoft Expose Brazil's Favelas
online.wsj.com
Brazil's favelas, once known mainly for crime and disorder, have come to represent economic opportunity and Internet users. That's attracting Google ...
-
Apple Rebuts Complaints of Bending iPhones
online.wsj.com
Apple on Thursday defended against reports that its largest iPhone bends easily in people's pockets, saying warping is "extremely rare" through ...
-
Will Silicon Valley Have Its NFL Moment?
online.wsj.com
A level of retrograde behavior and products, including sexist videogames, is proving remarkably resilient in the technology industry. When will tech ...
-
Apple Pulls iOS Software Update
online.wsj.com
Apple said it removed an update of its iOS mobile software after users reported major problems of the latest version of its operating system for ...
-
China's Tech Factories Turn to Student Labor
online.wsj.com
Student interns as young as 16 have become entrenched in China's labor force, especially among electronics makers in Chongqing. Some brands like H-P ...
-
On ‘Dark Talent’, MOOCs, Universities, and Startups: An Interview with the ...
a16z.com
We’re bringing together a great group of computer science professors from around the U.S. for talks and discussion as part of our second annual ...
-
#Bendgate: Five Durability Tests Apple Used on the iPhone 6 Plus
blogs.wsj.com
Apple outlined the gauntlet of durability testing it says it puts its phones through—five tests in particular.
-
Comcast, TWC Blast Critics of Merger
online.wsj.com
Comcast and Time Warner Cable fired back at critics of their proposed $45 billion merger, accusing them of engaging in "extortion" to extract ...
-
Would You Like 5.5 Billion YouTube Views? - Digits
www.wsj.com
Learn how to get attention for your YouTube channel, check out India’s $33 smartphone and hear the pros and cons of the just-released FIFA 15 soccer ...
-
iPhone camera evolution: How does the iPhone 6 camera compare to previous ...
snapsnapsnap.photos
How does the iPhone 6 camera stack up against previous hardware? In her ongoing series, professional iPhone photographer Lisa Bettany takes a hard ...
-
Note-Taking App Evernote Considering IPO in Next Few Years
online.wsj.com
Note-taking app Evernote has been approached in the past about a potential acquisition but prefers not to sell itself and is considering an initial ...
-
Silicon Valley Income Gap Continues to Widen, New Study Shows
blogs.wsj.com
The income gap between a wealthy elite and the rest of Silicon Valley – an impetus for Google bus protests and housing strife – continues to widen, ...
-
BlackBerry Passport Review: Back to Square One
online.wsj.com
With a huge square-shaped touch screen and innovative touch-sensitive physical keyboard, the BlackBerry Passport is focused squarely at the ...
-
Websites Are Wary of Facebook Tracking Software
online.wsj.com
Fearing the growing clout of Facebook, some publishers and retailers are reprogramming their websites to send less data back to the social network ...
-
Apple's New iPhone Pitch: Privacy
online.wsj.com
Along with new iPhones and a promised smartwatch, Apple Inc. is selling something else these days: privacy.
-
Talko | Talko is the best way to use your voice to get things done.
www.talko.com
TALK. SHARE. DO. Amazing things can happen when we talk with each other. Thoughts are shared, ideas formed and problems solved. Talko is the best way ...
-
China's Hunger for Apple's New iPhone Fuels Smuggling
online.wsj.com
Apple Inc.'s new iPhone has become an object of more than just desire in Asia, where tussles broke out near stores selling the phones, and police in ...
-
Video - Wsj.com
online.wsj.com
Business Financial News - The Wall Street Journal is the world's leading business publication. At WSJ.com users can access business news online as ...


| RFID ID | Tag ID | Cow ID | Weight | Pregnant | Medical Condition | Herd | Pasture | Calving Condition | Calving Ease | Calf Bonding |
|---|---|---|---|---|---|---|---|---|---|---|
| 8898899 | 342423 | 34234 | 500 | N | N/A | 1 | 2 | Y | Easy | Yes |
| RFID ID | Tag ID | Cow ID | Weight | Pregnant | Medical Condition |
|---|---|---|---|---|---|
| Herd | Pasture | Calving Condition | Calving Ease | Calf Bonding | |


Click here to see the weather in Belfast.
Click here to see the weather in London.
Click here to see the weather in Dublin.