diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 9e8af508..ce5be298 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -12,6 +12,7 @@ ## Using data +* [How to find opportunity data using the OpenActive Opportunity Data Dashboard](using-data/how-to-find-opportunity-data-using-the-openactive-opportunity-data-dashboard.md) * [Harvesting opportunity data](using-data/harvesting-opportunity-data.md) ## Data Model @@ -56,6 +57,8 @@ * [SportsActivityLocation](data-model/types/sportsactivitylocation.md) * [Toilets](data-model/types/toilets.md) * [Towels](data-model/types/towels.md) +* [Tutorial: describing events using the OpenActive data model - part one: the basics](data-model/tutorial-describing-events-using-the-openactive-data-model-part-one-the-basics.md) +* [Tutorial: describing events using the OpenActive data model - part two: adding additional detail](data-model/tutorial-describing-events-using-the-openactive-data-model-part-two-adding-additional-detail.md) ## Specifications diff --git a/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-one-the-basics.md b/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-one-the-basics.md new file mode 100644 index 00000000..a4f44e07 --- /dev/null +++ b/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-one-the-basics.md @@ -0,0 +1,322 @@ +# Tutorial: describing events using the OpenActive data model - part one: the basics + +Whether you’re aiming to publish open opportunity data or to use it, familiarity with the OpenActive data model will be key. + + +In this tutorial we’ll be looking at how to describe an activity session using the standard data model we have developed with the community. The model described here will conform to the [Modelling Opportunity Data 2.0](https://www.openactive.io/modelling-opportunity-data/) specification. If you want to jump ahead for a sneak peek of the final version, you can find it in [the validator](https://validator.openactive.io/?url=https%3A%2F%2Fwww.openactive.io%2Fdata-models%2Fversions%2F2.x%2Fexamples%2Ftutorials%2Fdescribing-events%2Fpart-one-finished.json&version=2.0). We’ll cover all of the core properties that are [required](https://www.openactive.io/modelling-opportunity-data/#required-and-optional-properties) as part of the standards. + + +The tutorial covers: + + +* Understanding what the model is +* The format of a model +* How to describe a basic activity session +* Where to go next + +By the end of this tutorial you should understand the concept behind the model, and be confident in describing your own events. + + +This tutorial requires a general understanding of JSON, and use of a text editor if you wish to follow along or write your own examples. + +## **1. Understanding the data model** + +Before jumping in to create one, we first need to understand what we’re trying to create. + + +OpenActive is working to bring about change within the sport and physical activity sector by improving access to ‘open opportunity data’. This means making data about where and when sport and physical activities happen open for anyone to access, use and share. By doing this, more places, products and services can better inform people of opportunities to get active. + + +All of the following types of data can be published as open data, and collectively this is known as opportunity data: + + +* descriptions and lists of physical activities +* details of the locations and venues at which activities or events takes place +* the facilities available at those locations +* the details of event involving physical activities e.g. when and where they will take place, restrictions on attendance, costs, etc +* any related information, e.g. about the format of the event, its organisers, etc + +Having a consistent format is important because it makes it easier for everyone to publish and use data, and so we have standards. [Open standards](https://standards.theodi.org/introduction/what-are-open-standards-for-data/) for data are documented, reusable agreements that help people and organisations to publish, access, share and use better quality data. + + +The data model that we’re going to walk through in this tutorial is an example of following the standards that the community have defined. It builds on existing standards \(such as [schema.org](https://schema.org/), JSON-LD, and [Simple Knowledge Organization System \(SKOS\)](https://www.w3.org/2004/02/skos/)\), which has let us focus specifically on the aspects of describing opportunity data that are important to the physical activity sector. + + +## **2. The format of a model** + +The recommended approach to publishing open opportunity data is as JSON, and specifically as JSON-LD \(a JSON-based serialization for linked data\). The use of JSON-LD for sharing structured information is also encouraged by people including [Google](https://developers.google.com/search/docs/guides/intro-structured-data), and is an example of why it’s useful to have common approaches. In this tutorial all of our examples will be using JSON-LD format. + + +## **3. How to describe an activity session** + +### **3.1 Add a context** + +For our starting foundations, all opportunity data should begin with a context contained within an opening and closing bracket \(see below\). + +```text +{ +"@context": "https://openactive.io/ns/oa.jsonld" +} +``` + +A JSON-LD context maps the terms used in a JSON document to their standard definitions. To indicate that your data conforms to the OpenActive opportunity data specification, include a @context reference that matches the above. + +**** + +### **3.2 Adding basic session details** + +Now we can start to add in the information about the session itself. To illustrate this, we’re going to use a rollerblading fitness class. + + +The following are the minimum requirements for modelling opportunity data: + + +* define that it’s an event \(opportunity\) +* its name +* a URL providing a link to a web page describing the session +* an indication of the type of activity that will take place at an event +* the time at which the event will take place +* the location at which the event will take place +* the person or organisation responsible for running the event + +Whilst this tutorial will help you to understand what’s necessary to get a basic, validating opportunity, there’s a lot more that you can do with the data. Other fields are optional, but might be recommended as they provide useful information for participants. Generally we encourage people to provide as much useful information as possible, while respecting privacy. We’ll talk a bit more about this in the second half of this tutorial, or you can refer to the [Required and Optional properties](https://www.openactive.io/modelling-opportunity-data/#required-and-optional-properties) part of the specification. + + +Let’s walk through and build it up. + + +#### **Defining the type of resource** + +Adding to the JSON-LD context that we added in the first step, we now want to start describing the event itself. + +To describe what type of thing we're going to be sharing in our data, we need to add a type property. It’s possible for the data model to describe a number of different types of things, but as we're describing an Event we’ll use that as the value. + +```text +{ +"@context": "https://openactive.io/ns/oa.jsonld", +"type": "Event" +} +``` + +#### **Give it a name and URL** + +Add in the name for your individual session, and the public URL where someone could go to find more information, or perhaps sign up to participate. + +```text +{ + "@context": "https://openactive.io/ns/oa.jsonld", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1" +} +``` + +#### **Defining the activity type** + +Next, we want to describe the type of activity this opportunity is for. As part of the OpenActive standards work there have been some initial efforts to develop a [standardised list of activities](https://www.openactive.io/activity-list/) for the sector. Where possible consider the terminology already being used, but if these don’t accurately reflect your activity types we’d encourage you to share your list as open data and contribute to the efforts in this area. + +In this case Roller Blading is in the standardised activity list, so we can add it to our model, along with references to the activity list that it has come from. We do this by adding an array of SKOS Concepts, however for our example we only need to define one activity type: + +```text +{ + "@context": "https://openactive.io/ns/oa.jsonld", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list/activity-list.jsonld +" + }], +} +``` + +#### **Giving it a time** + +People need to know when the event starts, and so in its most basic form we include a startDate property. The value of this must be a valid \[[ISO8601](https://www.openactive.io/opportunity-data-primer/#bib-ISO8601)\] date or date time, with a trailing definition of timezone. For example, 2018-08-01T10:51:02Z or 2018-08-01T10:51:02+01:00. + +Whilst this is the only _mandatory_ property, it’s recommended to include information about when the event finishes, and how long the activity part of it takes. Due to this, you may wish to include an EndDate, and a duration. + +The endDate property is the partner to startDate, and is used to signify the end of the event. Furthermore, certain activities may have a start and end point, but the actual duration of activity itself may be less than this total period - for instance a bike ride that meets at 10am and concludes at 3pm, but only includes two hours of cycling with the rest as social time. For activities such as these, we may wish to use the duration property \(defined using an [ISO8601](https://www.openactive.io/opportunity-data-primer/#bib-ISO8601) duration\) to indicate the length of the activity within the overall period. + +In our example the activity lasts the full hour dictated by the start and end points. For that reason duration is optional, but it has been included here to illustrate usage. + +```text +{ + "@context": "https://openactive.io/ns/oa.jsonld", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list/activity-list.jsonld +" + }], + "startDate": "2018-08-13T20:00:00Z", + "endDate": "2018-08-13T21:00:00Z", + "duration": "PT1H", +} +``` + +Your event timings may be more complicated than this, and we’ll come onto that in part two of this tutorial. + +#### **Stating where it happens** + +Finally, people need to know where to go to attend the event. Locations are added to events using the location property, which follows the [schema.org standards for address data](https://schema.org/PostalAddress). The minimum requirements for validation are shown below, but the recommendation in the specification is that applications should provide as much information about the **Place** as possible. + +```text +{ + "@context": "https://openactive.io/ns/oa.jsonld", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list/activity-list.jsonld +" + }], + "startDate": "2018-08-13T20:00:00Z", + "endDate": "2018-08-13T21:00:00Z", + "duration": "PT1H", + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + } + } +} +``` + +An example of providing more information is through including geocodes. Whilst this is not mandatory for each event, it’s recommended as people are more likely to use the data if it’s geocoded. + +```text +{ + "@context": "https://openactive.io/ns/oa.jsonld", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list/activity-list.jsonld +" + }], + "startDate": "2018-08-13T20:00:00Z", + "endDate": "2018-08-13T21:00:00Z", + "duration": "PT1H", + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + } + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } +} +``` + +**Providing information about the organiser** + +And finally, we need to include information about the person or organisation responsible for running the event. With this it’s important to note that personal data must not be published as open data without consent. +Whilst events could be organised by a club, led by a particular individual, or include other named participants of note, we’ll keep it simple for this first example and just use a club. As always, further detail is available in the [spec](https://www.openactive.io/modelling-opportunity-data/#describing-organisers-code-schema-person-code-and-code-schema-organization-code-) if needed. + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "startDate": "2018-08-13T20:00:00Z", + "endDate": "2018-08-13T21:00:00Z", + "duration": "PT1H", + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +And that’s it! Here we have a valid event described according to the OpenActive opportunity data model. +You’re able to double-check that you’ve got everything entered correctly by pasting your code into the [OpenActive data validator tool](https://validator.openactive.io/), or jump to [this pre-populated example](https://validator.openactive.io/?url=https%3A%2F%2Fwww.openactive.io%2Fdata-models%2Fversions%2F2.x%2Fexamples%2Ftutorials%2Fdescribing-events%2Fpart-one-finished.json&version=2.0). + +### **3.2 Changes for v2.1** + +v2.1 of the modelling spec will include offers as a required field, as it is critical for data users and end user experience. If you are building your data now we strongly recommend you include this field. Details of how to do this are included in part 2 of this tutorial. + +## **4. Where to go next** + +This is all you need to get up and running, but it may be that you’d like a bit more detail. If you’ve taken the time to validate the above, you’ll also see that the validator returns a number of additional recommendations for making the data even better. If you’d like to build the example up even further you can follow along with [part two: adding additional timing detail](tutorial-describing-events-using-the-openactive-data-model-part-two-adding-additional-detail.md). + + +Alternatively, if you’d like to jump straight in to creating your own events, the following will probably be useful: + + +* Data model specification: [https://www.openactive.io/modelling-opportunity-data/](https://www.openactive.io/modelling-opportunity-data/) +* OpenActive developer area: [https://developer.openactive.io/](https://developer.openactive.io/) +* A “full fat” Event example, which you may want to use as a starting point and cut down where needed: [https://developer.openactive.io/models/event](https://developer.openactive.io/models/event) + +Activity list: [https://www.openactive.io/activity-list/](https://www.openactive.io/activity-list/) + + diff --git a/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-two-adding-additional-detail.md b/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-two-adding-additional-detail.md new file mode 100644 index 00000000..e1edfb54 --- /dev/null +++ b/docs/data-model/tutorial-describing-events-using-the-openactive-data-model-part-two-adding-additional-detail.md @@ -0,0 +1,559 @@ +# Tutorial: describing events using the OpenActive data model - part two: adding additional detail + +In the [first part of this tutorial](tutorial-describing-events-using-the-openactive-data-model-part-one-the-basics.md) series we looked at putting together a basic example for an event. + +Using our previous example as a starting point we’ll now look at adding additional detail into our model. + +This tutorial will cover: + +* Detailing more complex event times, including recurring activities +* How to add in a description and images +* Revisiting activity types, including multiple activities +* Defining whether an activity is part of a wider programme +* Describing suitability +* Adding in an offer to describe the cost of an activity + +As a reminder, here’s our starting point from the previous tutorial: + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "startDate": "2018-08-13T20:00:00Z", + "endDate": "2018-08-13T21:00:00Z", + "duration": "PT1H", + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +## **1. Modelling recurring events** + +Whilst some events may be a one-off, very commonly others recur on a predictable schedule. Where this happens we can model the schedule rather than having to enter each opportunity individually. We do this through the **eventSchedule** property. + +In the below example you’ll see that we’ve removed the previously used **startDate** and **endDate** property, replacing these with an **eventSchedule** block. This details that it’s a \(repeating\) schedule, which starts and ends on specified dates \(leave off the end date if it repeats indefinitely\), and the frequency that repetition of the event should occur. The frequency again uses an ISO8601 duration, and can be \(for example\) daily, weekly, or monthly. + + +We’ve also explicitly stated the **startTime**, **endTime**, and **duration**, and the same logic applies to these as we discussed previously. + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], +"location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +## **2. Adding a description** + +At present, the only information we’ve built up around the content of the session is its name, activity type, and URL. To give our viewers more to go on and encourage them to attend, we may wish to use something more descriptive, in the form of a description. This is possible by using the property description. + +If an event is listed on the web there's probably already a description of some form, and that's the detail that would go in here. We’d suggest things like: + +* how the event will be run +* the types of people who are or will be attending the event +* information on the event organiser +* notes on any equipment required +* suggested apparel, e.g. footwear, kit, etc + +Let’s add in our description. It’s important to note that the order of properties is not important, but you may want to consider logical groupings for human readability. We’ve added it under the name and URL for this reason. + + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "description": "Run by our head instructor, this is an intermediate class for those with existing roller blading experience, where we focus on exercises to tone key muscle groups. Bring your own boots, shape up, and have fun!", + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], +"location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +## **3. Enhancing with images** + +Another element that can encourage participation is the inclusion of imagery. It’s recommended that you provide images that are representative of your events, and an array allows for the provision of multiple images. + +Let’s add a large image and a smaller thumbnail option under our new description. + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "description": "Run by our head instructor, this is an intermediate class for those with existing roller blading experience, where we focus on exercises to tone key muscle groups. Bring your own boots, shape up, and have fun!", + "image": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_large.jpg", + "thumbnail": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_thumbnail.jpg" + } + ] + }], + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], +"location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +## **4. Defining whether an activity is part of a wider programme** + +As well as having our opportunity repeat, we may have activities that are part of a wider [Programme](https://www.openactive.io/modelling-opportunity-data/#programmes) of events. These Programmes are often associated with specific branding, for instance: "Les Mills BodyPump" or "Back to Netball". + +In our fictional example let’s assume this is the case, and add in an association with a Programme. In its most basic form, we can do this by using the new property programme and adding the required details as follows: + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "description": "Run by our head instructor, this is an intermediate class for those with existing roller blading experience, where we focus on exercises to tone key muscle groups. Bring your own boots, shape up, and have fun!", + "image": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_large.jpg", + "thumbnail": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_thumbnail.jpg" + } + ] + }], + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], + "programme": { + "type": "Brand", + "name": "BladeFitness™️", + "url": "https://www.exampleorgbody.org/blade-fitness/", + "description": "A programme of events to encourage participation and get fit through roller blading" + }, + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + } + } +``` + +Here, we’ve added the name of the programme, a link to further detail about it, and a short description. + + +## **5. Describing suitability** + +Next we’ll look at adding in information to describe who your opportunity is suitable for. + +People searching for things to do and ways to be active want to feel confident that opportunities are the right ones for them. Where it’s important, we can encourage participation by highlighting inclusion or restrictions as needed. For example, this could cover whether events are: + +* suitable for a specific age range +* suitable for people within a specific height or weight range +* restricted to a male or female audience, or mixed +* suitable for people with a certain amount of experience +* able to provide support for particular disabilities + +When you come to writing your own suitability criteria it’s recommended that you refer to the [specification](https://www.openactive.io/modelling-opportunity-data/#describing-the-audience-suitability-of-events) to better understand all of the options available, and what is implied by the inclusion or omission or certain properties. + +For our example let’s explicitly state that this is a session for adults, with no gender restriction, at an intermediate level. + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "description": "Run by our head instructor, this is an intermediate class for those with existing roller blading experience, where we focus on exercises to tone key muscle groups. Bring your own boots, shape up, and have fun!", + "image": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_large.jpg", + "thumbnail": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_thumbnail.jpg" + } + ] + }], + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], + "programme": { + "type": "Brand", + "name": "BladeFitness™️", + "url": "https://www.exampleorgbody.org/blade-fitness/", + "description": "A programme of events to encourage participation and get fit through roller blading" + }, + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + }, + "ageRange": { + "type": "QuantitativeValue", + "minValue": 18 + }, + "genderRestriction": "https://openactive.io/NoRestriction", + "level": [ + "intermediate" + ] +} +``` + +## **6. Adding offers** + +Some opportunities are freely available for anyone to attend, but where participants need to pay for an event we can use Offers. + +In our final amendment to this example, we’ll add some detail that shows our class has an individual cost of £10 per session. + +```text +{ + "@context": "https://openactive.io/", + "type": "Event", + "name": "Blade and tone", + "url": "http://www.example.org/events/1", + "description": "Run by our head instructor, this is an intermediate class for those with existing roller blading experience, where we focus on exercises to tone key muscle groups. Bring your own boots, shape up, and have fun!", + "image": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_large.jpg", + "thumbnail": [ + { + "type": "ImageObject", + "url": "https://example.com/static/image/yourimage_thumbnail.jpg" + } + ] + }], + "activity": [{ + "id":" +https://openactive.io/activity-list/#7e5cb3ee-8c91-4f85-8c97-e335e0013eb3 +", + "type": "Concept", + "prefLabel": "Roller blading", + "inScheme": " +https://openactive.io/activity-list +" + }], + "eventSchedule": [ + { + "type": "Schedule", + "startDate": "2018-08-13", + "endDate": "2020-08-13", + "duration": "PT1H", + "repeatFrequency": "P1W", + "byDay": [ + "https://schema.org/Thursday" + ], + "startTime": "20:00", + "endTime": "21:00", + "scheduledEventType": "ScheduledSession" + } + ], + "programme": { + "type": "Brand", + "name": "BladeFitness™️", + "url": "https://www.exampleorgbody.org/blade-fitness/", + "description": "A programme of events to encourage participation and get fit through roller blading" + }, + "location": { + "type": "Place", + "name": "ExampleCo Gym", + "address": { + "type": "PostalAddress", + "streetAddress": "1 High Street", + "addressLocality": "Colchester", + "addressRegion": "Essex", + "postalCode": "AB1 2CD", + "addressCountry": "GB" + }, + "geo": { + "type": "GeoCoordinates", + "latitude": 51.88805, + "longitude": 0.90286 + } + }, + "organizer": { + "name": "Colchester Bladers", + "type": "Organization", + "url": "https://www.examplecluburl.com" + }, + "ageRange": { + "type": "QuantitativeValue", + "minValue": 18 + }, + "genderRestriction": "https://openactive.io/NoRestriction", + "level": [ + "intermediate" + ], + "offers": [{ + "type": "Offer", + "name": "Single session", + "price": 10, + "priceCurrency": "GBP" + }] +} +``` + +As in the previous tutorial we can check that this validates by either copying and pasting the above code into the [validation tool](https://validator.openactive.io), or using [this pre-populated link](https://validator.openactive.io/?url=https%3A%2F%2Fwww.openactive.io%2Fdata-models%2Fversions%2F2.x%2Fexamples%2Ftutorials%2Fdescribing-events%2Fpart-two-finished.json&version=2.0). + +## **7. Where to go next** + +At this point you should understand some of the more advanced ways to describe events using the OpenActive data model. To continue on your journey, please refer to the following resources if you’d like more information. + +* Data model specification: [https://www.openactive.io/modelling-opportunity-data/](https://www.openactive.io/modelling-opportunity-data/) +* Primer: [https://www.openactive.io/opportunity-data-primer/](https://www.openactive.io/opportunity-data-primer/) +* Activity list: [https://www.openactive.io/activity-list/](https://www.openactive.io/activity-list/) + + + diff --git a/docs/data-model/types/courseinstance.md b/docs/data-model/types/courseinstance.md index 434844f7..027eaabf 100644 --- a/docs/data-model/types/courseinstance.md +++ b/docs/data-model/types/courseinstance.md @@ -55,13 +55,22 @@ This type is derived from [https://pending.schema.org/CourseInstance](https://pe
The name of the event
Example
"name": "Speedball"
Offer
+ An array of schema:Offer that include the price of attending.
Example
"offers": [
{
"type": "Offer",
"identifier": "OX-AD",
"name": "Adult",
"price": 3.3,
"priceCurrency": "GBP",
"url": "https://profile.everyoneactive.com/booking?Site=0140&Activities=1402CBP20150217&Culture=en-GB"
}
]
OrganizationPerson
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": [
{
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
]
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
|
- 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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| offers | -
- Array of Offer
- |
-
- An array of schema:Offer that include the price of attending. Example
|
- ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| remainingAttendeeCapacity |
diff --git a/docs/data-model/types/event.md b/docs/data-model/types/event.md
index bfc679e5..29d47fd3 100644
--- a/docs/data-model/types/event.md
+++ b/docs/data-model/types/event.md
@@ -55,13 +55,22 @@ This type is derived from [https://schema.org/Event](https://schema.org/Event),
The name of the event Example
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| offers | +
+ Array of Offer
+ |
+
+ An array of schema:Offer that include the price of attending. Example
|
+ ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| organizer |
Organization- or - Person
|
- The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person. Example
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person. Example
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
- 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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
|
||
| offers | -
- Array of Offer
- |
-
- An array of schema:Offer that include the price of attending. Example
|
-
| remainingAttendeeCapacity |
diff --git a/docs/data-model/types/eventseries.md b/docs/data-model/types/eventseries.md
index 7f3bc1b4..8ae0da99 100644
--- a/docs/data-model/types/eventseries.md
+++ b/docs/data-model/types/eventseries.md
@@ -52,16 +52,42 @@ This type is derived from [https://pending.schema.org/EventSeries](https://pendi
Organization- or - Person
|
- The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person. Example
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person. Example
|
| url | +Property | +Expected Type | +Description | +
|---|---|---|---|
| id |
url
|
- A URL to a web page (or section of a page) that describes the event. Example
A unique url based identifier for the record Example
|
+ |
| identifier | +
+ Text- or - PropertyValue- or - Array of PropertyValue- or - Integer
+ |
+
+ A local non-URI identifier for the resource Example
|
|
| eventStatus | -
- EventStatusType
- |
-
- The status of an event. Can be used to indicate rescheduled or cancelled events Example
|
- |
| genderRestriction | @@ -134,12 +151,12 @@ This type is derived from [https://pending.schema.org/EventSeries](https://pendi | ||
| leader | +isCoached |
- Array of Person
+ Boolean
|
- 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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
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. Example
|
| maximumAttendeeCapacity | -
- Integer
- |
-
- The maximum capacity of the Event. Example
|
- |
| offers | -
- Array of Offer
- |
-
- An array of schema:Offer that include the price of attending. Example
|
- |
| remainingAttendeeCapacity | +programme |
- Integer
+ Brand
|
- The number of places that are still available for the Event. Example
Indicates that an event will be organised according to a specific Programme. Example
|
| eventStatus | +
+ EventStatusType
+ |
+
+ The status of an event. Can be used to indicate rescheduled or cancelled events Example
|
+ |
| identifier | @@ -293,12 +301,12 @@ This type is derived from [https://pending.schema.org/EventSeries](https://pendi | ||
| isCoached | +leader |
- Boolean
+ Array of Person
|
- 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. Example
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. The person will need to have given their consent for their personal information to be present in the Open Data. Example
|
| maximumAttendeeCapacity | +
+ Integer
+ |
+
+ The maximum capacity of the Event. Example
|
+ |
| meetingPoint |
@@ -319,6 +336,15 @@ This type is derived from [https://pending.schema.org/EventSeries](https://pendi
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. Example
|
||
| offers | +
+ Array of Offer
+ |
+
+ An array of schema:Offer that include the price of attending. Example
|
+ |
| potentialAction | @@ -329,12 +355,12 @@ This type is derived from [https://pending.schema.org/EventSeries](https://pendi | ||
| programme | +remainingAttendeeCapacity |
- Brand
+ Integer
|
- Indicates that an event will be organised according to a specific Programme. Example
The number of places that are still available for the Event. Example
|
| url | +
+ url
+ |
+
+ A URL to a web page (or section of a page) that describes the event. Example
|
+
The organisation responsible for providing the facility
+The organisation responsible for providing the facility
Example
"provider": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
OrganizationPerson
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": [
{
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
]
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"gender": "https://schema.org/Male",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
The organisation responsible for providing the facility
+The organisation responsible for providing the facility
Example
"provider": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
The description of the Organization
Example
"description": "The national governing body of cycling"
Text
+ General enquiries e-mail address for the organization.
Example
"email": "info@example.com"
The description of the Person
Example
"description": "The leader of the coaching team"
Text
+ A last name for the person.
This person must give direct permission for their personal information to be shared as part of the Open Data.
Example
"familyName": "Thompson"
Text
+ A first name for the person.
This person must give direct permission for their personal information to be shared as part of the Open Data.
Example
"givenName": "Daley"
| id | +address |
- url
+ PostalAddress- or - Text
|
- A unique url based identifier for the record Example
A structured PostalAddress object for the Place. Ideally the address should be provided using the PostalAddress structured format. Google Reserve requires https://schema.org/PostalAddress and will not accept plain text addresses. Example
|
| address | +geo |
- PostalAddress- or - Text
+ GeoCoordinates
|
- A structured PostalAddress object for the Place. Ideally the address should be provided using the PostalAddress structured format. Google Reserve requires https://schema.org/PostalAddress and will not accept plain text addresses. Example
The geo coordinates of the Place. Example
|
| Property | +Expected Type | +Description | +||
|---|---|---|---|---|
| amenityFeature | +id |
- Array of LocationFeatureSpecification
+ url
|
- An array listing the Ammenities of the Place. Example
A unique url based identifier for the record Example
|
|
| description | +amenityFeature |
- Text
+ Array of LocationFeatureSpecification
|
- The description of the Place Example
An array listing the Ammenities of the Place. Example
|
|
| geo | +description |
- GeoCoordinates
+ Text
|
- The geo coordinates of the Place. Example
The description of the Place Example
|
|
| address | +
+ PostalAddress- or - Text
+ |
+
+ A structured PostalAddress object for the Place. Ideally the address should be provided using the PostalAddress structured format. Google Reserve requires https://schema.org/PostalAddress and will not accept plain text addresses. Example
|
+ ||
| containedInPlace |
@@ -166,6 +192,15 @@ This type is derived from [https://schema.org/Place](https://schema.org/Place),
Places that exist within this place Example
|
|||
| geo | +
+ GeoCoordinates
+ |
+
+ The geo coordinates of the Place. Example
|
+ ||
| identifier |
diff --git a/docs/data-model/types/schedule.md b/docs/data-model/types/schedule.md
index 9d38742f..77c89bd8 100644
--- a/docs/data-model/types/schedule.md
+++ b/docs/data-model/types/schedule.md
@@ -37,15 +37,6 @@ This type is derived from [https://pending.schema.org/Schedule](https://pending.
The end time of the event. Example
|
|||
| repeatFrequency | -
- Duration
- |
-
- Defines the frequency at which Events will occur according to a Schedule. The intervals between events should be defined as a Duration of time. Example
|
- ||
| scheduledEventType |
@@ -70,7 +61,7 @@ This type is derived from [https://pending.schema.org/Schedule](https://pending.
### ** Required options **
-While these properties are marked as optional, a data publisher must provide either a schema:byDay, schema:byMonth or byMonthDay for a schedule.
+While these properties are marked as optional, a data publisher must provide either a `byDay`, `byMonth`, `byMonthDay` or `repeatFrequency` for a schedule.
Defines the number of times a recurring Event will take place. Example
|
|||
| repeatFrequency | +
+ Duration
+ |
+
+ Defines the frequency at which Events will occur according to a Schedule. The intervals between events should be defined as a Duration of time. Example
|
+
"type": "ScheduledSession"
Concept
- Specifies the physical activity or activities that will take place during an event.
Example
"activity": [
{
"type": "Concept",
"id": "https://openactive.io/activity-list#5e78bcbe-36db-425a-9064-bf96d09cc351",
"prefLabel": "Bodypump™",
"inScheme": "https://openactive.io/activity-list"
}
]
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.
It is recommended that locations should be specified as a Place complete with a fully described geographic location and/or address.If only an address is available then this should be described as a PostalAddress.
Applications may use schema:Text to provide a more general description of a location ("In Victoria Park, near the lake"), but this is not recommended: consuming applications will be unable to help users discover opportunities based on their location.
Example
"location": {
"address": {
"addressLocality": "New Malden",
"addressRegion": "London",
"postalCode": "NW5 3DU",
"streetAddress": "Raynes Park High School, 46A West Barnes Lane",
"type": "PostalAddress"
},
"description": "Raynes Park High School in London",
"geo": {
"latitude": 51.4034423828125,
"longitude": -0.2369088977575302,
"type": "GeoCoordinates"
},
"id": "https://example.com/locations/1234ABCD",
"identifier": "1234ABCD",
"name": "Raynes Park High School",
"telephone": "01253 473934",
"type": "Place"
}
Text
- The name of the event
Example
"name": "Speedball"
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"gender": "https://schema.org/Male",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
Used to specify the types of disabilities or impairments that are supported at an event.
Example
"accessibilitySupport": [
{
"type": "Concept",
"id": "https://openactive.io/accessibility-support#1393f2dc-3fcc-4be9-a99f-f1e51f5ad277",
"prefLabel": "Visual impairment",
"inScheme": "https://openactive.io/accessibility-support"
}
]
Concept
+ Specifies the physical activity or activities that will take place during an event.
Example
"activity": [
{
"type": "Concept",
"id": "https://openactive.io/activity-list#5e78bcbe-36db-425a-9064-bf96d09cc351",
"prefLabel": "Bodypump™",
"inScheme": "https://openactive.io/activity-list"
}
]
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.
Example
"level": [
"beginner"
]
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.
It is recommended that locations should be specified as a Place complete with a fully described geographic location and/or address.If only an address is available then this should be described as a PostalAddress.
Applications may use schema:Text to provide a more general description of a location ("In Victoria Park, near the lake"), but this is not recommended: consuming applications will be unable to help users discover opportunities based on their location.
Example
"location": {
"address": {
"addressLocality": "New Malden",
"addressRegion": "London",
"postalCode": "NW5 3DU",
"streetAddress": "Raynes Park High School, 46A West Barnes Lane",
"type": "PostalAddress"
},
"description": "Raynes Park High School in London",
"geo": {
"latitude": 51.4034423828125,
"longitude": -0.2369088977575302,
"type": "GeoCoordinates"
},
"id": "https://example.com/locations/1234ABCD",
"identifier": "1234ABCD",
"name": "Raynes Park High School",
"telephone": "01253 473934",
"type": "Place"
}
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.
Example
"meetingPoint": "At the entrance to the park"
Text
+ The name of the event
Example
"name": "Speedball"
OrganizationPerson
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": [
{
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
]
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
Event
+ Eventurl
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
diff --git a/docs/data-model/types/sessionseries.md b/docs/data-model/types/sessionseries.md index 4c4e26c0..ea90b5d3 100644 --- a/docs/data-model/types/sessionseries.md +++ b/docs/data-model/types/sessionseries.md @@ -55,13 +55,22 @@ This type is derived from [https://schema.org/Event](https://schema.org/Event),The name of the event
Example
"name": "Speedball"
Offer
+ An array of schema:Offer that include the price of attending.
Example
"offers": [
{
"type": "Offer",
"identifier": "OX-AD",
"name": "Adult",
"price": 3.3,
"priceCurrency": "GBP",
"url": "https://profile.everyoneactive.com/booking?Site=0140&Activities=1402CBP20150217&Culture=en-GB"
}
]
OrganizationPerson
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": [
{
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
]
The person or organization ultimately responsible for an event. An organizer might be an schema:Organization or a schema:Person.
Example
"organizer": {
"name": "Central Speedball Association",
"type": "Organization",
"url": "http://www.speedball-world.com"
}
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
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. The person will need to have given their consent for their personal information to be present in the Open Data.
Example
"leader": [
{
"type": "Person",
"familyName": "Smith",
"givenName": "Nicole",
"gender": "https://schema.org/Male",
"id": "https://example.com/locations/1234ABCD/leaders/89",
"identifier": 89
}
]
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.
Example
"level": [
"beginner"
]
Offer
- An array of schema:Offer that include the price of attending.
Example
"offers": [
{
"type": "Offer",
"identifier": "OX-AD",
"name": "Adult",
"price": 3.3,
"priceCurrency": "GBP",
"url": "https://profile.everyoneactive.com/booking?Site=0140&Activities=1402CBP20150217&Culture=en-GB"
}
]
URI to the FacilityUse that has this offer
Example
"facilityUse": "https://example.com/facility-use/1"
Offer
+ An array of schema:Offer that include the price of booking.
Example
"offers": {
"type": "Offer",
"identifier": "OX-AD",
"name": "Adult",
"price": 7.5,
"priceCurrency": "GBP",
"url": "https://profile.everyoneactive.com/booking?Site=0140&Activities=1402CBP20150217&Culture=en-GB"
}
A local non-URI identifier for the resource
Example
"identifier": "SB1234"
Offer
- An array of schema:Offer that include the price of booking.
Example
"offers": {
"type": "Offer",
"identifier": "OX-AD",
"name": "Adult",
"price": 7.5,
"priceCurrency": "GBP",
"url": "https://profile.everyoneactive.com/booking?Site=0140&Activities=1402CBP20150217&Culture=en-GB"
}