Login / Sign Up

FAQs Packet

This packet of data includes a list of questions and categories. Questions can include an embedded youtube video as well as document attachments if required.

Non-standard nesting

For legacy reasons the FAQs packet of data is nested in a single object, including the lastChange optional data versioning.

Questions are also filtered based on groupsite so if your app surfaces are part of a multi park install, then questions should be marked with which parks they should be available for.

Structure

{
  "faqs": {
    //Single FAQs Object
  }
}

Properties

faqs

Type : FAQs Data - Optional

The single FAQs Data object which contains the questions, categories, and lastChange

Required Type Definitions

Boolean - Reveal

As we connect to different systems using a range of different languages, we can interpret several things as a true. Generally speaking holidaymaker will use a standard true/false JSON boolean, however we also read a lower case string and checked if they are "1", "true", "yes", or "on" to then create the positive boolean. Unless explicitly noted, all booleans are defaulted as false if the node doesn't exist.

{
  "optionOne": true,
  "optionTwo": false,
  "allTheseAreValidTrues" : [
    1, "1", true, "true", "on", "yes"
  ]
}

Category - Reveal

A category packet contains the ID to filter entities, and also the name to render. Typically they are sorted by their priority integer which defaults at 99 if not set. The lower this number the higher in the list. After priority they are alphabatised (case insensitive). An 'All' category is never required as the app surfaces create this. Holiday home sales categories also should include a banner image url, as they are also rendered as banners on the home sales section landing page.

{
  "id": 42,
  "name": "Caravans",
  "slug": "caravans",
  "priority": 5,
  "imgUrl": "https://link-to-homesales-caravans-banner.jpg?v=12345",
  "locales": [
    "cy" : "Name Translation"
  ]
}

id

Type : Integer - Required

Category ID used for filtering entities. This should be unique to the specific entity category, however does not need to be unique within scope of other entities and data.


name

Type : String - Required

Name of category which is rendered in various places in the app surfaces


slug

Type : String - Optional

Currently optional as unused by categories. Filtering uses IDs, but slug is stored to potentially be referenced by future


priority

Type : Integer - Optional

Defaults to 99 if not set. The lower the priority, the higher this category will be sorted before alphabetisation.


imgUrl

Type : Image Url String - Optional

Currently only used by holiday home sales categories. This image is used as the banner on the holiday homes sales section landing page.


locales

Type : Array of String - Optional

An array of localisable name translations for this category. This can include multiple translated names with the array should be keyed with the locale code which are supported by your holidaymaker install

Epoch Date/Time Integer - Reveal

When dealing with time, as well as dates, our data packets will typically use an epoch integer. Our date/times will normally be in UTC/GMT - unless it will be a renderable time to the end user, when it currently will use the 'Europe/London' timezone to take into account daylight savings time.

{
  "lastChange": 1691481892,
  "time": 1691398800,
  "endTime": 1691402400
}

FAQs Data - Reveal

This is the main object used within the FAQs packet. It includes a list of categories, questions, as well as the lastChange optional data versioning.

{
  "categories" [
    {
      //Category 1
    },
   {
      //Category 1
    }
  ],
  "questions" [
    {
      //Question 1
    },
   {
      //Question 1
    }
  ],
  "lastChange": 1690378236
}

categories

Type : Array of Category - Required

List of available categories for the supplied data. These are used for the tabs on the holiday information / FAQ page, ordered by the sort priority, then alphabetically. A first tab for the information blocks is always added and a 'All FAQs' tab is also added, so a all category is not required


questions

Type : Array of Question - Optional

List of available questions


lastChange

Type : Epoch Date/Time Integer - Optional

Last change in UTC/GMT - Optionally used so our system knows if it should trigger data invalidation to end users devices.

Image Url String - Reveal

Our app surfaces talk to an image engine on our infrastructure to process and resize images for different smart phone screen densities. Because of this the size of images are less relevant as they are delivered at optimum sizes anyway. However due to processing power and speed we do recommend that image urls are all 3000 pixels or below. The app surfaces will never need an image this large, so it gives you the option of still having a large quality image, but can be loaded in the apps and our infrastructure efficiently. We support both png, jpeg, and webp images. You can optionally include a '?v=' version integer so this can be used for versioning. If you do include this you can ensure images are reprocessed if the source image is changed on your servers.

{
  "imgUrl": "https://your-wordpress-site.com/wp-content/uploads/2023/08/a-large-image-3000x2100.jpg?v=1691481892",
  "image": "https://your-wordpress-site.com/wp-content/uploads/2023/08/a-smaller-image.png"
}

Integer - Reveal

Standard JSON Integer - 0 is commonly considered to be a default value, unless it is an valid ID when -1 is used. For sort priorities 99 is used as the default.

{
  "key1": 9,
  "key2": 42,
  "arrayOfInts": [
    2,
    3,
    5,
    8
  ] 
}

Link (Legacy File) - Reveal

This is a legacy type which works the same as the 'link' object, however for legacy reasons has different node names.

{
  "name": "Owner's on park agreement",
  "file": "https://your-wordpress-install.com/wp-content/uploads/2023/02/owners.pdf"
}

name

Type : String - Required

Name of file which should be used on the CTA button when rendering on a detail page


file

Type : Url String - Required

External url that the CTA button should try to externally open

Question - Reveal

This represents a single question entity within the app. Title and content are required with optional youtube video embed, and attachment documents.

For multipark installs the 'sites' property is required. If you wish the offer to appear for a park then you must include it's groupsite key in the sites array.

