openapi: 3.0.3 info: title: 'LoopSpark API' description: 'LoopSpark Public API' version: 1.0.0 servers: - url: 'https://loopspark.com' tags: - name: Authorization description: "To authorize your requests, you need to pass a `token` in the request header `Authorization`.\n \nExample: `Authorization: Bearer YourToken`" - name: 'Integrations - MindBODY' description: '' - name: Automation description: 'All the Endpoints regarding Automations of your franchise' - name: Staff description: 'All the Endpoints regarding Staff members of your franchise' - name: Prospect description: 'All the Endpoints regarding the prospects of a specific studio.' - name: 'Unsubscribe Rules' description: "All the Endpoints regarding the unsubscribe rules of a specific studio.\nThis feature allows you to tell LoopSpark that when we see a client or prospect with the specified `UniqueID`,\nLoopSpark should consider them (un)subscribed on SMS and/or Email. Prospects' `UniqueID` can be retrieved from the \"Prospect list\"\n endpoint, using the returned `id` of the prospect" - name: Groups description: "\nAll the Endpoints regarding the groups and the Staff assigned to them." - name: Studio description: 'All the Endpoints regarding the studios belonging to your franchise.' - name: Forms description: "\nAll the Endpoints regarding the groups and the Staff assigned to them." - name: Client description: 'All the Endpoints regarding the clients of a specific studio.' - name: Contacts description: 'Endpoints related to managing studio contacts, encompassing both clients and prospects. A contact is a unified entity designed to facilitate seamless viewing and management of both clients and prospects within a single list. This makes it easier to find clients or prospects in the system with just one call.' - name: 'Custom Fields' description: 'Franchise API endpoints for managing custom field definitions and client values.' - name: 'Deferred Tags' description: "All the Endpoints regarding the deferred tags of a specific studio.\nThis feature allows you to tell LoopSpark that when we see a client or prospect with the specified `UniqueID`,\nLoopSpark should automatically add a Tag and attach it them. Prospects' `UniqueID` can be retrieved from the \"Prospect list\"\n endpoint, using the returned `id` of the prospect" - name: 'Note Categories' description: "\nThe studio's note categories, used to file a note created on a Client, Prospect or Contact." - name: Search description: "\nThis endpoint allows franchise owners to search and list contacts (clients or prospects) across all studios\nwithin their franchise. It provides filtering by email, mobile phone, tags, and specific studio site IDs,\nas well as sorting and pagination capabilities. This is useful for managing contacts across multiple locations\nand finding duplicates or shared contacts between studios." components: securitySchemes: default: type: http scheme: bearer description: 'To obtain a token, please contact our support at support@loopspark.com.' security: - default: [] paths: /api/franchise/v1/me: get: summary: 'Retrieving your franchise' operationId: retrievingYourFranchise description: "This endpoint should be used to make sure that the your authorization token is valid.\nIt will return an object with the name of the franchise." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: name: 'Your franchise name' meta: success: true properties: data: type: object properties: name: type: string example: 'Your franchise name' meta: type: object properties: success: type: boolean example: true 403: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Authorization '/api/franchise/v1/{siteId}/integrations/mbo/authorization-link': get: summary: 'Get the authorization link from MINDBODY.' operationId: getTheAuthorizationLinkFromMINDBODY description: 'This is the first step required in order to activate a SiteID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: authorization_link: 'https://....' properties: authorization_link: type: string example: 'https://....' 406: description: 'Studio already integrated' content: text/plain: schema: type: string example: "{\n \"error\" : TRUE,\n \"message\" : \"The SiteID is already integrated\"\n}" tags: - 'Integrations - MindBODY' parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/integrations/mbo/authorization-completed': post: summary: 'Confirm that the authorization is completed' operationId: confirmThatTheAuthorizationIsCompleted description: "This is the second and final step to activate a SiteID. After the authorization link is created (using GET authorization-link),\nproceed to activate the SiteID on MINDBODY. Once it's active, confirm it to LoopSpark by using this POST request.\nThe SiteID needs to have Locations already available on MINDBODY (beside the \"Online Store\")" parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n \"ok\" : TRUE\n}" tags: - 'Integrations - MindBODY' parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string /api/franchise/v1/automations: get: summary: 'Automations list' operationId: automationsList description: 'Retrieve a list of all the Automations available. The results are paginated' parameters: - in: query name: replicas_of_id description: 'Only show replica Automations of a specific Automation ID in the list. Default: `null`.' example: 123.0 required: false schema: type: number description: 'Only show replica Automations of a specific Automation ID in the list. Default: `null`.' example: 123.0 - in: query name: include_paused description: 'Include paused/inactive Automations in the list. Default: `false`.' example: true required: false schema: type: boolean description: 'Include paused/inactive Automations in the list. Default: `false`.' example: true - in: query name: include_archived description: 'Include archived Automations in the list. Default: `false`.' example: true required: false schema: type: boolean description: 'Include archived Automations in the list. Default: `false`.' example: true - in: query name: only_primaries description: 'Only show primary Automations in the list. Default: `false`.' example: true required: false schema: type: boolean description: 'Only show primary Automations in the list. Default: `false`.' example: true - in: query name: per_page description: 'The amount of automations to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of automations to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: only_type description: 'Only show Automations using a specific medium. Values are `EMAIL`,`SMS`,`TAG` or `TODO`. Default: `null`.' example: SMS required: false schema: type: string description: 'Only show Automations using a specific medium. Values are `EMAIL`,`SMS`,`TAG` or `TODO`. Default: `null`.' example: SMS enum: - EMAIL - SMS - TODO - TAG - EXPORT - in: query name: sort_by description: 'Sorts the results by either `id`, `name`, `last_ran_at`, or `creation_date`. Default: `id`.' example: id required: false schema: type: string description: 'Sorts the results by either `id`, `name`, `last_ran_at`, or `creation_date`. Default: `id`.' example: id enum: - id - name - creation_date - last_ran_at - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: site_id description: 'Limit the search to a specific SiteID. Default: null.' example: '12345' required: false schema: type: string description: 'Limit the search to a specific SiteID. Default: null.' example: '12345' - in: query name: category description: 'Limit the search to a specific category. Default: null.' example: 'Welcome Sequence' required: false schema: type: string description: 'Limit the search to a specific category. Default: null.' example: 'Welcome Sequence' responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 31 team_id: '6316' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: 'eius et animi' content: "Et fugiat sunt nihil accusantium. Mollitia modi deserunt aut ab provident perspiciatis quo. Nostrum aut adipisci quidem nostrum.\n\nIncidunt iure odit et et modi ipsum. Omnis autem et consequatur.\n\nEnim non facere tempora ex voluptatem laboriosam praesentium. Adipisci molestias fugit deleniti distinctio eum doloremque id. Libero aliquam veniam corporis dolorem mollitia deleniti." settings: name: architecto category: null delivery_type: SMS one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'sint aut molestiae' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: [] add: 1 todo: overdue_hours: 0 postponed_hours: null priority: LOW tags: [] stats: bounced: 0 clicked: 0 delivered: 0 opened: 0 sent: 0 unsubscribe_clicked: 0 - id: 32 team_id: '8222' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: 'suscipit doloribus fugiat' content: "Deserunt et error neque recusandae et. Dolorem et ut dicta. Assumenda consequatur ut et sunt quisquam. Repellendus ut eaque alias ratione dolores.\n\nEa ut aut deserunt sint quis. Quod id aspernatur consectetur id a consectetur assumenda. Neque sit sunt nihil accusantium odit ut perspiciatis.\n\nAut quis ut dolores omnis et earum. Asperiores est vel id aut officiis eos. Et qui unde et." settings: name: sunt category: null delivery_type: SMS one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'sed quasi et' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: [] add: 1 todo: overdue_hours: 0 postponed_hours: null priority: LOW tags: [] stats: bounced: 0 clicked: 0 delivered: 0 opened: 0 sent: 0 unsubscribe_clicked: 0 properties: data: type: array example: - id: 31 team_id: '6316' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: 'eius et animi' content: "Et fugiat sunt nihil accusantium. Mollitia modi deserunt aut ab provident perspiciatis quo. Nostrum aut adipisci quidem nostrum.\n\nIncidunt iure odit et et modi ipsum. Omnis autem et consequatur.\n\nEnim non facere tempora ex voluptatem laboriosam praesentium. Adipisci molestias fugit deleniti distinctio eum doloremque id. Libero aliquam veniam corporis dolorem mollitia deleniti." settings: name: architecto category: null delivery_type: SMS one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'sint aut molestiae' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: [] add: 1 todo: overdue_hours: 0 postponed_hours: null priority: LOW tags: [] stats: bounced: 0 clicked: 0 delivered: 0 opened: 0 sent: 0 unsubscribe_clicked: 0 - id: 32 team_id: '8222' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: 'suscipit doloribus fugiat' content: "Deserunt et error neque recusandae et. Dolorem et ut dicta. Assumenda consequatur ut et sunt quisquam. Repellendus ut eaque alias ratione dolores.\n\nEa ut aut deserunt sint quis. Quod id aspernatur consectetur id a consectetur assumenda. Neque sit sunt nihil accusantium odit ut perspiciatis.\n\nAut quis ut dolores omnis et earum. Asperiores est vel id aut officiis eos. Et qui unde et." settings: name: sunt category: null delivery_type: SMS one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'sed quasi et' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: [] add: 1 todo: overdue_hours: 0 postponed_hours: null priority: LOW tags: [] stats: bounced: 0 clicked: 0 delivered: 0 opened: 0 sent: 0 unsubscribe_clicked: 0 items: type: object properties: id: type: integer example: 31 team_id: type: string example: '6316' nullable: true active: type: boolean example: false archived: type: boolean example: false disabled: type: boolean example: false is_primary: type: boolean example: false replica_of: type: string example: null nullable: true message: type: object properties: subject: type: string example: 'eius et animi' nullable: true content: type: string example: "Et fugiat sunt nihil accusantium. Mollitia modi deserunt aut ab provident perspiciatis quo. Nostrum aut adipisci quidem nostrum.\n\nIncidunt iure odit et et modi ipsum. Omnis autem et consequatur.\n\nEnim non facere tempora ex voluptatem laboriosam praesentium. Adipisci molestias fugit deleniti distinctio eum doloremque id. Libero aliquam veniam corporis dolorem mollitia deleniti." nullable: true settings: type: object properties: name: type: string example: architecto category: type: string example: null nullable: true delivery_type: type: string example: SMS one_off: type: boolean example: false send_window: type: object properties: immediate: type: boolean example: true start_mins: type: string example: null nullable: true end_mins: type: string example: null nullable: true start_at: type: string example: null nullable: true audience: type: string example: 'sint aut molestiae' nullable: true created_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true updated_at: type: string example: '2026-10-03T08:00:35+00:00' last_ran_at: type: string example: null nullable: true tags: type: object properties: tags: type: array example: [] nullable: true add: type: integer example: 1 todo: type: object properties: overdue_hours: type: integer example: 0 postponed_hours: type: string example: null nullable: true priority: type: string example: LOW tags: type: array example: [] nullable: true stats: type: object properties: bounced: type: integer example: 0 clicked: type: integer example: 0 delivered: type: integer example: 0 opened: type: integer example: 0 sent: type: integer example: 0 unsubscribe_clicked: type: integer example: 0 tags: - Automation '/api/franchise/v1/automations/{id}': get: summary: 'Single Automation' operationId: singleAutomation description: 'Show a single Automation by ID' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 33 team_id: '2131' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: 'adipisci quidem nostrum' content: "Incidunt iure odit et et modi ipsum. Omnis autem et consequatur.\n\nEnim non facere tempora ex voluptatem laboriosam praesentium. Adipisci molestias fugit deleniti distinctio eum doloremque id. Libero aliquam veniam corporis dolorem mollitia deleniti.\n\nQuia officia est dignissimos neque. Odio veritatis excepturi doloribus delectus fugit qui repudiandae. Est alias tenetur ratione. Voluptate accusamus ut et recusandae." settings: name: aut category: null delivery_type: TODO one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'eaque alias ratione' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: [] add: 1 todo: overdue_hours: 0 postponed_hours: null priority: LOW tags: [] stats: completed: 0 created: 0 deleted: 0 open: 0 postponed: 0 properties: data: type: object properties: id: type: integer example: 33 team_id: type: string example: '2131' nullable: true active: type: boolean example: false archived: type: boolean example: false disabled: type: boolean example: false is_primary: type: boolean example: false replica_of: type: string example: null nullable: true message: type: object properties: subject: type: string example: 'adipisci quidem nostrum' nullable: true content: type: string example: "Incidunt iure odit et et modi ipsum. Omnis autem et consequatur.\n\nEnim non facere tempora ex voluptatem laboriosam praesentium. Adipisci molestias fugit deleniti distinctio eum doloremque id. Libero aliquam veniam corporis dolorem mollitia deleniti.\n\nQuia officia est dignissimos neque. Odio veritatis excepturi doloribus delectus fugit qui repudiandae. Est alias tenetur ratione. Voluptate accusamus ut et recusandae." nullable: true settings: type: object properties: name: type: string example: aut category: type: string example: null nullable: true delivery_type: type: string example: TODO one_off: type: boolean example: false send_window: type: object properties: immediate: type: boolean example: true start_mins: type: string example: null nullable: true end_mins: type: string example: null nullable: true start_at: type: string example: null nullable: true audience: type: string example: 'eaque alias ratione' nullable: true created_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true updated_at: type: string example: '2026-10-03T08:00:35+00:00' last_ran_at: type: string example: null nullable: true tags: type: object properties: tags: type: array example: [] nullable: true add: type: integer example: 1 todo: type: object properties: overdue_hours: type: integer example: 0 postponed_hours: type: string example: null nullable: true priority: type: string example: LOW tags: type: array example: [] nullable: true stats: type: object properties: completed: type: integer example: 0 created: type: integer example: 0 deleted: type: integer example: 0 open: type: integer example: 0 postponed: type: integer example: 0 tags: - Automation put: summary: 'Update an Automation' operationId: updateAnAutomation description: 'Update an Automation by ID' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 34 team_id: '4680' active: false archived: false disabled: false is_primary: false replica_of: null message: subject: null content: null settings: name: et category: null delivery_type: TAG one_off: false send_window: immediate: true start_mins: null end_mins: null start_at: null audience: 'consectetur assumenda eaque' created_at: '2026-10-03T08:00:35+00:00' updated_at: '2026-10-03T08:00:35+00:00' last_ran_at: null tags: tags: - ciao - second add: 1 todo: overdue_hours: 0 postponed_hours: 0 priority: LOW tags: [] stats: created: 0 properties: data: type: object properties: id: type: integer example: 34 team_id: type: string example: '4680' nullable: true active: type: boolean example: false archived: type: boolean example: false disabled: type: boolean example: false is_primary: type: boolean example: false replica_of: type: string example: null nullable: true message: type: object properties: subject: type: string example: null nullable: true content: type: string example: null nullable: true settings: type: object properties: name: type: string example: et category: type: string example: null nullable: true delivery_type: type: string example: TAG one_off: type: boolean example: false send_window: type: object properties: immediate: type: boolean example: true start_mins: type: string example: null nullable: true end_mins: type: string example: null nullable: true start_at: type: string example: null nullable: true audience: type: string example: 'consectetur assumenda eaque' nullable: true created_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true updated_at: type: string example: '2026-10-03T08:00:35+00:00' last_ran_at: type: string example: null nullable: true tags: type: object properties: tags: type: array example: - ciao - second items: type: string nullable: true nullable: true add: type: integer example: 1 todo: type: object properties: overdue_hours: type: integer example: 0 postponed_hours: type: integer example: 0 nullable: true priority: type: string example: LOW tags: type: array example: [] nullable: true stats: type: object properties: created: type: integer example: 0 tags: - Automation requestBody: required: false content: application/json: schema: type: object properties: active: type: boolean description: '' example: true archived: type: boolean description: '' example: true name: type: string description: 'Must be at least 1 character.' example: bngzmiyvdljnikhw category_name: type: string description: 'Must be at least 1 character.' example: aykcmyuwpwlvqwrs parameters: - in: path name: id description: 'The ID of the Automation' example: '123' required: true schema: type: string '/api/franchise/v1/automations/{automation_id}/stats': get: summary: Stats operationId: stats description: 'Get the stats of a single automation' parameters: - in: query name: start_date description: 'The Unix timestamp of the starting date for the stats. Defaults to 7 days ago. Must be a valid date in the format U.' example: '1581418800' required: false schema: type: string description: 'The Unix timestamp of the starting date for the stats. Defaults to 7 days ago. Must be a valid date in the format U.' example: '1581418800' - in: query name: end_date description: 'The Unix timestamp of the ending date for the stats. Defaults to now. Must be a valid date in the format U.' example: '1581678000' required: false schema: type: string description: 'The Unix timestamp of the ending date for the stats. Defaults to now. Must be a valid date in the format U.' example: '1581678000' responses: 200: description: '' content: application/json: schema: oneOf: - description: '' type: object example: data: id: 123 team_id: foobar delivery_type: EMAIL sent: 20 bounced: 1 delivered: 19 opened: 0 clicked: 0 properties: data: type: object properties: id: type: integer example: 123 team_id: type: string example: foobar nullable: true delivery_type: type: string example: EMAIL sent: type: integer example: 20 bounced: type: integer example: 1 delivered: type: integer example: 19 opened: type: integer example: 0 clicked: type: integer example: 0 - description: '' type: object example: data: id: 123 team_id: foobar delivery_type: SMS sent: 20 bounced: 1 delivered: 19 opened: 0 clicked: 0 properties: data: type: object properties: id: type: integer example: 123 team_id: type: string example: foobar nullable: true delivery_type: type: string example: SMS sent: type: integer example: 20 bounced: type: integer example: 1 delivered: type: integer example: 19 opened: type: integer example: 0 clicked: type: integer example: 0 - description: '' type: object example: data: id: 123 team_id: foobar delivery_type: TODO created: 100 completed: 25 open: 40 postponed: 35 deleted: 5 properties: data: type: object properties: id: type: integer example: 123 team_id: type: string example: foobar nullable: true delivery_type: type: string example: TODO created: type: integer example: 100 completed: type: integer example: 25 open: type: integer example: 40 postponed: type: integer example: 35 deleted: type: integer example: 5 - description: '' type: object example: data: id: 123 team_id: foobar delivery_type: TAG created: 100 properties: data: type: object properties: id: type: integer example: 123 team_id: type: string example: foobar nullable: true delivery_type: type: string example: TAG created: type: integer example: 100 tags: - Automation parameters: - in: path name: automation_id description: 'The ID of the Automation' example: '123' required: true schema: type: string '/api/franchise/v1/automations/{automation_id}/actions/{client_id}': get: summary: 'Action history' operationId: actionHistory description: 'Show the most recent actions performed by an automation for a specific client.' parameters: - in: query name: start_date description: 'The Unix timestamp of the starting date for the stats. Defaults to 7 days ago. Must be a valid date in the format U.' example: '1581418800' required: false schema: type: string description: 'The Unix timestamp of the starting date for the stats. Defaults to 7 days ago. Must be a valid date in the format U.' example: '1581418800' - in: query name: end_date description: 'The Unix timestamp of the ending date for the stats. Defaults to now. Must be a valid date in the format U.' example: '1581678000' required: false schema: type: string description: 'The Unix timestamp of the ending date for the stats. Defaults to now. Must be a valid date in the format U.' example: '1581678000' responses: 200: description: '' content: application/json: schema: type: object example: data: - type: EMAIL action: delivery_type: EMAIL sent: false bounced: false delivered: false opened: false clicked: false last_contacted_at: '2026-10-03T08:00:35+00:00' closed: false - type: EMAIL action: delivery_type: EMAIL sent: false bounced: false delivered: false opened: false clicked: false last_contacted_at: '2026-10-03T08:00:35+00:00' closed: false properties: data: type: array example: - type: EMAIL action: delivery_type: EMAIL sent: false bounced: false delivered: false opened: false clicked: false last_contacted_at: '2026-10-03T08:00:35+00:00' closed: false - type: EMAIL action: delivery_type: EMAIL sent: false bounced: false delivered: false opened: false clicked: false last_contacted_at: '2026-10-03T08:00:35+00:00' closed: false items: type: object properties: type: type: string example: EMAIL action: type: object properties: delivery_type: type: string example: EMAIL sent: type: boolean example: false bounced: type: boolean example: false delivered: type: boolean example: false opened: type: boolean example: false clicked: type: boolean example: false last_contacted_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true closed: type: boolean example: false tags: - Automation parameters: - in: path name: automation_id description: 'The ID of the Automation' example: '123' required: true schema: type: string - in: path name: client_id description: 'The ID of the Client' example: '12345' required: true schema: type: string /api/franchise/v1/staff: get: summary: 'Staff list' operationId: staffList description: "Retrieve a list of all the staff members available. Staff members can either be already assigned to\na Studio, or they can be the ones created via API. The results are paginated" parameters: - in: query name: per_page description: 'The amount of staff to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of staff to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: sort_by description: 'Sorts the results by either `email`, `name`, or `creation_date`. Default: `email`.' example: email required: false schema: type: string description: 'Sorts the results by either `email`, `name`, or `creation_date`. Default: `email`.' example: email enum: - email - name - creation_date - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: site_id description: 'Limit the search to a specific SiteID. Default: null.' example: '12345' required: false schema: type: string description: 'Limit the search to a specific SiteID. Default: null.' example: '12345' responses: 200: description: '' content: application/json: schema: type: object example: data: - name: 'Ms. Audra Crooks II' email: gulgowski.asia@example.com phone: null - name: 'Jermaine Tillman' email: mya96@example.com phone: null properties: data: type: array example: - name: 'Ms. Audra Crooks II' email: gulgowski.asia@example.com phone: null - name: 'Jermaine Tillman' email: mya96@example.com phone: null items: type: object properties: name: type: string example: 'Ms. Audra Crooks II' email: type: string example: gulgowski.asia@example.com nullable: true phone: type: string example: null nullable: true tags: - Staff post: summary: 'Create a Staff' operationId: createAStaff description: 'Create a new staff member' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: name: 'Ms. Elisabeth Okuneva' email: idickens@example.org phone: null studios: [] properties: data: type: object properties: name: type: string example: 'Ms. Elisabeth Okuneva' email: type: string example: idickens@example.org nullable: true phone: type: string example: null nullable: true studios: type: array example: [] tags: - Staff requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: gbailey@example.net name: type: string description: 'Must be at least 0 characters.' example: miyvdljnikhwaykcmyuwpwlvqwr phone: type: string description: '' example: architecto required: - email - name '/api/franchise/v1/staff/{email}': get: summary: 'Get Staff detail' operationId: getStaffDetail description: 'Shows the details of a specific Staff member, including all the Studios they are part of and their role' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: name: 'Morgan Hirthe' email: dare.emelie@example.com phone: null studios: [] properties: data: type: object properties: name: type: string example: 'Morgan Hirthe' email: type: string example: dare.emelie@example.com nullable: true phone: type: string example: null nullable: true studios: type: array example: [] tags: - Staff delete: summary: 'Detach a Staff' operationId: detachAStaff description: 'Detach a staff member from every Studio' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: name: 'Morgan Hirthe' email: imclaughlin@example.org phone: null studios: [] properties: data: type: object properties: name: type: string example: 'Morgan Hirthe' email: type: string example: imclaughlin@example.org nullable: true phone: type: string example: null nullable: true studios: type: array example: [] tags: - Staff parameters: - in: path name: email description: 'The email of the Staff member' example: foo@bar.com required: true schema: type: string '/api/franchise/v1/{siteId}/staff': post: summary: 'Add a Staff to a Studio' operationId: addAStaffToAStudio description: 'Add a Staff member to a specific Studio, with a defined role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: foobar name: 'My Yoga Studio' phone_number: '12225551234' api_set: true website: 'https://mystudioisgreat.com/landing' timezone: UTC start_date: '2020-09-30' creation_date: '2018-02-22T13:00:00+00:00' first_import_done: true outgoing_settings: email: signature: et sender: umonahan@hotmail.com sender_name: 'Prof. Nels Quitzon' phone: sender_name: '16273854741' phone_forward: '12125558888' address: '4800 Oak Grove Dr, Pasadena, CA 91109' social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' variables: packages: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null staff: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner groups: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] properties: data: type: object properties: id: type: string example: foobar name: type: string example: 'My Yoga Studio' phone_number: type: string example: '12225551234' nullable: true api_set: type: boolean example: true website: type: string example: 'https://mystudioisgreat.com/landing' nullable: true timezone: type: string example: UTC start_date: type: string example: '2020-09-30' nullable: true creation_date: type: string example: '2018-02-22T13:00:00+00:00' nullable: true first_import_done: type: boolean example: true outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: et nullable: true sender: type: string example: umonahan@hotmail.com nullable: true sender_name: type: string example: 'Prof. Nels Quitzon' nullable: true phone: type: object properties: sender_name: type: string example: '16273854741' nullable: true phone_forward: type: string example: '12125558888' nullable: true address: type: string example: '4800 Oak Grove Dr, Pasadena, CA 91109' nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true price: type: string example: $10 nullable: true name: type: string example: 'Great Package' nullable: true discount_code: type: string example: CouponName nullable: true discount_price: type: string example: '20 dollars' nullable: true contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: type: string example: null nullable: true price: type: string example: null nullable: true name: type: string example: null nullable: true discount_code: type: string example: null nullable: true discount_price: type: string example: null nullable: true staff: type: array example: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner items: type: object properties: name: type: string example: 'Krystal Harvey' email: type: string example: alexandrea87@example.com role: type: string example: owner groups: type: array example: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] items: type: object properties: id: type: integer example: 1 name: type: string example: front-desk staff: type: array example: - name: 'Katarina Funk' email: john42@example.com phone: null items: type: object properties: name: type: string example: 'Katarina Funk' email: type: string example: john42@example.com phone: type: string example: null nullable: true tags: - Staff requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: gbailey@example.net role: type: string description: '' example: owner enum: - member - owner - admin - manager required: - email - role parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/staff/{email}': put: summary: 'Change the Staff role' operationId: changeTheStaffRole description: "Change the role of a Staff member of a specific Studio. If the Staff member is not currently\npart of the Studio, it will be added to it." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: foobar name: 'My Yoga Studio' phone_number: '12225551234' api_set: true website: 'https://mystudioisgreat.com/landing' timezone: UTC start_date: '2020-09-30' creation_date: '2018-02-22T13:00:00+00:00' first_import_done: true outgoing_settings: email: signature: et sender: umonahan@hotmail.com sender_name: 'Prof. Nels Quitzon' phone: sender_name: '16273854741' phone_forward: '12125558888' address: '4800 Oak Grove Dr, Pasadena, CA 91109' social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' variables: packages: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null staff: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner groups: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] properties: data: type: object properties: id: type: string example: foobar name: type: string example: 'My Yoga Studio' phone_number: type: string example: '12225551234' nullable: true api_set: type: boolean example: true website: type: string example: 'https://mystudioisgreat.com/landing' nullable: true timezone: type: string example: UTC start_date: type: string example: '2020-09-30' nullable: true creation_date: type: string example: '2018-02-22T13:00:00+00:00' nullable: true first_import_done: type: boolean example: true outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: et nullable: true sender: type: string example: umonahan@hotmail.com nullable: true sender_name: type: string example: 'Prof. Nels Quitzon' nullable: true phone: type: object properties: sender_name: type: string example: '16273854741' nullable: true phone_forward: type: string example: '12125558888' nullable: true address: type: string example: '4800 Oak Grove Dr, Pasadena, CA 91109' nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true price: type: string example: $10 nullable: true name: type: string example: 'Great Package' nullable: true discount_code: type: string example: CouponName nullable: true discount_price: type: string example: '20 dollars' nullable: true contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: type: string example: null nullable: true price: type: string example: null nullable: true name: type: string example: null nullable: true discount_code: type: string example: null nullable: true discount_price: type: string example: null nullable: true staff: type: array example: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner items: type: object properties: name: type: string example: 'Krystal Harvey' email: type: string example: alexandrea87@example.com role: type: string example: owner groups: type: array example: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] items: type: object properties: id: type: integer example: 1 name: type: string example: front-desk staff: type: array example: - name: 'Katarina Funk' email: john42@example.com phone: null items: type: object properties: name: type: string example: 'Katarina Funk' email: type: string example: john42@example.com phone: type: string example: null nullable: true tags: - Staff requestBody: required: true content: application/json: schema: type: object properties: role: type: string description: '' example: manager enum: - member - owner - admin - manager required: - role delete: summary: 'Detach a Staff from a Studio' operationId: detachAStaffFromAStudio description: 'Removes a Staff member from a Studio' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: foobar name: 'My Yoga Studio' phone_number: '12225551234' api_set: true website: 'https://mystudioisgreat.com/landing' timezone: UTC start_date: '2020-09-30' creation_date: '2018-02-22T13:00:00+00:00' first_import_done: true outgoing_settings: email: signature: et sender: umonahan@hotmail.com sender_name: 'Prof. Nels Quitzon' phone: sender_name: '16273854741' phone_forward: '12125558888' address: '4800 Oak Grove Dr, Pasadena, CA 91109' social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' variables: packages: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null staff: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner groups: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] properties: data: type: object properties: id: type: string example: foobar name: type: string example: 'My Yoga Studio' phone_number: type: string example: '12225551234' nullable: true api_set: type: boolean example: true website: type: string example: 'https://mystudioisgreat.com/landing' nullable: true timezone: type: string example: UTC start_date: type: string example: '2020-09-30' nullable: true creation_date: type: string example: '2018-02-22T13:00:00+00:00' nullable: true first_import_done: type: boolean example: true outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: et nullable: true sender: type: string example: umonahan@hotmail.com nullable: true sender_name: type: string example: 'Prof. Nels Quitzon' nullable: true phone: type: object properties: sender_name: type: string example: '16273854741' nullable: true phone_forward: type: string example: '12125558888' nullable: true address: type: string example: '4800 Oak Grove Dr, Pasadena, CA 91109' nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true price: type: string example: $10 nullable: true name: type: string example: 'Great Package' nullable: true discount_code: type: string example: CouponName nullable: true discount_price: type: string example: '20 dollars' nullable: true contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: type: string example: null nullable: true price: type: string example: null nullable: true name: type: string example: null nullable: true discount_code: type: string example: null nullable: true discount_price: type: string example: null nullable: true staff: type: array example: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner items: type: object properties: name: type: string example: 'Krystal Harvey' email: type: string example: alexandrea87@example.com role: type: string example: owner groups: type: array example: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] items: type: object properties: id: type: integer example: 1 name: type: string example: front-desk staff: type: array example: - name: 'Katarina Funk' email: john42@example.com phone: null items: type: object properties: name: type: string example: 'Katarina Funk' email: type: string example: john42@example.com phone: type: string example: null nullable: true tags: - Staff parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: email description: 'The email of the Staff member' example: foo@bar.com required: true schema: type: string '/api/franchise/v1/{siteId}/prospects': get: summary: 'Prospect list' operationId: prospectList description: 'Retrieve a list of the prospects for a specific Studio. The results are paginated' parameters: - in: query name: per_page description: 'The amount of prospects to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of prospects to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: page description: 'The page number. Must be at least 1.' example: 1.0 required: false schema: type: number description: 'The page number. Must be at least 1.' example: 1.0 - in: query name: sort_by description: 'Sorts the results by either `email` or `creation_date`. Default: `email`.' example: id required: false schema: type: string description: 'Sorts the results by either `email` or `creation_date`. Default: `email`.' example: id enum: - creation_date - email - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: email description: 'Return only prospects with the selected email. Empty for all prospects . Must be a valid email address.' example: '' required: false schema: type: string description: 'Return only prospects with the selected email. Empty for all prospects . Must be a valid email address.' example: '' - in: query name: mobile_phone description: 'Return only prospects with the selected phone number. Phone format is 12223334444.' example: '' required: false schema: type: string description: 'Return only prospects with the selected phone number. Phone format is 12223334444.' example: '' - in: query name: opted_out_emails description: '`true` will return prospects opted out from email communications. `false` will show prospects that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return prospects opted out from email communications. `false` will show prospects that have not opted out. Do not pass the filter to show all.' example: true - in: query name: opted_out_sms description: '`true` will return prospects opted out from SMS communications. `false` will show prospects that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return prospects opted out from SMS communications. `false` will show prospects that have not opted out. Do not pass the filter to show all.' example: true - in: query name: tags description: 'Filter prospects by assigned tag(s). Array.' example: - signed-up required: false schema: type: array description: 'Filter prospects by assigned tag(s). Array.' example: - signed-up items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: lead-rosario67@hotmail.com profile_url: 'https://loopspark.com/go/client/117/lead-rosario67@hotmail.com' email: rosario67@hotmail.com first_name: Kayden last_name: Robel mobile_phone: '13572103900' creation_date: '2021-02-03T11:32:02+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true - id: lead-bryana.conn@hotmail.com profile_url: 'https://loopspark.com/go/client/3553/lead-bryana.conn@hotmail.com' email: bryana.conn@hotmail.com first_name: Grover last_name: Oberbrunner mobile_phone: '13577302692' creation_date: '1971-12-10T19:07:33+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true properties: data: type: array example: - id: lead-rosario67@hotmail.com profile_url: 'https://loopspark.com/go/client/117/lead-rosario67@hotmail.com' email: rosario67@hotmail.com first_name: Kayden last_name: Robel mobile_phone: '13572103900' creation_date: '2021-02-03T11:32:02+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true - id: lead-bryana.conn@hotmail.com profile_url: 'https://loopspark.com/go/client/3553/lead-bryana.conn@hotmail.com' email: bryana.conn@hotmail.com first_name: Grover last_name: Oberbrunner mobile_phone: '13577302692' creation_date: '1971-12-10T19:07:33+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true items: type: object properties: id: type: string example: lead-rosario67@hotmail.com profile_url: type: string example: 'https://loopspark.com/go/client/117/lead-rosario67@hotmail.com' email: type: string example: rosario67@hotmail.com nullable: true first_name: type: string example: Kayden nullable: true last_name: type: string example: Robel nullable: true mobile_phone: type: string example: '13572103900' nullable: true creation_date: type: string example: '2021-02-03T11:32:02+00:00' nullable: true referred_by: type: string example: null nullable: true referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true tags: - Prospect post: summary: 'Add a Prospect' operationId: addAProspect description: 'Adds a Prospect to the specified Studio.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: lead-info@loopspark.com email: info@loopspark.com first_name: Luca last_name: Critelli mobile_phone: null creation_date: '2020-01-29T11:55:09+00:00' tags: - name: signed-up assigned_at: '2020-01-29T11:55:09+00:00' - name: awesome-client assigned_at: '2020-01-29T11:55:09+00:00' properties: data: type: object properties: id: type: string example: lead-info@loopspark.com email: type: string example: info@loopspark.com nullable: true first_name: type: string example: Luca nullable: true last_name: type: string example: Critelli nullable: true mobile_phone: type: string example: null nullable: true creation_date: type: string example: '2020-01-29T11:55:09+00:00' nullable: true tags: type: array example: - name: signed-up assigned_at: '2020-01-29T11:55:09+00:00' - name: awesome-client assigned_at: '2020-01-29T11:55:09+00:00' items: type: object properties: name: type: string example: signed-up assigned_at: type: string example: '2020-01-29T11:55:09+00:00' nullable: true 400: description: '' content: application/json: schema: type: object example: error: true message: 'The Prospect already exists' properties: error: type: boolean example: true message: type: string example: 'The Prospect already exists' tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: gbailey@example.net mobile_phone: type: string description: '' example: null first_name: type: string description: 'Must be at least 0 characters.' example: miyvdljnikhwaykcmyuwpwlvqwr last_name: type: string description: 'Must be at least 0 characters.' example: sitcpscqldzsnrwtujwvlxjklqp referred_by: type: string description: '' example: architecto nullable: true tags: type: array description: 'Must be at least 1 character.' example: - ngzmiyvdljnikhwa items: type: string referrer: type: object description: '' example: null properties: first_name: type: string description: '' example: architecto nullable: true last_name: type: string description: '' example: architecto nullable: true email: type: string description: 'Must be a valid email address.' example: zbailey@example.net nullable: true phone: type: string description: '' example: architecto nullable: true location: type: string description: '' example: architecto nullable: true required: - email parameters: - in: path name: siteId description: 'The ID of the Studio' example: '123' required: true schema: type: string '/api/franchise/v1/{siteId}/prospects/{email}': get: summary: 'Get a prospect' operationId: getAProspect description: 'Returns the information about a specific prospect' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-mhamill@marvin.net profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' creation_date: '1996-08-19T01:34:47+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true properties: data: type: object properties: id: type: string example: lead-mhamill@marvin.net profile_url: type: string example: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: type: string example: mhamill@marvin.net nullable: true first_name: type: string example: Rhett nullable: true last_name: type: string example: Kuhn nullable: true mobile_phone: type: string example: '13573900260' nullable: true creation_date: type: string example: '1996-08-19T01:34:47+00:00' nullable: true referred_by: type: string example: null nullable: true referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true tags: - Prospect put: summary: 'Update a Prospect' operationId: updateAProspect description: 'Updates the information of a Prospect' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-rosario67@hotmail.com profile_url: 'https://loopspark.com/go/client/117/lead-rosario67@hotmail.com' email: rosario67@hotmail.com first_name: Kayden last_name: Robel mobile_phone: '13572103900' creation_date: '2021-02-03T11:32:02+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true properties: data: type: object properties: id: type: string example: lead-rosario67@hotmail.com profile_url: type: string example: 'https://loopspark.com/go/client/117/lead-rosario67@hotmail.com' email: type: string example: rosario67@hotmail.com nullable: true first_name: type: string example: Kayden nullable: true last_name: type: string example: Robel nullable: true mobile_phone: type: string example: '13572103900' nullable: true creation_date: type: string example: '2021-02-03T11:32:02+00:00' nullable: true referred_by: type: string example: null nullable: true referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true 422: description: 'Trying to SMS opt in a prospect that manually opted out' content: application/json: schema: type: object example: error: true message: 'The prospect cannot be opted-in to SMS because they sent the opt-out text' properties: error: type: boolean example: true message: type: string example: 'The prospect cannot be opted-in to SMS because they sent the opt-out text' tags: - Prospect requestBody: required: false content: application/json: schema: type: object properties: subscribed_email: type: boolean description: 'Unsubscribes an entity from email communications if false. Subscribes if true.' example: false subscribed_sms: type: boolean description: 'Unsubscribes an entity from SMS communications if false. Subscribes if true.' example: false period_count: type: number description: 'Manually set the period count for this entity. Must be at least 0.' example: 27 club_count: type: number description: 'Manually set the club count for this entity (requires manual_club_count to be enabled for the studio). Must be at least 0.' example: 5.0 referrer: type: object description: 'Object containing referrer information with optional properties: first_name, last_name, email, phone, location.' example: first_name: John last_name: Doe email: john.doe@example.com phone: 555-123-4567 location: 'New York' properties: first_name: type: string description: '' example: John nullable: true last_name: type: string description: '' example: Doe nullable: true email: type: string description: 'Must be a valid email address.' example: john.doe@example.com nullable: true phone: type: string description: '' example: 555-123-4567 nullable: true location: type: string description: '' example: 'New York' nullable: true parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: email description: 'The prospect email.' example: jack@bauer.com required: true schema: type: string '/api/franchise/v1/{siteId}/prospects/{email}/tags': post: summary: 'Add a Tag' operationId: addATag description: 'Assigns a Tag to a specific Prospect' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-mhamill@marvin.net profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' creation_date: '1996-08-19T01:34:47+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true properties: data: type: object properties: id: type: string example: lead-mhamill@marvin.net profile_url: type: string example: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: type: string example: mhamill@marvin.net nullable: true first_name: type: string example: Rhett nullable: true last_name: type: string example: Kuhn nullable: true mobile_phone: type: string example: '13573900260' nullable: true creation_date: type: string example: '1996-08-19T01:34:47+00:00' nullable: true referred_by: type: string example: null nullable: true referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: Member required: - tag delete: summary: 'Remove a Tag' operationId: removeATag description: "Removes a Tag from a specific Prospect.\nIf the Prospect does not have the Tag assigned, it will return an error `400`" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-mhamill@marvin.net profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' creation_date: '1996-08-19T01:34:47+00:00' referred_by: null referrer: first_name: null last_name: null email: null phone: null location: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true properties: data: type: object properties: id: type: string example: lead-mhamill@marvin.net profile_url: type: string example: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: type: string example: mhamill@marvin.net nullable: true first_name: type: string example: Rhett nullable: true last_name: type: string example: Kuhn nullable: true mobile_phone: type: string example: '13573900260' nullable: true creation_date: type: string example: '1996-08-19T01:34:47+00:00' nullable: true referred_by: type: string example: null nullable: true referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true 400: description: '' content: application/json: schema: type: object example: error: true message: 'The prospect does not have the tag signed-up' properties: error: type: boolean example: true message: type: string example: 'The prospect does not have the tag signed-up' tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: signed-up-flow required: - tag parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: email description: 'The email of the Prospect' example: test@email.com required: true schema: type: string '/api/franchise/v1/{siteId}/prospects/{email}/custom-fields': get: summary: 'Get Prospect Custom Fields' operationId: getProspectCustomFields description: "Retrieve all custom field values for a specific prospect.\nReturns field definition along with current value." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-1234' properties: data: type: array example: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-1234' items: type: object properties: id: type: string example: EMERGENCY_CONTACT value: type: string example: 'Jane Doe - 555-1234' tags: - Prospect post: summary: 'Update Prospect Custom Fields' operationId: updateProspectCustomFields description: "Batch update custom field values for a specific prospect.\nCan update multiple fields in a single request." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-5678' properties: data: type: array example: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-5678' items: type: object properties: id: type: string example: EMERGENCY_CONTACT value: type: string example: 'Jane Doe - 555-5678' tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: fields: type: array description: 'Array of field updates. Must have at least 1 items.' example: - id: EMERGENCY_CONTACT value: 'John Doe - 555-1234' - id: THREE_CS value: challenge items: type: object properties: '*': type: object description: '' example: id: architecto properties: id: type: string description: 'The custom field ID (e.g., "EMERGENCY_CONTACT")' example: architecto value: type: string description: 'nullable The field value' example: architecto required: - id id: type: string description: 'The custom field ID/slug (e.g., "EMERGENCY_CONTACT", "THREE_CS"). Must match an existing stored value.' example: EMERGENCY_CONTACT value: type: string description: 'The value to set. Use null to clear the field. Type depends on field definition (string, boolean, date, etc.).' example: 'John Doe - 555-1234' nullable: true required: - id required: - fields parameters: - in: path name: siteId description: "The studio's site identifier (e.g., MindBody site ID)." example: '100001' required: true schema: type: string - in: path name: email description: "The prospect's email address." example: john.doe@example.com required: true schema: type: string '/api/franchise/v1/{siteId}/prospects/{email}/notes': post: summary: 'Create a Note' operationId: createANote description: "Adds a note to a Prospect, found by email (not case-sensitive), dated now. The note is plain text: HTML is shown as text, and line breaks are kept.\nTo categorize it, send the `id` of one of the studio's active note categories (see \"List Note Categories\").\nEach call creates a new note, so do not retry a request that already succeeded.\nThe note has no staff author; LoopSpark shows its author as \"Integration\"." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: '

