{
    "variable": [
        {
            "id": "baseUrl",
            "key": "baseUrl",
            "type": "string",
            "name": "string",
            "value": "https:\/\/api.shlott.com"
        }
    ],
    "info": {
        "name": "Shlott Online Booking System API Documentation",
        "_postman_id": "f67520f6-cc2b-425e-a8c2-eb70aba6ec74",
        "description": "<h2>About<\/h2>\n    \n<div style=\"background-color:#f59e0b;color:#ffffff;padding:12px 20px;border-radius:6px;font-family:sans-serif;font-size:14px;font-weight:600;text-align:center;box-sizing:border-box;margin:16px;text-shadow:none;\">\ud83d\udea7 BETA: The Shlott API is in an early release BETA testing phase and is subject to change without notice. Please do not rely on it for anything critical.<\/div>\n\nThis is the documentation for the Shlott REST API. The API is the primary way to interact with Shlott programmatically, and can be used to build integrations and custom tooling for your flying club or aviation organisation. This page documents the available authentication methods, all API endpoints, example request payloads, and the expected HTTP responses.\n\nAPI access is included with <b>Shlott Pro<\/b> groups. Every group can use Shlott&#39;s core booking features on the free plan, and Pro adds extras such as the API, while helping to fund the continued development of Shlott. If your group is on the free plan and you would like to use the API, you can upgrade to Pro at any time from the <b>Subscription<\/b> page in Shlott.\n\n<h2>Information<\/h2>\n\nThe Shlott REST API is a token-based API that sits alongside the Shlott web platform, providing a focused integration layer for third-party tools. The API exposes a curated set of endpoints covering calendars, bookings, and club membership \u2014 with more endpoints being added over time.\n\nThe API is secured using token-based authentication via Laravel Sanctum. Most endpoints are protected and require a valid API key. To obtain an API key, log into Shlott, go to <b>Manage Account<\/b>, click the <b>API<\/b> tile and then click <b>Generate API Key<\/b>. The key must be included in the <code>Authorization<\/code> header of every subsequent request, preceded by <code>Bearer <\/code> \u2014 for example: <code>Authorization: Bearer your-api-key-here<\/code>.\n\nAPI access is available to <b>Pro groups only<\/b>, and each API key is specific to the group it was created for: switch to the group in Shlott before generating the key. Each key only works for that group, so to use the API with several groups, create a key in each one (you can create as many keys as you need). It stops working if the group stops being Pro, or if you leave or are removed from the group. If a request includes a <code>group_id<\/code> it must be the group the key was created for; if it is left out, that group is used.\n\nAPI keys expire 30 days after they are created, after which requests return 401 Unauthenticated and you must generate a new one. To invalidate a key sooner, remove it from the API page in Shlott.\n\nThe API accepts and returns JSON only.\n\n<h2>Support<\/h2>\n\nSupport for the Shlott API is limited. While we are happy to assist with questions about specific endpoints or unexpected behaviour, we are unable to provide assistance with writing code, building integrations, or connecting the API to your own website or application. Developers are expected to have the necessary technical knowledge to work with a REST API independently.\n\nThe OpenAPI and Postman files carry a shorter introduction than the documentation website. For the full guide (rate limits, errors, pagination and a getting-started example) see https:\/\/api.shlott.com\/api-docs",
        "schema": "https:\/\/schema.getpostman.com\/json\/collection\/v2.1.0\/collection.json"
    },
    "item": [
        {
            "name": "Calendar",
            "description": "",
            "item": [
                {
                    "name": "Calendar Sort Order",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/sort-order",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/sort-order?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Categories and roles in the order the calendar shows them. `count` is the number of live\nobjects (categories) or members (roles) in each."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"data\": [ { \"id\": 3, \"type\": \"resource\", \"name\": \"Courts\", \"count\": 4 }, { \"id\": 2, \"type\": \"role\", \"name\": \"Coach\", \"count\": 6 } ] }",
                            "name": "Order"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Save Calendar Sort Order",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/sort-order",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/sort-order"
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"order\":[\"architecto\"]}"
                        },
                        "description": "The complete new order of categories and roles, first to last. Hidden ones are moved after them,\nas on the website."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"The order has been saved.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Get Calendar Settings",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/calendar-settings",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/calendar-settings?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The values on the website's calendar settings page, plus the objects that can be picked as the\ndefault month-view object (`value` is `resource_<id>` or `member_<id>`; `0` means none)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"calendar_intervals\": 2, \"hide_member_details_on_calendar\": false, \"hide_unavailable_all_day_rows\": false,\n  \"flag_booking_if_member_has_not_booked_in\": 0, \"week_starts_on\": 1, \"default_overview_object\": \"0\",\n  \"overview_amber_limit\": 3, \"overview_red_limit\": 5, \"objects\": [ { \"value\": \"resource_8\", \"label\": \"Court 1 (Courts)\" } ]\n}",
                            "name": "Settings"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Update Calendar Settings",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/calendar-settings",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/calendar-settings"
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"calendar_intervals\":2,\"hide_member_details_on_calendar\":false,\"hide_unavailable_all_day_rows\":false,\"flag_booking_if_member_has_not_booked_in\":0,\"week_starts_on\":1,\"default_overview_object\":\"0\",\"overview_amber_limit\":3,\"overview_red_limit\":5}"
                        },
                        "description": "Same rules as the website: the calendar interval must suit the group's opening times, the amber\nlimit must be below the red limit, and the default object must belong to the group."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Settings updated.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"The overview red limit field must be greater than overview amber limit.\", \"errors\": { \"overview_red_limit\": [ \"...\" ] } }",
                            "name": "Invalid"
                        }
                    ]
                },
                {
                    "name": "Get Calendar Day",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/calendar\/day",
                            "query": [
                                {
                                    "key": "date",
                                    "value": "2025-06-21",
                                    "description": "The calendar date to fetch (YYYY-MM-DD).",
                                    "disabled": false
                                },
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group whose calendar to fetch.",
                                    "disabled": false
                                },
                                {
                                    "key": "resource_id",
                                    "value": "12",
                                    "description": "Limit the response to one resource or role-member row.",
                                    "disabled": false
                                },
                                {
                                    "key": "show_all_rows",
                                    "value": "",
                                    "description": "Include rows hidden by the group's \"hide unavailable all day rows\" setting.",
                                    "disabled": true
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/calendar\/day?date=2025-06-21&group_id=5&resource_id=12&show_all_rows="
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns all resources and role members (e.g. instructors) for the specified group on the given date,\ntogether with their bookings and unavailable time blocks. The response also includes\nthe group's opening hours and minimum booking duration for that day so a client can\nrender a full calendar grid without making additional requests.\n\nResources and role members that are marked as not visible, or whose availability\nrecord shows them as off for the requested day, are omitted. Supply `resource_id`\nto narrow the result to a single row.\n\nWhen the group hides member details on the calendar, a non-admin sees `\"Booked\"` as the\n`slot_text`, and no `booked_for`, `reason` or `note`, on bookings they are not involved in\n(they did not create it, and it is not booked for, booked with or shared with them). Admins\nalways see everything. Requests are limited to 60 a minute per user."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"date\": \"2025-06-21\",\n  \"day_start\": \"08:00\",\n  \"day_end\": \"18:00\",\n  \"minimum_booking_duration\": 30,\n  \"slot_minutes\": 15,\n  \"closed\": false,\n  \"rows_hidden\": false,\n  \"resources\": [\n    {\n      \"id\": 3,\n      \"name\": \"G-ABCD\",\n      \"type\": \"resource\",\n      \"category_id\": 4,\n      \"category_name\": \"Aircraft\",\n      \"subheading\": \"Cessna 172\",\n      \"expiry_warning\": null,\n      \"color\": \"#269DD9\",\n      \"available_from\": \"08:00\",\n      \"available_to\": \"18:00\",\n      \"bookings\": [\n        {\n          \"id\": 120,\n          \"start\": \"09:00\",\n          \"end\": \"11:00\",\n          \"color\": \"#269DD9\",\n          \"slot_text\": \"Jane Smith with John Doe\",\n          \"booked_for\": \"Jane Smith\",\n          \"booked_for_member_id\": 12,\n          \"reason\": \"Trial Flight\",\n          \"note\": \"First lesson\",\n          \"resource_unavailable\": false,\n          \"booking_overlaps_yesterday\": false,\n          \"booking_overlaps_tomorrow\": false,\n          \"im_booked\": false,\n          \"im_shared\": false\n        }\n      ]\n    }\n  ]\n}",
                            "name": "Day returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{\n  \"message\": \"Forbidden.\"\n}",
                            "name": "Authenticated user is not a member of this group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The date field is required.\",\n  \"errors\": { \"date\": [\"The date field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Get Calendar Week",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/calendar\/week",
                            "query": [
                                {
                                    "key": "date",
                                    "value": "2025-06-21",
                                    "description": "Any date in the week (YYYY-MM-DD).",
                                    "disabled": false
                                },
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group whose calendar to fetch.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/calendar\/week?date=2025-06-21&group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The website's week view: every visible resource and role member for the group with the\nbookings of the seven days of the week containing `date`. The week starts on the group's\n`week_starts_on` day (0 Sunday, 1 Monday). Built by the same code as the website\n(`BookingModule::getWeekBookings`), so hidden member details, multi-day bookings and\ndays off behave identically. `off` days only apply to Pro groups.\n\nBookings carry `hidden: true` when the group hides member details and the caller may not\nsee them (`GET \/booking\/{id}` answers 403 for those)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"week_starts_on\": 1,\n  \"start_date\": \"2025-06-16\",\n  \"end_date\": \"2025-06-22\",\n  \"days\": [\"2025-06-16\", \"2025-06-17\", \"2025-06-18\", \"2025-06-19\", \"2025-06-20\", \"2025-06-21\", \"2025-06-22\"],\n  \"categories\": [\n    {\n      \"id\": 1,\n      \"name\": \"Aircraft\",\n      \"type\": \"resource\",\n      \"rows\": [\n        {\n          \"id\": 3,\n          \"name\": \"G-ABCD\",\n          \"type\": \"resource\",\n          \"subheading\": \"Cessna 172\",\n          \"color\": \"#3366cc\",\n          \"expiry_warning\": null,\n          \"days\": [\n            {\n              \"date\": \"2025-06-16\",\n              \"off\": false,\n              \"bookings\": [\n                {\n                  \"id\": 101,\n                  \"all_day_unavailable\": false,\n                  \"start\": \"09:00\",\n                  \"label\": \"Jane Smith\",\n                  \"resource_unavailable\": false,\n                  \"hidden\": false,\n                  \"booking_overlaps_yesterday\": false,\n                  \"booking_overlaps_tomorrow\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}",
                            "name": "Week returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Authenticated user is not a member of this group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The date field is required.\",\n  \"errors\": { \"date\": [\"The date field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Get Calendar Month",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/calendar\/month",
                            "query": [
                                {
                                    "key": "date",
                                    "value": "2025-06-21",
                                    "description": "Any date in the month (YYYY-MM-DD).",
                                    "disabled": false
                                },
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group whose calendar to fetch.",
                                    "disabled": false
                                },
                                {
                                    "key": "object",
                                    "value": "resource_12",
                                    "description": "The object to show, `resource_` or `member_`.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/calendar\/month?date=2025-06-21&group_id=5&object=resource_12"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The website's month overview (`\/calendar\/month`): for one resource or role member, the\nhours booked on each day of the month, with the amber\/red limits that colour them. Built\nby the same code as the website (`BookingModule::objectBookingHours`).\n\n`objects` lists what can be picked (`value` is `resource_12` or `member_5`). When no\n`object` is sent the group's default overview object is used, or the only object if there\nis just one; otherwise `selected` is null and `days` is empty. `names` follows the group's\n\"hide member information\" setting; when names are hidden `count` is the number of bookings."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"month\": \"2025-06\",\n  \"week_starts_on\": 1,\n  \"amber_limit\": 6,\n  \"red_limit\": 10,\n  \"objects\": [\n    { \"value\": \"resource_12\", \"name\": \"G-ABCD\", \"category_name\": \"Aircraft\" }\n  ],\n  \"selected\": \"resource_12\",\n  \"subheading\": \"Cessna 172\",\n  \"expiry_warning\": null,\n  \"days\": [\n    { \"date\": \"2025-06-01\", \"hours\": 0, \"count\": 0, \"names\": [], \"entries\": [], \"level\": \"not-busy\" },\n    { \"date\": \"2025-06-02\", \"hours\": 7.5, \"count\": 2, \"names\": [\"Jane Smith\", \"John Doe\"], \"entries\": [], \"level\": \"busy\" }\n  ]\n}",
                            "name": "Month returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Authenticated user is not a member of this group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The date field is required.\",\n  \"errors\": { \"date\": [\"The date field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                }
            ]
        },
        {
            "name": "iCal",
            "description": "",
            "item": [
                {
                    "name": "Calendar Sync",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/calendar-sync",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/calendar-sync"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The website's Calendar Sync page: the user's private subscription link (`feed_url`, to add\nto Google, Apple or Microsoft calendars) or `has_link: false` when none exists yet.\n`masked_url` is the same link with the secret hidden, for showing on screen."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"has_link\": true, \"feed_url\": \"https:\/\/www.shlott.com\/calendar\/feed\/abc.ics\", \"masked_url\": \"https:\/\/www.shlott.com\/calendar\/feed\/\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022abcd.ics\", \"last_accessed_at\": \"2026-10-28T09:00:00+00:00\", \"last_accessed\": \"3 hours ago\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Generate or Regenerate Calendar Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/calendar-sync\/regenerate",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/calendar-sync\/regenerate"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Creates the link, or replaces it with a new one (the old link stops working at once)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"has_link\": true, \"feed_url\": \"https:\/\/www.shlott.com\/calendar\/feed\/abc.ics\", \"masked_url\": \"https:\/\/www.shlott.com\/calendar\/feed\/\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022abcd.ics\", \"last_accessed_at\": null, \"last_accessed\": null, \"message\": \"Your calendar link has been regenerated.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Delete Calendar Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/calendar-sync",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/calendar-sync"
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Switches calendar syncing off and removes the link."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"has_link\": false, \"feed_url\": null, \"masked_url\": null, \"last_accessed_at\": null, \"last_accessed\": null, \"message\": \"Your calendar link has been deleted.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Booking Calendar Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/booking\/:id\/calendar-link",
                            "query": [
                                {
                                    "key": "end_id",
                                    "value": "1250",
                                    "description": "Last booking id of a series.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/booking\/:id\/calendar-link?end_id=1250",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "564",
                                    "description": "The ID of the booking."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "A short-lived signed URL for the booking's .ics file (the website's \"add to calendar\"\ndownload), for the app to open so the phone offers to add it to the user's calendar.\nGive `end_id` too for a recurring series just created (`start_id` \/ `end_id` from the\ncreate response); a series only covers bookings the caller created."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"url\": \"https:\/\/example.test\/signed\" }",
                            "name": ""
                        }
                    ]
                }
            ]
        },
        {
            "name": "Documents",
            "description": "",
            "item": [
                {
                    "name": "List Object Documents",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/objects\/:id\/documents",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/objects\/:id\/documents?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 8,
                                    "description": "The object id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The files on the website's object page (Pro groups only). Separate from Get Object because\nit asks Azure storage, which can be slow, so the app loads it after the page is up."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"pro\": true, \"documents\": [ { \"name\": \"Manual.pdf\", \"size\": 120394 } ] }",
                            "name": "Documents"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"pro\": false, \"documents\": [] }",
                            "name": "Free group"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Object not found.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "List Group Documents",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/groups\/:id\/documents",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/groups\/:id\/documents",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 5,
                                    "description": "The group id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The group-wide files on the website's Group Documents page (Pro groups only), open to any member."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"pro\": true, \"documents\": [ { \"name\": \"Rules.pdf\", \"size\": 120394 } ] }",
                            "name": "Documents"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"pro\": false, \"documents\": [] }",
                            "name": "Free group"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member"
                        }
                    ]
                },
                {
                    "name": "Get Group Document Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/groups\/:id\/documents\/link",
                            "query": [
                                {
                                    "key": "file",
                                    "value": "Rules.pdf",
                                    "description": "The file name.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/groups\/:id\/documents\/link?file=Rules.pdf",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 5,
                                    "description": "The group id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "A short-lived signed URL for one group document. Pro groups only."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"url\": \"https:\/\/example.test\/signed\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Document not found.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Get Document Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/objects\/:id\/documents\/link",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                },
                                {
                                    "key": "file",
                                    "value": "Manual.pdf",
                                    "description": "A file name from List Object Documents.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/objects\/:id\/documents\/link?group_id=5&file=Manual.pdf",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 8,
                                    "description": "The object id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "A short-lived signed URL for one document, for the app to open in a browser view (the\nbrowser can't send the API key). Pro groups only."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"url\": \"https:\/\/api.example.com\/v1\/objects\/8\/documents\/file?...&signature=...\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member, or not a Pro group"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Document not found.\" }",
                            "name": ""
                        }
                    ]
                }
            ]
        },
        {
            "name": "Groups",
            "description": "",
            "item": [
                {
                    "name": "Search Groups",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/groups\/search",
                            "query": [
                                {
                                    "key": "name",
                                    "value": "group test",
                                    "description": "The search term.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/groups\/search?name=group%20test"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns public groups whose name matches the given search term, along with\ntheir country and postcode so a new user can identify the right group before\njoining. The term is split on whitespace and every word must appear somewhere\nin the group name, in any order, so a search for \"group test\" also matches a\ngroup named \"Test Group\".\n\nFor security reasons, at most 5 groups are returned, best match first (exact name, then names starting with the\nterm, then other matches, each alphabetical). There is no\npagination, so a user must refine the search term to find a group that is not shown.\n\nThis endpoint is unauthenticated so it can be used during sign-up, before a user\nhas an account or has joined any group.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"groups\": [\n    { \"id\": 5, \"name\": \"Test Group\", \"country\": \"United Kingdom\", \"postcode\": \"EX1 1AA\" },\n    { \"id\": 12, \"name\": \"My Test Group\", \"country\": \"United Kingdom\", \"postcode\": \"EX2 2BB\" }\n  ]\n}",
                            "name": "Groups found"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"groups\": []\n}",
                            "name": "No groups found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The name field is required.\",\n  \"errors\": { \"name\": [\"The name field is required.\"] }\n}",
                            "name": "Validation error"
                        },
                        {
                            "header": [],
                            "code": 429,
                            "body": "{ \"message\": \"Too Many Attempts.\" }",
                            "name": "Too many searches (30 a minute per IP address)"
                        }
                    ]
                },
                {
                    "name": "List Groups",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/groups",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/groups"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns every group the authenticated user is an active member of. Use the group `id`\nvalues with the endpoints that take a `group_id`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"groups\": [\n    { \"id\": 5, \"name\": \"Anytown Flying Club\", \"postcode\": \"EX1 1AA\", \"pro\": true }\n  ]\n}",
                            "name": "Groups returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        }
                    ]
                },
                {
                    "name": "Leave Group",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/groups\/:groupId",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/groups\/:groupId",
                            "variable": [
                                {
                                    "id": "groupId",
                                    "key": "groupId",
                                    "value": 5,
                                    "description": "The group to leave."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Removes the authenticated user's membership of a group. A group's only administrator\ncannot leave: another admin must be assigned first.\nIf the group was the user's primary group, another group they belong to becomes primary."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"remaining_groups\": 1 }",
                            "name": "Left the group"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"You are not a member of this group.\" }",
                            "name": "Not a member of the group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Please assign another admin before leaving this group.\" }",
                            "name": "Only admin"
                        }
                    ]
                },
                {
                    "name": "Manage Group Overview",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Whether the caller can manage the group (any member may ask) and, for admins, how many\nobjects, categories and roles it has."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"can_manage\": true, \"objects\": 12, \"categories\": 3, \"roles\": 2 }",
                            "name": "Admin"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"can_manage\": false }",
                            "name": "Not an admin"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member"
                        }
                    ]
                },
                {
                    "name": "Delete Group: Check",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/delete-group",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/delete-group?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "What the app shows before the Delete Group form: the group's name and, if it still has an\nactive Pro subscription, `blocked: true` with the reason (the subscription must be cancelled\nfirst, as on the website)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"name\": \"Flying Club\", \"blocked\": false, \"message\": null }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Delete Group",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/group",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/group"
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"group_name\":\"Flying Club\",\"password\":\"secret123\",\"reason\":\"Club closed\",\"also_delete_account\":true}"
                        },
                        "description": "Permanently deletes the group with its bookings, objects and members. The website's rules:\nadministrators only, the group's name and the admin's password must be typed, a reason is\nrequired, and an active Pro subscription must be cancelled first. Cannot be undone."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Group Successfully Deleted\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Invalid group name provided.\", \"errors\": { \"group_name\": [ \"Invalid group name provided.\" ] } }",
                            "name": "Wrong name or password"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Members",
            "description": "",
            "item": [
                {
                    "name": "Get Group Member",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/group_member\/:groupId\/:memberId",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/group_member\/:groupId\/:memberId",
                            "variable": [
                                {
                                    "id": "groupId",
                                    "key": "groupId",
                                    "value": 5,
                                    "description": "The ID of the group the member belongs to."
                                },
                                {
                                    "id": "memberId",
                                    "key": "memberId",
                                    "value": 12,
                                    "description": "The ID of the group membership record (not the user ID)."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the complete profile for a single member of the specified group. This\nincludes their personal details (name, email, phone), postal address, emergency\ncontact information, their permission level within the group (Read Only, Member,\nor Admin), any role they hold (e.g. Instructor, Examiner), and any custom fields\nthe group administrator has defined for members.\n\nThe authenticated user must themselves be an active member of the same group to\naccess this information. If they are not a member of that group, a 403 Forbidden\nresponse is returned. Custom fields that have been deleted by the group\nadministrator are automatically excluded from the response.\n\nNon-admins also get a 403 when the group hides its member list from non-admins, or when\nthat member has chosen to hide their details from other members."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"first_name\": \"Jane\",\n  \"last_name\": \"Smith\",\n  \"email\": \"jane.smith@example.com\",\n  \"phone\": \"01234 567890\",\n  \"mobile\": \"07700 900000\",\n  \"permission_level\": \"Member\",\n  \"role\": \"Instructor\",\n  \"address_1\": \"10 Runway Lane\",\n  \"address_2\": null,\n  \"address_3\": null,\n  \"city\": \"Anytown\",\n  \"state\": \"Exampleshire\",\n  \"postcode\": \"EX1 1AA\",\n  \"country\": \"United Kingdom\",\n  \"emergency_contact_name\": \"Bob Smith\",\n  \"emergency_contact_relationship\": \"Spouse\",\n  \"emergency_contact_number\": \"07700 900001\",\n  \"custom_fields\": [\n    {\n      \"id\": \"field_abc123\",\n      \"name\": \"Licence Number\",\n      \"type\": \"text\",\n      \"value\": \"PPL\/12345\"\n    }\n  ],\n  \"notes\": \"Prefers morning slots.\"\n}",
                            "name": "Member found"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\n  \"message\": \"Unauthenticated.\"\n}",
                            "name": "Unauthenticated \u2014 no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{\n  \"message\": \"Forbidden.\"\n}",
                            "name": "Authenticated user is not a member of this group, or the profile is private"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\n  \"message\": \"Member not found.\"\n}",
                            "name": "No member with this ID exists in this group"
                        }
                    ]
                },
                {
                    "name": "List Members",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                },
                                {
                                    "key": "search",
                                    "value": "architecto",
                                    "description": "Matches first name, last name, email or role.",
                                    "disabled": false
                                },
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "25",
                                    "description": "Page size, 1 to 100 (default 25).",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members?group_id=5&search=architecto&page=1&per_page=25"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "One page of the group's members, searchable by name, email or role. Non-admins get a 403\nwhen the group hides its member list from them, and never see members who hide their\ndetails. `status` is `expired` or `expiring` when one of the member's expiry-date custom\nfields is past or within 30 days; `can_manage` says whether the caller is a group admin."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 12, \"first_name\": \"Jane\", \"last_name\": \"Smith\", \"email\": \"jane@example.com\", \"role\": \"Instructor\", \"permission_level\": \"Member\", \"status\": null } ],\n  \"total\": 41, \"page\": 1, \"per_page\": 25, \"has_more\": true, \"can_manage\": true, \"removed_count\": 2\n}",
                            "name": "Page of members"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member, or the group hides its member list"
                        }
                    ]
                },
                {
                    "name": "Member Form Options",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/options",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members\/options?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "What the add and edit forms need: the group's roles, countries, the time choices for role\navailability, whether the group has a paid subscription (per-day availability) and whether\nthe free member limit has been reached."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"pro\": true, \"date_format\": \"DMY\", \"free_limit_reached\": false,\n  \"roles\": [ { \"id\": 2, \"name\": \"Instructor\", \"visible\": true } ],\n  \"countries\": [ { \"code\": \"GB\", \"name\": \"United Kingdom\" } ],\n  \"times\": [ \"08:00\", \"08:30\" ]\n}",
                            "name": "Options"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Removed Members",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/removed",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members\/removed?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Members who left or were removed (archived), who an admin can restore or delete for good."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 9, \"name\": \"Bob Jones\", \"email\": \"bob@example.com\", \"role\": null, \"permission_level\": \"Member\", \"reason\": \"left\" } ]\n}",
                            "name": "Removed members"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Expiring Members",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/expiring",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members\/expiring?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Members with an expiry-date custom field that has passed or ends within 30 days."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 12, \"name\": \"Jane Smith\", \"email\": \"jane@example.com\", \"status\": \"expiring\" } ]\n}",
                            "name": "Expiring members"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Check Email Before Adding",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/check-email",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/check-email"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"email\":\"new@example.com\"}"
                        },
                        "description": "The first step of adding a member, as on the website: what happens if this email is added.\n`status` is `new` (the app asks for name, permission and role), `existing` (they already\nhave a Shlott account, which is added as it is), `removed` (they were in this group before\nand can be restored), `member` (already in the group) or `blacklisted`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"status\": \"existing\", \"first_name\": \"Jane\", \"last_name\": \"Smith\", \"message\": \"...\" }",
                            "name": "Existing Shlott user"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Add Member",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"email\":\"new@example.com\",\"first_name\":\"architecto\",\"last_name\":\"architecto\",\"permission_level\":2,\"role\":16,\"new_role\":\"architecto\"}"
                        },
                        "description": "Adds a member to the group: someone with an existing Shlott account keeps their own details,\nand a new email address creates the account (the member gets a welcome email to set their\npassword). A previous member is reinstated. Groups on the free plan are limited in size.\nTo create a role at the same time send `new_role` (a name) instead of `role`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"message\": \"Member added.\", \"id\": 31 }",
                            "name": "Added"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\", \"errors\": { \"email\": [\"...\"] } }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Get Member For Editing",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members\/:id?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "A member's complete editable record: details, role and permission, availability (when the\nrole has any), address, emergency contact, the group's custom fields with their values, and\nnotes. Group admins only; everyone else uses Get Group Member. Dates are YYYY-MM-DD and\ntimes HH:MM. A member with no email address (`editable` false) cannot be changed, as on the\nwebsite."
                    },
                    "response": [
                        {
                            "header": [
                                {
                                    "key": "cache-control",
                                    "value": "no-cache, private"
                                },
                                {
                                    "key": "content-type",
                                    "value": "application\/json"
                                }
                            ],
                            "code": 401,
                            "body": "{\"message\":\"Unauthenticated.\"}",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Member not found.\" }",
                            "name": "No such member"
                        }
                    ]
                },
                {
                    "name": "Update Member",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"first_name\":\"architecto\",\"last_name\":\"architecto\",\"permission_level\":16,\"role\":16,\"color\":\"architecto\",\"note\":\"architecto\"}"
                        },
                        "description": "Saves the edit form. The email address cannot be changed. Sending `role` as null removes the\nrole (and its availability). `availability` only applies when the member has a role; per-day\nrows are used on paid groups and everyday start\/end otherwise. `custom_fields` is keyed by\nfield id; checkbox fields take an array of the ticked options, dates are YYYY-MM-DD, and a\nfield left out keeps its value."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Member details updated.\" }",
                            "name": "Saved"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Member not found.\" }",
                            "name": "No such member"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\", \"errors\": {} }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Archive Member",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id\/archive",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id\/archive",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5}"
                        },
                        "description": "Removes a member from the group but keeps their record, so they can be restored later.\nAdmins cannot archive themselves or the group's last admin."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Member removed.\" }",
                            "name": "Archived"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\" }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Restore Member",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id\/restore",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id\/restore",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5}"
                        },
                        "description": "Brings a removed member back and sends them the email that matches their account state.\nCounts towards the free plan's member limit."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Member restored.\" }",
                            "name": "Restored"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Member not found.\" }",
                            "name": "No such member"
                        }
                    ]
                },
                {
                    "name": "Delete Member Impact",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id\/delete-impact",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/members\/:id\/delete-impact?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "What permanently deleting a member would remove, for the confirmation screen."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"name\": \"Bob Jones\", \"bookings\": 14, \"future_bookings\": 2, \"shared_bookings\": 1, \"attended_bookings\": 0, \"training_records\": 0, \"tickets\": 0 }",
                            "name": "Impact"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\" }",
                            "name": "Cannot be deleted"
                        }
                    ]
                },
                {
                    "name": "Delete Member Permanently",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"member_name\":\"Bob Jones\",\"password\":\"|]|{+-\"}"
                        },
                        "description": "Permanently deletes a member and what goes with them (their bookings, preferences, training\nrecords and tickets). Cannot be undone, so the admin must type the member's full name and\ntheir own password, as on the website. Admins cannot delete themselves or the last admin."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Member deleted.\" }",
                            "name": "Deleted"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\", \"errors\": { \"member_name\": [\"...\"] } }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Resend Activation Email",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id\/resend-activation",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id\/resend-activation",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5}"
                        },
                        "description": "Sends the member the welcome email again (with a fresh set-password link when they have\nnot yet chosen a password)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Activation email sent.\" }",
                            "name": "Sent"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Send Password Reset Link",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/members\/:id\/password-reset",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/members\/:id\/password-reset",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 12,
                                    "description": "The membership id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5}"
                        },
                        "description": "Emails the member a password reset link. Admins never set another member's password."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Password Reset Link sent. Please allow up to 30 minutes for delivery.\" }",
                            "name": "Sent"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Objects",
            "description": "",
            "item": [
                {
                    "name": "List Objects",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/objects",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/objects?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Every live object with its category, and when it was last booked and next booked.\n`categories` is for grouping and for the add form (it says whether a category exists at all)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 8, \"name\": \"Court 1\", \"category_id\": 3, \"category_name\": \"Courts\", \"last_booking\": null, \"next_booking\": \"2026-10-20 09:00:00\", \"future_bookings\": 2 } ],\n  \"free_limit_reached\": false\n}",
                            "name": "Objects"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Add Object",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/objects",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/objects"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"category_id\":3,\"name\":\"Court 3\",\"subheading\":\"Indoor\",\"values\":[],\"availability\":{\"start\":\"08:00\",\"end\":\"22:00\",\"days\":[{\"day\":\"monday\",\"off\":false,\"start\":\"08:00\",\"end\":\"22:00\"}]}}"
                        },
                        "description": "The new object starts with the group's opening times unless `availability` is sent."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"message\": \"Object successfully created.\", \"id\": 21 }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"The name field is required.\", \"errors\": { \"name\": [ \"...\" ] } }",
                            "name": "Invalid, or free plan limit"
                        }
                    ]
                },
                {
                    "name": "Update Object",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/objects\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/objects\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 8,
                                    "description": "The object id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"category_id\":3,\"name\":\"Court 3\",\"subheading\":\"Indoor\",\"values\":[],\"availability\":{\"start\":\"08:00\",\"end\":\"22:00\",\"days\":[{\"day\":\"monday\",\"off\":false,\"start\":\"08:00\",\"end\":\"22:00\"}]}}"
                        },
                        "description": "Changing the category replaces the object's property values with the ones sent (the new\ncategory has its own fields). Opening-time availability is kept as it is unless `availability`\nis sent; days left out of `availability.days` keep their current hours."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Object successfully updated.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Object not found.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"The end time must be after the start time.\", \"errors\": { \"availability.end\": [ \"The end time must be after the start time.\" ] } }",
                            "name": "Invalid"
                        }
                    ]
                },
                {
                    "name": "Delete Object",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/objects\/:id",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/objects\/:id?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 8,
                                    "description": "The object id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Hides the object from the calendar and lists; the website can restore it. Its bookings stay."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Object successfully deleted\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Object not found.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Get Object Details",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/objects\/:id",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/objects\/:id?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 8,
                                    "description": "The object id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Used by the Day\/Week object page and by the admin edit form. `properties[].value` is a\nstring (`YYYY-MM-DD` for date \/ expiry_date; show it in `date_format` order: DMY, MDY or YMD)\nor, for checkbox properties, an array of the ticked options. `expiry_warning` is\n`red` \/ `yellow` \/ null and only set for expiry_date properties. `availability.days` is only\npresent on Pro groups (the website only lets Pro groups set days individually)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"id\": 8, \"name\": \"Court 1\", \"subheading\": \"Indoor\", \"category_id\": 3, \"category_name\": \"Courts\", \"date_format\": \"DMY\",\n  \"properties\": [ { \"id\": 0, \"name\": \"Surface\", \"type\": \"text\", \"value\": \"Clay\", \"expiry_warning\": null } ],\n  \"availability\": { \"start\": \"08:00\", \"end\": \"22:00\", \"pro\": true, \"step\": 30,\n    \"days\": [ { \"day\": \"monday\", \"start\": \"08:00\", \"end\": \"22:00\", \"off\": false } ] }\n}",
                            "name": "Object"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Object not found.\" }",
                            "name": ""
                        }
                    ]
                }
            ]
        },
        {
            "name": "Categories",
            "description": "",
            "item": [
                {
                    "name": "List Categories",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/categories",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/categories?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The group's live categories in calendar order, with their property definitions (hidden\nproperties included, flagged `deleted`) and how many objects each holds."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 3, \"name\": \"Courts\", \"objects\": 4, \"properties\": [ { \"id\": 0, \"name\": \"Surface\", \"type\": \"select\", \"options\": \"Clay,Grass\", \"required\": true, \"deleted\": false } ] } ],\n  \"free_limit_reached\": false, \"date_format\": \"DMY\"\n}",
                            "name": "Categories"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Add Category",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/categories",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/categories"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"name\":\"Courts\",\"properties\":[\"architecto\"]}"
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"message\": \"Calendar Category successfully created.\", \"id\": 9 }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Sorry! You have already exceeded free usage of Shlott. Please subscribe pro to continue ...\" }",
                            "name": "Free plan limit"
                        }
                    ]
                },
                {
                    "name": "Update Category",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/categories\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/categories\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 9,
                                    "description": "The category id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"name\":\"Courts\",\"properties\":[\"architecto\"]}"
                        },
                        "description": "Send every property the category should keep. Existing ones carry their `id`; new ones leave it\nout and are given the next free id. Set `deleted` to hide a property (or false to restore it).\nA property left out of the list is hidden."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Calendar Category successfully updated.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Category not found.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Delete Category",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/categories\/:id",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/categories\/:id?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 9,
                                    "description": "The category id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Hides the category (and so its objects) from the calendar; the website can restore it."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Calendar Category successfully deleted.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Category not found.\" }",
                            "name": ""
                        }
                    ]
                }
            ]
        },
        {
            "name": "Roles",
            "description": "",
            "item": [
                {
                    "name": "List Roles",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/roles",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/roles?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The group's roles in calendar order. `visible` roles appear as rows on the calendar; `members`\nis how many members hold the role."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"data\": [ { \"id\": 2, \"name\": \"Coach\", \"visible\": true, \"members\": 6 } ],\n  \"free_limit_reached\": false\n}",
                            "name": "Roles"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        }
                    ]
                },
                {
                    "name": "Add Role",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/roles",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/roles"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"name\":\"Coach\"}"
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"message\": \"Role saved.\", \"id\": 7 }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Sorry! You have already exceeded free usage of Shlott. Please subscribe pro to continue ...\" }",
                            "name": "Free plan limit"
                        }
                    ]
                },
                {
                    "name": "Update Role",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/roles\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/manage\/roles\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 7,
                                    "description": "The role id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"name\":\"Head coach\",\"visible\":true}"
                        },
                        "description": "Rename a role, or hide it (`visible` false) so it no longer has a row on the calendar."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Role updated.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Role not found.\" }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Delete Role",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/manage\/roles\/:id",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/manage\/roles\/:id?group_id=5",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 7,
                                    "description": "The role id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The group must keep at least one role. Members keep their (now deleted) role id, as on the website."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Role deleted.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a group admin"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Role not found.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"You cannot delete the last role in the group. ...\" }",
                            "name": "Last role"
                        }
                    ]
                }
            ]
        },
        {
            "name": "User",
            "description": "",
            "item": [
                {
                    "name": "Resend Account Activation Email",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/send-activation-email",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/send-activation-email"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"email\":\"jane.smith@example.com\",\"group_id\":5}"
                        },
                        "description": "Resends the activation email for an account that has a pending request to join a group\nbut has not yet been activated. To prevent repeated requests from flooding the user's\ninbox, resends are limited to once every 10 minutes per pending request. The API\nenforces this itself: you do not need to track the cooldown, just handle the 429\nresponse (`code` 6, with `retry_after_seconds`) if it occurs. There is also a limit of\n5 requests a minute per IP address.\n\n`group_id` is required alongside `email` because the activation email is\ngroup-specific \u2014 it names the group and is sent from that group's own contact\naddress, and a user could in principle have more than one pending, unactivated\njoin request across different groups.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"code\": 0,\n  \"message\": \"We've resent the activation email \u2014 please check your inbox.\"\n}",
                            "name": "Activation email resent"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\n  \"code\": 2,\n  \"message\": \"No account was found for this email address.\"\n}",
                            "name": "No account exists for this email"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\n  \"code\": 3,\n  \"message\": \"Group not found.\"\n}",
                            "name": "Group not found"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\n  \"code\": 4,\n  \"message\": \"No pending join request was found for this email address and group.\"\n}",
                            "name": "No pending join request for this email\/group"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\n  \"code\": 5,\n  \"message\": \"This account is already activated \u2014 there is nothing to resend.\"\n}",
                            "name": "Account is already activated"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"code\": 1,\n  \"message\": \"The email field is required.\",\n  \"errors\": { \"email\": [\"The email field is required.\"] }\n}",
                            "name": "Validation error"
                        },
                        {
                            "header": [],
                            "code": 429,
                            "body": "{\n  \"code\": 6,\n  \"message\": \"An activation email was already sent recently. Please wait a few minutes and check your inbox before requesting another.\",\n  \"retry_after_seconds\": 480\n}",
                            "name": "Resent too recently"
                        }
                    ]
                },
                {
                    "name": "Get Profile",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/profile",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/profile"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the authenticated user's personal details, address and emergency contact, plus the\nlist of countries the address can be set to. Group custom fields are not included."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"profile\": {\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Smith\",\n    \"email\": \"jane.smith@example.com\",\n    \"phone\": \"01234 567890\",\n    \"mobile\": \"07700 900000\",\n    \"address_line_1\": \"10 Runway Lane\",\n    \"address_line_2\": null,\n    \"address_line_3\": null,\n    \"city\": \"Anytown\",\n    \"county\": \"Exampleshire\",\n    \"postcode\": \"EX1 1AA\",\n    \"country\": \"GB\",\n    \"next_of_kin\": \"Bob Smith\",\n    \"next_of_kin_relationship\": \"Spouse\",\n    \"next_of_kin_contact\": \"07700 900001\"\n  },\n  \"countries\": [\n    { \"code\": \"GB\", \"name\": \"United Kingdom\" },\n    { \"code\": \"US\", \"name\": \"United States\" }\n  ]\n}",
                            "name": "Profile returned"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        }
                    ]
                },
                {
                    "name": "Update Profile",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/profile",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/profile"
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"first_name\":\"Jane\",\"last_name\":\"Smith\",\"email\":\"jane.smith@example.com\",\"phone\":\"01234 567890\",\"mobile\":\"07700 900000\",\"address_line_1\":\"10 Runway Lane\",\"address_line_2\":\"architecto\",\"address_line_3\":\"architecto\",\"city\":\"Anytown\",\"county\":\"Exampleshire\",\"postcode\":\"EX1 1AA\",\"country\":\"GB\",\"next_of_kin\":\"Bob Smith\",\"next_of_kin_relationship\":\"Spouse\",\"next_of_kin_contact\":\"07700 900001\"}"
                        },
                        "description": "Updates the authenticated user's personal details, address and emergency contact.\nEvery field is overwritten, so send the full set (blank values clear a field)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"profile\": {\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Smith\",\n    \"email\": \"jane.smith@example.com\",\n    \"phone\": \"01234 567890\",\n    \"mobile\": \"07700 900000\",\n    \"address_line_1\": \"10 Runway Lane\",\n    \"address_line_2\": null,\n    \"address_line_3\": null,\n    \"city\": \"Anytown\",\n    \"county\": \"Exampleshire\",\n    \"postcode\": \"EX1 1AA\",\n    \"country\": \"GB\",\n    \"next_of_kin\": \"Bob Smith\",\n    \"next_of_kin_relationship\": \"Spouse\",\n    \"next_of_kin_contact\": \"07700 900001\"\n  }\n}",
                            "name": "Profile updated"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The email has already been taken.\",\n  \"errors\": { \"email\": [\"The email has already been taken.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Change Password",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/password",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/password"
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"current_password\":\"oldsecret1\",\"password\":\"newsecret123\",\"password_confirmation\":\"newsecret123\"}"
                        },
                        "description": "Changes the authenticated user's login password. The current password must be supplied\nand the new one must be confirmed and be at least 8 characters. Limited to 6 attempts\na minute."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Your password has been changed.\" }",
                            "name": "Password changed"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The current password is incorrect.\",\n  \"errors\": { \"current_password\": [\"The current password is incorrect.\"] }\n}",
                            "name": "Wrong current password, or validation error"
                        },
                        {
                            "header": [],
                            "code": 429,
                            "body": "{ \"message\": \"Too Many Attempts.\" }",
                            "name": "Too many attempts"
                        }
                    ]
                },
                {
                    "name": "Delete Account: What Stands in the Way",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/delete",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/delete"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The groups the user belongs to (with whether anyone else administers each), their future\nbookings, and whether the account can be deleted now. A sole administrator of a group must\nfirst make someone else an admin or delete that group; future bookings must be cancelled first."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"groups\": [ { \"id\": 5, \"name\": \"Flying Club\", \"other_admins\": 0, \"sole_admin\": true } ], \"future_bookings\": [ { \"group_name\": \"Flying Club\", \"start\": \"2026-11-01 10:00:00\", \"end\": \"2026-11-01 11:00:00\" } ], \"blocked_by_groups\": true, \"blocked_by_bookings\": false, \"can_delete\": false, \"ad_free_warning\": null }",
                            "name": ""
                        }
                    ]
                },
                {
                    "name": "Delete Account",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user"
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"password\":\"secret123\",\"confirmed\":true}"
                        },
                        "description": "Permanently deletes the account: personal details are wiped, the user is removed from every\ngroup, tokens are revoked and any ad-free subscription ends. Needs the account password."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Your account has been permanently deleted.\" }",
                            "name": ""
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"...\" }",
                            "name": "Blocked or wrong password"
                        }
                    ]
                },
                {
                    "name": "Get Preferences",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/preferences",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/preferences"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the user's Shlott newsletter preference and their per-group notification preferences\nfor every group the user is an active member of. `is_admin` marks groups where the\ndaily upcoming booking list option applies."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"receive_shlott_newsletter\": true,\n  \"groups\": [\n    {\n      \"group_id\": 5,\n      \"group_name\": \"Anytown Flying Club\",\n      \"is_admin\": false,\n      \"preferences\": {\n        \"hide_details_from_other_members\": false,\n        \"allow_members_to_send_email\": true,\n        \"allow_members_to_change_booking\": true,\n        \"notify_on_members_booking\": false,\n        \"notify_on_new_member_joining\": false,\n        \"receive_email_sent_to_whole_group\": true,\n        \"receive_daily_upcoming_booking_list\": false,\n        \"receive_expiry_emails\": true\n      }\n    }\n  ]\n}",
                            "name": "Preferences returned"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        }
                    ]
                },
                {
                    "name": "Update Preferences",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/user\/preferences",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/user\/preferences"
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"receive_shlott_newsletter\":true,\"group_id\":5,\"preferences\":{\"hide_details_from_other_members\":false,\"allow_members_to_send_email\":true,\"allow_members_to_change_booking\":true,\"notify_on_members_booking\":false,\"notify_on_new_member_joining\":false,\"receive_email_sent_to_whole_group\":true,\"receive_daily_upcoming_booking_list\":false,\"receive_expiry_emails\":true}}"
                        },
                        "description": "Updates the user's Shlott newsletter preference (`receive_shlott_newsletter`) and\/or the\npreferences for one group (`group_id` plus any of the group preference booleans). Only the\nfields sent are changed. The user must be an active member of the group. Returns the\nfull, updated preferences, as Get Preferences does.\n\n`receive_daily_upcoming_booking_list` is only offered to group admins; it is ignored for\nother members."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"receive_shlott_newsletter\": true,\n  \"groups\": [\n    {\n      \"group_id\": 5,\n      \"group_name\": \"Anytown Flying Club\",\n      \"is_admin\": false,\n      \"preferences\": {\n        \"hide_details_from_other_members\": false,\n        \"allow_members_to_send_email\": true,\n        \"allow_members_to_change_booking\": true,\n        \"notify_on_members_booking\": false,\n        \"notify_on_new_member_joining\": false,\n        \"receive_email_sent_to_whole_group\": true,\n        \"receive_daily_upcoming_booking_list\": false,\n        \"receive_expiry_emails\": true\n      }\n    }\n  ]\n}",
                            "name": "Preferences updated"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"You are not a member of this group.\" }",
                            "name": "Not a member of the group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The preferences.receive_expiry_emails field must be true or false.\",\n  \"errors\": { \"preferences.receive_expiry_emails\": [\"The preferences.receive_expiry_emails field must be true or false.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Banner",
            "description": "",
            "item": [
                {
                    "name": "Get site banner",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/banner",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group the user is currently in. The user must be an active member of it.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/banner?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "The site-wide announcement banner, as the user should see it in the given group: `banner` is\nnull when there is no banner, it is switched off or expired, or it is targeted at other\nmembers (admins only, standard members and above) or another group type (free or Pro).\n`version` changes whenever the banner is edited. Store the version the user dismisses on the\ndevice and show the banner again when it differs. `style` is `info`, `success`, `warning` or\n`danger`. `html` is a safe HTML rendering (basic formatting tags and links only) and `text`\nis the same content as plain text. Render one of them."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"banner\": {\n    \"version\": 1793352000,\n    \"style\": \"warning\",\n    \"html\": \"Planned maintenance on Sunday 8am-9am.\",\n    \"text\": \"Planned maintenance on Sunday 8am-9am.\",\n    \"expires_at\": \"2026-11-15\"\n  }\n}",
                            "name": "Banner showing"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"banner\": null }",
                            "name": "No banner for this user"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The group id field is required.\",\n  \"errors\": { \"group_id\": [\"The group id field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Bookings",
            "description": "",
            "item": [
                {
                    "name": "List Bookings",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/bookings",
                            "query": [
                                {
                                    "key": "start_date",
                                    "value": "2025-06-01",
                                    "description": "Only return bookings that start on or after this date (YYYY-MM-DD).",
                                    "disabled": false
                                },
                                {
                                    "key": "end_date",
                                    "value": "2025-06-30",
                                    "description": "Only return bookings that start on or before this date (YYYY-MM-DD). Must be equal to or after start_date.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/bookings?start_date=2025-06-01&end_date=2025-06-30"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns all non-cancelled bookings that involve the authenticated user across every\ngroup they belong to. A booking is included if the user is the primary person booked,\nan additional member listed on the booking (e.g. an instructor or examiner), or a\nfriend the booking has been shared with.\n\nResults are ordered by booking start time (earliest first). Use the optional\n`start_date` and `end_date` query parameters to filter to a specific date window \u2014\nfor example, to fetch only this week's bookings or a future month's schedule.\nEach booking includes the resources reserved (e.g. aircraft), any additional members\non the booking, and any members the booking was shared with.\n\nCancelled bookings are excluded, but bookings that are pending approval or on the\nwaiting list are included and flagged with `pending_approval` \/ `waiting_list`.\nClients should not treat those as confirmed; the website's My Bookings lists keep\nthem out of Upcoming and Previous (a booking is confirmed when both flags are false)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "[\n  {\n    \"group_id\": 5,\n    \"group_name\": \"Anytown Flying Club\",\n    \"booked_for_member_id\": 12,\n    \"booked_for\": \"Jane Smith\",\n    \"booking_start\": \"2025-06-15 09:00:00\",\n    \"booking_end\": \"2025-06-15 11:00:00\",\n    \"calendar_objects\": [\n      { \"id\": 3, \"name\": \"G-ABCD\" }\n    ],\n    \"booked_with\": [\n      {\n        \"id\": 7,\n        \"first_name\": \"John\",\n        \"last_name\": \"Doe\",\n        \"role_id\": 2,\n        \"role_name\": \"Instructor\"\n      }\n    ],\n    \"shared_with\": [\n      {\n        \"id\": 9,\n        \"first_name\": \"Alice\",\n        \"last_name\": \"Jones\"\n      }\n    ],\n    \"reason\": \"Trial Flight\",\n    \"notes\": \"Student's first lesson\",\n    \"created_by\": \"Jane Smith\",\n    \"created_at\": \"2025-05-20T14:32:00.000000Z\",\n    \"pending_approval\": false,\n    \"waiting_list\": false\n  }\n]",
                            "name": "Bookings returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\n  \"message\": \"Unauthenticated.\"\n}",
                            "name": "Unauthenticated \u2014 no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The end date field must be a date after or equal to start date.\",\n  \"errors\": {\n    \"end_date\": [\"The end date field must be a date after or equal to start date.\"]\n  }\n}",
                            "name": "Invalid date format or end_date before start_date"
                        }
                    ]
                },
                {
                    "name": "Get Booking",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/booking\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/booking\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 42,
                                    "description": "The ID of the booking to retrieve."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns a single booking by its ID. The authenticated user must be a member of\nthe group that owns the booking. If the group has \"hide member details on calendar\"\nenabled, only admins and members directly involved in the\nbooking (created it, booked-for, booked-with, or shared-with) may view its details.\nBookings that are pending approval, on the waiting list or cancelled can only be viewed\nby admins and the members involved in them."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"group_id\": 5,\n  \"group_name\": \"Anytown Flying Club\",\n  \"booked_for_member_id\": 12,\n  \"booked_for\": \"Jane Smith\",\n  \"booking_start\": \"2025-06-15 09:00:00\",\n  \"booking_end\": \"2025-06-15 11:00:00\",\n  \"calendar_objects\": [\n    { \"id\": 3, \"name\": \"G-ABCD\" }\n  ],\n  \"booked_with\": [\n    {\n      \"id\": 7,\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"role_id\": 2,\n      \"role_name\": \"Instructor\"\n    }\n  ],\n  \"shared_with\": [\n    {\n      \"id\": 9,\n      \"first_name\": \"Alice\",\n      \"last_name\": \"Jones\"\n    }\n  ],\n  \"reason\": \"Trial Flight\",\n  \"notes\": \"Student's first lesson\",\n  \"created_by\": \"Jane Smith\",\n  \"created_at\": \"2025-05-20T14:32:00.000000Z\"\n}",
                            "name": "Booking returned successfully"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\n  \"message\": \"Unauthenticated.\"\n}",
                            "name": "Unauthenticated \u2014 no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{\n  \"message\": \"Forbidden.\"\n}",
                            "name": "Not a member of this group, bookings are private and user is not involved, or the booking is pending, waiting-listed or cancelled and user is not involved"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\n  \"message\": \"Not found.\"\n}",
                            "name": "Booking not found"
                        }
                    ]
                },
                {
                    "name": "Get Booking Options",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/booking-options",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group to book in.",
                                    "disabled": false
                                },
                                {
                                    "key": "date",
                                    "value": "2026-10-13",
                                    "description": "The day the booking is for (YYYY-MM-DD); defaults to today in the group's time zone.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/booking-options?group_id=5&date=2026-10-13"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns everything needed to build a booking for one group and date: what the user is\nallowed to do (book for others, share a booking, make recurring bookings, join the\nwaiting list), the booking reasons, the categories with the items bookable on that\ndate, the opening hours and the permitted start\/end time steps. Groups without a paid\nsubscription get the same shape with `recurring_allowed` false and the group-wide\nhours and availability instead of per-day ones."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"pro\": true,\n  \"member_id\": 12,\n  \"member_name\": \"Jane Smith\",\n  \"permission_level\": 2,\n  \"group_now\": \"2026-10-13 09:30\",\n  \"opening_start\": \"08:00\",\n  \"opening_end\": \"18:00\",\n  \"minimum_booking_duration\": 30,\n  \"minute_steps\": [0, 30],\n  \"future_booking_limit_months\": 6,\n  \"allow_past_booking\": false,\n  \"maximum_bookable_objects\": null,\n  \"requires_approval\": false,\n  \"recurring_allowed\": true,\n  \"can_book_for_others\": false,\n  \"can_share\": true,\n  \"members\": [ { \"id\": 7, \"name\": \"John Doe\" } ],\n  \"allow_waiting_list\": true,\n  \"email_options\": [\n    { \"value\": 1, \"label\": \"Do not send an email confirmation\" },\n    { \"value\": 2, \"label\": \"Email only the users booked\" }\n  ],\n  \"default_email_option\": 1,\n  \"reasons\": [ { \"id\": 3, \"reason\": \"Trial Flight\" } ],\n  \"categories\": [\n    {\n      \"key\": \"resource_4\",\n      \"type\": \"resource\",\n      \"name\": \"Aircraft\",\n      \"items\": [ { \"id\": 3, \"name\": \"G-ABCD\", \"available_from\": \"08:00\", \"available_to\": \"18:00\" } ]\n    },\n    {\n      \"key\": \"role_2\",\n      \"type\": \"role\",\n      \"name\": \"Instructor\",\n      \"items\": [ { \"id\": 7, \"name\": \"John Doe\", \"available_from\": \"09:00\", \"available_to\": \"17:00\" } ]\n    }\n  ]\n}",
                            "name": "Options returned"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the group, on hold, or read-only"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The group id field is required.\",\n  \"errors\": { \"group_id\": [\"The group id field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Create Booking",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/bookings",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/bookings"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"book_for\":77,\"resources\":[16],\"members\":[16],\"shared_with\":[16],\"start\":\"2026-10-13 14:00\",\"end\":\"2026-10-13 15:00\",\"reason\":3,\"note\":\"architecto\",\"email_to\":16,\"add_to_waiting_list_if_not_available\":false,\"recurring\":\"no\",\"frequency_num\":1,\"recurring_end\":\"architecto\"}"
                        },
                        "description": "Creates a booking (or a recurring series) for the authenticated member, applying the\ngroup's booking rules: opening hours, item availability, clashes, the waiting list,\napproval-only groups and the limits on how far ahead, and how many items, can be booked.\nAt least one of `resources` or `members` is required. Returns 422 with a human-readable\nmessage when the booking is refused (clash, outside opening hours, in the past, etc).\nCall Get Booking Options first to find what the user can book and which options apply."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"message\": \"Booking created.\", \"status\": \"success\", \"msg\": \"Booking created.\", \"start_id\": 120, \"end_id\": 120 }",
                            "name": "Created"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the group, on hold, or read-only"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Chris already booked for this time slot.\", \"errors\": { \"user_booked\": [\"Chris already booked for this time slot.\"] } }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Update Booking",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/booking\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/booking\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 42,
                                    "description": "The booking to change."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"book_for\":77,\"resources\":[16],\"members\":[16],\"shared_with\":[16],\"start\":\"2026-10-13 14:00\",\"end\":\"2026-10-13 15:00\",\"reason\":3,\"note\":\"architecto\",\"email_to\":16,\"add_to_waiting_list_if_not_available\":false}"
                        },
                        "description": "Changes a booking, applying the same booking rules as Create Booking. The body is the\nsame as Create Booking's, without the recurring fields: a recurring series cannot be\nchanged as a whole. Admins can change any booking in their group, other members only\nones they are involved in. In a group where bookings need approval, a non-admin's change\nsends the booking back for approval and an admin's change approves it. Confirmation and\nnotification emails are sent as for a new booking. Returns 422 with a human-readable\nmessage when the change is refused."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Booking updated.\", \"status\": \"success\", \"msg\": \"Booking updated.\", \"booking_id\": 42 }",
                            "name": "Updated"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"You can only change bookings you are involved in.\" }",
                            "name": "Not allowed to change it"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Not found.\" }",
                            "name": "Booking not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Chris already booked for this time slot.\", \"errors\": { \"user_booked\": [\"Chris already booked for this time slot.\"] } }",
                            "name": "Refused"
                        }
                    ]
                },
                {
                    "name": "Cancel Booking",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/booking\/:id\/cancel",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/booking\/:id\/cancel",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 42,
                                    "description": "The booking to cancel."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"reason\":2}"
                        },
                        "description": "Cancels a booking. Admins can cancel any booking in their group; other members only\nones they are involved in, and only when the group allows members to cancel. A cancel\nreason is required unless the booking is still awaiting approval. Cancelling frees the\nslot for the first waiting-list booking that now fits (when the group uses a waiting\nlist) and sends the cancellation emails. The `cancel_reasons` and `can_cancel` fields of\nGet Booking show what a user may do."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"message\": \"Booking successfully cancelled.\", \"status\": \"success\", \"msg\": \"Booking successfully cancelled.\", \"booked_from_waiting_list\": false }",
                            "name": "Cancelled"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"You can only cancel bookings you are involved in.\" }",
                            "name": "Not allowed to cancel"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Not found.\" }",
                            "name": "Booking not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{ \"message\": \"Please select a reason for cancelling.\" }",
                            "name": "Already cancelled, or no reason"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Noticeboard",
            "description": "",
            "item": [
                {
                    "name": "List Notices",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/notices",
                            "query": [
                                {
                                    "key": "group_id",
                                    "value": "5",
                                    "description": "The group. The user must be an active member of it.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/v1\/notices?group_id=5"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the unexpired notices on a group's noticeboard, newest first. `can_post` says\nwhether the user may add notices, and each notice's `can_edit` whether they may edit or\ndelete it (its author, or a group admin). `message` is the notice exactly as it was\nsubmitted (use it to pre-fill an edit form), `html` is a safe HTML rendering of it (basic\nformatting tags and links only, with line breaks and bare links converted), and `text` is\nthe same content as plain text. Render `html` or `text`, never `message`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"can_post\": true,\n  \"notices\": [\n    {\n      \"id\": 31,\n      \"subject\": \"Club night\",\n      \"message\": \"Friday at 7pm. Map: https:\/\/example.com\/map\",\n      \"html\": \"Friday at 7pm. Map: <a href=\\\"https:\/\/example.com\/map\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https:\/\/example.com\/map<\/a>\",\n      \"text\": \"Friday at 7pm. Map: https:\/\/example.com\/map\",\n      \"expire_at\": \"2026-11-01\",\n      \"created_by\": \"Jane Smith\",\n      \"created_at\": \"2026-10-10T09:15:00.000000Z\",\n      \"can_edit\": true\n    }\n  ]\n}",
                            "name": "Notices returned"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The group id field is required.\",\n  \"errors\": { \"group_id\": [\"The group id field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Add Notice",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/notices",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/notices"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"group_id\":5,\"subject\":\"Club night\",\"message\":\"Friday at 7pm.\",\"expire_at\":\"2026-11-01\",\"send_to_all\":false}"
                        },
                        "description": "Adds a notice to a group's noticeboard. Group admins can always post; other members can\nonly post when the group allows members to post notices. Read-only members and members on\nhold cannot post. The `message` may contain basic HTML (formatting tags and links); anything\nelse is stripped when it is displayed or emailed.\n\nWith `send_to_all` the notice is also emailed to every group member who has opted in to group\nemails. Emailing the group is limited to 3 times a day per user, and posting to 10 notices an hour."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"id\": 31 }",
                            "name": "Notice added"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the group, or not allowed to post"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The subject field must be at least 3 characters.\",\n  \"errors\": { \"subject\": [\"The subject field must be at least 3 characters.\"] }\n}",
                            "name": "Validation error"
                        },
                        {
                            "header": [],
                            "code": 429,
                            "body": "{\n  \"message\": \"You have emailed the group too many times today. Please try again tomorrow.\"\n}",
                            "name": "Too many notices posted, or the group was emailed too often today"
                        }
                    ]
                },
                {
                    "name": "Update Notice",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/notices\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/notices\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 31,
                                    "description": "The notice to change."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"subject\":\"Club night moved\",\"message\":\"Now on Saturday at 7pm.\",\"expire_at\":\"2026-11-01\"}"
                        },
                        "description": "Changes a notice's subject, message and expiry date. Group admins can change any notice in\ntheir group; other members only the ones they wrote (and not if they are read-only or on hold).\nThe notice is not re-emailed."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"id\": 31 }",
                            "name": "Notice updated"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the notice's group, or not allowed to change it"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Not found.\" }",
                            "name": "Notice not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The message field is required.\",\n  \"errors\": { \"message\": [\"The message field is required.\"] }\n}",
                            "name": "Validation error"
                        }
                    ]
                },
                {
                    "name": "Delete Notice",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/notices\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/notices\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": 31,
                                    "description": "The notice to delete."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Removes a notice from the noticeboard. Group admins can delete any notice in their group;\nother members only the ones they wrote (and not if they are read-only or on hold)."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{ \"deleted\": true }",
                            "name": "Notice deleted"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"Forbidden.\" }",
                            "name": "Not a member of the notice's group, or not allowed to delete it"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{ \"message\": \"Not found.\" }",
                            "name": "Notice not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Tickets",
            "description": "",
            "item": [
                {
                    "name": "Submit Ticket",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "v1\/tickets",
                            "query": [],
                            "raw": "{{baseUrl}}\/v1\/tickets"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"category\":\"bug\",\"message\":\"The calendar freezes when I rotate my phone.\",\"group_id\":5,\"screen\":\"calendar\",\"app_version\":\"1.0.0\",\"platform\":\"ios\",\"os_version\":\"19.1\",\"device_model\":\"iPhone 16\"}"
                        },
                        "description": "Raises a support ticket on behalf of the authenticated user in the given group (their\nprimary group when `group_id` is omitted). The ticket appears in the group's support\nticket list in Shlott, where it is handled like any other ticket. The user must be an\nactive member of the group. The optional `screen`, `app_version`, `platform`,\n`os_version` and `device_model` fields let your application attach diagnostic detail to\nthe ticket."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{ \"ticket_ref\": \"T00123\" }",
                            "name": "Ticket created"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{ \"message\": \"Unauthenticated.\" }",
                            "name": "Unauthenticated: no or invalid API key"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{ \"message\": \"You are not a member of this group.\" }",
                            "name": "Not a member of the group"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\n  \"message\": \"The category field must be one of: bug, suggestion, question, other.\",\n  \"errors\": { \"category\": [\"The category field must be one of: bug, suggestion, question, other.\"] }\n}",
                            "name": "Validation error"
                        },
                        {
                            "header": [],
                            "code": 429,
                            "body": "{ \"message\": \"Too Many Attempts.\" }",
                            "name": "Too many submissions (5 a minute)"
                        }
                    ]
                }
            ]
        }
    ],
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "key",
                "type": "string"
            }
        ]
    }
}