{
  "id": 123,
  "title": "How to close the blinds",
  "content":  "To close the blinds, simply pull the back cord downwards. Pull the front cord to open.",
  "youtubeCode": "Bwr_B6MVGgQ",
  "youtubePoster": "https://your-wordpress-install.com/wp-content/uploads/2022/05/hm_imported_7488.jpg",
  "priority": 99,
  "featured": 1,
  "downloads": [
    {
      //Question Attachment
    }  
  ],
  "sites": [
    "park-one"
  ],
  "categories": [
    79
  ]
}

id

Type : Integer - Required

ID for the question. Must be unique to other questions, but does not need to differ from other entities


title

Type : String - Required

The question or title of the question


content

Type : Rich Text / Multiline String - Required

The answer to the question


youtubeCode

Type : String - Optional

This should be the code to a youtube video (not the whole url)


youtubePoster

Type : Image Url String - Optional

Optional poster image to show in the app for users to click to start the video


priority

Type : Integer - Optional

Defaults to 99 - the lower the priority the higher on the offer lists views it will be after featured sorting and before alphabetisation.


featured

Type : Boolean - Optional

Should a question be considered featured. These will always be pushed to the top of the All FAQs category, and the filtered category tabs. If several questions are featured then the priority sorting will come next before alphabetisation.


downloads

Type : Array of Link (Legacy File) - Optional

Optional list of file attachments. Should be .pdf or .doc files.


sites

Type : Array of String - Required

Only required for multi site installs - can be disregarded for single park systems. This should be a list of valid groupsite keys which this question should be available for. If this array is missing or empty then the offer will not render for any user.


categories

Type : Array of Integer - Optional

List of category IDs to associate with this question. All questions will render in the 'All FAQs' tab, but this array can set which other category tabs the offer also appears in.

Rich Text / Multiline String - Reveal

Acts the same as the standard String type, however If text is assumed to include line breaks then we use a place holder of #BREAK#. These will then be replaced by the relevant line breaks depending on the language, and device that is rendering the text. This is commonly used in entity copy, and addresses. Rich text should not include HTML or other markup. There should always be a contextual consideration as well - for example if you copy includes a html anchor link to 'Read More' - then simply removing the markup will then leave the text 'Read More' which will be a redundant, none clickable piece of text within the app surfaces.

{
  "textWithBullets": "This paragraph will now have two line breaks, and then a list of bullets#BREAK##BREAK#• Bullet 1#BREAK#• Bullet 2#BREAK#• Bullet 3",
  "address": "Holidaymaker App Ltd#BREAK#Stowey House#BREAK#Bridport Road#BREAK#Dorchester#BREAK#DT12SB"
}

String - Reveal

Standard JSON String - Often will have certain characters escaped depending what system is writing the JSON packet, however our parser only requires to have double quotes (") escaped. UTF-8 encoding is our standard, but others may be accepted if required. If line breaks are required in the text then the Rich Text / Multiline String type is used instead.

{
  "key1": "A string value",
  "key2": "Another string with an some \"quotes\" that need escaping",
  "arrayOfStrings": [
    "Item one as a string",
    "Item two as a string",
    "Item three as a string",
  ] 
}

Url String - Reveal

A Url is sent the same as a string. If our system knows this is a url it will check if it starts with http or https - Note that navigating from both iOS and Android should use https.

{
  "bookingUrl" : "https://portal.managebooking.pmssystem"
}

Full Packet Example

{
  "faqs": {
    "categories": [
      {
        "id": 5,
        "name": "Caravan Holiday Homes",
        "priority": 1
      },
      {
        "id": 4,
        "name": "General",
        "priority": 0
      },
      {
        "id": 3,
        "name": "Glamping Units",
        "priority": 3
      },
      {
        "id": 2,
        "name": "Touring Pitches",
        "priority": 2
      }
    ],
    "questions": [   
      {
        "id": 25,
        "title": "Are dogs and other pets allowed?",
        "content": "We are a dog friendly park and pets are welcome in most areas, with a maximum of three dogs per caravan.#BREAK##BREAK#Please note however that dogs may not stay in our glamping units, with the exception of our dog friendly pods and can host up to two dogs.#BREAK##BREAK#We cannot accept any breeds listed under the Dangerous Dogs Act.",
        "categories": [
          5,
          4,
          3,   
          2
        ],
        "sites": [
          "park-one",
          "park-two"
        ]
      },
      {
        "id": 10,
        "title": "Are pitches hardstanding?",
        "content": "All of our standard and premium pitches are hardstanding.\r\n\r\nThe hardstanding pitches are to keep the pitches available and clean throughout the season for you to enjoy your stay at Skelwith Fold.",
        "categories": [
          2
        ],
        "sites": [
          "park-one",
          "park-two"
        ]
      },   
      {
        "id": 40,
        "title": "Are there hairdryers available?",
        "content": "Our glamping units all have a hairdryer available inside.\r\n\r\nOur cottages all have hairdryers provided.\r\n\r\nFor touring customers, our shower blocks have hairdryers available inside.",
        "categories": [
          3,          
          2
        ],
        "sites": [
          "park-one",
          "park-two"
        ]
      },
      {
        "id": 123,
        "title": "How to close the blinds",
        "content":  "To close the blinds, simply pull the back cord downwards. Pull the front cord to open.",
        "youtubeCode": "Bwr_B6MVGgQ",
        "youtubePoster": "https://your-wordpress-install.com/wp-content/uploads/2022/05/hm_imported_7488.jpg",
        "priority": 3,
        "featured": 1,
        "downloads": [
          {
            "name": "Blinds Instructions",
            "file": "https://your-wordpress-install.com/wp-content/uploads/2023/02/blinds.pdf"
          }
        ],
        "sites": [
          "park-one"
        ],
        "categories": [
          3
        ]
      }
    ],
    "lastChange": 1690378236
  }
}

Data Changes

10/04/2025 - Category

Added 'locales' property for translational holidaymaker installs

01/09/2022 - Category

Added 'imgUrl' property for home sales categories