Called about the 6-week challenge.

' note_category_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-09-28T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: type: string example: '

Called about the 6-week challenge.

' note_category_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true created_at: type: string example: '2026-09-28T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'The note category is not available for this studio.' errors: note_category_id: - 'The note category is not available for this studio.' properties: message: type: string example: 'The note category is not available for this studio.' errors: type: object properties: note_category_id: type: array example: - 'The note category is not available for this studio.' items: type: string tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: note: type: string description: 'The note text, at least 2 characters. Plain text; line breaks are kept.' example: 'Called about the 6-week challenge.' note_category_id: type: string description: "Optional. The id of one of the studio's active note categories." example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true required: - note parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: email description: 'The prospect email. Not case-sensitive.' example: jack@bauer.com required: true schema: type: string '/api/franchise/v1/{siteId}/prospects/{email}/messages': post: summary: 'Send a Text Message' operationId: sendATextMessage description: "Sends one SMS to a Prospect, found by email (not case-sensitive), from the studio's texting number, in the same conversation thread staff use in LoopSpark.\nPlaceholders are filled in as in LoopSpark: write the name in double curly braces, for example FIRST_NAME. The message can be at most 3 SMS segments long, counted before placeholders are filled in.\nOpt-outs (STOP) and the usual opt-out notice work exactly as for a staff send, and the text counts against the studio's SMS bundle.\nA `201` means the text was queued; delivery happens asynchronously. Each call sends a new text, so do not retry a request that already succeeded.\nThe text has no staff sender; the LoopSpark web app shows its sender as \"Integration\".\nReturns `422` when the person is muted, has opted out of texts, or has no valid mobile number, or when the text is empty once placeholders are filled in.\nReturns `403` when the studio is suspended." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-10-02T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: type: string example: '2026-10-02T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'This client cannot be contacted by text message' errors: message: - 'This client cannot be contacted by text message' properties: message: type: string example: 'This client cannot be contacted by text message' errors: type: object properties: message: type: array example: - 'This client cannot be contacted by text message' items: type: string tags: - Prospect requestBody: required: true content: application/json: schema: type: object properties: message: type: string description: 'The text to send, at most 3 SMS segments before placeholders are filled in. Placeholders (a name such as FIRST_NAME in double curly braces) are filled in.' example: 'Hi there, see you at the 6pm class!' required: - message parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: email description: 'The prospect email. Not case-sensitive.' example: jack@bauer.com required: true schema: type: string '/api/franchise/v1/{siteId}/unsubscribe_clients': post: summary: 'Add (un)subscribe rule' operationId: addunsubscribeRule description: "Add one or multiple (un)subscribe rules for a specific Studio.\nIf an Unsubscribe Rule is already present for the specified client ID, it will be updated." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - client_id: '681' unsubscribe: true type: sms valid_since: '2026-10-03T08:00:36+00:00' - client_id: '369' unsubscribe: true type: sms valid_since: '2026-10-03T08:00:36+00:00' properties: data: type: array example: - client_id: '681' unsubscribe: true type: sms valid_since: '2026-10-03T08:00:36+00:00' - client_id: '369' unsubscribe: true type: sms valid_since: '2026-10-03T08:00:36+00:00' items: type: object properties: client_id: type: string example: '681' unsubscribe: type: boolean example: true type: type: string example: sms valid_since: type: string example: '2026-10-03T08:00:36+00:00' tags: - 'Unsubscribe Rules' requestBody: required: false content: application/json: schema: type: object properties: clients: type: array description: '' example: - [] items: type: object properties: id: type: string description: 'The MBO UniqueID of the client, or the `ID` of a Prospect.' example: '1000017' unsubscribe: type: boolean description: 'Whether or not the client is (or will be) unsubscribed from the specified type.' example: true type: type: string description: 'Describes which type of (un)subscription this rule is about.' example: email enum: - sms - email required: - id - unsubscribe - type parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/unsubscribe_clients/{uniqueid}': delete: summary: 'Remove unsubscribe rule' operationId: removeUnsubscribeRule description: 'Removes any unsubscribe rule for a specific Client' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: error: false deleted: true success: true properties: error: type: boolean example: false deleted: type: boolean example: true success: type: boolean example: true 400: description: '' content: application/json: schema: type: object example: error: true message: 'No rule was found with that unique id and type combination' properties: error: type: boolean example: true message: type: string example: 'No rule was found with that unique id and type combination' tags: - 'Unsubscribe Rules' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Describes which type of (un)subscription to delete.' example: email enum: - sms - email required: - type parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: uniqueid description: 'The MBO UniqueID of the Client, or the `ID` of a Prospect' example: '10000012' required: true schema: type: string '/api/franchise/v1/{siteId}/groups': get: summary: 'List Groups of a Studio' operationId: listGroupsOfAStudio description: 'List the Groups of a Studio and the respective Staff members' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 name: foobar staff: - name: 'Dr. Zane Roberts Sr.' email: foo@current.com phone: null - name: "Kendrick O'Kon" email: stehr.ciara@example.com phone: null - id: 2 name: frontdesk staff: - name: 'Miss Megane Feeney' email: myriam99@example.net phone: null - name: 'Benedict Medhurst' email: cassin.adrianna@example.net phone: null - name: 'Roderick Lebsack' email: gabriella.bogisich@example.net phone: null - name: 'Okey Grady' email: tpagac@example.org phone: null properties: data: type: array example: - id: 1 name: foobar staff: - name: 'Dr. Zane Roberts Sr.' email: foo@current.com phone: null - name: "Kendrick O'Kon" email: stehr.ciara@example.com phone: null - id: 2 name: frontdesk staff: - name: 'Miss Megane Feeney' email: myriam99@example.net phone: null - name: 'Benedict Medhurst' email: cassin.adrianna@example.net phone: null - name: 'Roderick Lebsack' email: gabriella.bogisich@example.net phone: null - name: 'Okey Grady' email: tpagac@example.org phone: null items: type: object properties: id: type: integer example: 1 name: type: string example: foobar staff: type: array example: - name: 'Dr. Zane Roberts Sr.' email: foo@current.com phone: null - name: "Kendrick O'Kon" email: stehr.ciara@example.com phone: null items: type: object properties: name: type: string example: 'Dr. Zane Roberts Sr.' email: type: string example: foo@current.com phone: type: string example: null nullable: true tags: - Groups post: summary: 'Create a Group' operationId: createAGroup description: 'Use this endpoint to create a Group. If the Group is already present, the passed Staff will be added to the Group.' parameters: [] responses: 201: description: 'Successfully created' content: application/json: schema: type: object example: data: id: 14 name: frontdesk staff: - name: 'Jane Doe' email: frontdesk@studio.com phone: null - name: 'Jack Bauer' email: jack@bauer.com phone: null properties: data: type: object properties: id: type: integer example: 14 name: type: string example: frontdesk staff: type: array example: - name: 'Jane Doe' email: frontdesk@studio.com phone: null - name: 'Jack Bauer' email: jack@bauer.com phone: null items: type: object properties: name: type: string example: 'Jane Doe' email: type: string example: frontdesk@studio.com phone: type: string example: null nullable: true 422: description: 'Staff is not part of the Studio' content: application/json: schema: type: object example: message: 'The given data was invalid.' errors: staff.1: - 'Staff member does not exist' properties: message: type: string example: 'The given data was invalid.' errors: type: object properties: staff.1: type: array example: - 'Staff member does not exist' items: type: string tags: - Groups requestBody: required: true content: application/json: schema: type: object properties: group_name: type: string description: 'The name of the Group. Must be at least 3 characters. Must not be greater than 50 characters.' example: frontdesk staff: type: array description: 'Must be a valid email address.' example: - gbailey@example.net items: type: string required: - group_name - staff patch: summary: 'Update Group Members' operationId: updateGroupMembers description: 'Use this endpoint to update the Staff members assigned to a specific Group. This will detach any other Staff from the Group, and assign only the ones specified in the `staff` array' parameters: [] responses: 201: description: 'Successfully updated' content: application/json: schema: type: object example: data: id: 14 name: frontdesk staff: - name: 'Jane Doe' email: frontdesk@studio.com phone: null - name: 'Jack Bauer' email: jack@bauer.com phone: null properties: data: type: object properties: id: type: integer example: 14 name: type: string example: frontdesk staff: type: array example: - name: 'Jane Doe' email: frontdesk@studio.com phone: null - name: 'Jack Bauer' email: jack@bauer.com phone: null items: type: object properties: name: type: string example: 'Jane Doe' email: type: string example: frontdesk@studio.com phone: type: string example: null nullable: true 422: description: 'Staff is not part of the Studio' content: application/json: schema: type: object example: message: 'The given data was invalid.' errors: staff.1: - 'Staff member does not exist' properties: message: type: string example: 'The given data was invalid.' errors: type: object properties: staff.1: type: array example: - 'Staff member does not exist' items: type: string tags: - Groups requestBody: required: true content: application/json: schema: type: object properties: group_name: type: string description: 'The name of the Group. Must be at least 3 characters. Must not be greater than 50 characters.' example: frontdesk staff: type: array description: 'Must be a valid email address.' example: - gbailey@example.net items: type: string required: - group_name - staff parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string /api/franchise/v1/studios: get: summary: 'Studio list' operationId: studioList description: 'Retrieve the list of all the studios available. The results are paginated' parameters: - in: query name: per_page description: 'The amount of studios to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of studios to return. Max: `250`. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: sort_by description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id required: false schema: type: string description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id enum: - creation_date - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc responses: 200: description: '' content: application/json: schema: type: object example: data: - id: '739' name: "Dr. Courtney D'Amore II" api_set: true phone_number: null timezone: UTC website: 'http://www.mosciski.com/dolorem-expedita-vero-natus-laudantium-delectus-sunt-neque' creation_date: '2026-10-03T08:00:35+00:00' start_date: null first_import_done: true is_template: false outgoing_settings: email: signature: alias sender: xokuneva@eichmann.com sender_name: 'Aracely Yost' phone: sender_name: '10912332112' phone_forward: null address: "78972 Floyd Row\nSouth Fayetown, OR 63567-4075" social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=-7' variables: packages: - package_1: url: null price: null name: null discount_code: null discount_price: null - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null period_count: type: ALL_TIME day: 0 manual_club_count: false - id: '5718' name: 'Violet Kub' api_set: true phone_number: null timezone: UTC website: 'http://kozey.com/' creation_date: '2026-10-03T08:00:35+00:00' start_date: null first_import_done: true is_template: false outgoing_settings: email: signature: rerum sender: emarvin@yahoo.com sender_name: 'Gaetano Altenwerth' phone: sender_name: '13506254432' phone_forward: null address: "37248 Wuckert View\nWest Francisco, NC 09772-5660" social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=-7' variables: packages: - package_1: url: null price: null name: null discount_code: null discount_price: null - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null period_count: type: ALL_TIME day: 0 manual_club_count: false properties: data: type: array example: - id: '739' name: "Dr. Courtney D'Amore II" api_set: true phone_number: null timezone: UTC website: 'http://www.mosciski.com/dolorem-expedita-vero-natus-laudantium-delectus-sunt-neque' creation_date: '2026-10-03T08:00:35+00:00' start_date: null first_import_done: true is_template: false outgoing_settings: email: signature: alias sender: xokuneva@eichmann.com sender_name: 'Aracely Yost' phone: sender_name: '10912332112' phone_forward: null address: "78972 Floyd Row\nSouth Fayetown, OR 63567-4075" social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=-7' variables: packages: - package_1: url: null price: null name: null discount_code: null discount_price: null - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null period_count: type: ALL_TIME day: 0 manual_club_count: false - id: '5718' name: 'Violet Kub' api_set: true phone_number: null timezone: UTC website: 'http://kozey.com/' creation_date: '2026-10-03T08:00:35+00:00' start_date: null first_import_done: true is_template: false outgoing_settings: email: signature: rerum sender: emarvin@yahoo.com sender_name: 'Gaetano Altenwerth' phone: sender_name: '13506254432' phone_forward: null address: "37248 Wuckert View\nWest Francisco, NC 09772-5660" social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=5718&stype=-7' variables: packages: - package_1: url: null price: null name: null discount_code: null discount_price: null - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null period_count: type: ALL_TIME day: 0 manual_club_count: false items: type: object properties: id: type: string example: '739' name: type: string example: "Dr. Courtney D'Amore II" api_set: type: boolean example: true phone_number: type: string example: null nullable: true timezone: type: string example: UTC website: type: string example: 'http://www.mosciski.com/dolorem-expedita-vero-natus-laudantium-delectus-sunt-neque' nullable: true creation_date: type: string example: '2026-10-03T08:00:35+00:00' nullable: true start_date: type: string example: null nullable: true first_import_done: type: boolean example: true is_template: type: boolean example: false outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: alias nullable: true sender: type: string example: xokuneva@eichmann.com nullable: true sender_name: type: string example: 'Aracely Yost' nullable: true phone: type: object properties: sender_name: type: string example: '10912332112' nullable: true phone_forward: type: string example: null nullable: true address: type: string example: "78972 Floyd Row\nSouth Fayetown, OR 63567-4075" nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=739&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: null price: null name: null discount_code: null discount_price: null - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: { type: string, example: null, nullable: true } price: { type: string, example: null, nullable: true } name: { type: string, example: null, nullable: true } discount_code: { type: string, example: null, nullable: true } discount_price: { type: string, example: null, nullable: true } contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: { type: string, example: null, nullable: true } price: { type: string, example: null, nullable: true } name: { type: string, example: null, nullable: true } discount_code: { type: string, example: null, nullable: true } discount_price: { type: string, example: null, nullable: true } period_count: type: object properties: type: type: string example: ALL_TIME day: type: integer example: 0 nullable: true manual_club_count: type: boolean example: false tags: - Studio '/api/franchise/v1/studios/{siteId}': get: summary: 'Get a Studio' operationId: getAStudio description: "Shows the details of a specific studio. It shows also a list of the staff members assigned\nto this Studio and their respective role" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: foobar name: 'My Yoga Studio' phone_number: '12225551234' api_set: true website: 'https://mystudioisgreat.com/landing' timezone: UTC start_date: '2020-09-30' creation_date: '2018-02-22T13:00:00+00:00' first_import_done: true outgoing_settings: email: signature: et sender: umonahan@hotmail.com sender_name: 'Prof. Nels Quitzon' phone: sender_name: '16273854741' phone_forward: '12125558888' address: '4800 Oak Grove Dr, Pasadena, CA 91109' social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' variables: packages: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null staff: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner groups: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] properties: data: type: object properties: id: type: string example: foobar name: type: string example: 'My Yoga Studio' phone_number: type: string example: '12225551234' nullable: true api_set: type: boolean example: true website: type: string example: 'https://mystudioisgreat.com/landing' nullable: true timezone: type: string example: UTC start_date: type: string example: '2020-09-30' nullable: true creation_date: type: string example: '2018-02-22T13:00:00+00:00' nullable: true first_import_done: type: boolean example: true outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: et nullable: true sender: type: string example: umonahan@hotmail.com nullable: true sender_name: type: string example: 'Prof. Nels Quitzon' nullable: true phone: type: object properties: sender_name: type: string example: '16273854741' nullable: true phone_forward: type: string example: '12125558888' nullable: true address: type: string example: '4800 Oak Grove Dr, Pasadena, CA 91109' nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true price: type: string example: $10 nullable: true name: type: string example: 'Great Package' nullable: true discount_code: type: string example: CouponName nullable: true discount_price: type: string example: '20 dollars' nullable: true contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: type: string example: null nullable: true price: type: string example: null nullable: true name: type: string example: null nullable: true discount_code: type: string example: null nullable: true discount_price: type: string example: null nullable: true staff: type: array example: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner items: type: object properties: name: type: string example: 'Krystal Harvey' email: type: string example: alexandrea87@example.com role: type: string example: owner groups: type: array example: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] items: type: object properties: id: type: integer example: 1 name: type: string example: front-desk staff: type: array example: - name: 'Katarina Funk' email: john42@example.com phone: null items: type: object properties: name: type: string example: 'Katarina Funk' email: type: string example: john42@example.com phone: type: string example: null nullable: true tags: - Studio put: summary: 'Update a Studio' operationId: updateAStudio description: 'Update a specific studio information' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: foobar name: 'My Yoga Studio' phone_number: '12225551234' api_set: true website: 'https://mystudioisgreat.com/landing' timezone: UTC start_date: '2020-09-30' creation_date: '2018-02-22T13:00:00+00:00' first_import_done: true outgoing_settings: email: signature: et sender: umonahan@hotmail.com sender_name: 'Prof. Nels Quitzon' phone: sender_name: '16273854741' phone_forward: '12125558888' address: '4800 Oak Grove Dr, Pasadena, CA 91109' social: facebook_url: null instagram_handle: null twitter_handle: null urls: list_packages_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' list_contracts_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' book_class_url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' variables: packages: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null contracts: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null staff: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner groups: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] properties: data: type: object properties: id: type: string example: foobar name: type: string example: 'My Yoga Studio' phone_number: type: string example: '12225551234' nullable: true api_set: type: boolean example: true website: type: string example: 'https://mystudioisgreat.com/landing' nullable: true timezone: type: string example: UTC start_date: type: string example: '2020-09-30' nullable: true creation_date: type: string example: '2018-02-22T13:00:00+00:00' nullable: true first_import_done: type: boolean example: true outgoing_settings: type: object properties: email: type: object properties: signature: type: string example: et nullable: true sender: type: string example: umonahan@hotmail.com nullable: true sender_name: type: string example: 'Prof. Nels Quitzon' nullable: true phone: type: object properties: sender_name: type: string example: '16273854741' nullable: true phone_forward: type: string example: '12125558888' nullable: true address: type: string example: '4800 Oak Grove Dr, Pasadena, CA 91109' nullable: true social: type: object properties: facebook_url: type: string example: null nullable: true instagram_handle: type: string example: null nullable: true twitter_handle: type: string example: null nullable: true urls: type: object properties: list_packages_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true list_contracts_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=40' nullable: true book_class_url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=-7' nullable: true variables: type: object properties: packages: type: array example: - package_1: url: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' price: $10 name: 'Great Package' discount_code: CouponName discount_price: '20 dollars' - package_2: url: null price: null name: null discount_code: null discount_price: null - package_3: url: null price: null name: null discount_code: null discount_price: null - package_4: url: null price: null name: null discount_code: null discount_price: null - package_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: package_1: type: object properties: url: type: string example: 'https://clients.mindbodyonline.com/classic/ws?studioid=foobar&stype=41' nullable: true price: type: string example: $10 nullable: true name: type: string example: 'Great Package' nullable: true discount_code: type: string example: CouponName nullable: true discount_price: type: string example: '20 dollars' nullable: true contracts: type: array example: - contract_1: url: null price: null name: null discount_code: null discount_price: null - contract_2: url: null price: null name: null discount_code: null discount_price: null - contract_3: url: null price: null name: null discount_code: null discount_price: null - contract_4: url: null price: null name: null discount_code: null discount_price: null - contract_5: url: null price: null name: null discount_code: null discount_price: null items: type: object properties: contract_1: type: object properties: url: type: string example: null nullable: true price: type: string example: null nullable: true name: type: string example: null nullable: true discount_code: type: string example: null nullable: true discount_price: type: string example: null nullable: true staff: type: array example: - name: 'Krystal Harvey' email: alexandrea87@example.com role: owner items: type: object properties: name: type: string example: 'Krystal Harvey' email: type: string example: alexandrea87@example.com role: type: string example: owner groups: type: array example: - id: 1 name: front-desk staff: - name: 'Katarina Funk' email: john42@example.com phone: null - id: 2 name: teachers staff: [] items: type: object properties: id: type: integer example: 1 name: type: string example: front-desk staff: type: array example: - name: 'Katarina Funk' email: john42@example.com phone: null items: type: object properties: name: type: string example: 'Katarina Funk' email: type: string example: john42@example.com phone: type: string example: null nullable: true tags: - Studio requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Sets the value of name. Must be at least 1 character.' example: bngzmiyvdljnikhw timezone: type: string description: 'Sets the value of timezone. Valid timezones are available at https://www.php.net/manual/en/timezones.php. Must be a valid time zone, such as Africa/Accra.' example: America/Indiana/Tell_City start_date: type: string description: 'Internal date to define when the Studio will open. Used in filters. Must be a valid date.' example: '2020-09-30' nullable: true email_signature: type: string description: 'Sets the value of email_signature. Nullable.' example: architecto nullable: true email_sender: type: string description: 'Sets the value of email_sender. Must be a valid email address.' example: zbailey@example.net email_sender_name: type: string description: 'Sets the value of email_sender_name. Nullable. Must be at least 1 character.' example: iyvdljnikhwaykcm sms_sender: type: string description: 'Sets the value of sms_sender. Must be at least 1 character.' example: yuwpwlvqwrsitcps phone_forward: type: string description: 'Sets the value of phone_forward. Valid phone numbers are using format `15552221234`.' example: '15552221234' facebook_url: type: string description: 'Sets the value of facebook_url. Nullable. Must be a valid URL.' example: 'http://mclaughlin.info/dolores-enim-non-facere-tempora' nullable: true instagram_handle: type: string description: 'Sets the value of instagram_handle, without the @ symbol. Nullable.' example: '@loopspark' nullable: true twitter_handle: type: string description: 'Sets the value of twitter_handle, without the @ symbol. Nullable.' example: '@loopspark' nullable: true list_packages_url: type: string description: 'Sets the value of list_packages_url. Must be a valid URL.' example: 'http://www.leffler.info/quis-adipisci-molestias-fugit-deleniti-distinctio-eum' nullable: true list_contracts_url: type: string description: 'Sets the value of list_contracts_url. Must be a valid URL.' example: 'https://nitzsche.net/aliquam-veniam-corporis-dolorem-mollitia-deleniti-nemo.html' nullable: true book_class_url: type: string description: 'Sets the value of book_class_url. Must be a valid URL.' example: 'https://www.balistreri.org/dignissimos-neque-blanditiis-odio' nullable: true can_create_automations: type: boolean description: 'Allow the Studio members to create automations based on their role.' example: true manual_club_count: type: boolean description: 'When set to true, allows manual updating of club_count for Contacts and Clients.' example: true website: type: string description: 'The website of the Studio. Nullable. Must be a valid URL.' example: 'https://bradtke.org/fugit-qui-repudiandae-laboriosam-est-alias.html' address: type: string description: 'The address of the Studio. It will be used in the merge-tag @{{STUDIO_ADDRESS}}. Nullable.' example: null nullable: true period_count_type: type: string description: 'Sets the period count calculation type. Valid options are ALL_TIME, DAY_OF_YEAR, API.' example: API enum: - ALL_TIME - DAY_OF_YEAR - API period_count_day: type: number description: 'Days since January 1st for the calculation of period count when using DAY_OF_YEAR. January 1st is day 1. This field is required when period_count_type is DAY_OF_YEAR. Must be at least 1. Must not be greater than 365.' example: 1.0 nullable: true package_1_url: type: string description: 'Must be a valid URL.' example: 'http://howe.com/accusamus-ut-et-recusandae.html' nullable: true package_1_price: type: string description: '' example: architecto nullable: true package_1_name: type: string description: '' example: architecto nullable: true package_1_discount_code: type: string description: '' example: architecto nullable: true package_1_discount_price: type: string description: '' example: architecto nullable: true package_2_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true package_2_price: type: string description: '' example: architecto nullable: true package_2_name: type: string description: '' example: architecto nullable: true package_2_discount_code: type: string description: '' example: architecto nullable: true package_2_discount_price: type: string description: '' example: architecto nullable: true package_3_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true package_3_price: type: string description: '' example: architecto nullable: true package_3_name: type: string description: '' example: architecto nullable: true package_3_discount_code: type: string description: '' example: architecto nullable: true package_3_discount_price: type: string description: '' example: architecto nullable: true package_4_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true package_4_price: type: string description: '' example: architecto nullable: true package_4_name: type: string description: '' example: architecto nullable: true package_4_discount_code: type: string description: '' example: architecto nullable: true package_4_discount_price: type: string description: '' example: architecto nullable: true package_5_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true package_5_price: type: string description: '' example: architecto nullable: true package_5_name: type: string description: '' example: architecto nullable: true package_5_discount_code: type: string description: '' example: architecto nullable: true package_5_discount_price: type: string description: '' example: architecto nullable: true contract_1_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true contract_1_price: type: string description: '' example: architecto nullable: true contract_1_name: type: string description: '' example: architecto nullable: true contract_1_discount_code: type: string description: '' example: architecto nullable: true contract_1_discount_price: type: string description: '' example: architecto nullable: true contract_2_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true contract_2_price: type: string description: '' example: architecto nullable: true contract_2_name: type: string description: '' example: architecto nullable: true contract_2_discount_code: type: string description: '' example: architecto nullable: true contract_2_discount_price: type: string description: '' example: architecto nullable: true contract_3_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true contract_3_price: type: string description: '' example: architecto nullable: true contract_3_name: type: string description: '' example: architecto nullable: true contract_3_discount_code: type: string description: '' example: architecto nullable: true contract_3_discount_price: type: string description: '' example: architecto nullable: true contract_4_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true contract_4_price: type: string description: '' example: architecto nullable: true contract_4_name: type: string description: '' example: architecto nullable: true contract_4_discount_code: type: string description: '' example: architecto nullable: true contract_4_discount_price: type: string description: '' example: architecto nullable: true contract_5_url: type: string description: 'Must be a valid URL.' example: 'http://bailey.com/' nullable: true contract_5_price: type: string description: '' example: architecto nullable: true contract_5_name: type: string description: '' example: architecto nullable: true contract_5_discount_code: type: string description: '' example: architecto nullable: true contract_5_discount_price: type: string description: '' example: architecto nullable: true parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/forms': get: summary: 'Forms list' operationId: formsList description: 'Retrieve a list of the forms for a specific Studio. The results are paginated' parameters: - in: query name: per_page description: 'The amount of forms to return. Max: `250`. Default: `50`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of forms to return. Max: `250`. Default: `50`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: sort_by description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id required: false schema: type: string description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id enum: - creation_date - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: category description: 'Return only forms of this specific category. Empty for all forms.' example: '' required: false schema: type: string description: 'Return only forms of this specific category. Empty for all forms.' example: '' - in: query name: include_archived description: 'Include archived forms in the list. Default: `false`.' example: false required: false schema: type: boolean description: 'Include archived forms in the list. Default: `false`.' example: false responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 8818a7b7-d58c-4d9a-806d-bd382bb7dd52 name: explicabo category: non archived: false creates_pdf: false form_url: 'https://lo.ls/IdC1wXm' send_email_copy_to: null allows_new_clients: false thank_you_url: null - id: e4bf9b25-8d13-46b2-a66f-aa26aeaf6fae name: et category: assumenda archived: false creates_pdf: false form_url: 'https://lo.ls/MQa5UUA' send_email_copy_to: null allows_new_clients: false thank_you_url: null properties: data: type: array example: - id: 8818a7b7-d58c-4d9a-806d-bd382bb7dd52 name: explicabo category: non archived: false creates_pdf: false form_url: 'https://lo.ls/IdC1wXm' send_email_copy_to: null allows_new_clients: false thank_you_url: null - id: e4bf9b25-8d13-46b2-a66f-aa26aeaf6fae name: et category: assumenda archived: false creates_pdf: false form_url: 'https://lo.ls/MQa5UUA' send_email_copy_to: null allows_new_clients: false thank_you_url: null items: type: object properties: id: type: string example: 8818a7b7-d58c-4d9a-806d-bd382bb7dd52 name: type: string example: explicabo category: type: string example: non nullable: true archived: type: boolean example: false creates_pdf: type: boolean example: false form_url: type: string example: 'https://lo.ls/IdC1wXm' send_email_copy_to: type: string example: null nullable: true allows_new_clients: type: boolean example: false thank_you_url: type: string example: null nullable: true tags: - Forms parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/forms/{formId}': get: summary: 'Get a single form' operationId: getASingleForm description: 'Returns the information of a specific form' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: c4dece0b-6ac9-4961-9dc2-51fa495788b6 name: aut category: adipisci archived: false creates_pdf: false form_url: 'https://lo.ls/paorvUv' send_email_copy_to: null allows_new_clients: false thank_you_url: null properties: data: type: object properties: id: type: string example: c4dece0b-6ac9-4961-9dc2-51fa495788b6 name: type: string example: aut category: type: string example: adipisci nullable: true archived: type: boolean example: false creates_pdf: type: boolean example: false form_url: type: string example: 'https://lo.ls/paorvUv' send_email_copy_to: type: string example: null nullable: true allows_new_clients: type: boolean example: false thank_you_url: type: string example: null nullable: true tags: - Forms parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: formId description: 'The form ID' example: 61f48cb0-9b59-4ac5-8a46-c4192a5e750b required: true schema: type: string '/api/franchise/v1/{siteId}/clients': get: summary: 'Client list' operationId: clientList description: 'Retrieve a list of clients for a specific Studio. The results are paginated' parameters: - in: query name: per_page description: 'The amount of clients to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of clients to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: page description: 'The page number. Must be at least 1.' example: 1.0 required: false schema: type: number description: 'The page number. Must be at least 1.' example: 1.0 - in: query name: sort_by description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id required: false schema: type: string description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id enum: - creation_date - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: email description: 'Return only clients with the selected email. Empty for all clients . Must be a valid email address.' example: '' required: false schema: type: string description: 'Return only clients with the selected email. Empty for all clients . Must be a valid email address.' example: '' - in: query name: mobile_phone description: 'Return only clients with the selected phone number. Phone format is 12223334444.' example: '' required: false schema: type: string description: 'Return only clients with the selected phone number. Phone format is 12223334444.' example: '' - in: query name: opted_out_emails description: '`true` will return clients opted out from email communications. `false` will show clients that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return clients opted out from email communications. `false` will show clients that have not opted out. Do not pass the filter to show all.' example: true - in: query name: opted_out_sms description: '`true` will return clients opted out from SMS communications. `false` will show clients that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return clients opted out from SMS communications. `false` will show clients that have not opted out. Do not pass the filter to show all.' example: true - in: query name: tags description: 'Filter clients by assigned tag(s). Array.' example: - signed-up required: false schema: type: array description: 'Filter clients by assigned tag(s). Array.' example: - signed-up items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: '2137449171' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/2137449171' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'North Eileen' address: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" postal_code: 79150-6985 state: CA emergency_contact: email: mitchell.matilda@yahoo.com name: 'Mina Bauch' phone: '13573073143' relationship: wife birthday: '1972-08-25T23:37:54+00:00' creation_date: '2023-10-10T09:48:20+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] - id: '1796147067' team_id: '5854' profile_url: 'https://loopspark.com/go/client/5854/1796147067' email: tristin.mohr@leffler.com active: true first_name: Vella last_name: Ziemann mobile_phone: '13577240472' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: Maraborough address: "753 Jakubowski Track\nLake Daronside, MT 65023-7717" postal_code: 31500-3812 state: CA emergency_contact: email: noe.ankunding@hotmail.com name: 'Prof. Kenna Ortiz' phone: '13571889386' relationship: wife birthday: '2005-10-28T06:49:30+00:00' creation_date: '2024-05-25T01:27:05+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: array example: - id: '2137449171' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/2137449171' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'North Eileen' address: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" postal_code: 79150-6985 state: CA emergency_contact: email: mitchell.matilda@yahoo.com name: 'Mina Bauch' phone: '13573073143' relationship: wife birthday: '1972-08-25T23:37:54+00:00' creation_date: '2023-10-10T09:48:20+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] - id: '1796147067' team_id: '5854' profile_url: 'https://loopspark.com/go/client/5854/1796147067' email: tristin.mohr@leffler.com active: true first_name: Vella last_name: Ziemann mobile_phone: '13577240472' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: Maraborough address: "753 Jakubowski Track\nLake Daronside, MT 65023-7717" postal_code: 31500-3812 state: CA emergency_contact: email: noe.ankunding@hotmail.com name: 'Prof. Kenna Ortiz' phone: '13571889386' relationship: wife birthday: '2005-10-28T06:49:30+00:00' creation_date: '2024-05-25T01:27:05+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] items: type: object properties: id: type: string example: '2137449171' team_id: type: string example: '6789' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/6789/2137449171' email: type: string example: kconsidine@hotmail.com nullable: true active: type: boolean example: true first_name: type: string example: Pauline nullable: true last_name: type: string example: Schultz nullable: true mobile_phone: type: string example: '13577773167' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'North Eileen' nullable: true address: type: string example: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" nullable: true postal_code: type: string example: 79150-6985 nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: mitchell.matilda@yahoo.com nullable: true name: type: string example: 'Mina Bauch' nullable: true phone: type: string example: '13573073143' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1972-08-25T23:37:54+00:00' nullable: true creation_date: type: string example: '2023-10-10T09:48:20+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: integer example: 12 nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] tags: - Client parameters: - in: path name: siteId description: 'The ID of the Studio' example: '123' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}': get: summary: 'Get a client' operationId: getAClient description: 'Returns the information about a specific client' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '4274032' team_id: '2603' profile_url: 'https://loopspark.com/go/client/2603/4274032' email: green.doris@gmail.com active: true first_name: Emanuel last_name: Emmerich mobile_phone: '13573996721' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'New Monaland' address: "422 Moen Corners\nSouth Moises, NH 64519" postal_code: '91956' state: CA emergency_contact: email: kirsten.ward@yahoo.com name: 'Hank Batz' phone: '13570216494' relationship: wife birthday: '1990-07-16T02:01:30+00:00' creation_date: '2024-11-19T16:36:21+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '4274032' team_id: type: string example: '2603' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/2603/4274032' email: type: string example: green.doris@gmail.com nullable: true active: type: boolean example: true first_name: type: string example: Emanuel nullable: true last_name: type: string example: Emmerich nullable: true mobile_phone: type: string example: '13573996721' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'New Monaland' nullable: true address: type: string example: "422 Moen Corners\nSouth Moises, NH 64519" nullable: true postal_code: type: string example: '91956' nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: kirsten.ward@yahoo.com nullable: true name: type: string example: 'Hank Batz' nullable: true phone: type: string example: '13570216494' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1990-07-16T02:01:30+00:00' nullable: true creation_date: type: string example: '2024-11-19T16:36:21+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: integer example: 12 nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] tags: - Client put: summary: 'Update a Client' operationId: updateAClient description: 'Updates the information of a Client' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '524453158' team_id: '9290' profile_url: 'https://loopspark.com/go/client/9290/524453158' email: qankunding@gmail.com active: true first_name: Elton last_name: Gaylord mobile_phone: '13576738443' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'South Dorisfurt' address: "5805 Noah Via Suite 679\nSouth Katlyn, VA 78637" postal_code: '80568' state: CA emergency_contact: email: vraynor@labadie.com name: 'Mr. Carey Smitham' phone: '13573341494' relationship: wife birthday: '1986-10-21T08:44:51+00:00' creation_date: '2026-08-12T05:46:43+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: false can_contact_by_sms: false unsubscribed_email_at: '2026-10-03T08:00:35+00:00' unsubscribed_sms_at: '2026-10-03T08:00:35+00:00' unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '524453158' team_id: type: string example: '9290' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/9290/524453158' email: type: string example: qankunding@gmail.com nullable: true active: type: boolean example: true first_name: type: string example: Elton nullable: true last_name: type: string example: Gaylord nullable: true mobile_phone: type: string example: '13576738443' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'South Dorisfurt' nullable: true address: type: string example: "5805 Noah Via Suite 679\nSouth Katlyn, VA 78637" nullable: true postal_code: type: string example: '80568' nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: vraynor@labadie.com nullable: true name: type: string example: 'Mr. Carey Smitham' nullable: true phone: type: string example: '13573341494' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1986-10-21T08:44:51+00:00' nullable: true creation_date: type: string example: '2026-08-12T05:46:43+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: false can_contact_by_sms: type: boolean example: false unsubscribed_email_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true unsubscribed_sms_at: type: string example: '2026-10-03T08:00:35+00:00' nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: integer example: 12 nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] 403: description: 'Trying to update club_count when manual_club_count is disabled' content: application/json: schema: type: object example: error: true message: 'Cannot update club_count when manual_club_count is disabled for the studio' properties: error: type: boolean example: true message: type: string example: 'Cannot update club_count when manual_club_count is disabled for the studio' 422: description: 'Trying to SMS opt in a client that manually opted out' content: application/json: schema: type: object example: error: true message: 'The client cannot be opted-in to SMS because they sent the opt-out text' properties: error: type: boolean example: true message: type: string example: 'The client cannot be opted-in to SMS because they sent the opt-out text' tags: - Client requestBody: required: false content: application/json: schema: type: object properties: subscribed_email: type: boolean description: 'Unsubscribes an entity from email communications if false. Subscribes if true.' example: false subscribed_sms: type: boolean description: 'Unsubscribes an entity from SMS communications if false. Subscribes if true.' example: false period_count: type: number description: 'Manually set the period count for this entity. Must be at least 0.' example: 27 club_count: type: number description: 'Manually set the club count for this entity (requires manual_club_count to be enabled for the studio). Must be at least 0.' example: 5.0 referrer: type: object description: 'Object containing referrer information with optional properties: first_name, last_name, email, phone, location.' example: first_name: John last_name: Doe email: john.doe@example.com phone: 555-123-4567 location: 'New York' properties: first_name: type: string description: '' example: John nullable: true last_name: type: string description: '' example: Doe nullable: true email: type: string description: 'Must be a valid email address.' example: john.doe@example.com nullable: true phone: type: string description: '' example: 555-123-4567 nullable: true location: type: string description: '' example: 'New York' nullable: true parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: clientId description: 'The client ID.' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}/tags': post: summary: 'Add a Tag' operationId: addATag description: 'Assigns a Tag to a specific Client' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '1365105717' team_id: '9290' profile_url: 'https://loopspark.com/go/client/9290/1365105717' email: wbatz@kutch.com active: true first_name: Micaela last_name: Ankunding mobile_phone: '13576738443' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'South Dorisfurt' address: "2669 Wolff Trail\nBeierburgh, VA 78637" postal_code: '80568' state: CA emergency_contact: email: kconsidine@hotmail.com name: 'Henri Mitchell' phone: '13574946036' relationship: wife birthday: '1986-10-21T08:44:51+00:00' creation_date: '2026-08-12T05:46:43+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '1365105717' team_id: type: string example: '9290' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/9290/1365105717' email: type: string example: wbatz@kutch.com nullable: true active: type: boolean example: true first_name: type: string example: Micaela nullable: true last_name: type: string example: Ankunding nullable: true mobile_phone: type: string example: '13576738443' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'South Dorisfurt' nullable: true address: type: string example: "2669 Wolff Trail\nBeierburgh, VA 78637" nullable: true postal_code: type: string example: '80568' nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: kconsidine@hotmail.com nullable: true name: type: string example: 'Henri Mitchell' nullable: true phone: type: string example: '13574946036' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1986-10-21T08:44:51+00:00' nullable: true creation_date: type: string example: '2026-08-12T05:46:43+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: integer example: 12 nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] tags: - Client requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: Member required: - tag delete: summary: 'Remove a Tag' operationId: removeATag description: "Removes a Tag from a specific Client.\nIf the Client does not have the Tag assigned, it will return an error `400`" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '1880026316' team_id: '889' profile_url: 'https://loopspark.com/go/client/889/1880026316' email: torp.florence@wolff.info active: true first_name: Cynthia last_name: Fahey mobile_phone: '13577037707' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'New Modesta' address: "85188 Victoria Shoals\nWest Artborough, NV 18607-5439" postal_code: '26085' state: CA emergency_contact: email: mcdermott.verlie@gmail.com name: 'Shayna Raynor Jr.' phone: '13573786691' relationship: wife birthday: '1966-10-14T12:39:49+00:00' creation_date: '2025-02-26T10:16:56+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: null club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '1880026316' team_id: type: string example: '889' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/889/1880026316' email: type: string example: torp.florence@wolff.info nullable: true active: type: boolean example: true first_name: type: string example: Cynthia nullable: true last_name: type: string example: Fahey nullable: true mobile_phone: type: string example: '13577037707' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'New Modesta' nullable: true address: type: string example: "85188 Victoria Shoals\nWest Artborough, NV 18607-5439" nullable: true postal_code: type: string example: '26085' nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: mcdermott.verlie@gmail.com nullable: true name: type: string example: 'Shayna Raynor Jr.' nullable: true phone: type: string example: '13573786691' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1966-10-14T12:39:49+00:00' nullable: true creation_date: type: string example: '2025-02-26T10:16:56+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: string example: null nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] 400: description: '' content: application/json: schema: type: object example: error: true message: 'The client does not have the tag signed-up' properties: error: type: boolean example: true message: type: string example: 'The client does not have the tag signed-up' tags: - Client requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: signed-up-flow required: - tag parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: clientId description: 'The client ID' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}/form_submissions': get: summary: 'Lists the form submissions' operationId: listsTheFormSubmissions description: 'Lists the form submissions of a specific client' parameters: - in: query name: page description: 'The page number.' example: 1 required: false schema: type: integer description: 'The page number.' example: 1 - in: query name: per_page description: 'The amount of clients to return. Max: `250`. Default: `10`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of clients to return. Max: `250`. Default: `10`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: sort_by description: 'Sorts the results by either `id` or `creation_date`. Default: `creation_date`.' example: creation_date required: false schema: type: string description: 'Sorts the results by either `id` or `creation_date`. Default: `creation_date`.' example: creation_date enum: - creation_date - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `desc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `desc`.' example: asc enum: - asc - desc - in: query name: form_id description: 'Return only forms submissions of a specific form. Must be a valid UUID. Must match an existing stored value.' example: '' required: false schema: type: string description: 'Return only forms submissions of a specific form. Must be a valid UUID. Must match an existing stored value.' example: '' - in: query name: category description: 'Return only forms submissions of forms belonging to a specific category.' example: '' required: false schema: type: string description: 'Return only forms submissions of forms belonging to a specific category.' example: '' responses: 200: description: '' content: application/json: schema: type: object example: data: id: a621f6a5-219b-4a92-bc68-04a8b423d629 submission_date: '2026-10-03T08:00:35+00:00' pdf_url: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' form: id: d0ae0146-ed1a-47b8-9d38-d39cf6e0b512 name: rem category: ea archived: false creates_pdf: false form_url: 'https://lo.ls/C99cQnt' send_email_copy_to: null allows_new_clients: false thank_you_url: null properties: data: type: object properties: id: type: string example: a621f6a5-219b-4a92-bc68-04a8b423d629 submission_date: type: string example: '2026-10-03T08:00:35+00:00' nullable: true pdf_url: type: string example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' nullable: true form: type: object properties: id: type: string example: d0ae0146-ed1a-47b8-9d38-d39cf6e0b512 name: type: string example: rem category: type: string example: ea nullable: true archived: type: boolean example: false creates_pdf: type: boolean example: false form_url: type: string example: 'https://lo.ls/C99cQnt' send_email_copy_to: type: string example: null nullable: true allows_new_clients: type: boolean example: false thank_you_url: type: string example: null nullable: true tags: - Client parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: clientId description: 'The client ID.' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}/custom-fields': get: summary: 'Get Client Custom Fields' operationId: getClientCustomFields description: "Retrieve all custom field values for a specific client.\nReturns field definition along with current value." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - custom_field: id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string field_options: null description: 'Person to contact in case of emergency' value: 'John Doe - 555-1234' - custom_field: id: THREE_CS name: 'Three Cs' type: single_select field_options: - value: challenge label: Challenge is_active: true sort_order: 1 - value: commitment label: Commitment is_active: true sort_order: 2 - value: community label: Community is_active: true sort_order: 3 description: 'Select primary motivation' value: challenge properties: data: type: array example: - custom_field: id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string field_options: null description: 'Person to contact in case of emergency' value: 'John Doe - 555-1234' - custom_field: id: THREE_CS name: 'Three Cs' type: single_select field_options: - value: challenge label: Challenge is_active: true sort_order: 1 - value: commitment label: Commitment is_active: true sort_order: 2 - value: community label: Community is_active: true sort_order: 3 description: 'Select primary motivation' value: challenge items: type: object properties: custom_field: type: object properties: id: type: string example: EMERGENCY_CONTACT name: type: string example: 'Emergency Contact' type: type: string example: string field_options: type: string example: null nullable: true description: type: string example: 'Person to contact in case of emergency' nullable: true value: type: string example: 'John Doe - 555-1234' tags: - Client post: summary: 'Update Client Custom Fields' operationId: updateClientCustomFields description: "Batch update custom field values for a specific client.\nCan update multiple fields in a single request." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - custom_field: id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string value: 'Jane Doe - 555-5678' properties: data: type: array example: - custom_field: id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string value: 'Jane Doe - 555-5678' items: type: object properties: custom_field: type: object properties: id: type: string example: EMERGENCY_CONTACT name: type: string example: 'Emergency Contact' type: type: string example: string value: type: string example: 'Jane Doe - 555-5678' tags: - Client requestBody: required: true content: application/json: schema: type: object properties: fields: type: array description: 'Array of field updates. Must have at least 1 items.' example: - id: EMERGENCY_CONTACT value: 'John Doe - 555-1234' - id: THREE_CS value: challenge items: type: object properties: '*': type: object description: '' example: id: architecto properties: id: type: string description: 'The custom field ID (e.g., "EMERGENCY_CONTACT")' example: architecto value: type: string description: 'nullable The field value' example: architecto required: - id id: type: string description: 'The custom field ID/slug (e.g., "EMERGENCY_CONTACT", "THREE_CS"). Must match an existing stored value.' example: EMERGENCY_CONTACT value: type: string description: 'The value to set. Use null to clear the field. Type depends on field definition (string, boolean, date, etc.).' example: 'John Doe - 555-1234' nullable: true required: - id required: - fields parameters: - in: path name: siteId description: "The studio's site identifier (e.g., MindBody site ID)." example: '100001' required: true schema: type: string - in: path name: clientId description: "The client's external identifier (e.g., MindBody client ID)." example: '100000001' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}/notes': post: summary: 'Create a Note' operationId: createANote description: "Adds a note to a Client, dated now. The note is plain text: HTML is shown as text, and line breaks are kept.\nTo categorize it, send the `id` of one of the studio's active note categories (see \"List Note Categories\").\nEach call creates a new note, so do not retry a request that already succeeded.\nThe note has no staff author; LoopSpark shows its author as \"Integration\"." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: '

