< Return to Summary | File Generated: Wed Mar 27 2024 15:15:30 GMT+0000 (Coordinated Universal Time)
Booking Flow: OpenBookingApprovalFlow
Opportunity Type: ScheduledSession
Feature: Payment / Free opportunities (Implemented)
Test: Expect a TotalPaymentDueMismatchError when the totalPaymentDue property is non-zero for free opportunities
Run B for a valid opportunity, with totalPaymentDue not matching the value returned by C2, expecting a TotalPaymentDueMismatchError to be returned (C1 and C2 ignored as they do not have totalPaymentDue)
npm start -- --runInBand test/features/payment/free-opportunities/implemented/payment-mismatch-test.js
The OpenActive Reference Implementation test result for this test can be used as a reference to help with debugging.
⚠️ 14 passed with 0 failures, 79 warnings and 30 suggestions
POST http://localhost:3000/test-interface/datasets/uat-ci/opportunities
{
"@type": "ScheduledSession",
"superEvent": {
"@type": "SessionSeries",
"organizer": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1"
}
},
"@context": [
"https://openactive.io/",
"https://openactive.io/test-interface"
],
"test:testOpportunityCriteria": "https://openactive.io/test-interface#TestOpportunityBookableFree",
"test:testOpenBookingFlow": "https://openactive.io/test-interface#OpenBookingApprovalFlow"
}
Response status code: 200 OK. Responded in 6.731487ms.
{
"@context": "https://openactive.io/",
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017"
}
GET http://localhost:3000/opportunity/https%3A%2F%2Flocalhost%3A5001%2Fapi%2Fidentifiers%2Fscheduled-sessions%2F1502%2Fevents%2F15017?useCacheIfAvailable=true
Response status code: 200 OK. Responded in 27.240656ms.
{
"data": {
"@context": [
"https://openactive.io/"
],
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"startDate": "2024-03-31T13:08:08+00:00",
"endDate": "2024-03-31T18:42:08+00:00",
"superEvent": {
"@type": "SessionSeries",
"@id": "https://localhost:5001/api/identifiers/session-series/1502",
"name": "Frozen Yoga",
"activity": [
{
"@type": "Concept",
"@id": "https://openactive.io/activity-list#c07d63a0-8eb9-4602-8bcc-23be6deb8f83",
"inScheme": "https://openactive.io/activity-list",
"prefLabel": "Jet Skiing"
}
],
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"identifier": 1,
"name": "Post-ercise Plaza",
"description": "Sorting Out Your Fitness One Parcel Lift at a Time! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Oxford",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "Kings Mead House"
},
"amenityFeature": [
{
"@type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
},
{
"@type": "Showers",
"name": "Showers",
"value": true
},
{
"@type": "Lockers",
"name": "Lockers",
"value": true
},
{
"@type": "Towels",
"name": "Towels",
"value": false
},
{
"@type": "Creche",
"name": "Creche",
"value": false
},
{
"@type": "Parking",
"name": "Parking",
"value": false
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.7502,
"longitude": -1.2674
},
"image": [
{
"@type": "ImageObject",
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Oxford_StAldates_PostOffice.jpg"
}
],
"telephone": "01865 000001",
"url": "https://en.wikipedia.org/wiki/Post_Office_Limited"
},
"offers": [
{
"@type": "Offer",
"@id": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"allowCustomerCancellationFullRefund": true,
"openBookingFlowRequirement": [
"https://openactive.io/OpenBookingApproval",
"https://openactive.io/OpenBookingNegotiation"
],
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP",
"validFromBeforeStartDate": "P13DT39M"
}
],
"organizer": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1",
"name": "Acme Fitness Ltd",
"isOpenBookingAllowed": true,
"taxMode": "https://openactive.io/TaxGross",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
]
},
"url": "https://www.example.com/a-session-age"
},
"duration": "PT5H34M",
"maximumAttendeeCapacity": 2,
"remainingAttendeeCapacity": 2
}
}
eventStatus
is missing from ScheduledSession
.leader
is missing from ScheduledSession
.url
is missing from ScheduledSession
.ScheduledSession
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.description
is missing from SessionSeries
.image
is missing from SessionSeries
.ageRange
is missing from SessionSeries
.genderRestriction
is missing from SessionSeries
.leader
is missing from SessionSeries
.level
is missing from SessionSeries
.SessionSeries
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.@id
is missing from Place
.openingHoursSpecification
is missing from Place
.name
is missing from Offer
.ageRestriction
is missing from Offer
.url
is missing from Organization
.telephone
is missing from Organization
.sameAs
is missing from Organization
.genderRestriction
is supplied on a ScheduledSession
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.genderRestriction
is supplied on a SessionSeries
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.PUT https://localhost:5001/api/openbooking/order-quote-templates/d645bf0d-ba6b-443d-86be-09804104231a
"application/vnd.openactive.booking+json; version=1"
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTE1NTE1NTIsImV4cCI6MTcxMTU1NTE1MiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzExNTUxNTUxLCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjUzMzA0QkI2Mzc5RTk2MzI1OThFQzdBQjlBM0YxQjM4Iiwic2lkIjoiNDQ2QzUyQjlEOTYzREEyMjQ0MTA5NzAwNzhFRTQ1MDYiLCJpYXQiOjE3MTE1NTE1NTIsInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.DzOQYw-5dLVIkubzLZ6l3EusrCkga_EpKyXrE5HmLZGu7Mj2znIihBZuvmaH9Er26eIEguINA17qhMLTCCNMpPiX94q23H9YxX_4ErSbMyStjbssiy7VME4NRUqjuctJQHJjR6AtezF22FtPIvW6Lk7m4n34NAdKQ50ueWFU_d436m2e4SM7U9gNvwleUgRQ8w9b52Li7nmuqiJwctqL91Z7rJ7przbAJvMkGI9Ud2ttGsLpSACbDk8-tf1BHK0eyYpgoT6FYmfuzEp_8q-6Je3-0DfpwCks80lIyqtwjt9V0zXGHMU6D1YttuFKYH2hpg0qUola2wpKoc8SjRNfVg"
{
"@context": "https://openactive.io/",
"@type": "OrderQuote",
"brokerRole": "https://openactive.io/AgentBroker",
"broker": {
"@type": "Organization",
"name": "MyFitnessApp",
"url": "https://myfitnessapp.example.com",
"description": "A fitness app for all the community",
"logo": {
"@type": "ImageObject",
"url": "http://data.myfitnessapp.org.uk/images/logo.png"
},
"address": {
"@type": "PostalAddress",
"streetAddress": "Alan Peacock Way",
"addressLocality": "Village East",
"addressRegion": "Middlesbrough",
"postalCode": "TS4 3AE",
"addressCountry": "GB"
}
},
"seller": "https://localhost:5001/api/identifiers/sellers/1",
"orderedItem": [
{
"@type": "OrderItem",
"position": 0,
"acceptedOffer": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017"
}
],
"payment": {
"@type": "Payment",
"name": "AcmeBroker Points",
"accountId": "SN1593",
"paymentProviderId": "STRIPE"
}
}
Response status code: 200 OK. Responded in 285.479477ms.
{
"@context": "https://openactive.io/",
"@type": "OrderQuote",
"@id": "https://localhost:5001/api/openbooking/order-quotes/d645bf0d-ba6b-443d-86be-09804104231a",
"lease": {
"@type": "Lease",
"leaseExpires": "2024-03-27T15:20:38+00:00"
},
"orderRequiresApproval": true,
"bookingService": {
"@type": "BookingService",
"name": "Acme booking system",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
],
"url": "https://example.com"
},
"broker": {
"@type": "Organization",
"name": "MyFitnessApp",
"url": "https://myfitnessapp.example.com"
},
"brokerRole": "https://openactive.io/AgentBroker",
"orderedItem": [
{
"@type": "OrderItem",
"acceptedOffer": {
"@type": "Offer",
"@id": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"allowCustomerCancellationFullRefund": true,
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP",
"validFromBeforeStartDate": "P13DT39M"
},
"orderedItem": {
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"startDate": "2024-03-31T13:08:08+00:00",
"endDate": "2024-03-31T18:42:08+00:00",
"superEvent": {
"@type": "SessionSeries",
"@id": "https://localhost:5001/api/identifiers/session-series/1502",
"name": "Frozen Yoga",
"activity": [
{
"@type": "Concept",
"@id": "https://openactive.io/activity-list#6bdea630-ad22-4e58-98a3-bca26ee3f1da",
"inScheme": "https://openactive.io/activity-list",
"prefLabel": "Rave Fitness"
}
],
"location": {
"@type": "Place",
"identifier": 1,
"name": "Post-ercise Plaza",
"description": "Sorting Out Your Fitness One Parcel Lift at a Time! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Oxford",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "Kings Mead House"
},
"amenityFeature": [
{
"@type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
},
{
"@type": "Showers",
"name": "Showers",
"value": true
},
{
"@type": "Lockers",
"name": "Lockers",
"value": true
},
{
"@type": "Towels",
"name": "Towels",
"value": false
},
{
"@type": "Creche",
"name": "Creche",
"value": false
},
{
"@type": "Parking",
"name": "Parking",
"value": false
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.7502,
"longitude": -1.2674
},
"image": [
{
"@type": "ImageObject",
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Oxford_StAldates_PostOffice.jpg"
}
],
"telephone": "01865 000001",
"url": "https://en.wikipedia.org/wiki/Post_Office_Limited"
},
"url": "https://example.com/events/1502"
},
"maximumAttendeeCapacity": 2,
"remainingAttendeeCapacity": 2
},
"position": 0,
"unitTaxSpecification": [
{
"@type": "TaxChargeSpecification",
"name": "VAT at 20%",
"price": 0,
"priceCurrency": "GBP",
"rate": 0.2
}
]
}
],
"seller": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1",
"name": "Acme Fitness Ltd",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Another town",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "1 Hidden Gem"
},
"isOpenBookingAllowed": true,
"legalName": "Acme Fitness Ltd",
"taxMode": "https://openactive.io/TaxGross",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
]
},
"totalPaymentDue": {
"@type": "PriceSpecification",
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP"
},
"totalPaymentTax": [
{
"@type": "TaxChargeSpecification",
"name": "VAT at 20%",
"price": 0,
"priceCurrency": "GBP",
"rate": 0.2
}
]
}
name
is missing from Offer
.ageRestriction
is missing from Offer
.eventStatus
is missing from ScheduledSession
.ageRange
is missing from SessionSeries
.genderRestriction
is missing from SessionSeries
.eventStatus
is missing from SessionSeries
.@id
is missing from Place
.openingHoursSpecification
is missing from Place
.email
is missing from Organization
.url
is missing from Organization
.logo
is missing from Organization
.vatID
is missing from Organization
.genderRestriction
is supplied on a ScheduledSession
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.genderRestriction
is supplied on a SessionSeries
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.GET http://localhost:3000/opportunity/https%3A%2F%2Flocalhost%3A5001%2Fapi%2Fidentifiers%2Fscheduled-sessions%2F1502%2Fevents%2F15017?useCacheIfAvailable=true&expectedCapacity=1
Response status code: 200 OK. Responded in 435.610264ms.
{
"state": "updated",
"id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"modified": "1711552540478",
"data": {
"@context": [
"https://openactive.io/"
],
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"startDate": "2024-03-31T13:08:08+00:00",
"endDate": "2024-03-31T18:42:08+00:00",
"superEvent": {
"@type": "SessionSeries",
"@id": "https://localhost:5001/api/identifiers/session-series/1502",
"name": "Frozen Yoga",
"activity": [
{
"@type": "Concept",
"@id": "https://openactive.io/activity-list#c07d63a0-8eb9-4602-8bcc-23be6deb8f83",
"inScheme": "https://openactive.io/activity-list",
"prefLabel": "Jet Skiing"
}
],
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"identifier": 1,
"name": "Post-ercise Plaza",
"description": "Sorting Out Your Fitness One Parcel Lift at a Time! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Oxford",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "Kings Mead House"
},
"amenityFeature": [
{
"@type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
},
{
"@type": "Showers",
"name": "Showers",
"value": true
},
{
"@type": "Lockers",
"name": "Lockers",
"value": true
},
{
"@type": "Towels",
"name": "Towels",
"value": false
},
{
"@type": "Creche",
"name": "Creche",
"value": false
},
{
"@type": "Parking",
"name": "Parking",
"value": false
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.7502,
"longitude": -1.2674
},
"image": [
{
"@type": "ImageObject",
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Oxford_StAldates_PostOffice.jpg"
}
],
"telephone": "01865 000001",
"url": "https://en.wikipedia.org/wiki/Post_Office_Limited"
},
"offers": [
{
"@type": "Offer",
"@id": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"allowCustomerCancellationFullRefund": true,
"openBookingFlowRequirement": [
"https://openactive.io/OpenBookingApproval",
"https://openactive.io/OpenBookingNegotiation"
],
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP",
"validFromBeforeStartDate": "P13DT39M"
}
],
"organizer": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1",
"name": "Acme Fitness Ltd",
"isOpenBookingAllowed": true,
"taxMode": "https://openactive.io/TaxGross",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
]
},
"url": "https://www.example.com/a-session-age"
},
"duration": "PT5H34M",
"maximumAttendeeCapacity": 2,
"remainingAttendeeCapacity": 1
}
}
totalPaymentDue.openBookingPrepayment
'https://openactive.io/Unavailable
'eventStatus
is missing from ScheduledSession
.leader
is missing from ScheduledSession
.url
is missing from ScheduledSession
.ScheduledSession
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.description
is missing from SessionSeries
.image
is missing from SessionSeries
.ageRange
is missing from SessionSeries
.genderRestriction
is missing from SessionSeries
.leader
is missing from SessionSeries
.level
is missing from SessionSeries
.SessionSeries
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.@id
is missing from Place
.openingHoursSpecification
is missing from Place
.name
is missing from Offer
.ageRestriction
is missing from Offer
.url
is missing from Organization
.telephone
is missing from Organization
.sameAs
is missing from Organization
.genderRestriction
is supplied on a ScheduledSession
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.genderRestriction
is supplied on a SessionSeries
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.PUT https://localhost:5001/api/openbooking/order-quotes/d645bf0d-ba6b-443d-86be-09804104231a
"application/vnd.openactive.booking+json; version=1"
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTE1NTE1NTIsImV4cCI6MTcxMTU1NTE1MiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzExNTUxNTUxLCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjUzMzA0QkI2Mzc5RTk2MzI1OThFQzdBQjlBM0YxQjM4Iiwic2lkIjoiNDQ2QzUyQjlEOTYzREEyMjQ0MTA5NzAwNzhFRTQ1MDYiLCJpYXQiOjE3MTE1NTE1NTIsInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.DzOQYw-5dLVIkubzLZ6l3EusrCkga_EpKyXrE5HmLZGu7Mj2znIihBZuvmaH9Er26eIEguINA17qhMLTCCNMpPiX94q23H9YxX_4ErSbMyStjbssiy7VME4NRUqjuctJQHJjR6AtezF22FtPIvW6Lk7m4n34NAdKQ50ueWFU_d436m2e4SM7U9gNvwleUgRQ8w9b52Li7nmuqiJwctqL91Z7rJ7przbAJvMkGI9Ud2ttGsLpSACbDk8-tf1BHK0eyYpgoT6FYmfuzEp_8q-6Je3-0DfpwCks80lIyqtwjt9V0zXGHMU6D1YttuFKYH2hpg0qUola2wpKoc8SjRNfVg"
{
"@context": "https://openactive.io/",
"@type": "OrderQuote",
"brokerRole": "https://openactive.io/AgentBroker",
"broker": {
"@type": "Organization",
"name": "MyFitnessApp",
"url": "https://myfitnessapp.example.com",
"description": "A fitness app for all the community",
"logo": {
"@type": "ImageObject",
"url": "http://data.myfitnessapp.org.uk/images/logo.png"
},
"address": {
"@type": "PostalAddress",
"streetAddress": "Alan Peacock Way",
"addressLocality": "Village East",
"addressRegion": "Middlesbrough",
"postalCode": "TS4 3AE",
"addressCountry": "GB"
}
},
"seller": "https://localhost:5001/api/identifiers/sellers/1",
"customer": {
"@type": "Person",
"email": "[email protected]",
"telephone": "575-867-0501",
"givenName": "Boyle"
},
"orderedItem": [
{
"@type": "OrderItem",
"position": 0,
"acceptedOffer": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017"
}
],
"payment": {
"@type": "Payment",
"name": "AcmeBroker Points",
"accountId": "SN1593",
"paymentProviderId": "STRIPE"
}
}
Response status code: 200 OK. Responded in 194.246986ms.
{
"@context": "https://openactive.io/",
"@type": "OrderQuote",
"@id": "https://localhost:5001/api/openbooking/order-quotes/d645bf0d-ba6b-443d-86be-09804104231a",
"lease": {
"@type": "Lease",
"leaseExpires": "2024-03-27T15:20:39+00:00"
},
"orderRequiresApproval": true,
"bookingService": {
"@type": "BookingService",
"name": "Acme booking system",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
],
"url": "https://example.com"
},
"broker": {
"@type": "Organization",
"name": "MyFitnessApp",
"url": "https://myfitnessapp.example.com"
},
"brokerRole": "https://openactive.io/AgentBroker",
"customer": {
"@type": "Person",
"email": "[email protected]",
"givenName": "Boyle",
"telephone": "575-867-0501"
},
"orderedItem": [
{
"@type": "OrderItem",
"acceptedOffer": {
"@type": "Offer",
"@id": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"allowCustomerCancellationFullRefund": true,
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP",
"validFromBeforeStartDate": "P13DT39M"
},
"orderedItem": {
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"startDate": "2024-03-31T13:08:08+00:00",
"endDate": "2024-03-31T18:42:08+00:00",
"superEvent": {
"@type": "SessionSeries",
"@id": "https://localhost:5001/api/identifiers/session-series/1502",
"name": "Frozen Yoga",
"activity": [
{
"@type": "Concept",
"@id": "https://openactive.io/activity-list#6bdea630-ad22-4e58-98a3-bca26ee3f1da",
"inScheme": "https://openactive.io/activity-list",
"prefLabel": "Rave Fitness"
}
],
"location": {
"@type": "Place",
"identifier": 1,
"name": "Post-ercise Plaza",
"description": "Sorting Out Your Fitness One Parcel Lift at a Time! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Oxford",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "Kings Mead House"
},
"amenityFeature": [
{
"@type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
},
{
"@type": "Showers",
"name": "Showers",
"value": true
},
{
"@type": "Lockers",
"name": "Lockers",
"value": true
},
{
"@type": "Towels",
"name": "Towels",
"value": false
},
{
"@type": "Creche",
"name": "Creche",
"value": false
},
{
"@type": "Parking",
"name": "Parking",
"value": false
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.7502,
"longitude": -1.2674
},
"image": [
{
"@type": "ImageObject",
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Oxford_StAldates_PostOffice.jpg"
}
],
"telephone": "01865 000001",
"url": "https://en.wikipedia.org/wiki/Post_Office_Limited"
},
"url": "https://example.com/events/1502"
},
"maximumAttendeeCapacity": 2,
"remainingAttendeeCapacity": 2
},
"position": 0,
"unitTaxSpecification": [
{
"@type": "TaxChargeSpecification",
"name": "VAT at 20%",
"price": 0,
"priceCurrency": "GBP",
"rate": 0.2
}
]
}
],
"seller": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1",
"name": "Acme Fitness Ltd",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Another town",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "1 Hidden Gem"
},
"isOpenBookingAllowed": true,
"legalName": "Acme Fitness Ltd",
"taxMode": "https://openactive.io/TaxGross",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
]
},
"totalPaymentDue": {
"@type": "PriceSpecification",
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP"
},
"totalPaymentTax": [
{
"@type": "TaxChargeSpecification",
"name": "VAT at 20%",
"price": 0,
"priceCurrency": "GBP",
"rate": 0.2
}
]
}
name
is missing from Offer
.ageRestriction
is missing from Offer
.eventStatus
is missing from ScheduledSession
.ageRange
is missing from SessionSeries
.genderRestriction
is missing from SessionSeries
.eventStatus
is missing from SessionSeries
.@id
is missing from Place
.openingHoursSpecification
is missing from Place
.email
is missing from Organization
.url
is missing from Organization
.logo
is missing from Organization
.vatID
is missing from Organization
.genderRestriction
is supplied on a ScheduledSession
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.genderRestriction
is supplied on a SessionSeries
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.GET http://localhost:3000/opportunity/https%3A%2F%2Flocalhost%3A5001%2Fapi%2Fidentifiers%2Fscheduled-sessions%2F1502%2Fevents%2F15017?useCacheIfAvailable=true&expectedCapacity=1
Response status code: 200 OK. Responded in 12.957924ms.
{
"data": {
"@context": [
"https://openactive.io/"
],
"@type": "ScheduledSession",
"@id": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017",
"startDate": "2024-03-31T13:08:08+00:00",
"endDate": "2024-03-31T18:42:08+00:00",
"superEvent": {
"@type": "SessionSeries",
"@id": "https://localhost:5001/api/identifiers/session-series/1502",
"name": "Frozen Yoga",
"activity": [
{
"@type": "Concept",
"@id": "https://openactive.io/activity-list#c07d63a0-8eb9-4602-8bcc-23be6deb8f83",
"inScheme": "https://openactive.io/activity-list",
"prefLabel": "Jet Skiing"
}
],
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"identifier": 1,
"name": "Post-ercise Plaza",
"description": "Sorting Out Your Fitness One Parcel Lift at a Time! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"address": {
"@type": "PostalAddress",
"addressCountry": "GB",
"addressLocality": "Oxford",
"addressRegion": "Oxfordshire",
"postalCode": "OX1 1AA",
"streetAddress": "Kings Mead House"
},
"amenityFeature": [
{
"@type": "ChangingFacilities",
"name": "Changing Facilities",
"value": true
},
{
"@type": "Showers",
"name": "Showers",
"value": true
},
{
"@type": "Lockers",
"name": "Lockers",
"value": true
},
{
"@type": "Towels",
"name": "Towels",
"value": false
},
{
"@type": "Creche",
"name": "Creche",
"value": false
},
{
"@type": "Parking",
"name": "Parking",
"value": false
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.7502,
"longitude": -1.2674
},
"image": [
{
"@type": "ImageObject",
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Oxford_StAldates_PostOffice.jpg"
}
],
"telephone": "01865 000001",
"url": "https://en.wikipedia.org/wiki/Post_Office_Limited"
},
"offers": [
{
"@type": "Offer",
"@id": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"allowCustomerCancellationFullRefund": true,
"openBookingFlowRequirement": [
"https://openactive.io/OpenBookingApproval",
"https://openactive.io/OpenBookingNegotiation"
],
"openBookingPrepayment": "https://openactive.io/Unavailable",
"price": 0,
"priceCurrency": "GBP",
"validFromBeforeStartDate": "P13DT39M"
}
],
"organizer": {
"@type": "Organization",
"@id": "https://localhost:5001/api/identifiers/sellers/1",
"name": "Acme Fitness Ltd",
"isOpenBookingAllowed": true,
"taxMode": "https://openactive.io/TaxGross",
"termsOfService": [
{
"@type": "PrivacyPolicy",
"name": "Privacy Policy",
"requiresExplicitConsent": false,
"url": "https://example.com/privacy.html"
}
]
},
"url": "https://www.example.com/a-session-age"
},
"duration": "PT5H34M",
"maximumAttendeeCapacity": 2,
"remainingAttendeeCapacity": 1
}
}
totalPaymentDue.openBookingPrepayment
'https://openactive.io/Unavailable
'eventStatus
is missing from ScheduledSession
.leader
is missing from ScheduledSession
.url
is missing from ScheduledSession
.ScheduledSession
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.description
is missing from SessionSeries
.image
is missing from SessionSeries
.ageRange
is missing from SessionSeries
.genderRestriction
is missing from SessionSeries
.leader
is missing from SessionSeries
.level
is missing from SessionSeries
.SessionSeries
has at least one Offer
with price
set to 0
, it should also have a property named isAccessibleForFree
set to true
.@id
is missing from Place
.openingHoursSpecification
is missing from Place
.name
is missing from Offer
.ageRestriction
is missing from Offer
.url
is missing from Organization
.telephone
is missing from Organization
.sameAs
is missing from Organization
.genderRestriction
is supplied on a ScheduledSession
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.genderRestriction
is supplied on a SessionSeries
.ageRange
is 18+ when not specified.eventStatus
is scheduled if not specified or invalid.PUT https://localhost:5001/api/openbooking/order-proposals/d645bf0d-ba6b-443d-86be-09804104231a
"application/vnd.openactive.booking+json; version=1"
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTE1NTE1NTIsImV4cCI6MTcxMTU1NTE1MiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNWU3ZTc3YzEtZjNmOS00NDdlLWJlYmItNTMzNTE5ZTVmMDUwIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzExNTUxNTUxLCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjUzMzA0QkI2Mzc5RTk2MzI1OThFQzdBQjlBM0YxQjM4Iiwic2lkIjoiNDQ2QzUyQjlEOTYzREEyMjQ0MTA5NzAwNzhFRTQ1MDYiLCJpYXQiOjE3MTE1NTE1NTIsInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.DzOQYw-5dLVIkubzLZ6l3EusrCkga_EpKyXrE5HmLZGu7Mj2znIihBZuvmaH9Er26eIEguINA17qhMLTCCNMpPiX94q23H9YxX_4ErSbMyStjbssiy7VME4NRUqjuctJQHJjR6AtezF22FtPIvW6Lk7m4n34NAdKQ50ueWFU_d436m2e4SM7U9gNvwleUgRQ8w9b52Li7nmuqiJwctqL91Z7rJ7przbAJvMkGI9Ud2ttGsLpSACbDk8-tf1BHK0eyYpgoT6FYmfuzEp_8q-6Je3-0DfpwCks80lIyqtwjt9V0zXGHMU6D1YttuFKYH2hpg0qUola2wpKoc8SjRNfVg"
{
"@context": "https://openactive.io/",
"@type": "OrderProposal",
"brokerRole": "https://openactive.io/AgentBroker",
"broker": {
"@type": "Organization",
"name": "MyFitnessApp",
"url": "https://myfitnessapp.example.com",
"description": "A fitness app for all the community",
"logo": {
"@type": "ImageObject",
"url": "http://data.myfitnessapp.org.uk/images/logo.png"
},
"address": {
"@type": "PostalAddress",
"streetAddress": "Alan Peacock Way",
"addressLocality": "Village East",
"addressRegion": "Middlesbrough",
"postalCode": "TS4 3AE",
"addressCountry": "GB"
}
},
"seller": "https://localhost:5001/api/identifiers/sellers/1",
"customer": {
"@type": "Person",
"email": "[email protected]",
"telephone": "575-867-0501",
"givenName": "Boyle"
},
"orderedItem": [
{
"@type": "OrderItem",
"position": 0,
"acceptedOffer": "https://localhost:5001/api/identifiers/session-series/1502#/offers/0",
"orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/1502/events/15017"
}
],
"totalPaymentDue": {
"@type": "PriceSpecification",
"price": 1,
"priceCurrency": "GBP"
}
}
Response status code: 400 Bad Request. Responded in 136.20941ms.
{
"@context": "https://openactive.io/",
"@type": "TotalPaymentDueMismatchError",
"name": "The 'totalPaymentDue' property of the submitted 'Order' or 'OrderProposal' does not match the value calculated for that 'Order' or 'OrderProposal' by the Booking System.",
"statusCode": 400,
"description": "totalPaymentDue price in the request (1) does not match expected value (0)"
}
"@type": "TotalPaymentDueMismatchError"
with status code 400
instance
is missing from TotalPaymentDueMismatchError
.