{
  "info": {
    "name": "FeatShare Public API",
    "description": "Generated from the live OpenAPI spec. Set base_url (e.g. https://featshare.web.app) and api_key in your environment.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Meta",
      "item": [
        {
          "name": "Liveness probe",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/health",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "health"
              ],
              "query": []
            },
            "description": "Liveness probe"
          }
        },
        {
          "name": "This specification",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/openapi.json",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "openapi.json"
              ],
              "query": []
            },
            "description": "This specification"
          }
        },
        {
          "name": "Postman collection (generated from this spec)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/postman.json",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "postman.json"
              ],
              "query": []
            },
            "description": "Postman collection (generated from this spec)"
          }
        },
        {
          "name": "Identify the calling key",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/me",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "me"
              ],
              "query": []
            },
            "description": "Returns the business (share) this key belongs to, its scopes and environment. Useful as a connection test."
          }
        }
      ]
    },
    {
      "name": "Members",
      "item": [
        {
          "name": "Create a member",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members"
              ],
              "query": []
            },
            "description": "Runs the app's member-creation engine (roster + account doc). 409 when a member with this phone already exists in the business (its id is quoted in the error detail). Requires scope `members:create`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List members",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Archive filter (applied per page — a page may hold fewer than limit items)",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "",
                  "description": "Only members updated after this moment, oldest first — the sync mode",
                  "disabled": true
                },
                {
                  "key": "phone",
                  "value": "",
                  "description": "Exact phone match (any common format; normalized to E.164)",
                  "disabled": true
                },
                {
                  "key": "email",
                  "value": "",
                  "description": "Exact email match",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Name prefix search",
                  "disabled": true
                }
              ]
            },
            "description": "Ordered by last update (newest first) unless a search/sync filter changes the ordering. Requires scope `members:read`."
          }
        },
        {
          "name": "Get a member",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}"
              ],
              "query": [
                {
                  "key": "expand",
                  "value": "",
                  "description": "Comma list; supports `products`",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `members:read`."
          }
        },
        {
          "name": "Update a member",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}"
              ],
              "query": []
            },
            "description": "Allow-listed profile fields only — anything else is rejected. Requires scope `members:update`.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Archive a member",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}/archive",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}",
                "archive"
              ],
              "query": []
            },
            "description": "In-place archive (reversible). 409 when already archived. Requires scope `members:archive`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Restore an archived member",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}/unarchive",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}",
                "unarchive"
              ],
              "query": []
            },
            "description": "Requires scope `members:archive`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List a member's products",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}/products",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}",
                "products"
              ],
              "query": []
            },
            "description": "Requires scope `members:read`."
          }
        },
        {
          "name": "List a member's bookings",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/members/{id}/bookings",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "members",
                "{id}",
                "bookings"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "Window start (default: yesterday)",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Window end (max 62 days after from)",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `members:read`."
          }
        }
      ]
    },
    {
      "name": "Products",
      "item": [
        {
          "name": "List product types",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/product-types",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "product-types"
              ],
              "query": [
                {
                  "key": "include_inactive",
                  "value": "",
                  "description": "Include inactive catalogue entries",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `products:read`."
          }
        },
        {
          "name": "Grant a product to a member",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products"
              ],
              "query": []
            },
            "description": "Creates a product from the type (dates, entries and price copied from the catalogue), exactly like an in-app grant. Requires scope `products:grant`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List products",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products"
              ],
              "query": [
                {
                  "key": "member_id",
                  "value": "",
                  "description": "Products of one member",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Lifecycle filter",
                  "disabled": true
                },
                {
                  "key": "type_id",
                  "value": "",
                  "description": "Products created from one product type",
                  "disabled": true
                },
                {
                  "key": "expiring_before",
                  "value": "",
                  "description": "Products whose end date is on/before this day",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `products:read`."
          }
        },
        {
          "name": "Get a product",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                "{id}"
              ],
              "query": [
                {
                  "key": "expand",
                  "value": "",
                  "description": "Comma list; supports `activities` (usage entries)",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `products:read`."
          }
        },
        {
          "name": "Close a product",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products/{id}/close",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                "{id}",
                "close"
              ],
              "query": []
            },
            "description": "The app's full close engine (refund math, notifications, bookkeeping). 409 when already closed. There is NO delete on this API — close is final but auditable. Requires scope `products:close`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Freeze a product",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products/{id}/freeze",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                "{id}",
                "freeze"
              ],
              "query": []
            },
            "description": "Adds a freeze window (start/end — no indefinite freezes). The response includes the `freezes` list with each window's `key` for unfreezing. Requires scope `products:freeze`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Remove a freeze window",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/products/{id}/unfreeze",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                "{id}",
                "unfreeze"
              ],
              "query": []
            },
            "description": "Requires scope `products:freeze`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        }
      ]
    },
    {
      "name": "Messages",
      "item": [
        {
          "name": "Send a message to members",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/messages",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "messages"
              ],
              "query": []
            },
            "description": "Queues through the app's own pipelines; delivery is asynchronous. Archived/unknown members are skipped and reported. WhatsApp sends respect the business's quiet hours. EACH RECIPIENT counts against the daily message quota, so a batch that would exceed it is refused whole with 429 message_quota_exceeded and nothing is sent. Requires scope `messages:send`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        }
      ]
    },
    {
      "name": "Tasks",
      "item": [
        {
          "name": "List tasks",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/tasks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Task state filter",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `tasks:read`."
          }
        },
        {
          "name": "Create a task",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/tasks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks"
              ],
              "query": []
            },
            "description": "Requires scope `tasks:create`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Close a task",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/tasks/{id}/complete",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                "{id}",
                "complete"
              ],
              "query": []
            },
            "description": "409 when the task is already closed. Requires scope `tasks:complete`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        }
      ]
    },
    {
      "name": "Leads",
      "item": [
        {
          "name": "Create a lead",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads"
              ],
              "query": []
            },
            "description": "Triggers the same owner notification fan-out as in-app leads. 409 when an OPEN lead with this phone already exists (its id is quoted in the error detail). Requires scope `leads:create`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List leads",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads"
              ],
              "query": [
                {
                  "key": "open",
                  "value": "",
                  "description": "true = open leads only, false = closed only",
                  "disabled": true
                },
                {
                  "key": "phone",
                  "value": "",
                  "description": "Exact phone match",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "",
                  "description": "Only leads updated after this moment, oldest first",
                  "disabled": true
                }
              ]
            },
            "description": "Ordered by creation (newest first) unless a filter changes the ordering. Requires scope `leads:read`."
          }
        },
        {
          "name": "Get a lead",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads",
                "{id}"
              ],
              "query": [
                {
                  "key": "expand",
                  "value": "",
                  "description": "Comma list; supports `comments`",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `leads:read`."
          }
        },
        {
          "name": "Update a lead",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads",
                "{id}"
              ],
              "query": []
            },
            "description": "Requires scope `leads:update`.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Add a note to a lead",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads/{id}/notes",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads",
                "{id}",
                "notes"
              ],
              "query": []
            },
            "description": "Requires scope `leads:update`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Mark a lead as lost",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/leads/{id}/lost",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "leads",
                "{id}",
                "lost"
              ],
              "query": []
            },
            "description": "Closes the lead and records the reason as a note. Requires scope `leads:update`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List lead sources",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/lead-sources",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "lead-sources"
              ],
              "query": []
            },
            "description": "Requires scope `leads:read`."
          }
        },
        {
          "name": "List lead types",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/lead-types",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "lead-types"
              ],
              "query": []
            },
            "description": "Requires scope `leads:read`."
          }
        },
        {
          "name": "List lead interests",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/lead-interests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "lead-interests"
              ],
              "query": []
            },
            "description": "Requires scope `leads:read`."
          }
        }
      ]
    },
    {
      "name": "Schedule",
      "item": [
        {
          "name": "List classes in a date window",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/schedule",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "schedule"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "Window start (required)",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Window end (required; max 62 days after from)",
                  "disabled": true
                },
                {
                  "key": "teacher_id",
                  "value": "",
                  "description": "Only classes assigned to this staff member",
                  "disabled": true
                },
                {
                  "key": "location",
                  "value": "",
                  "description": "Location key (see /v1/locations)",
                  "disabled": true
                },
                {
                  "key": "category_id",
                  "value": "",
                  "description": "Category id (see /v1/categories)",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `schedule:read`."
          }
        },
        {
          "name": "Get a class",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/schedule/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "schedule",
                "{id}"
              ],
              "query": [
                {
                  "key": "expand",
                  "value": "",
                  "description": "Comma list; supports `participants`",
                  "disabled": true
                }
              ]
            },
            "description": "Requires scope `schedule:read`."
          }
        },
        {
          "name": "Book a member into a class",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/schedule/{id}/bookings",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "schedule",
                "{id}",
                "bookings"
              ],
              "query": []
            },
            "description": "Runs the app's full registration engine: capacity, product validity, entry caps, archive guard and locks all apply. 409 `meeting_full` when the class is full. Requires scope `bookings:book`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Cancel a member's booking",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/schedule/{id}/bookings/{member_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "schedule",
                "{id}",
                "bookings",
                "{member_id}"
              ],
              "query": []
            },
            "description": "Cancels a registration or waitlist entry. Fixed-slot registrations are app-only. Requires scope `bookings:cancel`."
          }
        },
        {
          "name": "Join a class waiting list",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/schedule/{id}/waitlist",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "schedule",
                "{id}",
                "waitlist"
              ],
              "query": []
            },
            "description": "Requires scope `bookings:waitlist`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List staff members",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/staff",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "staff"
              ],
              "query": []
            },
            "description": "Requires scope `schedule:read`."
          }
        },
        {
          "name": "List locations",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/locations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "locations"
              ],
              "query": []
            },
            "description": "Requires scope `schedule:read`."
          }
        },
        {
          "name": "List class categories",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/categories",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "categories"
              ],
              "query": []
            },
            "description": "Requires scope `schedule:read`."
          }
        }
      ]
    },
    {
      "name": "Reports",
      "item": [
        {
          "name": "Run a named report",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/reports/{name}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "reports",
                "{name}"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "Window start (windowed reports; default 30 days back)",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Window end",
                  "disabled": true
                },
                {
                  "key": "month",
                  "value": "",
                  "description": "birthdays report only",
                  "disabled": true
                }
              ]
            },
            "description": "Results are cached for 10 minutes. Requires scope `reports:read`."
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "List webhook subscriptions",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ],
              "query": []
            },
            "description": "Requires scope `webhooks:manage`."
          }
        },
        {
          "name": "Create a webhook subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ],
              "query": []
            },
            "description": "The signing `secret` (whsec_...) is returned ONCE in this response. Verify deliveries with `X-FeatShare-Signature: t=<unix>,v1=HMAC_SHA256(secret, t + '.' + rawBody)`. Retries: 1m/5m/30m/2h/12h; 20 consecutive failures auto-disable the subscription. Requires scope `webhooks:manage`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "Delete a webhook subscription",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/webhooks/{id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{id}"
              ],
              "query": []
            },
            "description": "Requires scope `webhooks:manage`."
          }
        },
        {
          "name": "Send a test ping",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/webhooks/{id}/test",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{id}",
                "test"
              ],
              "query": []
            },
            "description": "Queues a `ping` event through the production delivery path (same signature). Requires scope `webhooks:manage`. Send an `Idempotency-Key` header to make retries safe.",
            "body": {
              "mode": "raw",
              "raw": "{}"
            }
          }
        },
        {
          "name": "List recent delivery attempts",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{api_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/webhooks/{id}/deliveries",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{id}",
                "deliveries"
              ],
              "query": []
            },
            "description": "Requires scope `webhooks:manage`."
          }
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://web.featshare.com"
    },
    {
      "key": "api_key",
      "value": "fs_live_..."
    }
  ]
}