Called about the 6-week challenge.

' note_category_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-09-28T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: type: string example: '

Called about the 6-week challenge.

' note_category_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true created_at: type: string example: '2026-09-28T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'The note category is not available for this studio.' errors: note_category_id: - 'The note category is not available for this studio.' properties: message: type: string example: 'The note category is not available for this studio.' errors: type: object properties: note_category_id: type: array example: - 'The note category is not available for this studio.' items: type: string tags: - Client requestBody: required: true content: application/json: schema: type: object properties: note: type: string description: 'The note text, at least 2 characters. Plain text; line breaks are kept.' example: 'Called about the 6-week challenge.' note_category_id: type: string description: "Optional. The id of one of the studio's active note categories." example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true required: - note parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: clientId description: 'The client ID.' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/clients/{clientId}/messages': post: summary: 'Send a Text Message' operationId: sendATextMessage description: "Sends one SMS to a Client from the studio's texting number, in the same conversation thread staff use in LoopSpark.\nPlaceholders are filled in as in LoopSpark: write the name in double curly braces, for example FIRST_NAME. The message can be at most 3 SMS segments long, counted before placeholders are filled in.\nOpt-outs (STOP) and the usual opt-out notice work exactly as for a staff send, and the text counts against the studio's SMS bundle.\nA `201` means the text was queued; delivery happens asynchronously. Each call sends a new text, so do not retry a request that already succeeded.\nThe text has no staff sender; the LoopSpark web app shows its sender as \"Integration\".\nReturns `422` when the person is muted, has opted out of texts, or has no valid mobile number, or when the text is empty once placeholders are filled in.\nReturns `403` when the studio is suspended." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-10-02T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: type: string example: '2026-10-02T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'This client cannot be contacted by text message' errors: message: - 'This client cannot be contacted by text message' properties: message: type: string example: 'This client cannot be contacted by text message' errors: type: object properties: message: type: array example: - 'This client cannot be contacted by text message' items: type: string tags: - Client requestBody: required: true content: application/json: schema: type: object properties: message: type: string description: 'The text to send, at most 3 SMS segments before placeholders are filled in. Placeholders (a name such as FIRST_NAME in double curly braces) are filled in.' example: 'Hi there, see you at the 6pm class!' required: - message parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: clientId description: 'The client ID.' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts': get: summary: 'Contacts list' operationId: contactsList description: 'Retrieve a list of all the contacts for a specific Studio. The results are paginated' parameters: - in: query name: per_page description: 'The amount of contacts to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 required: false schema: type: number description: 'The amount of contacts to return. Default: `250`. Must be at least 1. Must not be greater than 250.' example: 10.0 - in: query name: page description: 'The page number. Must be at least 1.' example: 1.0 required: false schema: type: number description: 'The page number. Must be at least 1.' example: 1.0 - in: query name: sort_by description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id required: false schema: type: string description: 'Sorts the results by either `id` or `creation_date`. Default: `id`.' example: id enum: - creation_date - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: email description: 'Return only contacts with the selected email. Empty for all contacts . Must be a valid email address.' example: '' required: false schema: type: string description: 'Return only contacts with the selected email. Empty for all contacts . Must be a valid email address.' example: '' - in: query name: mobile_phone description: 'Return only contacts with the selected phone number. Phone format is 12223334444.' example: '' required: false schema: type: string description: 'Return only contacts with the selected phone number. Phone format is 12223334444.' example: '' - in: query name: opted_out_emails description: '`true` will return contacts opted out from email communications. `false` will show contacts that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return contacts opted out from email communications. `false` will show contacts that have not opted out. Do not pass the filter to show all.' example: true - in: query name: opted_out_sms description: '`true` will return contacts opted out from SMS communications. `false` will show contacts that have not opted out. Do not pass the filter to show all.' example: true required: false schema: type: boolean description: '`true` will return contacts opted out from SMS communications. `false` will show contacts that have not opted out. Do not pass the filter to show all.' example: true - in: query name: tags description: 'Filter contacts by assigned tag(s). Array.' example: - signed-up required: false schema: type: array description: 'Filter contacts by assigned tag(s). Array.' example: - signed-up items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: lead-mhamill@marvin.net team_id: '8863' profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net active: false first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null - id: lead-conn.brisa@yahoo.com team_id: '751' profile_url: 'https://loopspark.com/go/client/751/lead-conn.brisa@yahoo.com' email: conn.brisa@yahoo.com active: false first_name: Ethelyn last_name: Lesch mobile_phone: '13570269273' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null properties: data: type: array example: - id: lead-mhamill@marvin.net team_id: '8863' profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net active: false first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null - id: lead-conn.brisa@yahoo.com team_id: '751' profile_url: 'https://loopspark.com/go/client/751/lead-conn.brisa@yahoo.com' email: conn.brisa@yahoo.com active: false first_name: Ethelyn last_name: Lesch mobile_phone: '13570269273' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null items: type: object properties: id: type: string example: lead-mhamill@marvin.net team_id: type: string example: '8863' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: type: string example: mhamill@marvin.net nullable: true active: type: boolean example: false first_name: type: string example: Rhett nullable: true last_name: type: string example: Kuhn nullable: true mobile_phone: type: string example: '13573900260' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: true created_at: type: string example: '2026-10-03T08:00:36+00:00' nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: string example: null nullable: true tags: - Contacts parameters: - in: path name: siteId description: 'The ID of the Studio' example: '123' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts/{contactId}': get: summary: 'Get a Contact' operationId: getAContact description: 'Returns the information about a specific Contact' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-carter.raleigh@kreiger.info team_id: '3089' profile_url: 'https://loopspark.com/go/client/3089/lead-carter.raleigh@kreiger.info' email: carter.raleigh@kreiger.info active: false first_name: Callie last_name: Towne mobile_phone: '13576039800' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null properties: data: type: object properties: id: type: string example: lead-carter.raleigh@kreiger.info team_id: type: string example: '3089' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/3089/lead-carter.raleigh@kreiger.info' email: type: string example: carter.raleigh@kreiger.info nullable: true active: type: boolean example: false first_name: type: string example: Callie nullable: true last_name: type: string example: Towne nullable: true mobile_phone: type: string example: '13576039800' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: true created_at: type: string example: '2026-10-03T08:00:36+00:00' nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: string example: null nullable: true tags: - Contacts put: summary: 'Update a Contact' operationId: updateAContact description: 'Updates the information of a Contact' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: lead-mhamill@marvin.net team_id: '8863' profile_url: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: mhamill@marvin.net active: false first_name: Rhett last_name: Kuhn mobile_phone: '13573900260' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: true created_at: '2026-10-03T08:00:36+00:00' tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: null properties: data: type: object properties: id: type: string example: lead-mhamill@marvin.net team_id: type: string example: '8863' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/8863/lead-mhamill@marvin.net' email: type: string example: mhamill@marvin.net nullable: true active: type: boolean example: false first_name: type: string example: Rhett nullable: true last_name: type: string example: Kuhn nullable: true mobile_phone: type: string example: '13573900260' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: true created_at: type: string example: '2026-10-03T08:00:36+00:00' nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: string example: null nullable: true 422: description: 'Trying to SMS opt in a contact that manually opted out' content: application/json: schema: type: object example: error: true message: 'The contact cannot be opted-in to SMS because they sent the opt-out text' properties: error: type: boolean example: true message: type: string example: 'The contact cannot be opted-in to SMS because they sent the opt-out text' tags: - Contacts requestBody: required: false content: application/json: schema: type: object properties: subscribed_email: type: boolean description: 'Unsubscribes an entity from email communications if false. Subscribes if true.' example: false subscribed_sms: type: boolean description: 'Unsubscribes an entity from SMS communications if false. Subscribes if true.' example: false period_count: type: number description: 'Manually set the period count for this entity. Must be at least 0.' example: 27 club_count: type: number description: 'Manually set the club count for this entity (requires manual_club_count to be enabled for the studio). Must be at least 0.' example: 5.0 referrer: type: object description: 'Object containing referrer information with optional properties: first_name, last_name, email, phone, location.' example: first_name: John last_name: Doe email: john.doe@example.com phone: 555-123-4567 location: 'New York' properties: first_name: type: string description: '' example: John nullable: true last_name: type: string description: '' example: Doe nullable: true email: type: string description: 'Must be a valid email address.' example: john.doe@example.com nullable: true phone: type: string description: '' example: 555-123-4567 nullable: true location: type: string description: '' example: 'New York' nullable: true parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: contactId description: 'The contact ID.' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts/{contactId}/tags': post: summary: 'Add a Tag' operationId: addATag description: 'Assigns a Tag to a specific Contact' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '646980841' team_id: '4071' profile_url: 'https://loopspark.com/go/client/4071/646980841' email: emanuel.emmerich@yahoo.com active: true first_name: Kirsten last_name: Ward mobile_phone: '13577071833' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '646980841' team_id: '4071' profile_url: 'https://loopspark.com/go/client/4071/646980841' email: emanuel.emmerich@yahoo.com active: true first_name: Kirsten last_name: Ward mobile_phone: '13577071833' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: Sibylmouth address: "79388 Cristobal Ways\nCruickshankview, GA 41591-5182" postal_code: 60787-7092 state: CA emergency_contact: email: colt.balistreri@hotmail.com name: 'Mrs. Abbey Gaylord MD' phone: '13573113802' relationship: wife birthday: '1990-05-05T12:02:12+00:00' creation_date: '2025-03-26T01:00:14+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: null club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '646980841' team_id: type: string example: '4071' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/4071/646980841' email: type: string example: emanuel.emmerich@yahoo.com nullable: true active: type: boolean example: true first_name: type: string example: Kirsten nullable: true last_name: type: string example: Ward nullable: true mobile_phone: type: string example: '13577071833' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: false created_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: object properties: id: type: string example: '646980841' team_id: type: string example: '4071' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/4071/646980841' email: type: string example: emanuel.emmerich@yahoo.com nullable: true active: type: boolean example: true first_name: type: string example: Kirsten nullable: true last_name: type: string example: Ward nullable: true mobile_phone: type: string example: '13577071833' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: Sibylmouth nullable: true address: type: string example: "79388 Cristobal Ways\nCruickshankview, GA 41591-5182" nullable: true postal_code: type: string example: 60787-7092 nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: colt.balistreri@hotmail.com nullable: true name: type: string example: 'Mrs. Abbey Gaylord MD' nullable: true phone: type: string example: '13573113802' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1990-05-05T12:02:12+00:00' nullable: true creation_date: type: string example: '2025-03-26T01:00:14+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: string example: null nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] nullable: true tags: - Contacts requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: Member required: - tag delete: summary: 'Remove a Tag' operationId: removeATag description: "Removes a Tag from a specific Contact.\nIf the Contact does not have the Tag assigned, it will return an error `400`" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: '1187404954' team_id: '4071' profile_url: 'https://loopspark.com/go/client/4071/1187404954' email: emanuel.emmerich@yahoo.com active: true first_name: Kirsten last_name: Ward mobile_phone: '13577071833' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '1187404954' team_id: '4071' profile_url: 'https://loopspark.com/go/client/4071/1187404954' email: emanuel.emmerich@yahoo.com active: true first_name: Kirsten last_name: Ward mobile_phone: '13577071833' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: Sibylmouth address: "79388 Cristobal Ways\nCruickshankview, GA 41591-5182" postal_code: 60787-7092 state: CA emergency_contact: email: colt.balistreri@hotmail.com name: 'Mrs. Abbey Gaylord MD' phone: '13573113802' relationship: wife birthday: '1990-05-05T12:02:12+00:00' creation_date: '2025-03-26T01:00:14+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: null club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: object properties: id: type: string example: '1187404954' team_id: type: string example: '4071' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/4071/1187404954' email: type: string example: emanuel.emmerich@yahoo.com nullable: true active: type: boolean example: true first_name: type: string example: Kirsten nullable: true last_name: type: string example: Ward nullable: true mobile_phone: type: string example: '13577071833' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: false created_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: object properties: id: type: string example: '1187404954' team_id: type: string example: '4071' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/4071/1187404954' email: type: string example: emanuel.emmerich@yahoo.com nullable: true active: type: boolean example: true first_name: type: string example: Kirsten nullable: true last_name: type: string example: Ward nullable: true mobile_phone: type: string example: '13577071833' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: Sibylmouth nullable: true address: type: string example: "79388 Cristobal Ways\nCruickshankview, GA 41591-5182" nullable: true postal_code: type: string example: 60787-7092 nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: colt.balistreri@hotmail.com nullable: true name: type: string example: 'Mrs. Abbey Gaylord MD' nullable: true phone: type: string example: '13573113802' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1990-05-05T12:02:12+00:00' nullable: true creation_date: type: string example: '2025-03-26T01:00:14+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: string example: null nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] nullable: true 400: description: '' content: application/json: schema: type: object example: error: true message: 'The contact does not have the tag signed-up' properties: error: type: boolean example: true message: type: string example: 'The contact does not have the tag signed-up' tags: - Contacts requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The tag. Must be at least 1 character.' example: signed-up-flow required: - tag parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: contactId description: 'The contact ID' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts/{contactId}/custom-fields': get: summary: 'Get Contact Custom Fields' operationId: getContactCustomFields description: "Retrieve all custom field values for a specific contact.\nReturns field definition along with current value." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-1234' properties: data: type: array example: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-1234' items: type: object properties: id: type: string example: EMERGENCY_CONTACT value: type: string example: 'Jane Doe - 555-1234' tags: - Contacts post: summary: 'Update Contact Custom Fields' operationId: updateContactCustomFields description: "Batch update custom field values for a specific contact.\nCan update multiple fields in a single request." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-5678' properties: data: type: array example: - id: EMERGENCY_CONTACT value: 'Jane Doe - 555-5678' items: type: object properties: id: type: string example: EMERGENCY_CONTACT value: type: string example: 'Jane Doe - 555-5678' tags: - Contacts requestBody: required: true content: application/json: schema: type: object properties: fields: type: array description: 'Array of field updates. Must have at least 1 items.' example: - id: EMERGENCY_CONTACT value: 'John Doe - 555-1234' - id: THREE_CS value: challenge items: type: object properties: '*': type: object description: '' example: id: architecto properties: id: type: string description: 'The custom field ID (e.g., "EMERGENCY_CONTACT")' example: architecto value: type: string description: 'nullable The field value' example: architecto required: - id id: type: string description: 'The custom field ID/slug (e.g., "EMERGENCY_CONTACT", "THREE_CS"). Must match an existing stored value.' example: EMERGENCY_CONTACT value: type: string description: 'The value to set. Use null to clear the field. Type depends on field definition (string, boolean, date, etc.).' example: 'John Doe - 555-1234' nullable: true required: - id required: - fields parameters: - in: path name: siteId description: "The studio's site identifier (e.g., MindBody site ID)." example: '100001' required: true schema: type: string - in: path name: contactId description: "The contact's external identifier (e.g., MindBody client ID)." example: '100000001' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts/{contactId}/notes': post: summary: 'Create a Note' operationId: createANote description: "Adds a note to a Contact (a Client or a Prospect), found by its contact `id`, dated now. The note is plain text: HTML is shown as text, and line breaks are kept.\nTo categorize it, send the `id` of one of the studio's active note categories (see \"List Note Categories\").\nEach call creates a new note, so do not retry a request that already succeeded.\nThe note has no staff author; LoopSpark shows its author as \"Integration\"." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: '

Called about the 6-week challenge.

' note_category_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-09-28T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 note: type: string example: '

Called about the 6-week challenge.

' note_category_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true created_at: type: string example: '2026-09-28T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'The note category is not available for this studio.' errors: note_category_id: - 'The note category is not available for this studio.' properties: message: type: string example: 'The note category is not available for this studio.' errors: type: object properties: note_category_id: type: array example: - 'The note category is not available for this studio.' items: type: string tags: - Contacts requestBody: required: true content: application/json: schema: type: object properties: note: type: string description: 'The note text, at least 2 characters. Plain text; line breaks are kept.' example: 'Called about the 6-week challenge.' note_category_id: type: string description: "Optional. The id of one of the studio's active note categories." example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 nullable: true required: - note parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: contactId description: 'The contact ID (a client or a prospect).' example: '10000023' required: true schema: type: string '/api/franchise/v1/{siteId}/contacts/{contactId}/messages': post: summary: 'Send a Text Message' operationId: sendATextMessage description: "Sends one SMS to a Contact (a Client or a Prospect), found by its contact `id`, from the studio's texting number, in the same conversation thread staff use in LoopSpark.\nPlaceholders are filled in as in LoopSpark: write the name in double curly braces, for example FIRST_NAME. The message can be at most 3 SMS segments long, counted before placeholders are filled in.\nOpt-outs (STOP) and the usual opt-out notice work exactly as for a staff send, and the text counts against the studio's SMS bundle.\nA `201` means the text was queued; delivery happens asynchronously. Each call sends a new text, so do not retry a request that already succeeded.\nThe text has no staff sender; the LoopSpark web app shows its sender as \"Integration\".\nReturns `422` when the person is muted, has opted out of texts, or has no valid mobile number, or when the text is empty once placeholders are filled in.\nReturns `403` when the studio is suspended." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: '2026-10-02T14:05:00+00:00' properties: data: type: object properties: id: type: string example: 3f0d6a52-8a4e-4c43-9b1e-6f3c2a1d7e90 discussion_id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 created_at: type: string example: '2026-10-02T14:05:00+00:00' nullable: true 422: description: '' content: application/json: schema: type: object example: message: 'This client cannot be contacted by text message' errors: message: - 'This client cannot be contacted by text message' properties: message: type: string example: 'This client cannot be contacted by text message' errors: type: object properties: message: type: array example: - 'This client cannot be contacted by text message' items: type: string tags: - Contacts requestBody: required: true content: application/json: schema: type: object properties: message: type: string description: 'The text to send, at most 3 SMS segments before placeholders are filled in. Placeholders (a name such as FIRST_NAME in double curly braces) are filled in.' example: 'Hi there, see you at the 6pm class!' required: - message parameters: - in: path name: siteId description: 'The studio ID.' example: '21225' required: true schema: type: string - in: path name: contactId description: 'The contact ID (a client or a prospect).' example: '10000023' required: true schema: type: string /api/franchise/v1/custom-fields: get: summary: 'Get Custom Fields' operationId: getCustomFields description: 'Retrieve all custom field definitions for this franchise.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string field_options: null description: 'Person to contact in case of emergency' visible_in_ui: true editable_by_staff: true sort_order: 0 - id: MEMBERSHIP_TYPE name: 'Membership Type' type: single_select field_options: - value: basic label: Basic is_active: true sort_order: 1 - value: premium label: Premium is_active: true sort_order: 2 description: 'Choose membership level' visible_in_ui: true editable_by_staff: false sort_order: 1 properties: data: type: array example: - id: EMERGENCY_CONTACT name: 'Emergency Contact' type: string field_options: null description: 'Person to contact in case of emergency' visible_in_ui: true editable_by_staff: true sort_order: 0 - id: MEMBERSHIP_TYPE name: 'Membership Type' type: single_select field_options: - value: basic label: Basic is_active: true sort_order: 1 - value: premium label: Premium is_active: true sort_order: 2 description: 'Choose membership level' visible_in_ui: true editable_by_staff: false sort_order: 1 items: type: object properties: id: type: string example: EMERGENCY_CONTACT name: type: string example: 'Emergency Contact' type: type: string example: string field_options: type: string example: null nullable: true description: type: string example: 'Person to contact in case of emergency' nullable: true visible_in_ui: type: boolean example: true editable_by_staff: type: boolean example: true sort_order: type: integer example: 0 tags: - 'Custom Fields' '/api/franchise/v1/{siteId}/tags_deferred': post: summary: 'Add deferred tag' operationId: addDeferredTag description: "Add one or multiple deferred tag rules for a specific Studio.\nLoopSpark will automatically add the chosen tag when the rule is applied." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - client_id: '776' tag: eius valid_since: '2026-10-03T08:00:36+00:00' - client_id: '575' tag: corporis valid_since: '2026-10-03T08:00:36+00:00' properties: data: type: array example: - client_id: '776' tag: eius valid_since: '2026-10-03T08:00:36+00:00' - client_id: '575' tag: corporis valid_since: '2026-10-03T08:00:36+00:00' items: type: object properties: client_id: type: string example: '776' tag: type: string example: eius valid_since: type: string example: '2026-10-03T08:00:36+00:00' tags: - 'Deferred Tags' requestBody: required: false content: application/json: schema: type: object properties: clients: type: array description: '' example: - [] items: type: object properties: id: type: string description: 'The MBO UniqueID of the client, or the `ID` of a Prospect.' example: '1000017' tag: type: string description: 'The name of the tag to eventually add to this client. The Tag is not required to exist at the moment, it will be created the first time thi rule is applied. Must be at least 3 characters.' example: 'true' required: - id - tag parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string '/api/franchise/v1/{siteId}/tags_deferred/{uniqueid}': delete: summary: 'Remove Deferred Tag rule' operationId: removeDeferredTagRule description: 'Removes a defered tag rule for a specific Client' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: error: false deleted: true success: true properties: error: type: boolean example: false deleted: type: boolean example: true success: type: boolean example: true 400: description: '' content: application/json: schema: type: object example: error: true message: 'No rule was found with that unique id and type combination' properties: error: type: boolean example: true message: type: string example: 'No rule was found with that unique id and type combination' tags: - 'Deferred Tags' requestBody: required: true content: application/json: schema: type: object properties: tag: type: string description: 'The name of the tag of the deferred tag rule.' example: beginner required: - tag parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string - in: path name: uniqueid description: 'The MBO UniqueID of the Client, or the `ID` of a Prospect' example: '10000012' required: true schema: type: string '/api/franchise/v1/{siteId}/note-categories': get: summary: 'List Note Categories' operationId: listNoteCategories description: "The studio's active note categories. Send a category's `id` as `note_category_id` when creating a note." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 name: 'Objection Note' properties: data: type: array example: - id: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 name: 'Objection Note' items: type: object properties: id: type: string example: 9b2f0c1e-4c1a-4a53-9a5e-2f7f3d1c8b10 name: type: string example: 'Objection Note' tags: - 'Note Categories' parameters: - in: path name: siteId description: 'The studio ID' example: '21225' required: true schema: type: string /api/franchise/v1/search: get: summary: 'Search Contacts' operationId: searchContacts description: 'Search for a Contact across the whole franchise.' parameters: - in: query name: per_page description: 'The amount of contacts to return. Default: `50`. Must be at least 1. Must not be greater than 50.' example: 10.0 required: false schema: type: number description: 'The amount of contacts to return. Default: `50`. Must be at least 1. Must not be greater than 50.' example: 10.0 - in: query name: page description: 'The page number. Must be at least 1.' example: 1.0 required: false schema: type: number description: 'The page number. Must be at least 1.' example: 1.0 - in: query name: sort_by description: 'Sorts the results by `id` or `email`. Default: `email`.' example: id required: false schema: type: string description: 'Sorts the results by `id` or `email`. Default: `email`.' example: id enum: - email - id - in: query name: sort_direction description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc required: false schema: type: string description: 'Sorts the results `asc` for ascending order, `desc` for descending order. Default: `asc`.' example: asc enum: - asc - desc - in: query name: email description: 'Return only Contacts with the selected email. Required if mobile_phone not present. This field is required when mobile_phone is not present. Must be a valid email address.' example: '' required: false schema: type: string description: 'Return only Contacts with the selected email. Required if mobile_phone not present. This field is required when mobile_phone is not present. Must be a valid email address.' example: '' - in: query name: mobile_phone description: 'Return only Contacts with the selected phone number. Phone format is 12223334444. This field is required when email is not present.' example: '' required: false schema: type: string description: 'Return only Contacts with the selected phone number. Phone format is 12223334444. This field is required when email is not present.' example: '' - in: query name: tags description: 'Filter Contacts by assigned tag(s). Array.' example: - signed-up required: false schema: type: array description: 'Filter Contacts by assigned tag(s). Array.' example: - signed-up items: type: string - in: query name: site_ids description: 'Filter Contacts only from a list of siteIDs .' example: - '' required: false schema: type: array description: 'Filter Contacts only from a list of siteIDs .' example: - '' items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: '822569775' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/822569775' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '822569775' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/822569775' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'North Eileen' address: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" postal_code: 79150-6985 state: CA emergency_contact: email: mitchell.matilda@yahoo.com name: 'Mina Bauch' phone: '13573073143' relationship: wife birthday: '1972-08-25T23:37:54+00:00' creation_date: '2023-10-10T09:48:20+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] - id: '26665356' team_id: '9537' profile_url: 'https://loopspark.com/go/client/9537/26665356' email: schmitt.eleanore@nienow.com active: true first_name: Kenna last_name: Ortiz mobile_phone: '13579799206' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '26665356' team_id: '9537' profile_url: 'https://loopspark.com/go/client/9537/26665356' email: schmitt.eleanore@nienow.com active: true first_name: Kenna last_name: Ortiz mobile_phone: '13579799206' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'New Greyson' address: "6747 Wolf Light\nNew Brookeburgh, TX 37725" postal_code: 56023-5576 state: CA emergency_contact: email: ritchie.dorris@klocko.com name: 'Trinity Swaniawski' phone: '13572063041' relationship: wife birthday: '1987-05-12T05:35:52+00:00' creation_date: '2024-05-14T05:57:03+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] properties: data: type: array example: - id: '822569775' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/822569775' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '822569775' team_id: '6789' profile_url: 'https://loopspark.com/go/client/6789/822569775' email: kconsidine@hotmail.com active: true first_name: Pauline last_name: Schultz mobile_phone: '13577773167' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'North Eileen' address: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" postal_code: 79150-6985 state: CA emergency_contact: email: mitchell.matilda@yahoo.com name: 'Mina Bauch' phone: '13573073143' relationship: wife birthday: '1972-08-25T23:37:54+00:00' creation_date: '2023-10-10T09:48:20+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] - id: '26665356' team_id: '9537' profile_url: 'https://loopspark.com/go/client/9537/26665356' email: schmitt.eleanore@nienow.com active: true first_name: Kenna last_name: Ortiz mobile_phone: '13579799206' can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null is_prospect: false created_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] client: id: '26665356' team_id: '9537' profile_url: 'https://loopspark.com/go/client/9537/26665356' email: schmitt.eleanore@nienow.com active: true first_name: Kenna last_name: Ortiz mobile_phone: '13579799206' ltv: 0 phone_home: null phone_work: null referred_by: null address: city: 'New Greyson' address: "6747 Wolf Light\nNew Brookeburgh, TX 37725" postal_code: 56023-5576 state: CA emergency_contact: email: ritchie.dorris@klocko.com name: 'Trinity Swaniawski' phone: '13572063041' relationship: wife birthday: '1987-05-12T05:35:52+00:00' creation_date: '2024-05-14T05:57:03+00:00' refreshed_at: null tags: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' custom_fields: [] can_contact_by_email: true can_contact_by_sms: true unsubscribed_email_at: null unsubscribed_sms_at: null unsubscribed_sms_text: false referrer: first_name: null last_name: null email: null phone: null location: null stats: period_count: 12 club_count: 0 open_discussions: 0 open_todos: 0 social: twitter: [] linkedin: [] facebook: [] instagram: [] items: type: object properties: id: type: string example: '822569775' team_id: type: string example: '6789' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/6789/822569775' email: type: string example: kconsidine@hotmail.com nullable: true active: type: boolean example: true first_name: type: string example: Pauline nullable: true last_name: type: string example: Schultz nullable: true mobile_phone: type: string example: '13577773167' nullable: true can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true is_prospect: type: boolean example: false created_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] client: type: object properties: id: type: string example: '822569775' team_id: type: string example: '6789' nullable: true profile_url: type: string example: 'https://loopspark.com/go/client/6789/822569775' email: type: string example: kconsidine@hotmail.com nullable: true active: type: boolean example: true first_name: type: string example: Pauline nullable: true last_name: type: string example: Schultz nullable: true mobile_phone: type: string example: '13577773167' nullable: true ltv: type: integer example: 0 phone_home: type: string example: null nullable: true phone_work: type: string example: null nullable: true referred_by: type: string example: null nullable: true address: type: object properties: city: type: string example: 'North Eileen' nullable: true address: type: string example: "4706 Madisen Avenue Suite 636\nNew Josianetown, WV 49408-0159" nullable: true postal_code: type: string example: 79150-6985 nullable: true state: type: string example: CA nullable: true emergency_contact: type: object properties: email: type: string example: mitchell.matilda@yahoo.com nullable: true name: type: string example: 'Mina Bauch' nullable: true phone: type: string example: '13573073143' nullable: true relationship: type: string example: wife nullable: true birthday: type: string example: '1972-08-25T23:37:54+00:00' nullable: true creation_date: type: string example: '2023-10-10T09:48:20+00:00' nullable: true refreshed_at: type: string example: null nullable: true tags: type: array example: - name: Member assigned_at: '2025-01-15T09:30:00+00:00' items: type: object properties: name: type: string example: Member assigned_at: type: string example: '2025-01-15T09:30:00+00:00' nullable: true custom_fields: type: array example: [] can_contact_by_email: type: boolean example: true can_contact_by_sms: type: boolean example: true unsubscribed_email_at: type: string example: null nullable: true unsubscribed_sms_at: type: string example: null nullable: true unsubscribed_sms_text: type: boolean example: false referrer: type: object properties: first_name: type: string example: null nullable: true last_name: type: string example: null nullable: true email: type: string example: null nullable: true phone: type: string example: null nullable: true location: type: string example: null nullable: true stats: type: object properties: period_count: type: integer example: 12 nullable: true club_count: type: integer example: 0 open_discussions: type: integer example: 0 open_todos: type: integer example: 0 social: type: object properties: twitter: type: array example: [] linkedin: type: array example: [] facebook: type: array example: [] instagram: type: array example: [] nullable: true tags: - Search