openapi: 3.0.3 info: title: 'Ruhline API API Documentation' description: 'Ruhline API — authentication and role-based access for customers, admins, staff, and coaches, plus public catalogs, checkout, enrollments, reviews, disputes, and payouts.' version: 1.0.0 servers: - url: 'https://ruhline-api.test' tags: - name: 'Customer Authentication' description: "\nAPIs for customer authentication, registration, and password management." - name: 'Admin Authentication' description: "\nAPIs for admin and staff authentication. Both admin and staff users can access the admin portal." - name: 'Coach Authentication' description: "\nAPIs for coach authentication. Coaches can register, verify email, and log in.\nAdmin must verify a coach before they can log in (coaches created by admin are verified by default)." - name: 'Checkout (Customer)' description: "\nAPIs for checkout preview and Stripe Checkout Session payment.\n\nBase path: /api/v1/checkout" - name: 'Customer - Enrollments' description: '' - name: 'Customer - Disputes' description: '' - name: 'Customer - Program Reviews' description: '' - name: 'Programs (Guest / no auth)' description: "\nUnauthenticated catalog: list programs and program detail. Only programs whose category is active are returned.\nDoes not include program structure or modules.\n\nBase path: /api/v1/programs" - name: 'Coaches (Guest / no auth)' description: "\nUnauthenticated directory of admin-verified coaches only.\n\nBase path: /api/v1/coaches" - name: 'Coach - Programs' description: "\nAPIs for coaches to view programs they are assigned to.\n\nRoutes are prefixed with: /api/v1/program" - name: 'Coach - Program Availability' description: "\nAPIs for coaches to manage their own availability and time-off per assigned program.\n\nRoutes are prefixed with: /api/v1/program" - name: 'Coach - Program Structure' description: '' - name: 'Coach - Disputes' description: '' - name: 'Coach - Payouts' description: '' - name: 'Admin - About Page (CMS)' description: "\nAPIs for managing the About page content (Section 01, Mission/Vision/Values, Founder).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/about-page" - name: 'About Page (Public)' description: "\nPublic API for retrieving the About page content for the frontend.\nNo authentication required.\n\nRoutes are prefixed with: /api/v1/about-page" - name: 'Admin - Article Category Management' description: "\nAPIs for managing article categories. Only accessible by admin users.\nAdmin sends is_active as text \"true\" or \"false\".\n\nAll routes are prefixed with: /api/v1/admin/article-category" - name: 'Admin - Article Management' description: "\nAPIs for managing articles (with thumbnail, category, description, share options, sections).\nAdmin sends share_facebook, share_twitter, share_linkedin as text \"true\" or \"false\".\nSection image_position: left, right, or center.\n\nAll routes are prefixed with: /api/v1/admin/article" - name: 'Article Categories (Public)' description: "\nPublic APIs for listing article categories. No authentication required.\nReturns only active categories with articles count.\n\nAll routes are prefixed with: /api/v1/article-category" - name: 'Articles (Public)' description: "\nPublic APIs for listing and viewing articles. No authentication required.\nAll routes are prefixed with: /api/v1/article/article (list, single by id)." - name: 'Admin - Card Management' description: "\nAPIs for managing cards within card categories. Only accessible by admin users.\nEach category has up to 52 cards. Admin provides card name and description when creating.\n\nAll routes are prefixed with: /api/v1/admin/card-category/cards" - name: 'Admin - Card Category Management' description: "\nAPIs for managing card categories. Only accessible by admin users.\nAdmin provides only the card category name when creating.\n\nAll routes are prefixed with: /api/v1/admin/card-category" - name: 'Admin - Checkout Orders' description: '' - name: 'Admin - Coach Management' description: "\nAPIs for managing coaches. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/coach/admin" - name: 'Admin - Global Commission Rate (Coaches)' description: "\nAPIs for managing the global commission rate applied to coaches.\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/coach" - name: 'Admin - Contact Form Management' description: "\nAPIs for managing contact form submissions. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/contact" - name: 'Contact Form' description: "\nPublic APIs for submitting contact form. No authentication required." - name: 'Admin - Coupon Management' description: "\nAPIs for managing coupons. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/coupon" - name: 'Admin - Customer Management' description: "\nAPIs for managing customers. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/customer" - name: 'Admin - Disputes' description: '' - name: 'Admin - FAQ Management' description: "\nAPIs for managing FAQs for mentee and mentor pages.\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/faq" - name: 'FAQ (Public)' description: "\nPublic APIs for retrieving FAQs for mentee and mentor pages.\nNo authentication required.\n\nRoutes are prefixed with: /api/v1/faq" - name: 'Admin - Goal Type Management' description: "\nAPIs for managing goal types. Admin enters only the Goal Type Name.\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/goal-type" - name: 'Admin - Habit Type Management' description: "\nAPIs for managing habit types. Admin enters only the Habit Type Name.\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/habit-type" - name: 'Admin - Home Page (CMS)' description: "\nAPIs for managing the Home page content (Hero, About Us, Programs, Why Choose Us, Coaches, Articles).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/home-page" - name: 'Home Page (Public)' description: "\nPublic API for retrieving the Home page content for the frontend.\nNo authentication required.\n\nRoutes are prefixed with: /api/v1/home-page" - name: 'Admin - Values Intermediate Page (Intermediate Steps)' description: "\nAPIs for managing the Values Intermediate Page content (headline and points).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/intermediate-steps/values" - name: 'Admin - The Y Method Page (Intermediate Steps)' description: "\nAPIs for managing The Y Method Page content (headline and steps).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/intermediate-steps/y-method" - name: 'Admin - Eight most common mistakes Intermediate Page' description: "\nAPIs for managing the Eight most common mistakes page (headline and mistakes).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/intermediate-steps/eight-most-common-mistakes" - name: 'Admin - Goal Settings Intermediate Page' description: "\nAPIs for managing the Goal Settings Intermediate Page (headline, quote, sub-headings, description 2, options).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/intermediate-steps/goal-settings" - name: 'Admin - Questions for each goal - why? Intermediate Page' description: "\nAPIs for managing the Questions for each goal - why? page (headlines, question blocks, quote).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/intermediate-steps/questions-goal-why" - name: 'Intermediate Steps - Values Page (Public)' description: "\nPublic API for retrieving the Values Intermediate Page content.\n\nRoutes are prefixed with: /api/v1/intermediate-steps" - name: 'Intermediate Steps - The Y Method Page (Public)' description: "\nPublic API for retrieving The Y Method Page content.\n\nRoutes are prefixed with: /api/v1/intermediate-steps" - name: 'Intermediate Steps - Eight most common mistakes (Public)' description: "\nPublic API for retrieving the Eight most common mistakes page content.\n\nRoutes are prefixed with: /api/v1/intermediate-steps" - name: 'Intermediate Steps - Goal Settings (Public)' description: "\nPublic API for retrieving the Goal Settings Intermediate Page content." - name: 'Intermediate Steps - Questions for each goal - why? (Public)' description: "\nPublic API for retrieving the Questions for each goal - why? page content." - name: 'Admin - Legal Pages (CMS)' description: "\nAPIs for managing legal pages (privacy policy, refund policy, terms & conditions).\nOnly accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/legal-page" - name: 'Legal Pages (Public)' description: "\nPublic APIs for retrieving legal page content (privacy policy, refund policy, terms & conditions).\nNo authentication required.\n\nRoutes are prefixed with: /api/v1/legal-page" - name: Location description: "\nAPIs for retrieving location data including countries, states, cities, and phone country codes." - name: 'Admin - Program Category Management' description: "\nAPIs for managing program categories and sub-categories. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/program-category" - name: 'Program Categories (Public)' description: "\nPublic APIs for listing program categories and sub-categories. No authentication required.\nReturns only active categories. Use parent_id filter or nested=1 for tree.\n\nAll routes are prefixed with: /api/v1/program-category" - name: 'Admin - Program Management' description: "\nAPIs for managing programs. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/program" - name: 'Admin - Program Reviews' description: '' - name: 'Admin - Program Settings' description: "\nAPIs for managing program settings (Quote Category and Card Category per program).\nUsed to select which quote category and card category are used for this program (e.g. for future quotes and cards modules).\n\nRoutes: /api/v1/admin/program/{id}/settings" - name: 'Admin - Program Structure' description: "\nAPIs for managing program structure (ordered modules) and module content.\nRoutes: /api/v1/admin/program/{id}/structure" - name: 'Admin - Payouts' description: '' - name: 'Admin - Quote Management' description: "\nAPIs for managing quotes within quote categories. Only accessible by admin users.\nEach category has unlimited quotes. Admin provides quote text when creating.\n\nAll routes are prefixed with: /api/v1/admin/quote-category/quotes" - name: 'Admin - Quote Category Management' description: "\nAPIs for managing quote categories. Only accessible by admin users.\nAdmin provides only the quote category name when creating.\n\nAll routes are prefixed with: /api/v1/admin/quote-category" - name: 'Admin - Shift Management' description: "\nAPIs for managing shifts (name, start time, end time) for working days.\nBy default a shift is applied to all working days. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/shift\n\nDay of week: 0=Sunday, 1=Monday, ..., 6=Saturday" - name: 'Shifts (Public)' description: "\nPublic API for reading shifts. No authentication required.\n\nAll routes are prefixed with: /api/v1/shift\n\nDay of week: 0=Sunday, 1=Monday, ..., 6=Saturday" - name: 'Admin - Site Settings (CMS)' description: "\nAPIs for managing site settings. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/site-setting" - name: 'Site Settings (Public)' description: "\nPublic APIs for retrieving site settings (logos, footer, social links, address).\nNo authentication required.\n\nRoutes are prefixed with: /api/v1/site-setting" - name: 'Admin - Working Days Management' description: "\nAPIs for managing which week days are working days. Only accessible by admin users.\n\nAll routes are prefixed with: /api/v1/admin/working-day\n\nDay of week: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday" - name: 'Working Days (Public)' description: "\nPublic API for reading which week days are working days and their shifts. No authentication required.\n\nAll routes are prefixed with: /api/v1/working-day\n\nDay of week: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday" - name: 'Example Routes' description: "\nExample routes demonstrating role-based access control. These are sample endpoints showing how different user roles can access different resources.\n\n" - name: 'Coach - Enrollment Module Access' description: '' - name: 'Customer - Enrollment Card Game' description: '' - name: 'Customer - Enrollment Find Your Motivation' description: '' - name: 'Customer - Enrollment Goal Settings' description: '' - name: 'Customer - Enrollment Habit Tracker' description: '' - name: 'Customer - Enrollment Modules' description: '' - name: 'Customer - Enrollment Questions' description: '' - name: 'Customer - Enrollment Upload Documents' description: '' - name: 'Customer - Enrollment Wheel Of Life' description: '' - name: Endpoints description: '' components: securitySchemes: default: type: http scheme: bearer description: 'You can retrieve your token by logging in through the authentication endpoints. Include the token in the Authorization header as: Bearer {your-token-here}' security: - default: [] paths: /api/v1/auth/customer/register: post: summary: 'Register a new customer' operationId: registerANewCustomer description: "Register a new customer account. After registration, a verification email will be sent to the provided email address.\nThe customer must verify their email before they can log in." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Customer registered successfully. Please check your email to verify your account.' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: john.doe@example.com email_verified_at: null roles: - customer message: 'Registration successful. Please verify your email address before logging in.' properties: success: type: boolean example: true message: type: string example: 'Customer registered successfully. Please check your email to verify your account.' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john.doe@example.com email_verified_at: type: string example: null nullable: true roles: type: array example: - customer items: type: string message: type: string example: 'Registration successful. Please verify your email address before logging in.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'This email address is already registered.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'This email address is already registered.' items: type: string tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: first_name: type: string description: "The customer's first name." example: John last_name: type: string description: "The customer's last name." example: Doe email: type: string description: "The customer's email address. Must be unique." example: john.doe@example.com password: type: string description: "The customer's password. Must be at least 8 characters." example: password123 terms_accepted: type: boolean description: 'Must be true to accept terms and conditions.' example: true password_confirmation: type: string description: 'Password confirmation. Must match password.' example: password123 required: - first_name - last_name - email - password - terms_accepted - password_confirmation security: [] /api/v1/auth/customer/login: post: summary: 'Login customer' operationId: loginCustomer description: 'Authenticate a customer and return an access token. The customer must have verified their email address before logging in.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Login successful' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: john.doe@example.com email_verified_at: '2025-01-20T17:25:00+00:00' roles: - customer profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' address_line_1: '123 Main Street' address_line_2: 'Apt 4B' landmark: 'Near Central Park' country: id: 1 name: 'United States' state: id: 1 name: 'New York' city: id: 1 name: 'New York City' postal_code: '12345' profile_image: 'http://example.com/storage/customer-profiles/image.jpg' token: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx properties: success: type: boolean example: true message: type: string example: 'Login successful' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john.doe@example.com email_verified_at: type: string example: '2025-01-20T17:25:00+00:00' roles: type: array example: - customer items: type: string profile: type: object properties: phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' address_line_1: type: string example: '123 Main Street' address_line_2: type: string example: 'Apt 4B' landmark: type: string example: 'Near Central Park' country: type: object properties: id: type: integer example: 1 name: type: string example: 'United States' state: type: object properties: id: type: integer example: 1 name: type: string example: 'New York' city: type: object properties: id: type: integer example: 1 name: type: string example: 'New York City' postal_code: type: string example: '12345' profile_image: type: string example: 'http://example.com/storage/customer-profiles/image.jpg' token: type: string example: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 422: description: '' content: application/json: schema: type: object example: success: false message: 'Please verify your email address before logging in. Check your inbox for the verification link.' errors: email: - 'Please verify your email address before logging in. Check your inbox for the verification link.' properties: success: type: boolean example: false message: type: string example: 'Please verify your email address before logging in. Check your inbox for the verification link.' errors: type: object properties: email: type: array example: - 'Please verify your email address before logging in. Check your inbox for the verification link.' items: type: string tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The customer's email address." example: john.doe@example.com password: type: string description: "The customer's password." example: password123 required: - email - password security: [] /api/v1/auth/customer/forgot-password: post: summary: 'Forgot password' operationId: forgotPassword description: "Send a password reset link to the customer's email address. The link will be sent to the frontend URL configured in the system." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'If a customer account exists with that email, we have sent a password reset link.' data: message: 'If a customer account exists with that email, we have sent a password reset link.' frontend_url: 'http://localhost:3000' properties: success: type: boolean example: true message: type: string example: 'If a customer account exists with that email, we have sent a password reset link.' data: type: object properties: message: type: string example: 'If a customer account exists with that email, we have sent a password reset link.' frontend_url: type: string example: 'http://localhost:3000' tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The customer's email address." example: john.doe@example.com required: - email security: [] /api/v1/auth/customer/reset-password: post: summary: 'Reset password' operationId: resetPassword description: "Reset the customer's password using the token received in the password reset email." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password has been reset successfully. You can now login with your new password.' data: message: 'Password has been reset successfully. You can now login with your new password.' properties: success: type: boolean example: true message: type: string example: 'Password has been reset successfully. You can now login with your new password.' data: type: object properties: message: type: string example: 'Password has been reset successfully. You can now login with your new password.' 400: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid or expired reset token.' properties: success: type: boolean example: false message: type: string example: 'Invalid or expired reset token.' tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'The password reset token from the email.' example: abc123... email: type: string description: "The customer's email address." example: john.doe@example.com password: type: string description: 'The new password. Must be at least 8 characters.' example: newpassword123 password_confirmation: type: string description: 'Password confirmation. Must match password.' example: newpassword123 required: - token - email - password - password_confirmation security: [] /api/v1/auth/customer/email/verify: post: summary: 'Verify email address (POST)' operationId: verifyEmailAddressPOST description: "Verify a customer's email address using the verification parameters from the email link.\nThis endpoint is designed for frontend applications to call after extracting parameters from the verification URL." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Email verified successfully. You can now log in.' data: user: id: 1 name: 'John Doe' email: john.doe@example.com email_verified_at: '2025-01-20T17:25:00+00:00' roles: - customer already_verified: false properties: success: type: boolean example: true message: type: string example: 'Email verified successfully. You can now log in.' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: john.doe@example.com email_verified_at: type: string example: '2025-01-20T17:25:00+00:00' roles: type: array example: - customer items: type: string already_verified: type: boolean example: false 403: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid or expired verification link.' properties: success: type: boolean example: false message: type: string example: 'Invalid or expired verification link.' tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: id: type: integer description: 'The user ID from the verification link.' example: 1 hash: type: string description: 'The verification hash from the email link.' example: abc123... expires: type: integer description: 'The expiration timestamp from the verification link.' example: 1234567890 signature: type: string description: 'The signature from the verification link.' example: xyz789... required: - id - hash - expires - signature security: [] '/api/v1/auth/customer/email/verify/{id}/{hash}': get: summary: 'Verify email address (GET)' operationId: verifyEmailAddressGET description: "Verify a customer's email address via direct link access. This endpoint is used when clicking the verification link directly." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Email verified successfully. You can now log in.' data: user: id: 1 name: 'John Doe' email: john.doe@example.com email_verified_at: '2025-01-20T17:25:00+00:00' roles: - customer already_verified: false properties: success: type: boolean example: true message: type: string example: 'Email verified successfully. You can now log in.' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: john.doe@example.com email_verified_at: type: string example: '2025-01-20T17:25:00+00:00' roles: type: array example: - customer items: type: string already_verified: type: boolean example: false tags: - 'Customer Authentication' security: [] parameters: - in: path name: id description: 'The user ID.' example: 1 required: true schema: type: integer - in: path name: hash description: 'The verification hash.' example: abc123... required: true schema: type: string /api/v1/auth/customer/email/resend-verification: post: summary: 'Resend email verification' operationId: resendEmailVerification description: "Resend the email verification link to the customer's email address. This is a public endpoint that accepts an email address." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'If a customer account exists with that email, we have sent a verification email.' data: message: 'If a customer account exists with that email, we have sent a verification email.' frontend_url: 'http://localhost:3000' properties: success: type: boolean example: true message: type: string example: 'If a customer account exists with that email, we have sent a verification email.' data: type: object properties: message: type: string example: 'If a customer account exists with that email, we have sent a verification email.' frontend_url: type: string example: 'http://localhost:3000' 400: description: '' content: application/json: schema: type: object example: success: false message: 'Email already verified.' properties: success: type: boolean example: false message: type: string example: 'Email already verified.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'We could not find a user with that email address.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'We could not find a user with that email address.' items: type: string tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The customer's email address." example: john.doe@example.com required: - email security: [] /api/v1/auth/customer/logout: post: summary: 'Logout customer' operationId: logoutCustomer description: 'Revoke the current access token and log out the authenticated customer.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Logged out successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Logged out successfully' data: type: array example: [] 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer Authentication' /api/v1/auth/customer/me: get: summary: 'Get customer profile' operationId: getCustomerProfile description: "Get the authenticated customer's profile information." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile retrieved successfully' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: john.doe@example.com email_verified_at: '2025-01-20T17:25:00+00:00' roles: - customer profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' address_line_1: '123 Main Street' address_line_2: 'Apt 4B' landmark: 'Near Central Park' country: id: 1 name: 'United States' state: id: 1 name: 'New York' city: id: 1 name: 'New York City' postal_code: '12345' profile_image: 'http://example.com/storage/profiles/image.jpg' properties: success: type: boolean example: true message: type: string example: 'Profile retrieved successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john.doe@example.com email_verified_at: type: string example: '2025-01-20T17:25:00+00:00' roles: type: array example: - customer items: type: string profile: type: object properties: phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' address_line_1: type: string example: '123 Main Street' address_line_2: type: string example: 'Apt 4B' landmark: type: string example: 'Near Central Park' country: type: object properties: id: type: integer example: 1 name: type: string example: 'United States' state: type: object properties: id: type: integer example: 1 name: type: string example: 'New York' city: type: object properties: id: type: integer example: 1 name: type: string example: 'New York City' postal_code: type: string example: '12345' profile_image: type: string example: 'http://example.com/storage/profiles/image.jpg' tags: - 'Customer Authentication' /api/v1/auth/customer/change-password: post: summary: 'Change password' operationId: changePassword description: "Change the authenticated customer's password. The customer must provide their current password for verification." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password changed successfully' data: message: 'Your password has been changed successfully.' properties: success: type: boolean example: true message: type: string example: 'Password changed successfully' data: type: object properties: message: type: string example: 'Your password has been changed successfully.' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: current_password: - 'The current password is incorrect.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: current_password: type: array example: - 'The current password is incorrect.' items: type: string tags: - 'Customer Authentication' requestBody: required: true content: application/json: schema: type: object properties: current_password: type: string description: "The customer's current password." example: oldpassword123 password: type: string description: 'The new password. Must be at least 8 characters.' example: newpassword123 password_confirmation: type: string description: 'Password confirmation. Must match password.' example: newpassword123 required: - current_password - password - password_confirmation /api/v1/auth/customer/update-profile: post: summary: 'Update customer profile' operationId: updateCustomerProfile description: "Update the authenticated customer's profile information including personal details, contact information, address, and profile image." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile updated successfully' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: john.doe@example.com email_verified_at: '2025-01-20T17:25:00+00:00' roles: - customer profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' address_line_1: '123 Main Street' address_line_2: 'Apt 4B' landmark: 'Near Central Park' country: id: 1 name: 'United States' state: id: 1 name: 'New York' city: id: 1 name: 'New York City' postal_code: '12345' profile_image: 'http://example.com/storage/profiles/image.jpg' properties: success: type: boolean example: true message: type: string example: 'Profile updated successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john.doe@example.com email_verified_at: type: string example: '2025-01-20T17:25:00+00:00' roles: type: array example: - customer items: type: string profile: type: object properties: phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' address_line_1: type: string example: '123 Main Street' address_line_2: type: string example: 'Apt 4B' landmark: type: string example: 'Near Central Park' country: type: object properties: id: type: integer example: 1 name: type: string example: 'United States' state: type: object properties: id: type: integer example: 1 name: type: string example: 'New York' city: type: object properties: id: type: integer example: 1 name: type: string example: 'New York City' postal_code: type: string example: '12345' profile_image: type: string example: 'http://example.com/storage/profiles/image.jpg' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'This email address is already registered.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'This email address is already registered.' items: type: string tags: - 'Customer Authentication' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "The customer's first name." example: John last_name: type: string description: "The customer's last name." example: Doe email: type: string description: "The customer's email address. Must be unique." example: john.doe@example.com phone: type: string description: "The customer's phone number." example: '1234567890' phone_country_code_id: type: integer description: 'The ID of the phone country code.' example: 1 nullable: true address_line_1: type: string description: "The customer's primary address line." example: '123 Main Street' nullable: true address_line_2: type: string description: "The customer's secondary address line." example: 'Apt 4B' nullable: true landmark: type: string description: 'A nearby landmark.' example: 'Near Central Park' nullable: true country_id: type: integer description: 'The ID of the country.' example: 1 nullable: true state_id: type: integer description: 'The ID of the state.' example: 1 nullable: true city_id: type: integer description: 'The ID of the city.' example: 1 nullable: true postal_code: type: string description: 'The postal or zip code.' example: '12345' nullable: true profile_image: type: string format: binary description: "The customer's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB." nullable: true /api/v1/admin/profile: get: summary: 'Get admin/staff profile data' operationId: getAdminstaffProfileData description: "Get the authenticated admin or staff user's detailed profile data including first name, last name, email, profile photo and extra data." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Admin profile retrieved successfully' data: id: 1 user_id: 1 first_name: John last_name: Doe email: admin@ruhline.com profile_photo: 'http://example.com/storage/profiles/photo.jpg' extra_data: null created_at: '2026-01-20T17:47:05+00:00' updated_at: '2026-01-20T17:47:05+00:00' properties: success: type: boolean example: true message: type: string example: 'Admin profile retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: admin@ruhline.com profile_photo: type: string example: 'http://example.com/storage/profiles/photo.jpg' extra_data: type: string example: null nullable: true created_at: type: string example: '2026-01-20T17:47:05+00:00' updated_at: type: string example: '2026-01-20T17:47:05+00:00' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 404: description: '' content: application/json: schema: type: object example: success: false message: 'Admin profile not found' properties: success: type: boolean example: false message: type: string example: 'Admin profile not found' tags: - 'Admin Authentication' put: summary: 'Update profile' operationId: updateProfile description: "Update the authenticated admin or staff user's profile information including first name, last name, and profile photo." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile updated successfully' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: admin@ruhline.com email_verified_at: null roles: - admin profile: profile_photo: 'http://example.com/storage/profiles/photo.jpg' properties: success: type: boolean example: true message: type: string example: 'Profile updated successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: admin@ruhline.com email_verified_at: type: string example: null nullable: true roles: type: array example: - admin items: type: string profile: type: object properties: profile_photo: type: string example: 'http://example.com/storage/profiles/photo.jpg' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: profile_photo: - 'The profile photo must be an image.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: profile_photo: type: array example: - 'The profile photo must be an image.' items: type: string tags: - 'Admin Authentication' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: 'The admin/staff first name.' example: John last_name: type: string description: 'The admin/staff last name.' example: Doe profile_photo: type: string format: binary description: 'The admin/staff profile photo. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB.' /api/v1/auth/admin/login: post: summary: 'Login admin or staff' operationId: loginAdminOrStaff description: 'Authenticate an admin or staff user and return an access token. Both admin and staff roles can use this endpoint.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Login successful' data: user: id: 1 name: 'Admin User' first_name: Admin last_name: User email: admin@ruhline.com email_verified_at: null roles: - admin profile: profile_photo: 'http://example.com/storage/profiles/photo.jpg' token: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx properties: success: type: boolean example: true message: type: string example: 'Login successful' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Admin User' first_name: type: string example: Admin last_name: type: string example: User email: type: string example: admin@ruhline.com email_verified_at: type: string example: null nullable: true roles: type: array example: - admin items: type: string profile: type: object properties: profile_photo: type: string example: 'http://example.com/storage/profiles/photo.jpg' token: type: string example: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 422: description: '' content: application/json: schema: type: object example: success: false message: 'This account is not authorized to access the admin portal.' errors: email: - 'This account is not authorized to access the admin portal.' properties: success: type: boolean example: false message: type: string example: 'This account is not authorized to access the admin portal.' errors: type: object properties: email: type: array example: - 'This account is not authorized to access the admin portal.' items: type: string tags: - 'Admin Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'The admin/staff email address.' example: admin@ruhline.com password: type: string description: 'The admin/staff password.' example: password required: - email - password security: [] /api/v1/auth/admin/logout: post: summary: 'Logout admin/staff' operationId: logoutAdminstaff description: 'Revoke the current access token and log out the authenticated admin or staff user.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Logged out successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Logged out successfully' data: type: array example: [] tags: - 'Admin Authentication' /api/v1/auth/admin/me: get: summary: 'Get admin/staff profile' operationId: getAdminstaffProfile description: "Get the authenticated admin or staff user's profile information." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile retrieved successfully' data: user: id: 1 name: 'Admin User' email: admin@ruhline.com email_verified_at: null roles: - admin properties: success: type: boolean example: true message: type: string example: 'Profile retrieved successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Admin User' email: type: string example: admin@ruhline.com email_verified_at: type: string example: null nullable: true roles: type: array example: - admin items: type: string tags: - 'Admin Authentication' /api/v1/auth/admin/change-password: post: summary: 'Change password' operationId: changePassword description: "Change the authenticated admin or staff user's password. The user must provide their current password for verification." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password changed successfully' data: message: 'Your password has been changed successfully.' properties: success: type: boolean example: true message: type: string example: 'Password changed successfully' data: type: object properties: message: type: string example: 'Your password has been changed successfully.' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: current_password: - 'The current password is incorrect.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: current_password: type: array example: - 'The current password is incorrect.' items: type: string tags: - 'Admin Authentication' requestBody: required: true content: application/json: schema: type: object properties: current_password: type: string description: 'The admin/staff current password.' example: oldpassword123 password: type: string description: 'The new password. Must be at least 8 characters.' example: newpassword123 password_confirmation: type: string description: 'Password confirmation. Must match password.' example: newpassword123 required: - current_password - password - password_confirmation /api/v1/auth/admin/profile: get: summary: 'Get admin/staff profile data' operationId: getAdminstaffProfileData description: "Get the authenticated admin or staff user's detailed profile data including first name, last name, email, profile photo and extra data." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Admin profile retrieved successfully' data: id: 1 user_id: 1 first_name: John last_name: Doe email: admin@ruhline.com profile_photo: 'http://example.com/storage/profiles/photo.jpg' extra_data: null created_at: '2026-01-20T17:47:05+00:00' updated_at: '2026-01-20T17:47:05+00:00' properties: success: type: boolean example: true message: type: string example: 'Admin profile retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: admin@ruhline.com profile_photo: type: string example: 'http://example.com/storage/profiles/photo.jpg' extra_data: type: string example: null nullable: true created_at: type: string example: '2026-01-20T17:47:05+00:00' updated_at: type: string example: '2026-01-20T17:47:05+00:00' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 404: description: '' content: application/json: schema: type: object example: success: false message: 'Admin profile not found' properties: success: type: boolean example: false message: type: string example: 'Admin profile not found' tags: - 'Admin Authentication' put: summary: 'Update profile' operationId: updateProfile description: "Update the authenticated admin or staff user's profile information including first name, last name, and profile photo." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile updated successfully' data: user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: admin@ruhline.com email_verified_at: null roles: - admin profile: profile_photo: 'http://example.com/storage/profiles/photo.jpg' properties: success: type: boolean example: true message: type: string example: 'Profile updated successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: admin@ruhline.com email_verified_at: type: string example: null nullable: true roles: type: array example: - admin items: type: string profile: type: object properties: profile_photo: type: string example: 'http://example.com/storage/profiles/photo.jpg' 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: profile_photo: - 'The profile photo must be an image.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: profile_photo: type: array example: - 'The profile photo must be an image.' items: type: string tags: - 'Admin Authentication' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: 'The admin/staff first name.' example: John last_name: type: string description: 'The admin/staff last name.' example: Doe profile_photo: type: string format: binary description: 'The admin/staff profile photo. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB.' /api/v1/auth/coach/register: post: summary: 'Register a new coach' operationId: registerANewCoach description: "Register a new coach account. After registration, a verification email is sent.\nThe coach must verify their email, and an admin must verify the coach, before they can log in." parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Coach registered successfully. Please check your email to verify your account.' data: user: id: 1 name: 'John Doe' email: coach@example.com email_verified_at: null roles: - coach message: 'Registration successful. Please verify your email. An admin must approve your account before you can log in.' properties: success: type: boolean example: true message: type: string example: 'Coach registered successfully. Please check your email to verify your account.' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: coach@example.com email_verified_at: type: string example: null nullable: true roles: type: array example: - coach items: type: string message: type: string example: 'Registration successful. Please verify your email. An admin must approve your account before you can log in.' tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: first_name: type: string description: "The coach's first name." example: John last_name: type: string description: "The coach's last name." example: Doe email: type: string description: "The coach's email address. Must be unique." example: coach@example.com password: type: string description: "The coach's password. Must be at least 8 characters." example: password123 password_confirmation: type: string description: 'Password confirmation.' example: password123 required: - first_name - last_name - email - password - password_confirmation security: [] /api/v1/auth/coach/login: post: summary: 'Login coach' operationId: loginCoach description: "Authenticate a coach and return an access token. The coach must have verified their email\nand be verified by an admin before they can log in." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Login successful' data: user: id: 1 name: 'Coach User' email: coach@ruhline.com roles: - coach token: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx properties: success: type: boolean example: true message: type: string example: 'Login successful' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Coach User' email: type: string example: coach@ruhline.com roles: type: array example: - coach items: type: string token: type: string example: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 422: description: '' content: application/json: schema: type: object example: success: false message: 'This account is not authorized to access the coach portal.' errors: email: - 'This account is not authorized to access the coach portal.' properties: success: type: boolean example: false message: type: string example: 'This account is not authorized to access the coach portal.' errors: type: object properties: email: type: array example: - 'This account is not authorized to access the coach portal.' items: type: string tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'The coach email address.' example: coach@ruhline.com password: type: string description: 'The coach password.' example: password required: - email - password security: [] /api/v1/auth/coach/forgot-password: post: summary: 'Forgot password (coach)' operationId: forgotPasswordcoach description: '' parameters: [] responses: { } tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The customer's email address. Must be a valid email address. The email of an existing record in the users table." example: john.doe@example.com required: - email security: [] /api/v1/auth/coach/reset-password: post: summary: 'Reset password (coach)' operationId: resetPasswordcoach description: '' parameters: [] responses: { } tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'The password reset token from the email.' example: abc123... email: type: string description: "The customer's email address. Must be a valid email address. The email of an existing record in the users table." example: john.doe@example.com password: type: string description: 'The new password. Must be at least 8 characters.' example: newpassword123 required: - token - email - password security: [] /api/v1/auth/coach/email/verify: post: summary: 'Verify coach email (POST)' operationId: verifyCoachEmailPOST description: '' parameters: [] responses: { } tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: id: type: integer description: 'The user ID from the verification link. The id of an existing record in the users table.' example: 1 hash: type: string description: 'The verification hash from the email link.' example: abc123... expires: type: integer description: 'The expiration timestamp from the verification link.' example: 1234567890 signature: type: string description: 'The signature from the verification link.' example: xyz789... required: - id - hash - expires - signature security: [] '/api/v1/auth/coach/email/verify/{id}/{hash}': get: summary: 'Verify coach email (GET)' operationId: verifyCoachEmailGET description: '' parameters: [] responses: 403: description: '' content: application/json: schema: type: object example: message: 'Invalid signature.' properties: message: type: string example: 'Invalid signature.' tags: - 'Coach Authentication' security: [] parameters: - in: path name: id description: 'The ID of the verify.' example: architecto required: true schema: type: string - in: path name: hash description: '' example: architecto required: true schema: type: string /api/v1/auth/coach/email/resend-verification: post: summary: 'Resend coach email verification' operationId: resendCoachEmailVerification description: '' parameters: [] responses: { } tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The customer's email address. Must be a valid email address. The email of an existing record in the users table." example: john.doe@example.com required: - email security: [] /api/v1/auth/coach/logout: post: summary: 'Logout coach' operationId: logoutCoach description: 'Revoke the current access token and log out the authenticated coach user.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Logged out successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Logged out successfully' data: type: array example: [] tags: - 'Coach Authentication' /api/v1/auth/coach/me: get: summary: 'Get coach profile' operationId: getCoachProfile description: "Get the authenticated coach user's profile information." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile retrieved successfully' data: user: id: 1 name: 'Coach User' email: coach@ruhline.com email_verified_at: null roles: - coach properties: success: type: boolean example: true message: type: string example: 'Profile retrieved successfully' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Coach User' email: type: string example: coach@ruhline.com email_verified_at: type: string example: null nullable: true roles: type: array example: - coach items: type: string tags: - 'Coach Authentication' /api/v1/auth/coach/change-password: post: summary: 'Change password' operationId: changePassword description: "Change the authenticated coach's password. The coach must provide their current password for verification." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password changed successfully' data: message: 'Your password has been changed successfully.' properties: success: type: boolean example: true message: type: string example: 'Password changed successfully' data: type: object properties: message: type: string example: 'Your password has been changed successfully.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'The given data was invalid.' errors: current_password: - 'The current password is incorrect.' properties: success: type: boolean example: false message: type: string example: 'The given data was invalid.' errors: type: object properties: current_password: type: array example: - 'The current password is incorrect.' items: type: string tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: current_password: type: string description: "The coach's current password." example: oldpassword123 password: type: string description: 'The new password. Must be at least 8 characters.' example: newpassword123 password_confirmation: type: string description: 'Password confirmation. Must match password.' example: newpassword123 required: - current_password - password - password_confirmation /api/v1/auth/coach/update-profile: post: summary: 'Update coach profile' operationId: updateCoachProfile description: "Update the authenticated coach's profile. All fields are optional; only provided fields are updated.\nSupports: first_name, last_name, email, phone, phone_country_code_id, coach_type, address fields, profile_image." parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n \"success\": true,\n \"message\": \"Profile updated successfully\",\n \"data\": { \"user\": { \"id\": 1, \"name\": \"John Doe\", \"email\": \"coach@example.com\", \"profile\": { ... } } }\n}" 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 422: description: '' content: text/plain: schema: type: string example: '{ "success": false, "message": "Validation failed", "errors": { ... } }' tags: - 'Coach Authentication' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "Optional. The coach's first name." example: John last_name: type: string description: "Optional. The coach's last name." example: Doe email: type: string description: "Optional. The coach's email. Must be unique." example: coach@example.com phone: type: string description: 'Optional. Phone number.' example: '1234567890' nullable: true phone_country_code_id: type: integer description: 'Optional. ID of phone country code.' example: 1 nullable: true coach_type: type: string description: 'Optional. One of: Mentor, Yoga Trainer.' example: Mentor nullable: true address_line_1: type: string description: 'Optional. Primary address line.' example: '123 Main St' nullable: true address_line_2: type: string description: 'Optional. Secondary address line.' example: 'Apt 4B' nullable: true landmark: type: string description: 'Optional. Landmark.' example: 'Near Central Park' nullable: true country_id: type: integer description: 'Optional. Country ID.' example: 1 nullable: true state_id: type: integer description: 'Optional. State ID.' example: 1 nullable: true city_id: type: integer description: 'Optional. City ID.' example: 1 nullable: true postal_code: type: string description: 'Optional. Postal code.' example: '12345' nullable: true profile_image: type: string format: binary description: 'Optional. Profile image (jpeg, png, jpg, gif, max 2MB).' nullable: true /api/v1/auth/coach/payment-details: get: summary: 'Get coach payment details.' operationId: getCoachPaymentDetails description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach Authentication' put: summary: 'Update coach payment details.' operationId: updateCoachPaymentDetails description: '' parameters: [] responses: { } tags: - 'Coach Authentication' requestBody: required: true content: application/json: schema: type: object properties: account_number: type: string description: 'Auto-generated from validation rules for `account_number`. Must not be greater than 100 characters.' example: b country: type: string description: 'Auto-generated from validation rules for `country`. Must not be greater than 100 characters.' example: 'n' bank_name: type: string description: 'Auto-generated from validation rules for `bank_name`. Must not be greater than 255 characters.' example: g account_holder_name: type: string description: 'Auto-generated from validation rules for `account_holder_name`. Must not be greater than 255 characters.' example: z swiss_code: type: string description: 'Auto-generated from validation rules for `swiss_code`. Must not be greater than 100 characters.' example: m required: - account_number - country - bank_name - account_holder_name - swiss_code /api/v1/checkout/webhook/stripe: post: summary: '' operationId: postApiV1CheckoutWebhookStripe description: '' parameters: [] responses: { } tags: - 'Checkout (Customer)' security: [] /api/v1/checkout/preview: post: summary: '' operationId: postApiV1CheckoutPreview description: '' parameters: [] responses: { } tags: - 'Checkout (Customer)' requestBody: required: true content: application/json: schema: type: object properties: program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. The id of an existing record in the programs table.' example: 16 coach_id: type: integer description: 'Auto-generated from validation rules for `coach_id`. The id of an existing record in the coaches table.' example: 16 slot_start_at: type: string description: 'Auto-generated from validation rules for `slot_start_at`. Must be a valid date.' example: '2026-04-25T17:16:45' coupon_code: type: string description: 'Auto-generated from validation rules for `coupon_code`. Must not be greater than 50 characters.' example: 'n' nullable: true timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Antarctica/Rothera required: - program_id - coach_id - slot_start_at security: [] /api/v1/checkout/create-session: post: summary: '' operationId: postApiV1CheckoutCreateSession description: '' parameters: [] responses: { } tags: - 'Checkout (Customer)' requestBody: required: true content: application/json: schema: type: object properties: program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. The id of an existing record in the programs table.' example: 16 coach_id: type: integer description: 'Auto-generated from validation rules for `coach_id`. The id of an existing record in the coaches table.' example: 16 slot_start_at: type: string description: 'Auto-generated from validation rules for `slot_start_at`. Must be a valid date.' example: '2026-04-25T17:16:45' coupon_code: type: string description: 'Auto-generated from validation rules for `coupon_code`. Must not be greater than 50 characters.' example: 'n' nullable: true timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Antarctica/Rothera success_url: type: string description: 'Auto-generated from validation rules for `success_url`. Must be a valid URL.' example: 'http://www.okuneva.com/fugiat-sunt-nihil-accusantium-harum-mollitia.html' cancel_url: type: string description: 'Auto-generated from validation rules for `cancel_url`. Must be a valid URL.' example: 'http://www.considine.com/provident-perspiciatis-quo-omnis-nostrum-aut-adipisci-quidem' required: - program_id - coach_id - slot_start_at - success_url - cancel_url security: [] /api/v1/checkout/orders: get: summary: '' operationId: getApiV1CheckoutOrders description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Checkout (Customer)' requestBody: required: false content: application/json: schema: type: object properties: status: type: string description: '' example: architecto nullable: true payment_status: type: string description: '' example: architecto nullable: true per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 security: [] '/api/v1/checkout/order/{orderId}': get: summary: '' operationId: getApiV1CheckoutOrderOrderId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Checkout (Customer)' security: [] parameters: - in: path name: orderId description: '' example: architecto required: true schema: type: string /api/v1/checkout/sessions/upcoming: get: summary: '' operationId: getApiV1CheckoutSessionsUpcoming description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Checkout (Customer)' security: [] /api/v1/customer/enrollments: get: summary: '' operationId: getApiV1CustomerEnrollments description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollments' requestBody: required: false content: application/json: schema: type: object properties: occurrence_type: type: string description: '' example: architecto enrollment_status: type: string description: '' example: architecto per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 security: [] '/api/v1/customer/enrollments/{enrollmentId}': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollments' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdSessions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollments' requestBody: required: false content: application/json: schema: type: object properties: session_ui_phase: type: string description: '' example: architecto per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions/{sessionId}/available-slots': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdSessionsSessionIdAvailableSlots description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollments' requestBody: required: true content: application/json: schema: type: object properties: date: type: string description: 'Auto-generated from validation rules for `date`. Must be a valid date in the format Y-m-d.' example: '2026-04-25' timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Asia/Yekaterinburg required: - date security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions/{sessionId}/schedule': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdSessionsSessionIdSchedule description: '' parameters: [] responses: { } tags: - 'Customer - Enrollments' requestBody: required: true content: application/json: schema: type: object properties: slot_start_at: type: string description: 'Auto-generated from validation rules for `slot_start_at`. Must be a valid date.' example: '2026-04-25T17:16:47' timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Asia/Yekaterinburg required: - slot_start_at security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions/{sessionId}/reschedule': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdSessionsSessionIdReschedule description: '' parameters: [] responses: { } tags: - 'Customer - Enrollments' requestBody: required: true content: application/json: schema: type: object properties: slot_start_at: type: string description: 'Auto-generated from validation rules for `slot_start_at`. Must be a valid date.' example: '2026-04-25T17:16:47' timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Asia/Yekaterinburg required: - slot_start_at security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions/{sessionId}/cancel': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdSessionsSessionIdCancel description: '' parameters: [] responses: { } tags: - 'Customer - Enrollments' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/sessions/{sessionId}/video-token': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdSessionsSessionIdVideoToken description: '' parameters: [] responses: { } tags: - 'Customer - Enrollments' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string /api/v1/dispute/form-options: get: summary: '' operationId: getApiV1DisputeFormOptions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Disputes' security: [] /api/v1/dispute: get: summary: '' operationId: getApiV1Dispute description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Disputes' security: [] post: summary: '' operationId: postApiV1Dispute description: '' parameters: [] responses: { } tags: - 'Customer - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_coach enum: - issue_with_program - issue_with_coach - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. The id of an existing record in the programs table.' example: 16 nullable: true coach_id: type: integer description: 'Auto-generated from validation rules for `coach_id`. The id of an existing record in the coaches table.' example: 16 nullable: true checkout_order_id: type: integer description: 'Auto-generated from validation rules for `checkout_order_id`. The id of an existing record in the checkout_orders table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] '/api/v1/dispute/{id}': get: summary: '' operationId: getApiV1DisputeId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Disputes' security: [] put: summary: '' operationId: putApiV1DisputeId description: '' parameters: [] responses: { } tags: - 'Customer - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_program enum: - issue_with_program - issue_with_coach - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. The id of an existing record in the programs table.' example: 16 nullable: true coach_id: type: integer description: 'Auto-generated from validation rules for `coach_id`. The id of an existing record in the coaches table.' example: 16 nullable: true checkout_order_id: type: integer description: 'Auto-generated from validation rules for `checkout_order_id`. The id of an existing record in the checkout_orders table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] patch: summary: '' operationId: patchApiV1DisputeId description: '' parameters: [] responses: { } tags: - 'Customer - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_program enum: - issue_with_program - issue_with_coach - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. The id of an existing record in the programs table.' example: 16 nullable: true coach_id: type: integer description: 'Auto-generated from validation rules for `coach_id`. The id of an existing record in the coaches table.' example: 16 nullable: true checkout_order_id: type: integer description: 'Auto-generated from validation rules for `checkout_order_id`. The id of an existing record in the checkout_orders table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] delete: summary: '' operationId: deleteApiV1DisputeId description: '' parameters: [] responses: { } tags: - 'Customer - Disputes' security: [] parameters: - in: path name: id description: 'The ID of the dispute.' example: architecto required: true schema: type: string /api/v1/customer/reviews: get: summary: '' operationId: getApiV1CustomerReviews description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Program Reviews' requestBody: required: false content: application/json: schema: type: object properties: per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 1 page: type: integer description: 'Must be at least 1.' example: 22 security: [] post: summary: '' operationId: postApiV1CustomerReviews description: '' parameters: [] responses: { } tags: - 'Customer - Program Reviews' requestBody: required: true content: application/json: schema: type: object properties: program_enrollment_id: type: integer description: 'Auto-generated from validation rules for `program_enrollment_id`. The id of an existing record in the program_enrollments table.' example: 16 rating: type: integer description: 'Auto-generated from validation rules for `rating`. Must be at least 1. Must not be greater than 5.' example: 2 body: type: string description: 'Auto-generated from validation rules for `body`. Must be at least 1 character. Must not be greater than 5000 characters.' example: g required: - program_enrollment_id - rating - body security: [] '/api/v1/customer/reviews/{reviewId}': put: summary: '' operationId: putApiV1CustomerReviewsReviewId description: '' parameters: [] responses: { } tags: - 'Customer - Program Reviews' requestBody: required: false content: application/json: schema: type: object properties: rating: type: integer description: 'Auto-generated from validation rules for `rating`. Must be at least 1. Must not be greater than 5.' example: 1 body: type: string description: 'Auto-generated from validation rules for `body`. Must be at least 1 character. Must not be greater than 5000 characters.' example: 'n' security: [] delete: summary: '' operationId: deleteApiV1CustomerReviewsReviewId description: '' parameters: [] responses: { } tags: - 'Customer - Program Reviews' security: [] parameters: - in: path name: reviewId description: '' example: architecto required: true schema: type: string /api/v1/programs: get: summary: 'List programs (optional filter by active category).' operationId: listProgramsoptionalFilterByActiveCategory description: '' parameters: - in: query name: page description: '' example: 1 required: false schema: type: integer description: '' example: 1 - in: query name: per_page description: '' example: 15 required: false schema: type: integer description: '' example: 15 - in: query name: program_category_id description: 'optional Only programs in this category (must be active).' example: 2 required: false schema: type: integer description: 'optional Only programs in this category (must be active).' example: 2 responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program category not found or inactive.' properties: success: type: boolean example: false message: type: string example: 'Program category not found or inactive.' tags: - 'Programs (Guest / no auth)' security: [] '/api/v1/programs/category/{categoryId}': get: summary: 'List programs in a specific active category.' operationId: listProgramsInASpecificActiveCategory description: '' parameters: - in: query name: page description: '' example: 1 required: false schema: type: integer description: '' example: 1 - in: query name: per_page description: '' example: 15 required: false schema: type: integer description: '' example: 15 responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program category not found or inactive.' properties: success: type: boolean example: false message: type: string example: 'Program category not found or inactive.' tags: - 'Programs (Guest / no auth)' security: [] parameters: - in: path name: categoryId description: '' example: 1 required: true schema: type: integer '/api/v1/programs/{id}/facilitators': get: summary: 'List facilitators (coaches) assigned to one visible program.' operationId: listFacilitatorscoachesAssignedToOneVisibleProgram description: '' parameters: - in: query name: page description: '' example: 1 required: false schema: type: integer description: '' example: 1 - in: query name: per_page description: '' example: 15 required: false schema: type: integer description: '' example: 15 - in: query name: coach_type description: 'optional Filter: Mentor or Yoga Trainer.' example: Mentor required: false schema: type: string description: 'optional Filter: Mentor or Yoga Trainer.' example: Mentor responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program not found or unavailable.' properties: success: type: boolean example: false message: type: string example: 'Program not found or unavailable.' tags: - 'Programs (Guest / no auth)' security: [] parameters: - in: path name: id description: '' example: 1 required: true schema: type: integer '/api/v1/programs/{id}/facilitators/{coachId}/slots': get: summary: 'List available slots for one facilitator on one date.' operationId: listAvailableSlotsForOneFacilitatorOnOneDate description: '' parameters: - in: query name: date description: 'Date in YYYY-MM-DD.' example: '2026-04-10' required: true schema: type: string description: 'Date in YYYY-MM-DD.' example: '2026-04-10' - in: query name: timezone description: 'optional IANA timezone name. Defaults to UTC.' example: Asia/Kolkata required: false schema: type: string description: 'optional IANA timezone name. Defaults to UTC.' example: Asia/Kolkata responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program not found or unavailable.' properties: success: type: boolean example: false message: type: string example: 'Program not found or unavailable.' tags: - 'Programs (Guest / no auth)' requestBody: required: true content: application/json: schema: type: object properties: date: type: string description: 'Auto-generated from validation rules for `date`. Must be a valid date in the format Y-m-d.' example: '2026-04-25' timezone: type: string description: 'Auto-generated from validation rules for `timezone`. Must be a valid time zone, such as Africa/Accra.' example: Asia/Yekaterinburg required: - date security: [] parameters: - in: path name: id description: 'Program ID.' example: 1 required: true schema: type: integer - in: path name: coachId description: 'Coach ID assigned to this program.' example: 3 required: true schema: type: integer '/api/v1/programs/{id}': get: summary: 'Program detail (marketing content only; no structure/modules).' operationId: programDetailmarketingContentOnlyNoStructuremodules description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program not found or unavailable.' properties: success: type: boolean example: false message: type: string example: 'Program not found or unavailable.' tags: - 'Programs (Guest / no auth)' security: [] parameters: - in: path name: id description: '' example: 1 required: true schema: type: integer /api/v1/coaches: get: summary: 'List coaches visible on the public directory.' operationId: listCoachesVisibleOnThePublicDirectory description: '' parameters: - in: query name: page description: '' example: 1 required: false schema: type: integer description: '' example: 1 - in: query name: per_page description: '' example: 15 required: false schema: type: integer description: '' example: 15 - in: query name: coach_type description: 'optional Filter: `Mentor` or `Yoga Trainer`.' example: Mentor required: false schema: type: string description: 'optional Filter: `Mentor` or `Yoga Trainer`.' example: Mentor responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coaches retrieved successfully' data: data: [] links: first: 'https://ruhline-api.test/api/v1/coaches?page=1' last: 'https://ruhline-api.test/api/v1/coaches?page=1' prev: null next: null meta: current_page: 1 from: null last_page: 1 links: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/coaches?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false path: 'https://ruhline-api.test/api/v1/coaches' per_page: 15 to: null total: 0 properties: success: type: boolean example: true message: type: string example: 'Coaches retrieved successfully' data: type: object properties: data: type: array example: [] links: type: object properties: first: type: string example: 'https://ruhline-api.test/api/v1/coaches?page=1' last: type: string example: 'https://ruhline-api.test/api/v1/coaches?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: string example: null nullable: true last_page: type: integer example: 1 links: type: array example: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/coaches?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Previous' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: 'https://ruhline-api.test/api/v1/coaches' per_page: type: integer example: 15 to: type: string example: null nullable: true total: type: integer example: 0 tags: - 'Coaches (Guest / no auth)' security: [] /api/v1/program: get: summary: 'List programs assigned to the authenticated coach.' operationId: listProgramsAssignedToTheAuthenticatedCoach description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Programs' security: [] '/api/v1/program/{programId}': get: summary: 'Get details of one program assigned to the authenticated coach.' operationId: getDetailsOfOneProgramAssignedToTheAuthenticatedCoach description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Programs' security: [] parameters: - in: path name: programId description: 'The ID of the program.' example: 1 required: true schema: type: integer '/api/v1/program/{programId}/availability': get: summary: 'Get coach availability and time-off for an assigned program.' operationId: getCoachAvailabilityAndTimeOffForAnAssignedProgram description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Availability' security: [] put: summary: 'Replace coach availability rules for one assigned program.' operationId: replaceCoachAvailabilityRulesForOneAssignedProgram description: '' parameters: [] responses: { } tags: - 'Coach - Program Availability' requestBody: required: true content: application/json: schema: type: object properties: rules: type: array description: 'Auto-generated from validation rules for `rules`.' example: - [] items: type: object properties: day_of_week: type: integer description: 'Auto-generated from validation rules for `rules.*.day_of_week`. Must be at least 0. Must not be greater than 6.' example: 4 start_time: type: string description: 'Auto-generated from validation rules for `rules.*.start_time`. Must be a valid date in the format H:i.' example: '17:16' end_time: type: string description: 'Auto-generated from validation rules for `rules.*.end_time`. Must be a valid date in the format H:i.' example: '17:16' effective_from: type: string description: 'Auto-generated from validation rules for `rules.*.effective_from`. Must be a valid date in the format Y-m-d.' example: '2026-04-25' effective_to: type: string description: 'Auto-generated from validation rules for `rules.*.effective_to`. Must be a valid date in the format Y-m-d. Must be a date after or equal to rules.*.effective_from.' example: '2052-05-18' nullable: true is_active: type: boolean description: 'Auto-generated from validation rules for `rules.*.is_active`.' example: true required: - day_of_week - start_time - end_time - effective_from required: - rules security: [] patch: summary: 'Replace coach availability rules for one assigned program.' operationId: replaceCoachAvailabilityRulesForOneAssignedProgram description: '' parameters: [] responses: { } tags: - 'Coach - Program Availability' requestBody: required: true content: application/json: schema: type: object properties: rules: type: array description: 'Auto-generated from validation rules for `rules`.' example: - [] items: type: object properties: day_of_week: type: integer description: 'Auto-generated from validation rules for `rules.*.day_of_week`. Must be at least 0. Must not be greater than 6.' example: 4 start_time: type: string description: 'Auto-generated from validation rules for `rules.*.start_time`. Must be a valid date in the format H:i.' example: '17:16' end_time: type: string description: 'Auto-generated from validation rules for `rules.*.end_time`. Must be a valid date in the format H:i.' example: '17:16' effective_from: type: string description: 'Auto-generated from validation rules for `rules.*.effective_from`. Must be a valid date in the format Y-m-d.' example: '2026-04-25' effective_to: type: string description: 'Auto-generated from validation rules for `rules.*.effective_to`. Must be a valid date in the format Y-m-d. Must be a date after or equal to rules.*.effective_from.' example: '2052-05-18' nullable: true is_active: type: boolean description: 'Auto-generated from validation rules for `rules.*.is_active`.' example: false required: - day_of_week - start_time - end_time - effective_from required: - rules security: [] parameters: - in: path name: programId description: 'The ID of the assigned program.' example: 1 required: true schema: type: integer '/api/v1/program/{programId}/time-off': post: summary: 'Add a time-off block for one assigned program.' operationId: addATimeOffBlockForOneAssignedProgram description: '' parameters: [] responses: { } tags: - 'Coach - Program Availability' requestBody: required: true content: application/json: schema: type: object properties: start_at: type: string description: 'Auto-generated from validation rules for `start_at`. Must be a valid date.' example: '2026-04-25T17:16:46' end_at: type: string description: 'Auto-generated from validation rules for `end_at`. Must be a valid date. Must be a date after start_at.' example: '2052-05-18' reason: type: string description: 'Auto-generated from validation rules for `reason`. Must not be greater than 500 characters.' example: 'n' nullable: true required: - start_at - end_at security: [] parameters: - in: path name: programId description: 'The ID of the assigned program.' example: 1 required: true schema: type: integer '/api/v1/program/{programId}/time-off/{timeOffId}': delete: summary: 'Delete one time-off block for an assigned program.' operationId: deleteOneTimeOffBlockForAnAssignedProgram description: '' parameters: [] responses: { } tags: - 'Coach - Program Availability' security: [] parameters: - in: path name: programId description: 'The ID of the assigned program.' example: 1 required: true schema: type: integer - in: path name: timeOffId description: 'The ID of the time-off block.' example: 5 required: true schema: type: integer '/api/v1/program/{programId}/structure': get: summary: "List program structure for a coach, including flags\nabout whether each module can be edited and whether a\ncoach-specific copy exists." operationId: listProgramStructureForACoachIncludingFlagsAboutWhetherEachModuleCanBeEditedAndWhetherACoachSpecificCopyExists description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/quote': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdQuote description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/goal-settings-module': get: summary: 'Goal Settings module has no extra configuration; coaches get metadata only.' operationId: goalSettingsModuleHasNoExtraConfigurationCoachesGetMetadataOnly description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/habit-tracker-module': get: summary: 'Habit Tracker module has no extra configuration; coaches get metadata only.' operationId: habitTrackerModuleHasNoExtraConfigurationCoachesGetMetadataOnly description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/card-game/question-sets': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdCardGameQuestionSets description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/card-game/question-sets/{setId}/questions': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdCardGameQuestionSetsSetIdQuestions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/card-game/cards': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdCardGameCards description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/intermediate-values': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdIntermediateValues description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/intermediate-eight-most-common-mistakes': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdIntermediateEightMostCommonMistakes description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/intermediate-goal-settings': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdIntermediateGoalSettings description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/intermediate-questions-goal-why': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdIntermediateQuestionsGoalWhy description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/intermediate-y-method': get: summary: '' operationId: getApiV1ProgramProgramIdStructureStructureIdIntermediateYMethod description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/words': get: summary: 'List words for a Find your Motivation module.' operationId: listWordsForAFindYourMotivationModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Create a coach-specific word (clones coach copy on first write).' operationId: createACoachSpecificWordclonesCoachCopyOnFirstWrite description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Must not be greater than 255 characters.' example: b required: - word security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/words/{wordId}': put: summary: 'Update a coach-specific word.' operationId: updateACoachSpecificWord description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Must not be greater than 255 characters.' example: b required: - word security: [] patch: summary: 'Update a coach-specific word.' operationId: updateACoachSpecificWord description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Must not be greater than 255 characters.' example: b required: - word security: [] delete: summary: 'Delete a coach-specific word.' operationId: deleteACoachSpecificWord description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: wordId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/words/reorder': put: summary: 'Reorder coach-specific words.' operationId: reorderCoachSpecificWords description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach-specific words.' operationId: reorderCoachSpecificWords description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/values/questions': get: summary: "List Values questions for a coach (program defaults or\ncoach copy, depending on whether a copy exists)." operationId: listValuesQuestionsForACoachprogramDefaultsOrCoachCopyDependingOnWhetherACopyExists description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Create a coach-specific Values question (clones on first write).' operationId: createACoachSpecificValuesQuestionclonesOnFirstWrite description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/values/questions/{questionId}': put: summary: 'Update a coach-specific Values question.' operationId: updateACoachSpecificValuesQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] patch: summary: 'Update a coach-specific Values question.' operationId: updateACoachSpecificValuesQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] delete: summary: 'Delete a coach-specific Values question.' operationId: deleteACoachSpecificValuesQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/values/questions/reorder': put: summary: 'Reorder coach-specific Values questions.' operationId: reorderCoachSpecificValuesQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach-specific Values questions.' operationId: reorderCoachSpecificValuesQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/who-am-i/questions': get: summary: 'List Who am I questions for a coach.' operationId: listWhoAmIQuestionsForACoach description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Create a coach-specific Who am I question.' operationId: createACoachSpecificWhoAmIQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/who-am-i/questions/{questionId}': put: summary: 'Update a coach-specific Who am I question.' operationId: updateACoachSpecificWhoAmIQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] patch: summary: 'Update a coach-specific Who am I question.' operationId: updateACoachSpecificWhoAmIQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] delete: summary: 'Delete a coach-specific Who am I question.' operationId: deleteACoachSpecificWhoAmIQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/who-am-i/questions/reorder': put: summary: 'Reorder coach-specific Who am I questions.' operationId: reorderCoachSpecificWhoAmIQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach-specific Who am I questions.' operationId: reorderCoachSpecificWhoAmIQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements': get: summary: 'List life elements for a coach Wheel of Life module.' operationId: listLifeElementsForACoachWheelOfLifeModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Add a life element to a coach-specific Wheel of Life module.' operationId: addALifeElementToACoachSpecificWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b required: - name security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements/{elementId}': put: summary: 'Update a coach-specific life element.' operationId: updateACoachSpecificLifeElement description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b required: - name security: [] patch: summary: 'Update a coach-specific life element.' operationId: updateACoachSpecificLifeElement description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b required: - name security: [] delete: summary: 'Delete a coach-specific life element.' operationId: deleteACoachSpecificLifeElement description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements/reorder': put: summary: 'Reorder coach-specific life elements.' operationId: reorderCoachSpecificLifeElements description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach-specific life elements.' operationId: reorderCoachSpecificLifeElements description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions': get: summary: 'List questions for a coach Wheel of Life element.' operationId: listQuestionsForACoachWheelOfLifeElement description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Add a question to a coach-specific Wheel of Life element.' operationId: addAQuestionToACoachSpecificWheelOfLifeElement description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions/{questionId}': put: summary: 'Update a coach-specific Wheel of Life question.' operationId: updateACoachSpecificWheelOfLifeQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] patch: summary: 'Update a coach-specific Wheel of Life question.' operationId: updateACoachSpecificWheelOfLifeQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: null question_text: type: string description: 'Must not be greater than 2000 characters.' example: b options: type: array description: 'Must not be greater than 500 characters.' example: - 'n' items: type: string required: - question_text security: [] delete: summary: 'Delete a coach-specific Wheel of Life question.' operationId: deleteACoachSpecificWheelOfLifeQuestion description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions/reorder': put: summary: 'Reorder coach-specific Wheel of Life questions.' operationId: reorderCoachSpecificWheelOfLifeQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach-specific Wheel of Life questions.' operationId: reorderCoachSpecificWheelOfLifeQuestions description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/upload-documents': get: summary: 'List upload documents for a coach.' operationId: listUploadDocumentsForACoach description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Program Structure' security: [] post: summary: 'Upload one or more documents to an Upload Documents module.' operationId: uploadOneOrMoreDocumentsToAnUploadDocumentsModule description: "Single file: multipart field \"file\" (optional \"original_name\").\nMultiple files: multipart field \"files[]\" (array of files)." parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Must be a file. Must not be greater than 20480 kilobytes.' nullable: true files: type: array description: 'Must be a file. Must not be greater than 20480 kilobytes.' items: type: string format: binary original_name: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/upload-documents/{documentId}': put: summary: "Update a coach document's original name." operationId: updateACoachDocumentsOriginalName description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: original_name: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true security: [] patch: summary: "Update a coach document's original name." operationId: updateACoachDocumentsOriginalName description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: original_name: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true security: [] delete: summary: 'Delete a coach document (and remove its file from storage).' operationId: deleteACoachDocumentandRemoveItsFileFromStorage description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: documentId description: '' example: architecto required: true schema: type: string '/api/v1/program/{programId}/structure/{structureId}/upload-documents/reorder': put: summary: 'Reorder coach documents.' operationId: reorderCoachDocuments description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: 'Reorder coach documents.' operationId: reorderCoachDocuments description: '' parameters: [] responses: { } tags: - 'Coach - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: programId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string /api/v1/coach/dispute/form-options: get: summary: '' operationId: getApiV1CoachDisputeFormOptions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Disputes' security: [] /api/v1/coach/dispute: get: summary: '' operationId: getApiV1CoachDispute description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Disputes' security: [] post: summary: '' operationId: postApiV1CoachDispute description: '' parameters: [] responses: { } tags: - 'Coach - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_payments enum: - issue_with_program - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. This field is required when category is issue_with_program. The id of an existing record in the programs table.' example: 16 nullable: true payout_id: type: integer description: 'Auto-generated from validation rules for `payout_id`. This field is required when category is issue_with_payments. The id of an existing record in the payouts table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] '/api/v1/coach/dispute/{id}': get: summary: '' operationId: getApiV1CoachDisputeId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Disputes' security: [] put: summary: '' operationId: putApiV1CoachDisputeId description: '' parameters: [] responses: { } tags: - 'Coach - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_payments enum: - issue_with_program - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. This field is required when category is issue_with_program. The id of an existing record in the programs table.' example: 16 nullable: true payout_id: type: integer description: 'Auto-generated from validation rules for `payout_id`. This field is required when category is issue_with_payments. The id of an existing record in the payouts table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] patch: summary: '' operationId: patchApiV1CoachDisputeId description: '' parameters: [] responses: { } tags: - 'Coach - Disputes' requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Auto-generated from validation rules for `subject`. Must not be greater than 255 characters.' example: b category: type: string description: 'Auto-generated from validation rules for `category`.' example: issue_with_payments enum: - issue_with_program - issue_with_payments description: type: string description: 'Auto-generated from validation rules for `description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' program_id: type: integer description: 'Auto-generated from validation rules for `program_id`. This field is required when category is issue_with_program. The id of an existing record in the programs table.' example: 16 nullable: true payout_id: type: integer description: 'Auto-generated from validation rules for `payout_id`. This field is required when category is issue_with_payments. The id of an existing record in the payouts table.' example: 16 nullable: true attachments: type: array description: 'Auto-generated from validation rules for `attachments.*`. Must be a file. Must not be greater than 250 kilobytes.' items: type: string format: binary required: - subject - category - description security: [] delete: summary: '' operationId: deleteApiV1CoachDisputeId description: '' parameters: [] responses: { } tags: - 'Coach - Disputes' security: [] parameters: - in: path name: id description: 'The ID of the dispute.' example: architecto required: true schema: type: string /api/v1/payout: get: summary: '' operationId: getApiV1Payout description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Payouts' security: [] /api/v1/admin/about-page: get: summary: 'Get about page data (admin)' operationId: getAboutPageDataadmin description: 'Returns the full about page content for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - About Page (CMS)' security: [] put: summary: 'Update about page' operationId: updateAboutPage description: "Update section 01, mission/vision/values, and founder. All sections are optional.\nUse multipart/form-data for image uploads." parameters: [] responses: { } tags: - 'Admin - About Page (CMS)' requestBody: required: false content: application/json: schema: type: object properties: section_one: type: array description: 'optional Section 01 (About Us).' example: - architecto items: type: string nullable: true mission_vision_values: type: array description: 'optional Array of { type, title, description, icon } (type: mission, vision, values).' example: - architecto items: type: string nullable: true founder: type: array description: 'optional Section 03 (Our Founder).' example: - architecto items: type: string nullable: true security: [] patch: summary: 'Update about page' operationId: updateAboutPage description: "Update section 01, mission/vision/values, and founder. All sections are optional.\nUse multipart/form-data for image uploads." parameters: [] responses: { } tags: - 'Admin - About Page (CMS)' requestBody: required: false content: application/json: schema: type: object properties: section_one: type: array description: 'optional Section 01 (About Us).' example: - architecto items: type: string nullable: true mission_vision_values: type: array description: 'optional Array of { type, title, description, icon } (type: mission, vision, values).' example: - architecto items: type: string nullable: true founder: type: array description: 'optional Section 03 (Our Founder).' example: - architecto items: type: string nullable: true security: [] /api/v1/about-page: get: summary: 'Get about page' operationId: getAboutPage description: 'Returns Section 01 (About Us), Section 02 (Mission, Vision, Values), and Section 03 (Our Founder).' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'About page retrieved successfully' data: section_01: headline: null about_us_image: null secondary_headline: null description: null section_02: mission_vision_values: - id: 1 type: mission title: Mission description: null icon: null - id: 2 type: vision title: Vision description: null icon: null - id: 3 type: values title: Values description: null icon: null section_03: headline: null secondary_headline: null image: null description: null updated_at: '2026-04-25T17:05:01+00:00' properties: success: type: boolean example: true message: type: string example: 'About page retrieved successfully' data: type: object properties: section_01: type: object properties: headline: type: string example: null nullable: true about_us_image: type: string example: null nullable: true secondary_headline: type: string example: null nullable: true description: type: string example: null nullable: true section_02: type: object properties: mission_vision_values: type: array example: - id: 1 type: mission title: Mission description: null icon: null - id: 2 type: vision title: Vision description: null icon: null - id: 3 type: values title: Values description: null icon: null items: type: object properties: id: type: integer example: 1 type: type: string example: mission title: type: string example: Mission description: type: string example: null nullable: true icon: type: string example: null nullable: true section_03: type: object properties: headline: type: string example: null nullable: true secondary_headline: type: string example: null nullable: true image: type: string example: null nullable: true description: type: string example: null nullable: true updated_at: type: string example: '2026-04-25T17:05:01+00:00' tags: - 'About Page (Public)' security: [] /api/v1/admin/article/article-category: get: summary: 'Get list of article categories (with articles count)' operationId: getListOfArticleCategorieswithArticlesCount description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Article Category Management' security: [] post: summary: 'Create a new article category' operationId: createANewArticleCategory description: '' parameters: [] responses: { } tags: - 'Admin - Article Category Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The category name.' example: 'Fitness Tips' is_active: type: string description: 'optional "true" or "false". Default true.' example: 'true' nullable: true required: - name security: [] '/api/v1/admin/article/article-category/{id}': get: summary: 'Get a specific article category' operationId: getASpecificArticleCategory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Article Category Management' security: [] put: summary: 'Update an article category' operationId: updateAnArticleCategory description: '' parameters: [] responses: { } tags: - 'Admin - Article Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The category name.' example: architecto is_active: type: string description: 'optional "true" or "false".' example: architecto nullable: true security: [] patch: summary: 'Update an article category' operationId: updateAnArticleCategory description: '' parameters: [] responses: { } tags: - 'Admin - Article Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The category name.' example: architecto is_active: type: string description: 'optional "true" or "false".' example: architecto nullable: true security: [] delete: summary: 'Delete an article category' operationId: deleteAnArticleCategory description: '' parameters: [] responses: { } tags: - 'Admin - Article Category Management' security: [] parameters: - in: path name: id description: 'The ID of the article category.' example: 1 required: true schema: type: integer /api/v1/admin/article/article: get: summary: 'Get list of articles' operationId: getListOfArticles description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: article_category_id description: 'optional Filter by category.' example: 1 required: false schema: type: integer description: 'optional Filter by category.' example: 1 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Article Management' security: [] post: summary: 'Create a new article' operationId: createANewArticle description: '' parameters: [] responses: { } tags: - 'Admin - Article Management' requestBody: required: true content: multipart/form-data: schema: type: object properties: article_category_id: type: integer description: 'Article category ID.' example: 1 name: type: string description: 'Article name.' example: 'How to Stay Fit' thumbnail_image: type: string format: binary description: 'optional Thumbnail image.' nullable: true description: type: string description: 'optional Article description.' example: 'Eius et animi quos velit et.' nullable: true share_facebook: type: string description: 'optional "true" or "false". Default true.' example: architecto nullable: true share_twitter: type: string description: 'optional "true" or "false". Default true.' example: architecto nullable: true share_linkedin: type: string description: 'optional "true" or "false". Default true.' example: architecto nullable: true sections: type: array description: 'optional Array of sections. Each: image (file), image_position (left|right|center), heading, description, button, button_url, sort_order.' example: - architecto items: type: string nullable: true required: - article_category_id - name security: [] '/api/v1/admin/article/article/{id}': get: summary: 'Get a specific article' operationId: getASpecificArticle description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Article Management' security: [] post: summary: 'Update an article' operationId: updateAnArticle description: '' parameters: [] responses: { } tags: - 'Admin - Article Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: article_category_id: type: integer description: 'optional Article category ID.' example: 16 name: type: string description: 'optional Article name.' example: architecto thumbnail_image: type: string format: binary description: 'optional Thumbnail image.' nullable: true description: type: string description: 'optional Article description.' example: 'Eius et animi quos velit et.' nullable: true share_facebook: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_twitter: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_linkedin: type: string description: 'optional "true" or "false".' example: architecto nullable: true sections: type: array description: 'optional Full replacement of sections. Each: id (optional for existing), image (file), image_position, heading, description, button, button_url, sort_order.' example: - architecto items: type: string nullable: true security: [] put: summary: 'Update an article' operationId: updateAnArticle description: '' parameters: [] responses: { } tags: - 'Admin - Article Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: article_category_id: type: integer description: 'optional Article category ID.' example: 16 name: type: string description: 'optional Article name.' example: architecto thumbnail_image: type: string format: binary description: 'optional Thumbnail image.' nullable: true description: type: string description: 'optional Article description.' example: 'Eius et animi quos velit et.' nullable: true share_facebook: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_twitter: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_linkedin: type: string description: 'optional "true" or "false".' example: architecto nullable: true sections: type: array description: 'optional Full replacement of sections. Each: id (optional for existing), image (file), image_position, heading, description, button, button_url, sort_order.' example: - architecto items: type: string nullable: true security: [] patch: summary: 'Update an article' operationId: updateAnArticle description: '' parameters: [] responses: { } tags: - 'Admin - Article Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: article_category_id: type: integer description: 'optional Article category ID.' example: 16 name: type: string description: 'optional Article name.' example: architecto thumbnail_image: type: string format: binary description: 'optional Thumbnail image.' nullable: true description: type: string description: 'optional Article description.' example: 'Eius et animi quos velit et.' nullable: true share_facebook: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_twitter: type: string description: 'optional "true" or "false".' example: architecto nullable: true share_linkedin: type: string description: 'optional "true" or "false".' example: architecto nullable: true sections: type: array description: 'optional Full replacement of sections. Each: id (optional for existing), image (file), image_position, heading, description, button, button_url, sort_order.' example: - architecto items: type: string nullable: true security: [] delete: summary: 'Delete an article' operationId: deleteAnArticle description: '' parameters: [] responses: { } tags: - 'Admin - Article Management' security: [] parameters: - in: path name: id description: 'The ID of the article.' example: 1 required: true schema: type: integer /api/v1/article/article-category: get: summary: 'List active article categories (with articles count)' operationId: listActiveArticleCategorieswithArticlesCount description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Article categories retrieved successfully' data: data: [] links: first: 'https://ruhline-api.test/api/v1/article/article-category?page=1' last: 'https://ruhline-api.test/api/v1/article/article-category?page=1' prev: null next: null meta: current_page: 1 from: null last_page: 1 links: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/article/article-category?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false path: 'https://ruhline-api.test/api/v1/article/article-category' per_page: 15 to: null total: 0 properties: success: type: boolean example: true message: type: string example: 'Article categories retrieved successfully' data: type: object properties: data: type: array example: [] links: type: object properties: first: type: string example: 'https://ruhline-api.test/api/v1/article/article-category?page=1' last: type: string example: 'https://ruhline-api.test/api/v1/article/article-category?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: string example: null nullable: true last_page: type: integer example: 1 links: type: array example: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/article/article-category?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Previous' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: 'https://ruhline-api.test/api/v1/article/article-category' per_page: type: integer example: 15 to: type: string example: null nullable: true total: type: integer example: 0 tags: - 'Article Categories (Public)' security: [] '/api/v1/article/article-category/{id}': get: summary: 'Get a single active article category' operationId: getASingleActiveArticleCategory description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Article category not found.' properties: success: type: boolean example: false message: type: string example: 'Article category not found.' tags: - 'Article Categories (Public)' security: [] parameters: - in: path name: id description: 'The ID of the article category.' example: 1 required: true schema: type: integer /api/v1/article/article: get: summary: 'List articles' operationId: listArticles description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: article_category_id description: 'optional Filter by category.' example: 1 required: false schema: type: integer description: 'optional Filter by category.' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Articles retrieved successfully' data: data: [] links: first: 'https://ruhline-api.test/api/v1/article/article?page=1' last: 'https://ruhline-api.test/api/v1/article/article?page=1' prev: null next: null meta: current_page: 1 from: null last_page: 1 links: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/article/article?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false path: 'https://ruhline-api.test/api/v1/article/article' per_page: 15 to: null total: 0 properties: success: type: boolean example: true message: type: string example: 'Articles retrieved successfully' data: type: object properties: data: type: array example: [] links: type: object properties: first: type: string example: 'https://ruhline-api.test/api/v1/article/article?page=1' last: type: string example: 'https://ruhline-api.test/api/v1/article/article?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: string example: null nullable: true last_page: type: integer example: 1 links: type: array example: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/article/article?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Previous' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: 'https://ruhline-api.test/api/v1/article/article' per_page: type: integer example: 15 to: type: string example: null nullable: true total: type: integer example: 0 tags: - 'Articles (Public)' security: [] '/api/v1/article/article/{id}': get: summary: 'Get a single article' operationId: getASingleArticle description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Article not found.' properties: success: type: boolean example: false message: type: string example: 'Article not found.' tags: - 'Articles (Public)' security: [] parameters: - in: path name: id description: 'The ID of the article.' example: 1 required: true schema: type: integer /api/v1/admin/card-category/cards: get: summary: 'Get list of cards' operationId: getListOfCards description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: card_category_id description: 'optional Filter by card category.' example: 1 required: false schema: type: integer description: 'optional Filter by card category.' example: 1 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Card Management' security: [] post: summary: 'Create a new card' operationId: createANewCard description: '' parameters: [] responses: { } tags: - 'Admin - Card Management' requestBody: required: true content: application/json: schema: type: object properties: card_category_id: type: integer description: 'Card category ID.' example: 1 name: type: string description: 'Card name.' example: 'The Fool' description: type: string description: 'optional Card description.' example: 'Eius et animi quos velit et.' nullable: true required: - card_category_id - name security: [] '/api/v1/admin/card-category/cards/{id}': get: summary: 'Get a specific card' operationId: getASpecificCard description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Card Management' security: [] put: summary: 'Update a card' operationId: updateACard description: '' parameters: [] responses: { } tags: - 'Admin - Card Management' requestBody: required: false content: application/json: schema: type: object properties: card_category_id: type: integer description: 'optional Card category ID.' example: 16 name: type: string description: 'optional Card name.' example: architecto description: type: string description: 'optional Card description.' example: 'Eius et animi quos velit et.' nullable: true security: [] patch: summary: 'Update a card' operationId: updateACard description: '' parameters: [] responses: { } tags: - 'Admin - Card Management' requestBody: required: false content: application/json: schema: type: object properties: card_category_id: type: integer description: 'optional Card category ID.' example: 16 name: type: string description: 'optional Card name.' example: architecto description: type: string description: 'optional Card description.' example: 'Eius et animi quos velit et.' nullable: true security: [] delete: summary: 'Delete a card' operationId: deleteACard description: '' parameters: [] responses: { } tags: - 'Admin - Card Management' security: [] parameters: - in: path name: id description: 'The ID of the card.' example: 1 required: true schema: type: integer /api/v1/admin/card-category: get: summary: 'Get list of card categories (with cards count)' operationId: getListOfCardCategorieswithCardsCount description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Card Category Management' security: [] post: summary: 'Create a new card category' operationId: createANewCardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Card Category Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The card category name.' example: Tarot required: - name security: [] '/api/v1/admin/card-category/{id}': get: summary: 'Get a specific card category' operationId: getASpecificCardCategory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Card Category Management' security: [] put: summary: 'Update a card category' operationId: updateACardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Card Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The card category name.' example: architecto security: [] patch: summary: 'Update a card category' operationId: updateACardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Card Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The card category name.' example: architecto security: [] delete: summary: 'Delete a card category' operationId: deleteACardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Card Category Management' security: [] parameters: - in: path name: id description: 'The ID of the card category.' example: 1 required: true schema: type: integer /api/v1/admin/checkout/orders: get: summary: '' operationId: getApiV1AdminCheckoutOrders description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Checkout Orders' security: [] '/api/v1/admin/checkout/orders/{id}': get: summary: '' operationId: getApiV1AdminCheckoutOrdersId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Checkout Orders' security: [] parameters: - in: path name: id description: 'The ID of the order.' example: architecto required: true schema: type: string /api/v1/admin/coach: get: summary: 'Get list of all coaches' operationId: getListOfAllCoaches description: 'Retrieve a paginated list of all coaches with their profiles.' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coaches retrieved successfully' data: current_page: 1 data: - id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor profile_image: 'http://example.com/storage/coaches/profiles/image.jpg' total: 10 properties: success: type: boolean example: true message: type: string example: 'Coaches retrieved successfully' data: type: object properties: current_page: type: integer example: 1 data: type: array example: - id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor profile_image: 'http://example.com/storage/coaches/profiles/image.jpg' items: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' gender: type: string example: male coach_type: type: string example: Mentor profile_image: type: string example: 'http://example.com/storage/coaches/profiles/image.jpg' total: type: integer example: 10 tags: - 'Admin - Coach Management' security: [] post: summary: 'Create a new coach' operationId: createANewCoach description: 'Create a new coach account with profile information. An email will be sent to the coach with their login credentials.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Coach created successfully' data: id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor profile_image: 'http://example.com/storage/coaches/profiles/image.jpg' properties: success: type: boolean example: true message: type: string example: 'Coach created successfully' data: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' gender: type: string example: male coach_type: type: string example: Mentor profile_image: type: string example: 'http://example.com/storage/coaches/profiles/image.jpg' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation error' errors: email: - 'The email has already been taken.' properties: success: type: boolean example: false message: type: string example: 'Validation error' errors: type: object properties: email: type: array example: - 'The email has already been taken.' items: type: string tags: - 'Admin - Coach Management' requestBody: required: true content: multipart/form-data: schema: type: object properties: first_name: type: string description: "The coach's first name." example: John last_name: type: string description: "The coach's last name." example: Doe email: type: string description: "The coach's email address." example: john@example.com phone: type: string description: "The coach's phone number." example: '1234567890' phone_country_code_id: type: integer description: 'The phone country code ID.' example: 1 gender: type: string description: "The coach's gender (male, female, other)." example: male coach_type: type: string description: 'The coach type (Mentor, Yoga Trainer).' example: Mentor password: type: string description: "The coach's password." example: password123 notes: type: string description: 'Optional notes about the coach.' example: 'Experienced mentor with 10 years of experience.' nullable: true profile_image: type: string format: binary description: "optional The coach's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB." nullable: true password_confirmation: type: string description: 'Password confirmation.' example: password123 required: - first_name - last_name - email - phone - phone_country_code_id - gender - coach_type - password - password_confirmation security: [] '/api/v1/admin/coach/{id}': get: summary: 'Get a specific coach' operationId: getASpecificCoach description: 'Retrieve detailed information about a specific coach.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach retrieved successfully' data: id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor profile_image: 'http://example.com/storage/coaches/profiles/image.jpg' properties: success: type: boolean example: true message: type: string example: 'Coach retrieved successfully' data: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' gender: type: string example: male coach_type: type: string example: Mentor profile_image: type: string example: 'http://example.com/storage/coaches/profiles/image.jpg' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Coach not found.' properties: success: type: boolean example: false message: type: string example: 'Coach not found.' tags: - 'Admin - Coach Management' security: [] put: summary: 'Update a coach' operationId: updateACoach description: 'Update coach information and profile details.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach updated successfully' data: id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor properties: success: type: boolean example: true message: type: string example: 'Coach updated successfully' data: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' gender: type: string example: male coach_type: type: string example: Mentor 404: description: '' content: application/json: schema: type: object example: success: false message: 'Coach not found.' properties: success: type: boolean example: false message: type: string example: 'Coach not found.' tags: - 'Admin - Coach Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "optional The coach's first name." example: John last_name: type: string description: "optional The coach's last name." example: Doe email: type: string description: "optional The coach's email address." example: john@example.com phone: type: string description: "optional The coach's phone number." example: '1234567890' phone_country_code_id: type: integer description: 'optional The phone country code ID.' example: 1 gender: type: string description: "optional The coach's gender (male, female, other)." example: male coach_type: type: string description: 'optional The coach type (Mentor, Yoga Trainer).' example: Mentor notes: type: string description: 'Optional notes about the coach.' example: 'Experienced mentor with 10 years of experience.' nullable: true profile_image: type: string format: binary description: "optional The coach's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB." security: [] patch: summary: 'Update a coach' operationId: updateACoach description: 'Update coach information and profile details.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach updated successfully' data: id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' gender: male coach_type: Mentor properties: success: type: boolean example: true message: type: string example: 'Coach updated successfully' data: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' gender: type: string example: male coach_type: type: string example: Mentor 404: description: '' content: application/json: schema: type: object example: success: false message: 'Coach not found.' properties: success: type: boolean example: false message: type: string example: 'Coach not found.' tags: - 'Admin - Coach Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "optional The coach's first name." example: John last_name: type: string description: "optional The coach's last name." example: Doe email: type: string description: "optional The coach's email address." example: john@example.com phone: type: string description: "optional The coach's phone number." example: '1234567890' phone_country_code_id: type: integer description: 'optional The phone country code ID.' example: 1 gender: type: string description: "optional The coach's gender (male, female, other)." example: male coach_type: type: string description: 'optional The coach type (Mentor, Yoga Trainer).' example: Mentor notes: type: string description: 'Optional notes about the coach.' example: 'Experienced mentor with 10 years of experience.' nullable: true profile_image: type: string format: binary description: "optional The coach's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB." security: [] delete: summary: 'Delete a coach' operationId: deleteACoach description: 'Delete a coach account and all associated data. This will also delete the user account.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach deleted successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Coach deleted successfully' data: type: array example: [] 404: description: '' content: application/json: schema: type: object example: success: false message: 'Coach not found.' properties: success: type: boolean example: false message: type: string example: 'Coach not found.' tags: - 'Admin - Coach Management' security: [] parameters: - in: path name: id description: 'The ID of the coach.' example: 1 required: true schema: type: integer '/api/v1/admin/coach/{id}/verify': post: summary: 'Verify a coach (admin approval)' operationId: verifyACoachadminApproval description: 'Mark a coach as admin-verified so they can log into the coach portal.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach verified successfully. They can now log in.' data: [] properties: success: type: boolean example: true message: type: string example: 'Coach verified successfully. They can now log in.' data: type: array example: [] 404: description: '' content: application/json: schema: type: object example: success: false message: 'Coach not found.' properties: success: type: boolean example: false message: type: string example: 'Coach not found.' tags: - 'Admin - Coach Management' security: [] parameters: - in: path name: id description: 'The ID of the coach.' example: 1 required: true schema: type: integer /api/v1/admin/coach/global-commission-rate: get: summary: 'Get global commission rate' operationId: getGlobalCommissionRate description: 'Returns the current global commission rate (percentage) for coaches.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Global commission rate retrieved successfully' data: global_commission_rate: 10.5 properties: success: type: boolean example: true message: type: string example: 'Global commission rate retrieved successfully' data: type: object properties: global_commission_rate: type: number example: 10.5 tags: - 'Admin - Global Commission Rate (Coaches)' security: [] put: summary: 'Update global commission rate' operationId: updateGlobalCommissionRate description: "Update the global commission rate (percentage) for all coaches.\nValue must be between 0 and 100." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Global commission rate updated successfully' data: global_commission_rate: 10.5 properties: success: type: boolean example: true message: type: string example: 'Global commission rate updated successfully' data: type: object properties: global_commission_rate: type: number example: 10.5 422: description: '' content: text/plain: schema: type: string example: '{"success":false,"message":"Validation failed","errors":{...}}' tags: - 'Admin - Global Commission Rate (Coaches)' requestBody: required: true content: application/json: schema: type: object properties: global_commission_rate: type: number description: 'The commission rate as a percentage (0-100).' example: 10.5 required: - global_commission_rate security: [] patch: summary: 'Update global commission rate' operationId: updateGlobalCommissionRate description: "Update the global commission rate (percentage) for all coaches.\nValue must be between 0 and 100." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Global commission rate updated successfully' data: global_commission_rate: 10.5 properties: success: type: boolean example: true message: type: string example: 'Global commission rate updated successfully' data: type: object properties: global_commission_rate: type: number example: 10.5 422: description: '' content: text/plain: schema: type: string example: '{"success":false,"message":"Validation failed","errors":{...}}' tags: - 'Admin - Global Commission Rate (Coaches)' requestBody: required: true content: application/json: schema: type: object properties: global_commission_rate: type: number description: 'The commission rate as a percentage (0-100).' example: 10.5 required: - global_commission_rate security: [] /api/v1/admin/contact: get: summary: 'Get list of all contact submissions' operationId: getListOfAllContactSubmissions description: 'Retrieve a paginated list of all contact form submissions.' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Contact submissions retrieved successfully' data: current_page: 1 data: - id: 1 name: 'John Doe' email: john@example.com phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' message: 'I would like to know more about your services.' created_at: '2026-01-28T06:05:31+00:00' total: 10 properties: success: type: boolean example: true message: type: string example: 'Contact submissions retrieved successfully' data: type: object properties: current_page: type: integer example: 1 data: type: array example: - id: 1 name: 'John Doe' email: john@example.com phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' message: 'I would like to know more about your services.' created_at: '2026-01-28T06:05:31+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: john@example.com phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' message: type: string example: 'I would like to know more about your services.' created_at: type: string example: '2026-01-28T06:05:31+00:00' total: type: integer example: 10 tags: - 'Admin - Contact Form Management' security: [] '/api/v1/admin/contact/{id}': get: summary: 'Get a specific contact submission' operationId: getASpecificContactSubmission description: 'Retrieve detailed information about a specific contact submission.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Contact submission retrieved successfully' data: id: 1 name: 'John Doe' email: john@example.com phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' message: 'I would like to know more about your services.' created_at: '2026-01-28T06:05:31+00:00' properties: success: type: boolean example: true message: type: string example: 'Contact submission retrieved successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: john@example.com phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' message: type: string example: 'I would like to know more about your services.' created_at: type: string example: '2026-01-28T06:05:31+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Contact submission not found.' properties: success: type: boolean example: false message: type: string example: 'Contact submission not found.' tags: - 'Admin - Contact Form Management' security: [] delete: summary: 'Delete a contact submission' operationId: deleteAContactSubmission description: 'Delete a contact form submission.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Contact submission deleted successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Contact submission deleted successfully' data: type: array example: [] 404: description: '' content: application/json: schema: type: object example: success: false message: 'Contact submission not found.' properties: success: type: boolean example: false message: type: string example: 'Contact submission not found.' tags: - 'Admin - Contact Form Management' security: [] parameters: - in: path name: id description: 'The ID of the contact submission.' example: 1 required: true schema: type: integer /api/v1/contact: post: summary: 'Submit contact form' operationId: submitContactForm description: 'Submit a contact form with name, email, phone (with country code), and message.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Contact form submitted successfully' data: id: 1 name: 'John Doe' email: john@example.com phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' message: 'I would like to know more about your services.' created_at: '2026-01-28T06:05:31+00:00' properties: success: type: boolean example: true message: type: string example: 'Contact form submitted successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'John Doe' email: type: string example: john@example.com phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' message: type: string example: 'I would like to know more about your services.' created_at: type: string example: '2026-01-28T06:05:31+00:00' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email field is required.' items: type: string tags: - 'Contact Form' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: "The contact's name." example: 'John Doe' email: type: string description: "The contact's email address." example: john@example.com phone: type: string description: "The contact's phone number." example: '1234567890' phone_country_code_id: type: integer description: 'The phone country code ID.' example: 1 message: type: string description: "The contact's message." example: 'I would like to know more about your services.' required: - name - email - phone - phone_country_code_id - message security: [] /api/v1/admin/coupon: get: summary: 'Get list of all coupons' operationId: getListOfAllCoupons description: 'Retrieve a paginated list of all coupons.' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: search description: 'Optional search by code or name.' example: WELCOME required: false schema: type: string description: 'Optional search by code or name.' example: WELCOME responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Coupon Management' security: [] post: summary: 'Create a new coupon' operationId: createANewCoupon description: '' parameters: [] responses: { } tags: - 'Admin - Coupon Management' requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Unique coupon code. Must not be greater than 50 characters.' example: WELCOME10 name: type: string description: 'Human readable coupon name. Must not be greater than 255 characters.' example: 'Welcome Discount' type: type: string description: 'Coupon type: fixed amount or percentage.' example: percentage enum: - fixed - percentage amount: type: number description: 'Discount amount (value or percentage based on type). Must be at least 0.01.' example: 10.0 usage_limit_per_user: type: integer description: 'Maximum times a single user can use this coupon. Null means unlimited per user. Must be at least 1.' example: 3 nullable: true applies_to_all: type: boolean description: 'Whether coupon applies to all program categories.' example: true nullable: true is_active: type: boolean description: 'Whether the coupon is currently active.' example: true nullable: true starts_at: type: string description: 'Optional start date/time from which the coupon is valid. Must be a valid date.' example: '2026-02-01T00:00:00+00:00' nullable: true ends_at: type: string description: 'Optional end date/time after which the coupon is no longer valid. Must be a valid date. Must be a date after or equal to starts_at.' example: '2026-02-28T23:59:59+00:00' nullable: true program_category_ids: type: array description: 'The id of an existing record in the program_categories table.' example: - 16 items: type: integer required: - code - name - type - amount security: [] '/api/v1/admin/coupon/{id}': get: summary: 'Get a specific coupon' operationId: getASpecificCoupon description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Coupon Management' security: [] put: summary: 'Update a coupon' operationId: updateACoupon description: '' parameters: [] responses: { } tags: - 'Admin - Coupon Management' requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Unique coupon code. Must not be greater than 50 characters.' example: WELCOME10 name: type: string description: 'Human readable coupon name. Must not be greater than 255 characters.' example: 'Welcome Discount' type: type: string description: 'Coupon type: fixed amount or percentage.' example: percentage enum: - fixed - percentage amount: type: number description: 'Discount amount (value or percentage based on type). Must be at least 0.01.' example: 10.0 usage_limit_per_user: type: integer description: 'Maximum times a single user can use this coupon. Null means unlimited per user. Must be at least 1.' example: 3 nullable: true applies_to_all: type: boolean description: 'Whether coupon applies to all program categories.' example: true nullable: true is_active: type: boolean description: 'Whether the coupon is currently active.' example: true nullable: true starts_at: type: string description: 'Optional start date/time from which the coupon is valid. Must be a valid date.' example: '2026-02-01T00:00:00+00:00' nullable: true ends_at: type: string description: 'Optional end date/time after which the coupon is no longer valid. Must be a valid date. Must be a date after or equal to starts_at.' example: '2026-02-28T23:59:59+00:00' nullable: true program_category_ids: type: array description: 'The id of an existing record in the program_categories table.' example: - 16 items: type: integer security: [] patch: summary: 'Update a coupon' operationId: updateACoupon description: '' parameters: [] responses: { } tags: - 'Admin - Coupon Management' requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Unique coupon code. Must not be greater than 50 characters.' example: WELCOME10 name: type: string description: 'Human readable coupon name. Must not be greater than 255 characters.' example: 'Welcome Discount' type: type: string description: 'Coupon type: fixed amount or percentage.' example: percentage enum: - fixed - percentage amount: type: number description: 'Discount amount (value or percentage based on type). Must be at least 0.01.' example: 10.0 usage_limit_per_user: type: integer description: 'Maximum times a single user can use this coupon. Null means unlimited per user. Must be at least 1.' example: 3 nullable: true applies_to_all: type: boolean description: 'Whether coupon applies to all program categories.' example: true nullable: true is_active: type: boolean description: 'Whether the coupon is currently active.' example: true nullable: true starts_at: type: string description: 'Optional start date/time from which the coupon is valid. Must be a valid date.' example: '2026-02-01T00:00:00+00:00' nullable: true ends_at: type: string description: 'Optional end date/time after which the coupon is no longer valid. Must be a valid date. Must be a date after or equal to starts_at.' example: '2026-02-28T23:59:59+00:00' nullable: true program_category_ids: type: array description: 'The id of an existing record in the program_categories table.' example: - 16 items: type: integer security: [] delete: summary: 'Delete a coupon' operationId: deleteACoupon description: '' parameters: [] responses: { } tags: - 'Admin - Coupon Management' security: [] parameters: - in: path name: id description: 'The ID of the coupon.' example: 1 required: true schema: type: integer /api/v1/admin/customer: get: summary: 'Get list of all customers' operationId: getListOfAllCustomers description: 'Retrieve a paginated list of all customers with their profiles.' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Customers retrieved successfully' data: current_page: 1 data: - id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' total: 10 properties: success: type: boolean example: true message: type: string example: 'Customers retrieved successfully' data: type: object properties: current_page: type: integer example: 1 data: type: array example: - id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' items: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' total: type: integer example: 10 tags: - 'Admin - Customer Management' security: [] post: summary: 'Create a new customer' operationId: createANewCustomer description: "Create a new customer account with profile information. An email will be sent to the customer with their login credentials.\nThe customer's email is marked as verified by default because the account is created by an admin." parameters: [] responses: { } tags: - 'Admin - Customer Management' requestBody: required: true content: multipart/form-data: schema: type: object properties: first_name: type: string description: "The customer's first name. Must not be greater than 255 characters." example: John last_name: type: string description: "The customer's last name. Must not be greater than 255 characters." example: Doe email: type: string description: "The customer's email address. Must be a valid email address. Must not be greater than 255 characters." example: john@example.com phone: type: string description: "The customer's phone number. Must not be greater than 20 characters." example: '1234567890' phone_country_code_id: type: integer description: 'The phone country code ID. The id of an existing record in the phone_country_codes table.' example: 1 password: type: string description: "The customer's password. Must be at least 8 characters." example: password123 notes: type: string description: 'Optional notes about the customer.' example: 'VIP customer with special requirements.' nullable: true address_line_1: type: string description: "The customer's primary address line. Must not be greater than 255 characters." example: '123 Main Street' nullable: true address_line_2: type: string description: "The customer's secondary address line. Must not be greater than 255 characters." example: 'Apt 4B' nullable: true landmark: type: string description: 'A nearby landmark. Must not be greater than 255 characters.' example: 'Near Central Park' nullable: true country_id: type: string description: 'The ID of the country. The id of an existing record in the countries table.' example: 1 nullable: true state_id: type: string description: 'The ID of the state. The id of an existing record in the states table.' example: 1 nullable: true city_id: type: string description: 'The ID of the city. The id of an existing record in the cities table.' example: 1 nullable: true postal_code: type: string description: 'The postal or zip code. Must not be greater than 20 characters.' example: '12345' nullable: true profile_image: type: string format: binary description: "The customer's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB. Must be an image. Must not be greater than 2048 kilobytes." nullable: true required: - first_name - last_name - email - phone - phone_country_code_id - password security: [] '/api/v1/admin/customer/{id}': get: summary: 'Get a specific customer' operationId: getASpecificCustomer description: 'Retrieve detailed information about a specific customer.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Customer retrieved successfully' data: id: 1 user: id: 1 first_name: John last_name: Doe email: john@example.com profile: phone: '1234567890' phone_country_code: id: 1 phone_code: '+1' intl_dialing_prefix: '1' properties: success: type: boolean example: true message: type: string example: 'Customer retrieved successfully' data: type: object properties: id: type: integer example: 1 user: type: object properties: id: type: integer example: 1 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: john@example.com profile: type: object properties: phone: type: string example: '1234567890' phone_country_code: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' intl_dialing_prefix: type: string example: '1' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Customer not found.' properties: success: type: boolean example: false message: type: string example: 'Customer not found.' tags: - 'Admin - Customer Management' security: [] put: summary: 'Update a customer' operationId: updateACustomer description: 'Update customer information and profile details.' parameters: [] responses: { } tags: - 'Admin - Customer Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "The customer's first name. Must not be greater than 255 characters." example: John last_name: type: string description: "The customer's last name. Must not be greater than 255 characters." example: Doe email: type: string description: "The customer's email address. Must be a valid email address. Must not be greater than 255 characters." example: john@example.com phone: type: string description: "The customer's phone number. Must not be greater than 20 characters." example: '1234567890' phone_country_code_id: type: integer description: 'The phone country code ID. The id of an existing record in the phone_country_codes table.' example: 1 notes: type: string description: 'Optional notes about the customer.' example: 'VIP customer with special requirements.' nullable: true address_line_1: type: string description: "The customer's primary address line. Must not be greater than 255 characters." example: '123 Main Street' nullable: true address_line_2: type: string description: "The customer's secondary address line. Must not be greater than 255 characters." example: 'Apt 4B' nullable: true landmark: type: string description: 'A nearby landmark. Must not be greater than 255 characters.' example: 'Near Central Park' nullable: true country_id: type: string description: 'The ID of the country. The id of an existing record in the countries table.' example: 1 nullable: true state_id: type: string description: 'The ID of the state. The id of an existing record in the states table.' example: 1 nullable: true city_id: type: string description: 'The ID of the city. The id of an existing record in the cities table.' example: 1 nullable: true postal_code: type: string description: 'The postal or zip code. Must not be greater than 20 characters.' example: '12345' nullable: true profile_image: type: string format: binary description: "The customer's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB. Must be an image. Must not be greater than 2048 kilobytes." nullable: true security: [] patch: summary: 'Update a customer' operationId: updateACustomer description: 'Update customer information and profile details.' parameters: [] responses: { } tags: - 'Admin - Customer Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: "The customer's first name. Must not be greater than 255 characters." example: John last_name: type: string description: "The customer's last name. Must not be greater than 255 characters." example: Doe email: type: string description: "The customer's email address. Must be a valid email address. Must not be greater than 255 characters." example: john@example.com phone: type: string description: "The customer's phone number. Must not be greater than 20 characters." example: '1234567890' phone_country_code_id: type: integer description: 'The phone country code ID. The id of an existing record in the phone_country_codes table.' example: 1 notes: type: string description: 'Optional notes about the customer.' example: 'VIP customer with special requirements.' nullable: true address_line_1: type: string description: "The customer's primary address line. Must not be greater than 255 characters." example: '123 Main Street' nullable: true address_line_2: type: string description: "The customer's secondary address line. Must not be greater than 255 characters." example: 'Apt 4B' nullable: true landmark: type: string description: 'A nearby landmark. Must not be greater than 255 characters.' example: 'Near Central Park' nullable: true country_id: type: string description: 'The ID of the country. The id of an existing record in the countries table.' example: 1 nullable: true state_id: type: string description: 'The ID of the state. The id of an existing record in the states table.' example: 1 nullable: true city_id: type: string description: 'The ID of the city. The id of an existing record in the cities table.' example: 1 nullable: true postal_code: type: string description: 'The postal or zip code. Must not be greater than 20 characters.' example: '12345' nullable: true profile_image: type: string format: binary description: "The customer's profile image. Must be an image file (jpeg, png, jpg, gif) and not exceed 2MB. Must be an image. Must not be greater than 2048 kilobytes." nullable: true security: [] delete: summary: 'Delete a customer' operationId: deleteACustomer description: 'Delete a customer account and all associated data. This will also delete the user account.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Customer deleted successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Customer deleted successfully' data: type: array example: [] 404: description: '' content: application/json: schema: type: object example: success: false message: 'Customer not found.' properties: success: type: boolean example: false message: type: string example: 'Customer not found.' tags: - 'Admin - Customer Management' security: [] parameters: - in: path name: id description: 'The ID of the customer.' example: 1 required: true schema: type: integer /api/v1/admin/dispute: get: summary: '' operationId: getApiV1AdminDispute description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Disputes' security: [] '/api/v1/admin/dispute/{id}': get: summary: '' operationId: getApiV1AdminDisputeId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Disputes' security: [] parameters: - in: path name: id description: 'The ID of the dispute.' example: architecto required: true schema: type: string '/api/v1/admin/dispute/{id}/status': patch: summary: '' operationId: patchApiV1AdminDisputeIdStatus description: '' parameters: [] responses: { } tags: - 'Admin - Disputes' requestBody: required: true content: application/json: schema: type: object properties: status: type: string description: 'Auto-generated from validation rules for `status`.' example: closed enum: - open - closed required: - status security: [] parameters: - in: path name: id description: 'The ID of the dispute.' example: architecto required: true schema: type: string /api/v1/admin/faq: get: summary: 'Get list of FAQs' operationId: getListOfFAQs description: 'Optionally filter by page_type (mentee|mentor) and is_active.' parameters: - in: query name: page_type description: 'optional Filter by page type.' example: mentee required: false schema: type: string description: 'optional Filter by page type.' example: mentee - in: query name: is_active description: 'optional Filter by active status.' example: true required: false schema: type: boolean description: 'optional Filter by active status.' example: true responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - FAQ Management' security: [] post: summary: 'Create a new FAQ' operationId: createANewFAQ description: '' parameters: [] responses: { } tags: - 'Admin - FAQ Management' requestBody: required: true content: application/json: schema: type: object properties: page_type: type: string description: 'Page type. Allowed: mentee, mentor.' example: mentee heading: type: string description: 'FAQ heading.' example: 'What is a mentee?' description: type: string description: 'FAQ description.' example: 'A mentee is...' is_active: type: boolean description: 'optional Whether the FAQ is active. Default true.' example: true nullable: true sort_order: type: integer description: 'optional Sort order within the page.' example: 1 nullable: true required: - page_type - heading - description security: [] '/api/v1/admin/faq/{id}': get: summary: 'Get a specific FAQ' operationId: getASpecificFAQ description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - FAQ Management' security: [] put: summary: 'Update an existing FAQ' operationId: updateAnExistingFAQ description: '' parameters: [] responses: { } tags: - 'Admin - FAQ Management' requestBody: required: false content: application/json: schema: type: object properties: page_type: type: string description: 'optional Page type. Allowed: mentee, mentor.' example: mentor heading: type: string description: 'optional FAQ heading.' example: architecto description: type: string description: 'optional FAQ description.' example: 'Eius et animi quos velit et.' is_active: type: boolean description: 'optional Whether the FAQ is active.' example: false nullable: true sort_order: type: integer description: 'optional Sort order within the page.' example: 16 nullable: true security: [] patch: summary: 'Update an existing FAQ' operationId: updateAnExistingFAQ description: '' parameters: [] responses: { } tags: - 'Admin - FAQ Management' requestBody: required: false content: application/json: schema: type: object properties: page_type: type: string description: 'optional Page type. Allowed: mentee, mentor.' example: mentor heading: type: string description: 'optional FAQ heading.' example: architecto description: type: string description: 'optional FAQ description.' example: 'Eius et animi quos velit et.' is_active: type: boolean description: 'optional Whether the FAQ is active.' example: false nullable: true sort_order: type: integer description: 'optional Sort order within the page.' example: 16 nullable: true security: [] delete: summary: 'Delete an FAQ' operationId: deleteAnFAQ description: '' parameters: [] responses: { } tags: - 'Admin - FAQ Management' security: [] parameters: - in: path name: id description: 'The ID of the FAQ.' example: 1 required: true schema: type: integer '/api/v1/faq/{page_type}': get: summary: 'Get FAQs for a given page type' operationId: getFAQsForAGivenPageType description: 'Returns all active FAQs for the specified page (mentee or mentor), ordered by sort_order and id.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'FAQs retrieved successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'FAQs retrieved successfully' data: type: array example: [] tags: - 'FAQ (Public)' security: [] parameters: - in: path name: page_type description: 'The page type. Allowed: mentee, mentor.' example: mentee required: true schema: type: string /api/v1/admin/goal-type: get: summary: 'Get list of all goal types' operationId: getListOfAllGoalTypes description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Goal Type Management' security: [] post: summary: 'Create a new goal type' operationId: createANewGoalType description: '' parameters: [] responses: { } tags: - 'Admin - Goal Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The goal type name.' example: Fitness required: - name security: [] '/api/v1/admin/goal-type/{id}': get: summary: 'Get a specific goal type' operationId: getASpecificGoalType description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Goal Type Management' security: [] put: summary: 'Update a goal type' operationId: updateAGoalType description: '' parameters: [] responses: { } tags: - 'Admin - Goal Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The goal type name.' example: Fitness required: - name security: [] patch: summary: 'Update a goal type' operationId: updateAGoalType description: '' parameters: [] responses: { } tags: - 'Admin - Goal Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The goal type name.' example: Fitness required: - name security: [] delete: summary: 'Delete a goal type' operationId: deleteAGoalType description: '' parameters: [] responses: { } tags: - 'Admin - Goal Type Management' security: [] parameters: - in: path name: id description: 'The ID of the goal type.' example: 1 required: true schema: type: integer /api/v1/admin/habit-type: get: summary: 'Get list of all habit types' operationId: getListOfAllHabitTypes description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Habit Type Management' security: [] post: summary: 'Create a new habit type' operationId: createANewHabitType description: '' parameters: [] responses: { } tags: - 'Admin - Habit Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The habit type name.' example: 'Daily Exercise' required: - name security: [] '/api/v1/admin/habit-type/{id}': get: summary: 'Get a specific habit type' operationId: getASpecificHabitType description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Habit Type Management' security: [] put: summary: 'Update a habit type' operationId: updateAHabitType description: '' parameters: [] responses: { } tags: - 'Admin - Habit Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The habit type name.' example: 'Daily Exercise' required: - name security: [] patch: summary: 'Update a habit type' operationId: updateAHabitType description: '' parameters: [] responses: { } tags: - 'Admin - Habit Type Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The habit type name.' example: 'Daily Exercise' required: - name security: [] delete: summary: 'Delete a habit type' operationId: deleteAHabitType description: '' parameters: [] responses: { } tags: - 'Admin - Habit Type Management' security: [] parameters: - in: path name: id description: 'The ID of the habit type.' example: 1 required: true schema: type: integer /api/v1/admin/home-page: get: summary: 'Get home page data (admin)' operationId: getHomePageDataadmin description: 'Returns the full home page content for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Home Page (CMS)' security: [] put: summary: 'Update home page' operationId: updateHomePage description: 'Update any section. All sections are optional. Use multipart/form-data for image uploads.' parameters: [] responses: { } tags: - 'Admin - Home Page (CMS)' requestBody: required: false content: multipart/form-data: schema: type: object properties: section_01: type: object description: 'Auto-generated from validation rules for `section_01`.' example: null properties: hero_headline: type: string description: 'Auto-generated from validation rules for `section_01.hero_headline`. Must not be greater than 255 characters.' example: b nullable: true hero_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_01.hero_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true hero_description: type: string description: 'Auto-generated from validation rules for `section_01.hero_description`. Must not be greater than 5000 characters.' example: 'n' nullable: true nullable: true section_02: type: object description: 'Auto-generated from validation rules for `section_02`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_02.headline`. Must not be greater than 255 characters.' example: g nullable: true about_us_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_02.about_us_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_02.secondary_headline`. Must not be greater than 255 characters.' example: z nullable: true description: type: string description: 'Auto-generated from validation rules for `section_02.description`. Must not be greater than 10000 characters.' example: 'Velit et fugiat sunt nihil accusantium.' nullable: true button_name: type: string description: 'Auto-generated from validation rules for `section_02.button_name`. Must not be greater than 100 characters.' example: 'n' nullable: true button_url: type: string description: 'Auto-generated from validation rules for `section_02.button_url`. Must be a valid URL. Must not be greater than 500 characters.' example: 'https://www.runte.com/ab-provident-perspiciatis-quo-omnis-nostrum-aut-adipisci' nullable: true nullable: true section_03: type: object description: 'Auto-generated from validation rules for `section_03`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_03.headline`. Must not be greater than 255 characters.' example: p nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_03.secondary_headline`. Must not be greater than 255 characters.' example: w nullable: true nullable: true section_04: type: object description: 'Auto-generated from validation rules for `section_04`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_04.headline`. Must not be greater than 255 characters.' example: l nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_04.secondary_headline`. Must not be greater than 255 characters.' example: v nullable: true why_choose_us_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_04.why_choose_us_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true background_image: type: string format: binary description: 'Auto-generated from validation rules for `section_04.background_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true options: type: array description: 'Auto-generated from validation rules for `section_04.options`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `section_04.options.*.id`. The id of an existing record in the home_why_choose_us_options table.' example: 16 nullable: true title: type: string description: 'Auto-generated from validation rules for `section_04.options.*.title`. Must not be greater than 255 characters.' example: 'n' nullable: true description: type: string description: 'Auto-generated from validation rules for `section_04.options.*.description`. Must not be greater than 2000 characters.' example: 'Animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `section_04.options.*.sort_order`. Must be at least 0.' example: 42 nullable: true nullable: true section_05: type: object description: 'Auto-generated from validation rules for `section_05`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_05.headline`. Must not be greater than 255 characters.' example: q nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_05.secondary_headline`. Must not be greater than 255 characters.' example: w nullable: true nullable: true section_06: type: object description: 'Auto-generated from validation rules for `section_06`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_06.headline`. Must not be greater than 255 characters.' example: r nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_06.secondary_headline`. Must not be greater than 255 characters.' example: s nullable: true nullable: true security: [] patch: summary: 'Update home page' operationId: updateHomePage description: 'Update any section. All sections are optional. Use multipart/form-data for image uploads.' parameters: [] responses: { } tags: - 'Admin - Home Page (CMS)' requestBody: required: false content: multipart/form-data: schema: type: object properties: section_01: type: object description: 'Auto-generated from validation rules for `section_01`.' example: null properties: hero_headline: type: string description: 'Auto-generated from validation rules for `section_01.hero_headline`. Must not be greater than 255 characters.' example: b nullable: true hero_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_01.hero_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true hero_description: type: string description: 'Auto-generated from validation rules for `section_01.hero_description`. Must not be greater than 5000 characters.' example: 'n' nullable: true nullable: true section_02: type: object description: 'Auto-generated from validation rules for `section_02`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_02.headline`. Must not be greater than 255 characters.' example: g nullable: true about_us_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_02.about_us_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_02.secondary_headline`. Must not be greater than 255 characters.' example: z nullable: true description: type: string description: 'Auto-generated from validation rules for `section_02.description`. Must not be greater than 10000 characters.' example: 'Velit et fugiat sunt nihil accusantium.' nullable: true button_name: type: string description: 'Auto-generated from validation rules for `section_02.button_name`. Must not be greater than 100 characters.' example: 'n' nullable: true button_url: type: string description: 'Auto-generated from validation rules for `section_02.button_url`. Must be a valid URL. Must not be greater than 500 characters.' example: 'https://www.runte.com/ab-provident-perspiciatis-quo-omnis-nostrum-aut-adipisci' nullable: true nullable: true section_03: type: object description: 'Auto-generated from validation rules for `section_03`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_03.headline`. Must not be greater than 255 characters.' example: p nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_03.secondary_headline`. Must not be greater than 255 characters.' example: w nullable: true nullable: true section_04: type: object description: 'Auto-generated from validation rules for `section_04`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_04.headline`. Must not be greater than 255 characters.' example: l nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_04.secondary_headline`. Must not be greater than 255 characters.' example: v nullable: true why_choose_us_section_image: type: string format: binary description: 'Auto-generated from validation rules for `section_04.why_choose_us_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true background_image: type: string format: binary description: 'Auto-generated from validation rules for `section_04.background_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true options: type: array description: 'Auto-generated from validation rules for `section_04.options`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `section_04.options.*.id`. The id of an existing record in the home_why_choose_us_options table.' example: 16 nullable: true title: type: string description: 'Auto-generated from validation rules for `section_04.options.*.title`. Must not be greater than 255 characters.' example: 'n' nullable: true description: type: string description: 'Auto-generated from validation rules for `section_04.options.*.description`. Must not be greater than 2000 characters.' example: 'Animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `section_04.options.*.sort_order`. Must be at least 0.' example: 42 nullable: true nullable: true section_05: type: object description: 'Auto-generated from validation rules for `section_05`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_05.headline`. Must not be greater than 255 characters.' example: q nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_05.secondary_headline`. Must not be greater than 255 characters.' example: w nullable: true nullable: true section_06: type: object description: 'Auto-generated from validation rules for `section_06`.' example: null properties: headline: type: string description: 'Auto-generated from validation rules for `section_06.headline`. Must not be greater than 255 characters.' example: r nullable: true secondary_headline: type: string description: 'Auto-generated from validation rules for `section_06.secondary_headline`. Must not be greater than 255 characters.' example: s nullable: true nullable: true security: [] /api/v1/home-page: get: summary: 'Get home page' operationId: getHomePage description: 'Returns all home page sections: Hero, About Us, Programs, Why Choose Us, Coaches, Articles.' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Home page not found.' properties: success: type: boolean example: false message: type: string example: 'Home page not found.' tags: - 'Home Page (Public)' security: [] /api/v1/admin/intermediate-steps/values: get: summary: 'Get Values Intermediate Page content (admin)' operationId: getValuesIntermediatePageContentadmin description: 'Returns the headline and all points for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Values Intermediate Page (Intermediate Steps)' security: [] put: summary: 'Update Values Intermediate Page' operationId: updateValuesIntermediatePage description: "Update headline and/or points. Send full points array to replace; existing points\ncan be updated by id, new points without id will be created." parameters: [] responses: { } tags: - 'Admin - Values Intermediate Page (Intermediate Steps)' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto points: type: array description: 'optional Array of points (description, sort_order). Include id to update existing. Order = display order.' example: - architecto items: type: string nullable: true required: - headline security: [] patch: summary: 'Update Values Intermediate Page' operationId: updateValuesIntermediatePage description: "Update headline and/or points. Send full points array to replace; existing points\ncan be updated by id, new points without id will be created." parameters: [] responses: { } tags: - 'Admin - Values Intermediate Page (Intermediate Steps)' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto points: type: array description: 'optional Array of points (description, sort_order). Include id to update existing. Order = display order.' example: - architecto items: type: string nullable: true required: - headline security: [] /api/v1/admin/intermediate-steps/y-method: get: summary: 'Get The Y Method Page content (admin)' operationId: getTheYMethodPageContentadmin description: 'Returns the headline and all steps for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - The Y Method Page (Intermediate Steps)' security: [] put: summary: 'Update The Y Method Page' operationId: updateTheYMethodPage description: "Update headline and/or steps. Send full steps array to replace; existing steps\ncan be updated by id, new steps without id will be created." parameters: [] responses: { } tags: - 'Admin - The Y Method Page (Intermediate Steps)' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto steps: type: array description: 'optional Array of steps (description, sort_order). Include id to update existing. Order = display order.' example: - architecto items: type: string nullable: true required: - headline security: [] patch: summary: 'Update The Y Method Page' operationId: updateTheYMethodPage description: "Update headline and/or steps. Send full steps array to replace; existing steps\ncan be updated by id, new steps without id will be created." parameters: [] responses: { } tags: - 'Admin - The Y Method Page (Intermediate Steps)' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto steps: type: array description: 'optional Array of steps (description, sort_order). Include id to update existing. Order = display order.' example: - architecto items: type: string nullable: true required: - headline security: [] /api/v1/admin/intermediate-steps/eight-most-common-mistakes: get: summary: 'Get Eight most common mistakes page content (admin)' operationId: getEightMostCommonMistakesPageContentadmin description: 'Returns the headline and all mistakes for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Eight most common mistakes Intermediate Page' security: [] put: summary: 'Update Eight most common mistakes page' operationId: updateEightMostCommonMistakesPage description: "Update headline and/or mistakes. Send full mistakes array to replace; existing\nitems can be updated by id, new items without id will be created." parameters: [] responses: { } tags: - 'Admin - Eight most common mistakes Intermediate Page' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto mistakes: type: array description: 'optional Array of mistakes (description, sort_order). Include id to update existing.' example: - architecto items: type: string nullable: true required: - headline security: [] patch: summary: 'Update Eight most common mistakes page' operationId: updateEightMostCommonMistakesPage description: "Update headline and/or mistakes. Send full mistakes array to replace; existing\nitems can be updated by id, new items without id will be created." parameters: [] responses: { } tags: - 'Admin - Eight most common mistakes Intermediate Page' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto mistakes: type: array description: 'optional Array of mistakes (description, sort_order). Include id to update existing.' example: - architecto items: type: string nullable: true required: - headline security: [] /api/v1/admin/intermediate-steps/goal-settings: get: summary: 'Get Goal Settings Intermediate Page content (admin)' operationId: getGoalSettingsIntermediatePageContentadmin description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Goal Settings Intermediate Page' security: [] put: summary: 'Update Goal Settings Intermediate Page' operationId: updateGoalSettingsIntermediatePage description: '' parameters: [] responses: { } tags: - 'Admin - Goal Settings Intermediate Page' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto quote: type: string description: 'optional Quote.' example: architecto nullable: true sub_heading_1: type: string description: 'optional Sub-heading 1.' example: architecto nullable: true sub_heading_2: type: string description: 'optional Sub-heading 2.' example: architecto nullable: true description_2: type: string description: 'optional Description 2 (long text).' example: architecto nullable: true options: type: array description: 'optional Array of options (description, sort_order). Include id to update existing.' example: - architecto items: type: string nullable: true required: - headline security: [] patch: summary: 'Update Goal Settings Intermediate Page' operationId: updateGoalSettingsIntermediatePage description: '' parameters: [] responses: { } tags: - 'Admin - Goal Settings Intermediate Page' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Page headline.' example: architecto quote: type: string description: 'optional Quote.' example: architecto nullable: true sub_heading_1: type: string description: 'optional Sub-heading 1.' example: architecto nullable: true sub_heading_2: type: string description: 'optional Sub-heading 2.' example: architecto nullable: true description_2: type: string description: 'optional Description 2 (long text).' example: architecto nullable: true options: type: array description: 'optional Array of options (description, sort_order). Include id to update existing.' example: - architecto items: type: string nullable: true required: - headline security: [] /api/v1/admin/intermediate-steps/questions-goal-why: get: summary: 'Get Questions for each goal - why? page content (admin)' operationId: getQuestionsForEachGoalWhyPageContentadmin description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Questions for each goal - why? Intermediate Page' security: [] put: summary: 'Update Questions for each goal - why? page' operationId: updateQuestionsForEachGoalWhyPage description: '' parameters: [] responses: { } tags: - 'Admin - Questions for each goal - why? Intermediate Page' requestBody: required: false content: application/json: schema: type: object properties: headline_1: type: string description: 'Auto-generated from validation rules for `headline_1`. Must not be greater than 255 characters.' example: b nullable: true headline_2: type: string description: 'Auto-generated from validation rules for `headline_2`. Must not be greater than 255 characters.' example: 'n' nullable: true headline_3: type: string description: 'Auto-generated from validation rules for `headline_3`. Must not be greater than 255 characters.' example: g nullable: true headline_4: type: string description: 'Auto-generated from validation rules for `headline_4`. Must not be greater than 255 characters.' example: z nullable: true headline_5: type: string description: 'Auto-generated from validation rules for `headline_5`. Must not be greater than 255 characters.' example: m nullable: true question_heading_1: type: string description: 'Auto-generated from validation rules for `question_heading_1`. Must not be greater than 255 characters.' example: i nullable: true question_description_1: type: string description: 'Auto-generated from validation rules for `question_description_1`. Must not be greater than 5000 characters.' example: 'y' nullable: true question_heading_2: type: string description: 'Auto-generated from validation rules for `question_heading_2`. Must not be greater than 255 characters.' example: v nullable: true question_description_2: type: string description: 'Auto-generated from validation rules for `question_description_2`. Must not be greater than 5000 characters.' example: d nullable: true question_heading_3: type: string description: 'Auto-generated from validation rules for `question_heading_3`. Must not be greater than 255 characters.' example: l nullable: true question_description_3: type: string description: 'Auto-generated from validation rules for `question_description_3`. Must not be greater than 5000 characters.' example: j nullable: true quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 2000 characters.' example: 'n' nullable: true security: [] patch: summary: 'Update Questions for each goal - why? page' operationId: updateQuestionsForEachGoalWhyPage description: '' parameters: [] responses: { } tags: - 'Admin - Questions for each goal - why? Intermediate Page' requestBody: required: false content: application/json: schema: type: object properties: headline_1: type: string description: 'Auto-generated from validation rules for `headline_1`. Must not be greater than 255 characters.' example: b nullable: true headline_2: type: string description: 'Auto-generated from validation rules for `headline_2`. Must not be greater than 255 characters.' example: 'n' nullable: true headline_3: type: string description: 'Auto-generated from validation rules for `headline_3`. Must not be greater than 255 characters.' example: g nullable: true headline_4: type: string description: 'Auto-generated from validation rules for `headline_4`. Must not be greater than 255 characters.' example: z nullable: true headline_5: type: string description: 'Auto-generated from validation rules for `headline_5`. Must not be greater than 255 characters.' example: m nullable: true question_heading_1: type: string description: 'Auto-generated from validation rules for `question_heading_1`. Must not be greater than 255 characters.' example: i nullable: true question_description_1: type: string description: 'Auto-generated from validation rules for `question_description_1`. Must not be greater than 5000 characters.' example: 'y' nullable: true question_heading_2: type: string description: 'Auto-generated from validation rules for `question_heading_2`. Must not be greater than 255 characters.' example: v nullable: true question_description_2: type: string description: 'Auto-generated from validation rules for `question_description_2`. Must not be greater than 5000 characters.' example: d nullable: true question_heading_3: type: string description: 'Auto-generated from validation rules for `question_heading_3`. Must not be greater than 255 characters.' example: l nullable: true question_description_3: type: string description: 'Auto-generated from validation rules for `question_description_3`. Must not be greater than 5000 characters.' example: j nullable: true quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 2000 characters.' example: 'n' nullable: true security: [] /api/v1/intermediate-steps/values: get: summary: 'Get Values Intermediate Page content (public)' operationId: getValuesIntermediatePageContentpublic description: 'Returns the headline and points for display.' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Values Intermediate Page not found.' properties: success: type: boolean example: false message: type: string example: 'Values Intermediate Page not found.' tags: - 'Intermediate Steps - Values Page (Public)' security: [] /api/v1/intermediate-steps/y-method: get: summary: 'Get The Y Method Page content (public)' operationId: getTheYMethodPageContentpublic description: 'Returns the headline and steps for display.' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'The Y Method Page not found.' properties: success: type: boolean example: false message: type: string example: 'The Y Method Page not found.' tags: - 'Intermediate Steps - The Y Method Page (Public)' security: [] /api/v1/intermediate-steps/eight-most-common-mistakes: get: summary: 'Get Eight most common mistakes page content (public)' operationId: getEightMostCommonMistakesPageContentpublic description: 'Returns the headline and mistakes for display.' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Eight most common mistakes page not found.' properties: success: type: boolean example: false message: type: string example: 'Eight most common mistakes page not found.' tags: - 'Intermediate Steps - Eight most common mistakes (Public)' security: [] /api/v1/intermediate-steps/goal-settings: get: summary: 'Get Goal Settings Intermediate Page content (public)' operationId: getGoalSettingsIntermediatePageContentpublic description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Goal Settings Intermediate Page not found.' properties: success: type: boolean example: false message: type: string example: 'Goal Settings Intermediate Page not found.' tags: - 'Intermediate Steps - Goal Settings (Public)' security: [] /api/v1/intermediate-steps/questions-goal-why: get: summary: 'Get Questions for each goal - why? page content (public)' operationId: getQuestionsForEachGoalWhyPageContentpublic description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Questions for each goal - why? page not found.' properties: success: type: boolean example: false message: type: string example: 'Questions for each goal - why? page not found.' tags: - 'Intermediate Steps - Questions for each goal - why? (Public)' security: [] /api/v1/admin/legal-page: get: summary: 'List all legal pages' operationId: listAllLegalPages description: 'Returns all legal pages (privacy policy, refund policy, terms & conditions).' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Legal pages retrieved successfully","data":[{"id":1,"slug":"privacy-policy","content":"...","updated_at":"..."},...]}' tags: - 'Admin - Legal Pages (CMS)' security: [] '/api/v1/admin/legal-page/{slug}': get: summary: 'Get a legal page by slug (admin)' operationId: getALegalPageBySlugadmin description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Legal Pages (CMS)' security: [] put: summary: 'Update a legal page' operationId: updateALegalPage description: 'Update the content of a legal page. Slug cannot be changed.' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Legal page updated successfully","data":{...}}' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Legal page not found.' properties: success: type: boolean example: false message: type: string example: 'Legal page not found.' tags: - 'Admin - Legal Pages (CMS)' requestBody: required: false content: application/json: schema: type: object properties: content: type: string description: 'optional The page content (HTML or plain text).' example: '

Privacy policy content...

' nullable: true security: [] patch: summary: 'Update a legal page' operationId: updateALegalPage description: 'Update the content of a legal page. Slug cannot be changed.' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Legal page updated successfully","data":{...}}' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Legal page not found.' properties: success: type: boolean example: false message: type: string example: 'Legal page not found.' tags: - 'Admin - Legal Pages (CMS)' requestBody: required: false content: application/json: schema: type: object properties: content: type: string description: 'optional The page content (HTML or plain text).' example: '

Privacy policy content...

' nullable: true security: [] parameters: - in: path name: slug description: 'The page slug.' example: privacy-policy required: true schema: type: string '/api/v1/legal-page/{slug}': get: summary: 'Get a legal page by slug' operationId: getALegalPageBySlug description: 'Returns the content for the given legal page. Valid slugs: privacy-policy, refund-policy, terms-conditions.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Legal page retrieved successfully' data: id: 1 slug: privacy-policy content: ... updated_at: '2026-02-04T14:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Legal page retrieved successfully' data: type: object properties: id: type: integer example: 1 slug: type: string example: privacy-policy content: type: string example: ... updated_at: type: string example: '2026-02-04T14:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Legal page not found.' properties: success: type: boolean example: false message: type: string example: 'Legal page not found.' tags: - 'Legal Pages (Public)' security: [] parameters: - in: path name: slug description: 'The page slug.' example: privacy-policy required: true schema: type: string /api/v1/location/countries: get: summary: 'Get list of all countries' operationId: getListOfAllCountries description: 'Retrieve a list of all available countries.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Countries retrieved successfully' data: - id: 1 name: 'United States' - id: 2 name: Canada properties: success: type: boolean example: true message: type: string example: 'Countries retrieved successfully' data: type: array example: - id: 1 name: 'United States' - id: 2 name: Canada items: type: object properties: id: type: integer example: 1 name: type: string example: 'United States' tags: - Location security: [] '/api/v1/location/countries/{countryId}/states': get: summary: 'Get list of all states for a specific country' operationId: getListOfAllStatesForASpecificCountry description: 'Retrieve a list of all states/provinces for a given country.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'States retrieved successfully' data: - id: 1 country_id: 1 name: California - id: 2 country_id: 1 name: 'New York' properties: success: type: boolean example: true message: type: string example: 'States retrieved successfully' data: type: array example: - id: 1 country_id: 1 name: California - id: 2 country_id: 1 name: 'New York' items: type: object properties: id: type: integer example: 1 country_id: type: integer example: 1 name: type: string example: California 404: description: '' content: application/json: schema: type: object example: success: false message: 'Country not found.' properties: success: type: boolean example: false message: type: string example: 'Country not found.' tags: - Location security: [] parameters: - in: path name: countryId description: 'The ID of the country.' example: 1 required: true schema: type: integer '/api/v1/location/states/{stateId}/cities': get: summary: 'Get list of all cities for a specific state' operationId: getListOfAllCitiesForASpecificState description: 'Retrieve a list of all cities for a given state/province.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Cities retrieved successfully' data: - id: 1 state_id: 1 name: 'Los Angeles' - id: 2 state_id: 1 name: 'San Francisco' properties: success: type: boolean example: true message: type: string example: 'Cities retrieved successfully' data: type: array example: - id: 1 state_id: 1 name: 'Los Angeles' - id: 2 state_id: 1 name: 'San Francisco' items: type: object properties: id: type: integer example: 1 state_id: type: integer example: 1 name: type: string example: 'Los Angeles' 404: description: '' content: application/json: schema: type: object example: success: false message: 'State not found.' properties: success: type: boolean example: false message: type: string example: 'State not found.' tags: - Location security: [] parameters: - in: path name: stateId description: 'The ID of the state.' example: 1 required: true schema: type: integer /api/v1/location/phone-country-codes: get: summary: 'Get list of all phone country codes' operationId: getListOfAllPhoneCountryCodes description: 'Retrieve a list of all phone country codes. Optionally filter by country ID.' parameters: - in: query name: country_id description: 'optional Filter phone codes by country ID.' example: 1 required: false schema: type: integer description: 'optional Filter phone codes by country ID.' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Phone country codes retrieved successfully' data: - id: 1 phone_code: '+1' - id: 2 phone_code: '+91' properties: success: type: boolean example: true message: type: string example: 'Phone country codes retrieved successfully' data: type: array example: - id: 1 phone_code: '+1' - id: 2 phone_code: '+91' items: type: object properties: id: type: integer example: 1 phone_code: type: string example: '+1' tags: - Location security: [] /api/v1/admin/program-category: get: summary: 'Get list of program categories' operationId: getListOfProgramCategories description: 'Optional filter: parent_id=null or omitted for all; parent_id=0 for roots only; parent_id={id} for children of that category.' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: parent_id description: 'optional Filter by parent (0 or "null" for root-level only, or category id for children).' example: null required: false schema: type: integer description: 'optional Filter by parent (0 or "null" for root-level only, or category id for children).' example: null responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Category Management' security: [] post: summary: 'Create a new program category or sub-category' operationId: createANewProgramCategoryOrSubCategory description: '' parameters: [] responses: { } tags: - 'Admin - Program Category Management' requestBody: required: true content: application/json: schema: type: object properties: parent_id: type: integer description: 'optional ID of parent category. Omit for top-level.' example: null nullable: true name: type: string description: 'The category name.' example: 'Personal Training' slug: type: string description: 'optional URL-friendly slug. If omitted, generated from name.' example: personal-training nullable: true description: type: string description: 'optional Description.' example: 'One-on-one fitness coaching sessions.' nullable: true sort_order: type: integer description: 'optional Display order (lower first). Default 0.' example: 0 nullable: true is_active: type: boolean description: 'optional Whether visible on frontend. Default true.' example: true nullable: true required: - name security: [] '/api/v1/admin/program-category/{id}': get: summary: 'Get a specific program category' operationId: getASpecificProgramCategory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Category Management' security: [] put: summary: 'Update a program category' operationId: updateAProgramCategory description: '' parameters: [] responses: { } tags: - 'Admin - Program Category Management' requestBody: required: false content: application/json: schema: type: object properties: parent_id: type: integer description: 'ID of the parent category. Null for top-level. Cannot set to self. The id of an existing record in the program_categories table. Must not be one of .' example: null nullable: true name: type: string description: 'The category name. Must not be greater than 255 characters.' example: 'Personal Training' slug: type: string description: 'URL-friendly slug. Unique per parent. Must match the regex /^[a-z0-9]+(?:-[a-z0-9]+)*$/. Must not be greater than 255 characters.' example: personal-training description: type: string description: 'Optional description. Must not be greater than 2000 characters.' example: 'One-on-one fitness coaching sessions.' nullable: true sort_order: type: integer description: 'Display order (lower first). Must be at least 0.' example: 0 nullable: true is_active: type: boolean description: 'Whether the category is visible on the frontend.' example: true nullable: true security: [] patch: summary: 'Update a program category' operationId: updateAProgramCategory description: '' parameters: [] responses: { } tags: - 'Admin - Program Category Management' requestBody: required: false content: application/json: schema: type: object properties: parent_id: type: integer description: 'ID of the parent category. Null for top-level. Cannot set to self. The id of an existing record in the program_categories table. Must not be one of .' example: null nullable: true name: type: string description: 'The category name. Must not be greater than 255 characters.' example: 'Personal Training' slug: type: string description: 'URL-friendly slug. Unique per parent. Must match the regex /^[a-z0-9]+(?:-[a-z0-9]+)*$/. Must not be greater than 255 characters.' example: personal-training description: type: string description: 'Optional description. Must not be greater than 2000 characters.' example: 'One-on-one fitness coaching sessions.' nullable: true sort_order: type: integer description: 'Display order (lower first). Must be at least 0.' example: 0 nullable: true is_active: type: boolean description: 'Whether the category is visible on the frontend.' example: true nullable: true security: [] delete: summary: 'Delete a program category' operationId: deleteAProgramCategory description: "Children will have their parent_id set to null (become root-level) via onDelete('set null')." parameters: [] responses: { } tags: - 'Admin - Program Category Management' security: [] parameters: - in: path name: id description: 'The ID of the program category.' example: 1 required: true schema: type: integer /api/v1/program-category: get: summary: 'List active program categories' operationId: listActiveProgramCategories description: "Optional: parent_id=null (or 0) for root-level only; parent_id={id} for children of that category.\nOptional: nested=1 to return root categories with their active children nested." 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: parent_id description: 'optional Filter by parent (null/0 for roots, or category id for children).' example: null required: false schema: type: integer description: 'optional Filter by parent (null/0 for roots, or category id for children).' example: null - in: query name: nested description: 'optional Set to 1 to get root categories with children nested.' example: 0 required: false schema: type: integer description: 'optional Set to 1 to get root categories with children nested.' example: 0 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Program categories retrieved successfully' data: data: [] links: first: 'https://ruhline-api.test/api/v1/program-category?page=1' last: 'https://ruhline-api.test/api/v1/program-category?page=1' prev: null next: null meta: current_page: 1 from: null last_page: 1 links: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/program-category?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false path: 'https://ruhline-api.test/api/v1/program-category' per_page: 15 to: null total: 0 properties: success: type: boolean example: true message: type: string example: 'Program categories retrieved successfully' data: type: object properties: data: type: array example: [] links: type: object properties: first: type: string example: 'https://ruhline-api.test/api/v1/program-category?page=1' last: type: string example: 'https://ruhline-api.test/api/v1/program-category?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: string example: null nullable: true last_page: type: integer example: 1 links: type: array example: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/program-category?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Previous' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: 'https://ruhline-api.test/api/v1/program-category' per_page: type: integer example: 15 to: type: string example: null nullable: true total: type: integer example: 0 tags: - 'Program Categories (Public)' security: [] '/api/v1/program-category/{id}': get: summary: 'Get a single active program category (optionally with children)' operationId: getASingleActiveProgramCategoryoptionallyWithChildren description: '' parameters: - in: query name: with_children description: 'optional Set to 1 to include active child categories.' example: 0 required: false schema: type: integer description: 'optional Set to 1 to include active child categories.' example: 0 responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Program category not found.' properties: success: type: boolean example: false message: type: string example: 'Program category not found.' tags: - 'Program Categories (Public)' security: [] parameters: - in: path name: id description: 'The ID of the program category.' example: 1 required: true schema: type: integer /api/v1/admin/program: get: summary: 'Get list of programs' operationId: getListOfPrograms description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: program_category_id description: 'optional Filter by program category.' example: 1 required: false schema: type: integer description: 'optional Filter by program category.' example: 1 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Management' security: [] post: summary: 'Create a new program' operationId: createANewProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b program_category_id: type: integer description: 'Auto-generated from validation rules for `program_category_id`. The id of an existing record in the program_categories table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true main_image: type: string format: binary description: 'Auto-generated from validation rules for `main_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true gallery_images: type: array description: 'Auto-generated from validation rules for `gallery_images.*`. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary nullable: true faqs_section_image: type: string format: binary description: 'Auto-generated from validation rules for `faqs_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true faqs: type: array description: 'Auto-generated from validation rules for `faqs`.' example: null items: type: object nullable: true properties: heading: type: string description: 'Auto-generated from validation rules for `faqs.*.heading`. Must not be greater than 500 characters.' example: 'n' description: type: string description: 'Auto-generated from validation rules for `faqs.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `faqs.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - heading - description benefits_section_image: type: string format: binary description: 'Auto-generated from validation rules for `benefits_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true benefits: type: array description: 'Auto-generated from validation rules for `benefits`.' example: null items: type: object nullable: true properties: description: type: string description: 'Auto-generated from validation rules for `benefits.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `benefits.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description how_it_works_section_image: type: string format: binary description: 'Auto-generated from validation rules for `how_it_works_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true how_it_works: type: array description: 'Auto-generated from validation rules for `how_it_works`.' example: null items: type: object nullable: true properties: description: type: string description: 'Auto-generated from validation rules for `how_it_works.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description occurrence_type: type: string description: 'Auto-generated from validation rules for `occurrence_type`.' example: one_time enum: - one_time - recurring session_duration_minutes: type: integer description: 'Auto-generated from validation rules for `session_duration_minutes`.' example: 180 enum: - 30 - 45 - 60 - 75 - 90 - 105 - 120 - 135 - 150 - 165 - 180 - 195 - 210 - 225 - 240 tenure_weeks: type: integer description: 'Auto-generated from validation rules for `tenure_weeks`. This field is required when occurrence_type is recurring. Must be at least 1. Must not be greater than 520.' example: 1 nullable: true sessions_per_week: type: integer description: 'Auto-generated from validation rules for `sessions_per_week`. This field is required when occurrence_type is recurring. Must be at least 1. Must not be greater than 28.' example: 1 nullable: true sale_price: type: number description: 'Auto-generated from validation rules for `sale_price`. Must be at least 0.' example: 37 original_price: type: number description: 'Auto-generated from validation rules for `original_price`. Must be at least 0.' example: 9 coach_commission_type: type: string description: 'Auto-generated from validation rules for `coach_commission_type`.' example: custom enum: - global - custom custom_commission_rate: type: number description: 'Auto-generated from validation rules for `custom_commission_rate`. This field is required when coach_commission_type is custom. Must be at least 0. Must not be greater than 100.' example: 17 nullable: true coach_ids: type: array description: 'Auto-generated from validation rules for `coach_ids.*`. The id of an existing record in the coaches table.' example: - 16 items: type: integer tag: type: string description: 'Auto-generated from validation rules for `tag`.' example: recommended enum: - new - bestselling - most_rated - recommended nullable: true required: - name - program_category_id - occurrence_type - session_duration_minutes - sale_price - original_price - coach_commission_type security: [] '/api/v1/admin/program/{id}': get: summary: 'Get a specific program' operationId: getASpecificProgram description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Management' security: [] post: summary: 'Update a program' operationId: updateAProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b program_category_id: type: integer description: 'Auto-generated from validation rules for `program_category_id`. The id of an existing record in the program_categories table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true main_image: type: string format: binary description: 'Auto-generated from validation rules for `main_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true gallery_images: type: array description: 'Auto-generated from validation rules for `gallery_images.*`. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary nullable: true faqs_section_image: type: string format: binary description: 'Auto-generated from validation rules for `faqs_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true faqs: type: array description: 'Auto-generated from validation rules for `faqs`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `faqs.*.id`. The id of an existing record in the program_faqs table.' example: 16 heading: type: string description: 'Auto-generated from validation rules for `faqs.*.heading`. Must not be greater than 500 characters.' example: 'n' description: type: string description: 'Auto-generated from validation rules for `faqs.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `faqs.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - heading - description benefits_section_image: type: string format: binary description: 'Auto-generated from validation rules for `benefits_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true benefits: type: array description: 'Auto-generated from validation rules for `benefits`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `benefits.*.id`. The id of an existing record in the program_benefits table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `benefits.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `benefits.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description how_it_works_section_image: type: string format: binary description: 'Auto-generated from validation rules for `how_it_works_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true how_it_works: type: array description: 'Auto-generated from validation rules for `how_it_works`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.id`. The id of an existing record in the program_how_it_works table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `how_it_works.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description occurrence_type: type: string description: 'Auto-generated from validation rules for `occurrence_type`.' example: recurring enum: - one_time - recurring session_duration_minutes: type: integer description: 'Auto-generated from validation rules for `session_duration_minutes`.' example: 210 enum: - 30 - 45 - 60 - 75 - 90 - 105 - 120 - 135 - 150 - 165 - 180 - 195 - 210 - 225 - 240 tenure_weeks: type: integer description: 'Auto-generated from validation rules for `tenure_weeks`. Must be at least 1. Must not be greater than 520.' example: 1 nullable: true sessions_per_week: type: integer description: 'Auto-generated from validation rules for `sessions_per_week`. Must be at least 1. Must not be greater than 28.' example: 1 nullable: true sale_price: type: number description: 'Auto-generated from validation rules for `sale_price`. Must be at least 0.' example: 37 original_price: type: number description: 'Auto-generated from validation rules for `original_price`. Must be at least 0.' example: 9 coach_commission_type: type: string description: 'Auto-generated from validation rules for `coach_commission_type`.' example: global enum: - global - custom custom_commission_rate: type: number description: 'Auto-generated from validation rules for `custom_commission_rate`. Must be at least 0. Must not be greater than 100.' example: 17 nullable: true coach_ids: type: array description: 'Auto-generated from validation rules for `coach_ids.*`. The id of an existing record in the coaches table.' example: - 16 items: type: integer tag: type: string description: 'Auto-generated from validation rules for `tag`.' example: most_rated enum: - new - bestselling - most_rated - recommended nullable: true security: [] put: summary: 'Update a program' operationId: updateAProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b program_category_id: type: integer description: 'Auto-generated from validation rules for `program_category_id`. The id of an existing record in the program_categories table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true main_image: type: string format: binary description: 'Auto-generated from validation rules for `main_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true gallery_images: type: array description: 'Auto-generated from validation rules for `gallery_images.*`. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary nullable: true faqs_section_image: type: string format: binary description: 'Auto-generated from validation rules for `faqs_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true faqs: type: array description: 'Auto-generated from validation rules for `faqs`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `faqs.*.id`. The id of an existing record in the program_faqs table.' example: 16 heading: type: string description: 'Auto-generated from validation rules for `faqs.*.heading`. Must not be greater than 500 characters.' example: 'n' description: type: string description: 'Auto-generated from validation rules for `faqs.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `faqs.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - heading - description benefits_section_image: type: string format: binary description: 'Auto-generated from validation rules for `benefits_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true benefits: type: array description: 'Auto-generated from validation rules for `benefits`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `benefits.*.id`. The id of an existing record in the program_benefits table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `benefits.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `benefits.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description how_it_works_section_image: type: string format: binary description: 'Auto-generated from validation rules for `how_it_works_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true how_it_works: type: array description: 'Auto-generated from validation rules for `how_it_works`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.id`. The id of an existing record in the program_how_it_works table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `how_it_works.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description occurrence_type: type: string description: 'Auto-generated from validation rules for `occurrence_type`.' example: recurring enum: - one_time - recurring session_duration_minutes: type: integer description: 'Auto-generated from validation rules for `session_duration_minutes`.' example: 105 enum: - 30 - 45 - 60 - 75 - 90 - 105 - 120 - 135 - 150 - 165 - 180 - 195 - 210 - 225 - 240 tenure_weeks: type: integer description: 'Auto-generated from validation rules for `tenure_weeks`. Must be at least 1. Must not be greater than 520.' example: 1 nullable: true sessions_per_week: type: integer description: 'Auto-generated from validation rules for `sessions_per_week`. Must be at least 1. Must not be greater than 28.' example: 1 nullable: true sale_price: type: number description: 'Auto-generated from validation rules for `sale_price`. Must be at least 0.' example: 37 original_price: type: number description: 'Auto-generated from validation rules for `original_price`. Must be at least 0.' example: 9 coach_commission_type: type: string description: 'Auto-generated from validation rules for `coach_commission_type`.' example: global enum: - global - custom custom_commission_rate: type: number description: 'Auto-generated from validation rules for `custom_commission_rate`. Must be at least 0. Must not be greater than 100.' example: 17 nullable: true coach_ids: type: array description: 'Auto-generated from validation rules for `coach_ids.*`. The id of an existing record in the coaches table.' example: - 16 items: type: integer tag: type: string description: 'Auto-generated from validation rules for `tag`.' example: most_rated enum: - new - bestselling - most_rated - recommended nullable: true security: [] patch: summary: 'Update a program' operationId: updateAProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' requestBody: required: false content: multipart/form-data: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b program_category_id: type: integer description: 'Auto-generated from validation rules for `program_category_id`. The id of an existing record in the program_categories table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true main_image: type: string format: binary description: 'Auto-generated from validation rules for `main_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true gallery_images: type: array description: 'Auto-generated from validation rules for `gallery_images.*`. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary nullable: true faqs_section_image: type: string format: binary description: 'Auto-generated from validation rules for `faqs_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true faqs: type: array description: 'Auto-generated from validation rules for `faqs`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `faqs.*.id`. The id of an existing record in the program_faqs table.' example: 16 heading: type: string description: 'Auto-generated from validation rules for `faqs.*.heading`. Must not be greater than 500 characters.' example: 'n' description: type: string description: 'Auto-generated from validation rules for `faqs.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `faqs.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - heading - description benefits_section_image: type: string format: binary description: 'Auto-generated from validation rules for `benefits_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true benefits: type: array description: 'Auto-generated from validation rules for `benefits`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `benefits.*.id`. The id of an existing record in the program_benefits table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `benefits.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `benefits.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description how_it_works_section_image: type: string format: binary description: 'Auto-generated from validation rules for `how_it_works_section_image`. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true how_it_works: type: array description: 'Auto-generated from validation rules for `how_it_works`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.id`. The id of an existing record in the program_how_it_works table.' example: 16 description: type: string description: 'Auto-generated from validation rules for `how_it_works.*.description`.' example: 'Eius et animi quos velit et.' sort_order: type: integer description: 'Auto-generated from validation rules for `how_it_works.*.sort_order`. Must be at least 0.' example: 60 nullable: true required: - description occurrence_type: type: string description: 'Auto-generated from validation rules for `occurrence_type`.' example: one_time enum: - one_time - recurring session_duration_minutes: type: integer description: 'Auto-generated from validation rules for `session_duration_minutes`.' example: 240 enum: - 30 - 45 - 60 - 75 - 90 - 105 - 120 - 135 - 150 - 165 - 180 - 195 - 210 - 225 - 240 tenure_weeks: type: integer description: 'Auto-generated from validation rules for `tenure_weeks`. Must be at least 1. Must not be greater than 520.' example: 1 nullable: true sessions_per_week: type: integer description: 'Auto-generated from validation rules for `sessions_per_week`. Must be at least 1. Must not be greater than 28.' example: 1 nullable: true sale_price: type: number description: 'Auto-generated from validation rules for `sale_price`. Must be at least 0.' example: 37 original_price: type: number description: 'Auto-generated from validation rules for `original_price`. Must be at least 0.' example: 9 coach_commission_type: type: string description: 'Auto-generated from validation rules for `coach_commission_type`.' example: global enum: - global - custom custom_commission_rate: type: number description: 'Auto-generated from validation rules for `custom_commission_rate`. Must be at least 0. Must not be greater than 100.' example: 17 nullable: true coach_ids: type: array description: 'Auto-generated from validation rules for `coach_ids.*`. The id of an existing record in the coaches table.' example: - 16 items: type: integer tag: type: string description: 'Auto-generated from validation rules for `tag`.' example: most_rated enum: - new - bestselling - most_rated - recommended nullable: true security: [] delete: summary: 'Delete a program' operationId: deleteAProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: 1 required: true schema: type: integer '/api/v1/admin/program/{id}/gallery/{imageId}': delete: summary: 'Delete a single gallery image from a program' operationId: deleteASingleGalleryImageFromAProgram description: '' parameters: [] responses: { } tags: - 'Admin - Program Management' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: 1 required: true schema: type: integer - in: path name: imageId description: 'The ID of the gallery image to delete.' example: 5 required: true schema: type: integer /api/v1/admin/review: get: summary: '' operationId: getApiV1AdminReview description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Reviews' security: [] '/api/v1/admin/review/{id}': get: summary: '' operationId: getApiV1AdminReviewId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Reviews' security: [] parameters: - in: path name: id description: 'The ID of the review.' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/settings': get: summary: 'Get program settings (quote category and card category).' operationId: getProgramSettingsquoteCategoryAndCardCategory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Settings' security: [] put: summary: 'Update program settings (set or change quote category and/or card category).' operationId: updateProgramSettingssetOrChangeQuoteCategoryAndorCardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Program Settings' requestBody: required: false content: application/json: schema: type: object properties: quote_category_id: type: integer description: 'Auto-generated from validation rules for `quote_category_id`. The id of an existing record in the quote_categories table.' example: 16 nullable: true card_category_id: type: integer description: 'Auto-generated from validation rules for `card_category_id`. The id of an existing record in the card_categories table.' example: 16 nullable: true coach_can_edit_modules: type: boolean description: 'Auto-generated from validation rules for `coach_can_edit_modules`.' example: false nullable: true coach_editable_module_types: type: array description: 'Auto-generated from validation rules for `coach_editable_module_types.*`.' example: - upload_documents items: type: string enum: - values - wheel_of_life - find_your_motivation - upload_documents - who_am_i security: [] patch: summary: 'Update program settings (set or change quote category and/or card category).' operationId: updateProgramSettingssetOrChangeQuoteCategoryAndorCardCategory description: '' parameters: [] responses: { } tags: - 'Admin - Program Settings' requestBody: required: false content: application/json: schema: type: object properties: quote_category_id: type: integer description: 'Auto-generated from validation rules for `quote_category_id`. The id of an existing record in the quote_categories table.' example: 16 nullable: true card_category_id: type: integer description: 'Auto-generated from validation rules for `card_category_id`. The id of an existing record in the card_categories table.' example: 16 nullable: true coach_can_edit_modules: type: boolean description: 'Auto-generated from validation rules for `coach_can_edit_modules`.' example: true nullable: true coach_editable_module_types: type: array description: 'Auto-generated from validation rules for `coach_editable_module_types.*`.' example: - wheel_of_life items: type: string enum: - values - wheel_of_life - find_your_motivation - upload_documents - who_am_i security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure': get: summary: 'List program structure (all modules in order).' operationId: listProgramStructureallModulesInOrder description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a module to the program structure.' operationId: addAModuleToTheProgramStructure description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: module_type: type: string description: 'Auto-generated from validation rules for `module_type`.' example: values enum: - find_your_motivation - values - wheel_of_life - who_am_i - quote - card_game - upload_documents - goal_settings - habit_tracker - intermediate_values - intermediate_eight_common_mistakes - intermediate_goal_settings - intermediate_questions_goal_why - intermediate_y_method required: - module_type security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/reorder': put: summary: 'Reorder modules in the program structure.' operationId: reorderModulesInTheProgramStructure description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structures table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder modules in the program structure.' operationId: reorderModulesInTheProgramStructure description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structures table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}': delete: summary: 'Remove a module from the program structure.' operationId: removeAModuleFromTheProgramStructure description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/words': get: summary: 'List words for a Find your Motivation module.' operationId: listWordsForAFindYourMotivationModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a word to a Find your Motivation module.' operationId: addAWordToAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Auto-generated from validation rules for `word`. Must not be greater than 255 characters.' example: b required: - word security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/words/reorder': put: summary: 'Reorder words in a Find your Motivation module.' operationId: reorderWordsInAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_find_your_motivation_words table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder words in a Find your Motivation module.' operationId: reorderWordsInAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_find_your_motivation_words table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/words/{wordId}': put: summary: 'Update a word in a Find your Motivation module.' operationId: updateAWordInAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Auto-generated from validation rules for `word`. Must not be greater than 255 characters.' example: b required: - word security: [] patch: summary: 'Update a word in a Find your Motivation module.' operationId: updateAWordInAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: word: type: string description: 'Auto-generated from validation rules for `word`. Must not be greater than 255 characters.' example: b required: - word security: [] delete: summary: 'Delete a word from a Find your Motivation module.' operationId: deleteAWordFromAFindYourMotivationModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: wordId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/values/questions': get: summary: 'List questions for a Values module.' operationId: listQuestionsForAValuesModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a question to a Values module.' operationId: addAQuestionToAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: dropdown enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/values/questions/reorder': put: summary: 'Reorder questions in a Values module.' operationId: reorderQuestionsInAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_values_questions table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder questions in a Values module.' operationId: reorderQuestionsInAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_values_questions table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/values/questions/{questionId}': put: summary: 'Update a question in a Values module.' operationId: updateAQuestionInAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: single_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] patch: summary: 'Update a question in a Values module.' operationId: updateAQuestionInAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: single_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] delete: summary: 'Delete a question from a Values module.' operationId: deleteAQuestionFromAValuesModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/who-am-i/questions': get: summary: 'List questions for a Who am I module.' operationId: listQuestionsForAWhoAmIModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a question to a Who am I module.' operationId: addAQuestionToAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: multi_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/who-am-i/questions/reorder': put: summary: 'Reorder questions in a Who am I module.' operationId: reorderQuestionsInAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_who_am_i_questions table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder questions in a Who am I module.' operationId: reorderQuestionsInAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_who_am_i_questions table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/who-am-i/questions/{questionId}': put: summary: 'Update a question in a Who am I module.' operationId: updateAQuestionInAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: multi_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] patch: summary: 'Update a question in a Who am I module.' operationId: updateAQuestionInAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: multi_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] delete: summary: 'Delete a question from a Who am I module.' operationId: deleteAQuestionFromAWhoAmIModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets': get: summary: 'List question sets for a Card Game module.' operationId: listQuestionSetsForACardGameModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets/reorder': put: summary: 'Reorder question sets in a Card Game module.' operationId: reorderQuestionSetsInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_card_game_question_sets table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder question sets in a Card Game module.' operationId: reorderQuestionSetsInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_card_game_question_sets table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets/{setId}': put: summary: 'Update a question set (e.g. rename title) in a Card Game module.' operationId: updateAQuestionSetegRenameTitleInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Auto-generated from validation rules for `title`. Must not be greater than 255 characters.' example: b required: - title security: [] patch: summary: 'Update a question set (e.g. rename title) in a Card Game module.' operationId: updateAQuestionSetegRenameTitleInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Auto-generated from validation rules for `title`. Must not be greater than 255 characters.' example: b required: - title security: [] delete: summary: 'Delete a question set from a Card Game module.' operationId: deleteAQuestionSetFromACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets/{setId}/questions': get: summary: 'List questions in a Card Game question set.' operationId: listQuestionsInACardGameQuestionSet description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a question to a Card Game question set.' operationId: addAQuestionToACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: dropdown enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets/{setId}/questions/reorder': put: summary: 'Reorder questions in a Card Game question set.' operationId: reorderQuestionsInACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_card_game_questions table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder questions in a Card Game question set.' operationId: reorderQuestionsInACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_card_game_questions table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/question-sets/{setId}/questions/{questionId}': put: summary: 'Update a question in a Card Game question set.' operationId: updateAQuestionInACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: descriptive enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] patch: summary: 'Update a question in a Card Game question set.' operationId: updateAQuestionInACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: descriptive enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] delete: summary: 'Delete a question from a Card Game question set.' operationId: deleteAQuestionFromACardGameQuestionSet description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/cards': get: summary: 'List cards for a Card Game module.' operationId: listCardsForACardGameModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a new card to a Card Game module.' operationId: addANewCardToACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true required: - name security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/cards/reorder': put: summary: 'Reorder cards in a Card Game module.' operationId: reorderCardsInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] patch: summary: 'Reorder cards in a Card Game module.' operationId: reorderCardsInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/card-game/cards/{cardId}': put: summary: 'Update a card in a Card Game module.' operationId: updateACardInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true security: [] patch: summary: 'Update a card in a Card Game module.' operationId: updateACardInACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b description: type: string description: 'Auto-generated from validation rules for `description`.' example: 'Eius et animi quos velit et.' nullable: true security: [] delete: summary: 'Delete a card from a Card Game module.' operationId: deleteACardFromACardGameModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: cardId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/upload-documents': get: summary: 'List documents for an Upload Documents module.' operationId: listDocumentsForAnUploadDocumentsModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Upload one or more documents to an Upload Documents module.' operationId: uploadOneOrMoreDocumentsToAnUploadDocumentsModule description: "Single file: multipart field \"file\" (optional \"original_name\").\nMultiple files: multipart field \"files[]\" (array of files)." parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Auto-generated from validation rules for `file`. Must be a file. Must not be greater than 20480 kilobytes.' nullable: true files: type: array description: 'Auto-generated from validation rules for `files.*`. Must be a file. Must not be greater than 20480 kilobytes.' items: type: string format: binary original_name: type: string description: 'Auto-generated from validation rules for `original_name`. Must not be greater than 255 characters.' example: b nullable: true security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/upload-documents/reorder': put: summary: 'Reorder documents in an Upload Documents module.' operationId: reorderDocumentsInAnUploadDocumentsModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder documents in an Upload Documents module.' operationId: reorderDocumentsInAnUploadDocumentsModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/upload-documents/{documentId}': put: summary: 'Update a document (e.g. display name) in an Upload Documents module.' operationId: updateADocumentegDisplayNameInAnUploadDocumentsModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: original_name: type: string description: 'Auto-generated from validation rules for `original_name`. Must not be greater than 255 characters.' example: b nullable: true security: [] patch: summary: 'Update a document (e.g. display name) in an Upload Documents module.' operationId: updateADocumentegDisplayNameInAnUploadDocumentsModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: original_name: type: string description: 'Auto-generated from validation rules for `original_name`. Must not be greater than 255 characters.' example: b nullable: true security: [] delete: summary: 'Delete a document from an Upload Documents module.' operationId: deleteADocumentFromAnUploadDocumentsModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: documentId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements': get: summary: 'List life elements for a Wheel of Life module.' operationId: listLifeElementsForAWheelOfLifeModule description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a life element to a Wheel of Life module.' operationId: addALifeElementToAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b required: - name security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements/reorder': put: summary: 'Reorder life elements in a Wheel of Life module.' operationId: reorderLifeElementsInAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_wol_elements table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder life elements in a Wheel of Life module.' operationId: reorderLifeElementsInAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_wol_elements table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements/{elementId}': put: summary: 'Update a life element in a Wheel of Life module.' operationId: updateALifeElementInAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b required: - name security: [] patch: summary: 'Update a life element in a Wheel of Life module.' operationId: updateALifeElementInAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b required: - name security: [] delete: summary: 'Delete a life element from a Wheel of Life module.' operationId: deleteALifeElementFromAWheelOfLifeModule description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions': get: summary: 'List questions for a Wheel of Life life element.' operationId: listQuestionsForAWheelOfLifeLifeElement description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] post: summary: 'Add a question to a Wheel of Life life element.' operationId: addAQuestionToAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: dropdown enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions/reorder': put: summary: 'Reorder questions in a Wheel of Life life element.' operationId: reorderQuestionsInAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_wol_questions table.' example: - 16 items: type: integer security: [] patch: summary: 'Reorder questions in a Wheel of Life life element.' operationId: reorderQuestionsInAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: order: type: array description: 'Auto-generated from validation rules for `order.*`. The id of an existing record in the program_structure_wol_questions table.' example: - 16 items: type: integer security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/wheel-of-life/elements/{elementId}/questions/{questionId}': put: summary: 'Update a question in a Wheel of Life life element.' operationId: updateAQuestionInAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: single_choice enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] patch: summary: 'Update a question in a Wheel of Life life element.' operationId: updateAQuestionInAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Auto-generated from validation rules for `type`.' example: dropdown enum: - descriptive - multi_choice - single_choice - dropdown question_text: type: string description: 'Auto-generated from validation rules for `question_text`. Must not be greater than 2000 characters.' example: b options: type: array description: 'Auto-generated from validation rules for `options.*`. Must not be greater than 500 characters.' example: - 'n' items: type: string required: - type - question_text security: [] delete: summary: 'Delete a question from a Wheel of Life life element.' operationId: deleteAQuestionFromAWheelOfLifeLifeElement description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-values': get: summary: 'Program-specific intermediate Values page – show.' operationId: programSpecificIntermediateValuesPageShow description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] put: summary: 'Program-specific intermediate Values page – update.' operationId: programSpecificIntermediateValuesPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b points: type: array description: 'Auto-generated from validation rules for `points`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `points.*.id`. The id of an existing record in the values_intermediate_points table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `points.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `points.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] patch: summary: 'Program-specific intermediate Values page – update.' operationId: programSpecificIntermediateValuesPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b points: type: array description: 'Auto-generated from validation rules for `points`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `points.*.id`. The id of an existing record in the values_intermediate_points table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `points.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `points.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-eight-most-common-mistakes': get: summary: 'Program-specific intermediate Eight most common mistakes page – show.' operationId: programSpecificIntermediateEightMostCommonMistakesPageShow description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] put: summary: 'Program-specific intermediate Eight most common mistakes page – update.' operationId: programSpecificIntermediateEightMostCommonMistakesPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b mistakes: type: array description: 'Auto-generated from validation rules for `mistakes`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `mistakes.*.id`. The id of an existing record in the eight_common_mistakes table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `mistakes.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `mistakes.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] patch: summary: 'Program-specific intermediate Eight most common mistakes page – update.' operationId: programSpecificIntermediateEightMostCommonMistakesPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b mistakes: type: array description: 'Auto-generated from validation rules for `mistakes`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `mistakes.*.id`. The id of an existing record in the eight_common_mistakes table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `mistakes.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `mistakes.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-goal-settings': get: summary: 'Program-specific intermediate Goal Settings page – show.' operationId: programSpecificIntermediateGoalSettingsPageShow description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] put: summary: 'Program-specific intermediate Goal Settings page – update.' operationId: programSpecificIntermediateGoalSettingsPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 500 characters.' example: 'n' nullable: true sub_heading_1: type: string description: 'Auto-generated from validation rules for `sub_heading_1`. Must not be greater than 255 characters.' example: g nullable: true sub_heading_2: type: string description: 'Auto-generated from validation rules for `sub_heading_2`. Must not be greater than 255 characters.' example: z nullable: true description_2: type: string description: 'Auto-generated from validation rules for `description_2`. Must not be greater than 10000 characters.' example: m nullable: true options: type: array description: 'Auto-generated from validation rules for `options`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `options.*.id`. The id of an existing record in the goal_settings_intermediate_options table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `options.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `options.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] patch: summary: 'Program-specific intermediate Goal Settings page – update.' operationId: programSpecificIntermediateGoalSettingsPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 500 characters.' example: 'n' nullable: true sub_heading_1: type: string description: 'Auto-generated from validation rules for `sub_heading_1`. Must not be greater than 255 characters.' example: g nullable: true sub_heading_2: type: string description: 'Auto-generated from validation rules for `sub_heading_2`. Must not be greater than 255 characters.' example: z nullable: true description_2: type: string description: 'Auto-generated from validation rules for `description_2`. Must not be greater than 10000 characters.' example: m nullable: true options: type: array description: 'Auto-generated from validation rules for `options`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `options.*.id`. The id of an existing record in the goal_settings_intermediate_options table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `options.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `options.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-questions-goal-why': get: summary: 'Program-specific intermediate Questions Goal Why page – show.' operationId: programSpecificIntermediateQuestionsGoalWhyPageShow description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] put: summary: 'Program-specific intermediate Questions Goal Why page – update.' operationId: programSpecificIntermediateQuestionsGoalWhyPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: headline_1: type: string description: 'Auto-generated from validation rules for `headline_1`. Must not be greater than 255 characters.' example: b nullable: true headline_2: type: string description: 'Auto-generated from validation rules for `headline_2`. Must not be greater than 255 characters.' example: 'n' nullable: true headline_3: type: string description: 'Auto-generated from validation rules for `headline_3`. Must not be greater than 255 characters.' example: g nullable: true headline_4: type: string description: 'Auto-generated from validation rules for `headline_4`. Must not be greater than 255 characters.' example: z nullable: true headline_5: type: string description: 'Auto-generated from validation rules for `headline_5`. Must not be greater than 255 characters.' example: m nullable: true question_heading_1: type: string description: 'Auto-generated from validation rules for `question_heading_1`. Must not be greater than 255 characters.' example: i nullable: true question_description_1: type: string description: 'Auto-generated from validation rules for `question_description_1`. Must not be greater than 5000 characters.' example: 'y' nullable: true question_heading_2: type: string description: 'Auto-generated from validation rules for `question_heading_2`. Must not be greater than 255 characters.' example: v nullable: true question_description_2: type: string description: 'Auto-generated from validation rules for `question_description_2`. Must not be greater than 5000 characters.' example: d nullable: true question_heading_3: type: string description: 'Auto-generated from validation rules for `question_heading_3`. Must not be greater than 255 characters.' example: l nullable: true question_description_3: type: string description: 'Auto-generated from validation rules for `question_description_3`. Must not be greater than 5000 characters.' example: j nullable: true quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 2000 characters.' example: 'n' nullable: true security: [] patch: summary: 'Program-specific intermediate Questions Goal Why page – update.' operationId: programSpecificIntermediateQuestionsGoalWhyPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: false content: application/json: schema: type: object properties: headline_1: type: string description: 'Auto-generated from validation rules for `headline_1`. Must not be greater than 255 characters.' example: b nullable: true headline_2: type: string description: 'Auto-generated from validation rules for `headline_2`. Must not be greater than 255 characters.' example: 'n' nullable: true headline_3: type: string description: 'Auto-generated from validation rules for `headline_3`. Must not be greater than 255 characters.' example: g nullable: true headline_4: type: string description: 'Auto-generated from validation rules for `headline_4`. Must not be greater than 255 characters.' example: z nullable: true headline_5: type: string description: 'Auto-generated from validation rules for `headline_5`. Must not be greater than 255 characters.' example: m nullable: true question_heading_1: type: string description: 'Auto-generated from validation rules for `question_heading_1`. Must not be greater than 255 characters.' example: i nullable: true question_description_1: type: string description: 'Auto-generated from validation rules for `question_description_1`. Must not be greater than 5000 characters.' example: 'y' nullable: true question_heading_2: type: string description: 'Auto-generated from validation rules for `question_heading_2`. Must not be greater than 255 characters.' example: v nullable: true question_description_2: type: string description: 'Auto-generated from validation rules for `question_description_2`. Must not be greater than 5000 characters.' example: d nullable: true question_heading_3: type: string description: 'Auto-generated from validation rules for `question_heading_3`. Must not be greater than 255 characters.' example: l nullable: true question_description_3: type: string description: 'Auto-generated from validation rules for `question_description_3`. Must not be greater than 5000 characters.' example: j nullable: true quote: type: string description: 'Auto-generated from validation rules for `quote`. Must not be greater than 2000 characters.' example: 'n' nullable: true security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-y-method': get: summary: 'Program-specific intermediate Y Method page – show.' operationId: programSpecificIntermediateYMethodPageShow description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Program Structure' security: [] put: summary: 'Program-specific intermediate Y Method page – update.' operationId: programSpecificIntermediateYMethodPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b steps: type: array description: 'Auto-generated from validation rules for `steps`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `steps.*.id`. The id of an existing record in the program_y_method_steps table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `steps.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `steps.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] patch: summary: 'Program-specific intermediate Y Method page – update.' operationId: programSpecificIntermediateYMethodPageUpdate description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' requestBody: required: true content: application/json: schema: type: object properties: headline: type: string description: 'Auto-generated from validation rules for `headline`. Must not be greater than 255 characters.' example: b steps: type: array description: 'Auto-generated from validation rules for `steps`.' example: null items: type: object nullable: true properties: id: type: integer description: 'Auto-generated from validation rules for `steps.*.id`. The id of an existing record in the program_y_method_steps table.' example: 16 nullable: true description: type: string description: 'Auto-generated from validation rules for `steps.*.description`. Must not be greater than 5000 characters.' example: 'Et animi quos velit et fugiat.' nullable: true sort_order: type: integer description: 'Auto-generated from validation rules for `steps.*.sort_order`. Must be at least 0.' example: 42 nullable: true required: - headline security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/admin/program/{id}/structure/{structureId}/intermediate-steps/complete-setup': post: summary: 'Complete setup for an intermediate module: choose global vs specific.' operationId: completeSetupForAnIntermediateModuleChooseGlobalVsSpecific description: '' parameters: [] responses: { } tags: - 'Admin - Program Structure' security: [] parameters: - in: path name: id description: 'The ID of the program.' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string /api/v1/admin/payout: get: summary: '' operationId: getApiV1AdminPayout description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Payouts' security: [] /api/v1/admin/payout/settings: get: summary: '' operationId: getApiV1AdminPayoutSettings description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Payouts' security: [] put: summary: '' operationId: putApiV1AdminPayoutSettings description: '' parameters: [] responses: { } tags: - 'Admin - Payouts' requestBody: required: false content: application/json: schema: type: object properties: global_commission_rate: type: number description: 'Auto-generated from validation rules for `global_commission_rate`. Must be at least 0. Must not be greater than 100.' example: 1 nullable: true payout_frequency: type: string description: 'Auto-generated from validation rules for `payout_frequency`.' example: 7_days enum: - 7_days - 14_days - monthly nullable: true security: [] patch: summary: '' operationId: patchApiV1AdminPayoutSettings description: '' parameters: [] responses: { } tags: - 'Admin - Payouts' requestBody: required: false content: application/json: schema: type: object properties: global_commission_rate: type: number description: 'Auto-generated from validation rules for `global_commission_rate`. Must be at least 0. Must not be greater than 100.' example: 1 nullable: true payout_frequency: type: string description: 'Auto-generated from validation rules for `payout_frequency`.' example: 14_days enum: - 7_days - 14_days - monthly nullable: true security: [] '/api/v1/admin/payout/{id}': get: summary: '' operationId: getApiV1AdminPayoutId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Payouts' security: [] parameters: - in: path name: id description: 'The ID of the payout.' example: architecto required: true schema: type: string '/api/v1/admin/payout/{id}/status': post: summary: '' operationId: postApiV1AdminPayoutIdStatus description: '' parameters: [] responses: { } tags: - 'Admin - Payouts' requestBody: required: true content: multipart/form-data: schema: type: object properties: status: type: string description: 'Auto-generated from validation rules for `status`.' example: paid enum: - unpaid - paid transaction_number: type: string description: 'Auto-generated from validation rules for `transaction_number`. Must not be greater than 120 characters.' example: b nullable: true payment_receipt: type: string format: binary description: 'Auto-generated from validation rules for `payment_receipt`. Must be a file. Must not be greater than 4096 kilobytes.' nullable: true payment_notes: type: string description: 'Auto-generated from validation rules for `payment_notes`. Must not be greater than 2000 characters.' example: 'n' nullable: true required: - status security: [] parameters: - in: path name: id description: 'The ID of the payout.' example: architecto required: true schema: type: string /api/v1/admin/quote-category/quotes: get: summary: 'Get list of quotes' operationId: getListOfQuotes description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: quote_category_id description: 'optional Filter by quote category.' example: 1 required: false schema: type: integer description: 'optional Filter by quote category.' example: 1 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Quote Management' security: [] post: summary: 'Create a new quote' operationId: createANewQuote description: '' parameters: [] responses: { } tags: - 'Admin - Quote Management' requestBody: required: true content: application/json: schema: type: object properties: quote_category_id: type: integer description: 'Quote category ID.' example: 1 quote: type: string description: 'The quote text.' example: 'The only way to do great work is to love what you do.' required: - quote_category_id - quote security: [] '/api/v1/admin/quote-category/quotes/{id}': get: summary: 'Get a specific quote' operationId: getASpecificQuote description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Quote Management' security: [] put: summary: 'Update a quote' operationId: updateAQuote description: '' parameters: [] responses: { } tags: - 'Admin - Quote Management' requestBody: required: false content: application/json: schema: type: object properties: quote_category_id: type: integer description: 'optional Quote category ID.' example: 16 quote: type: string description: 'optional The quote text.' example: architecto security: [] patch: summary: 'Update a quote' operationId: updateAQuote description: '' parameters: [] responses: { } tags: - 'Admin - Quote Management' requestBody: required: false content: application/json: schema: type: object properties: quote_category_id: type: integer description: 'optional Quote category ID.' example: 16 quote: type: string description: 'optional The quote text.' example: architecto security: [] delete: summary: 'Delete a quote' operationId: deleteAQuote description: '' parameters: [] responses: { } tags: - 'Admin - Quote Management' security: [] parameters: - in: path name: id description: 'The ID of the quote.' example: 1 required: true schema: type: integer /api/v1/admin/quote-category: get: summary: 'Get list of quote categories (with quotes count)' operationId: getListOfQuoteCategorieswithQuotesCount description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Quote Category Management' security: [] post: summary: 'Create a new quote category' operationId: createANewQuoteCategory description: '' parameters: [] responses: { } tags: - 'Admin - Quote Category Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The quote category name.' example: Motivation required: - name security: [] '/api/v1/admin/quote-category/{id}': get: summary: 'Get a specific quote category' operationId: getASpecificQuoteCategory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Quote Category Management' security: [] put: summary: 'Update a quote category' operationId: updateAQuoteCategory description: '' parameters: [] responses: { } tags: - 'Admin - Quote Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The quote category name.' example: architecto security: [] patch: summary: 'Update a quote category' operationId: updateAQuoteCategory description: '' parameters: [] responses: { } tags: - 'Admin - Quote Category Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional The quote category name.' example: architecto security: [] delete: summary: 'Delete a quote category' operationId: deleteAQuoteCategory description: '' parameters: [] responses: { } tags: - 'Admin - Quote Category Management' security: [] parameters: - in: path name: id description: 'The ID of the quote category.' example: 1 required: true schema: type: integer /api/v1/admin/shift: get: summary: 'Get list of all shifts' operationId: getListOfAllShifts description: '' 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Shift Management' security: [] post: summary: 'Create a new shift' operationId: createANewShift description: 'By default the shift is applied to all working days. Pass working_days to restrict to specific days (0-6).' parameters: [] responses: { } tags: - 'Admin - Shift Management' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Shift name.' example: 'Morning Shift' start_time: type: string description: 'Start time (HH:MM).' example: '09:00' end_time: type: string description: 'End time (HH:MM).' example: '17:00' working_days: type: array description: 'optional Day numbers (0-6). Omit to apply to all working days.' example: - 1 - 2 - 3 - 4 - 5 items: type: string required: - name - start_time - end_time security: [] '/api/v1/admin/shift/{id}': get: summary: 'Get a specific shift' operationId: getASpecificShift description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Shift Management' security: [] put: summary: 'Update a shift' operationId: updateAShift description: 'Pass working_days to set which days (0-6) the shift applies to. Omit to leave days unchanged.' parameters: [] responses: { } tags: - 'Admin - Shift Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b start_time: type: string description: 'Auto-generated from validation rules for `start_time`. Must be a valid date in the format H:i.' example: '17:16' end_time: type: string description: 'Auto-generated from validation rules for `end_time`. Must be a valid date in the format H:i.' example: '17:16' working_days: type: array description: 'Auto-generated from validation rules for `working_days.*`. Must be at least 0. Must not be greater than 6.' example: - 4 items: type: integer security: [] patch: summary: 'Update a shift' operationId: updateAShift description: 'Pass working_days to set which days (0-6) the shift applies to. Omit to leave days unchanged.' parameters: [] responses: { } tags: - 'Admin - Shift Management' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Auto-generated from validation rules for `name`. Must not be greater than 255 characters.' example: b start_time: type: string description: 'Auto-generated from validation rules for `start_time`. Must be a valid date in the format H:i.' example: '17:16' end_time: type: string description: 'Auto-generated from validation rules for `end_time`. Must be a valid date in the format H:i.' example: '17:16' working_days: type: array description: 'Auto-generated from validation rules for `working_days.*`. Must be at least 0. Must not be greater than 6.' example: - 4 items: type: integer security: [] delete: summary: 'Delete a shift' operationId: deleteAShift description: '' parameters: [] responses: { } tags: - 'Admin - Shift Management' security: [] parameters: - in: path name: id description: 'The ID of the shift.' example: architecto required: true schema: type: string /api/v1/shift: get: summary: 'List shifts' operationId: listShifts description: "Returns all shifts with their name, start/end time and working day numbers.\nOptionally filter by day_of_week (0-6) to get shifts that apply to that day." 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: 'Number of items per page.' example: 15 required: false schema: type: integer description: 'Number of items per page.' example: 15 - in: query name: day_of_week description: 'Filter shifts that apply to this day (0=Sunday..6=Saturday).' example: 1 required: false schema: type: integer description: 'Filter shifts that apply to this day (0=Sunday..6=Saturday).' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Shifts retrieved successfully' data: current_page: 1 data: [] first_page_url: 'https://ruhline-api.test/api/v1/shift?page=1' from: null last_page: 1 last_page_url: 'https://ruhline-api.test/api/v1/shift?page=1' links: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/shift?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false next_page_url: null path: 'https://ruhline-api.test/api/v1/shift' per_page: 15 prev_page_url: null to: null total: 0 properties: success: type: boolean example: true message: type: string example: 'Shifts retrieved successfully' data: type: object properties: current_page: type: integer example: 1 data: type: array example: [] first_page_url: type: string example: 'https://ruhline-api.test/api/v1/shift?page=1' from: type: string example: null nullable: true last_page: type: integer example: 1 last_page_url: type: string example: 'https://ruhline-api.test/api/v1/shift?page=1' links: type: array example: - url: null label: '« Previous' page: null active: false - url: 'https://ruhline-api.test/api/v1/shift?page=1' label: '1' page: 1 active: true - url: null label: 'Next »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Previous' page: type: string example: null nullable: true active: type: boolean example: false next_page_url: type: string example: null nullable: true path: type: string example: 'https://ruhline-api.test/api/v1/shift' per_page: type: integer example: 15 prev_page_url: type: string example: null nullable: true to: type: string example: null nullable: true total: type: integer example: 0 tags: - 'Shifts (Public)' security: [] '/api/v1/shift/{id}': get: summary: 'Get a single shift' operationId: getASingleShift description: '' parameters: [] responses: 500: description: '' content: application/json: schema: type: object example: message: 'Server Error' properties: message: type: string example: 'Server Error' tags: - 'Shifts (Public)' security: [] parameters: - in: path name: id description: 'The ID of the shift.' example: architecto required: true schema: type: string /api/v1/admin/site-setting: get: summary: 'Get site settings (admin)' operationId: getSiteSettingsadmin description: 'Returns the current site settings for editing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Admin - Site Settings (CMS)' security: [] put: summary: 'Update site settings' operationId: updateSiteSettings description: "Update site settings. All fields are optional; only provided fields are updated.\nImage fields accept file uploads; text/URL fields accept strings." parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Site settings updated successfully","data":{...}}' 422: description: '' content: text/plain: schema: type: string example: '{"success":false,"message":"Validation failed","errors":{...}}' tags: - 'Admin - Site Settings (CMS)' requestBody: required: false content: multipart/form-data: schema: type: object properties: favicon: type: string format: binary description: 'optional Favicon image (ico, png, jpg, gif, svg).' nullable: true header_logo: type: string format: binary description: 'optional Header logo image.' nullable: true page_header_image: type: string format: binary description: 'optional Page header image.' nullable: true footer_logo: type: string format: binary description: 'optional Footer logo image.' nullable: true footer_description: type: string description: 'optional Footer description text.' example: 'Your fitness partner.' nullable: true copyright: type: string description: 'optional Copyright text.' example: '© 2026 Company Name' nullable: true facebook_url: type: string description: 'optional Facebook profile URL.' example: 'https://facebook.com/...' nullable: true instagram_url: type: string description: 'optional Instagram profile URL.' example: 'https://instagram.com/...' nullable: true linkedin_url: type: string description: 'optional LinkedIn profile URL.' example: 'https://linkedin.com/...' nullable: true address_line_1: type: string description: 'optional Address line 1.' example: '123 Main St' nullable: true address_line_2: type: string description: 'optional Address line 2.' example: 'Suite 100' nullable: true landmark: type: string description: 'optional Landmark.' example: 'Near Central Park' nullable: true country_id: type: integer description: 'optional Country ID (from countries table).' example: 1 nullable: true state_id: type: integer description: 'optional State ID (from states table).' example: 1 nullable: true city_id: type: integer description: 'optional City ID (from cities table).' example: 1 nullable: true zipcode: type: string description: 'optional Zip/Postal code.' example: '10001' nullable: true global_commission_rate: type: number description: 'optional Global commission rate for coaches (0-100%).' example: 10.5 nullable: true payout_frequency: type: string description: 'Auto-generated from validation rules for `payout_frequency`.' example: 7_days enum: - 7_days - 14_days - monthly nullable: true security: [] patch: summary: 'Update site settings' operationId: updateSiteSettings description: "Update site settings. All fields are optional; only provided fields are updated.\nImage fields accept file uploads; text/URL fields accept strings." parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Site settings updated successfully","data":{...}}' 422: description: '' content: text/plain: schema: type: string example: '{"success":false,"message":"Validation failed","errors":{...}}' tags: - 'Admin - Site Settings (CMS)' requestBody: required: false content: multipart/form-data: schema: type: object properties: favicon: type: string format: binary description: 'optional Favicon image (ico, png, jpg, gif, svg).' nullable: true header_logo: type: string format: binary description: 'optional Header logo image.' nullable: true page_header_image: type: string format: binary description: 'optional Page header image.' nullable: true footer_logo: type: string format: binary description: 'optional Footer logo image.' nullable: true footer_description: type: string description: 'optional Footer description text.' example: 'Your fitness partner.' nullable: true copyright: type: string description: 'optional Copyright text.' example: '© 2026 Company Name' nullable: true facebook_url: type: string description: 'optional Facebook profile URL.' example: 'https://facebook.com/...' nullable: true instagram_url: type: string description: 'optional Instagram profile URL.' example: 'https://instagram.com/...' nullable: true linkedin_url: type: string description: 'optional LinkedIn profile URL.' example: 'https://linkedin.com/...' nullable: true address_line_1: type: string description: 'optional Address line 1.' example: '123 Main St' nullable: true address_line_2: type: string description: 'optional Address line 2.' example: 'Suite 100' nullable: true landmark: type: string description: 'optional Landmark.' example: 'Near Central Park' nullable: true country_id: type: integer description: 'optional Country ID (from countries table).' example: 1 nullable: true state_id: type: integer description: 'optional State ID (from states table).' example: 1 nullable: true city_id: type: integer description: 'optional City ID (from cities table).' example: 1 nullable: true zipcode: type: string description: 'optional Zip/Postal code.' example: '10001' nullable: true global_commission_rate: type: number description: 'optional Global commission rate for coaches (0-100%).' example: 10.5 nullable: true payout_frequency: type: string description: 'Auto-generated from validation rules for `payout_frequency`.' example: 7_days enum: - 7_days - 14_days - monthly nullable: true security: [] /api/v1/site-setting: get: summary: 'Get site settings' operationId: getSiteSettings description: 'Returns the current site settings for the frontend (favicon, logos, footer, social links, address).' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Site settings retrieved successfully' data: id: 1 favicon: 'http://localhost/storage/favicon.ico' header_logo: 'http://localhost/storage/site/header-logo.png' page_header_image: 'http://localhost/storage/site/page-header.jpg' footer_logo: 'http://localhost/storage/site/footer-logo.png' footer_description: 'Your fitness partner.' copyright: '© 2026 Company Name' social_media: facebook_url: 'https://facebook.com/...' instagram_url: 'https://instagram.com/...' linkedin_url: 'https://linkedin.com/...' address: address_line_1: '123 Main St' address_line_2: 'Suite 100' landmark: 'Near Central Park' city: 'New York' state: NY country: USA zipcode: '10001' updated_at: '2026-02-04T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Site settings retrieved successfully' data: type: object properties: id: type: integer example: 1 favicon: type: string example: 'http://localhost/storage/favicon.ico' header_logo: type: string example: 'http://localhost/storage/site/header-logo.png' page_header_image: type: string example: 'http://localhost/storage/site/page-header.jpg' footer_logo: type: string example: 'http://localhost/storage/site/footer-logo.png' footer_description: type: string example: 'Your fitness partner.' copyright: type: string example: '© 2026 Company Name' social_media: type: object properties: facebook_url: type: string example: 'https://facebook.com/...' instagram_url: type: string example: 'https://instagram.com/...' linkedin_url: type: string example: 'https://linkedin.com/...' address: type: object properties: address_line_1: type: string example: '123 Main St' address_line_2: type: string example: 'Suite 100' landmark: type: string example: 'Near Central Park' city: type: string example: 'New York' state: type: string example: NY country: type: string example: USA zipcode: type: string example: '10001' updated_at: type: string example: '2026-02-04T10:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Site settings not found.' properties: success: type: boolean example: false message: type: string example: 'Site settings not found.' tags: - 'Site Settings (Public)' security: [] /api/v1/admin/working-day: get: summary: 'Get working days configuration' operationId: getWorkingDaysConfiguration description: 'Returns all seven week days with their working/non-working status.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Working days retrieved successfully' data: days: - id: 1 day_of_week: 0 day_name: Sunday is_working: false updated_at: '2026-01-29T12:00:00+00:00' - id: 2 day_of_week: 1 day_name: Monday is_working: true updated_at: '2026-01-29T12:00:00+00:00' working_day_numbers: - 1 - 2 - 3 - 4 - 5 properties: success: type: boolean example: true message: type: string example: 'Working days retrieved successfully' data: type: object properties: days: type: array example: - id: 1 day_of_week: 0 day_name: Sunday is_working: false updated_at: '2026-01-29T12:00:00+00:00' - id: 2 day_of_week: 1 day_name: Monday is_working: true updated_at: '2026-01-29T12:00:00+00:00' items: type: object properties: id: type: integer example: 1 day_of_week: type: integer example: 0 day_name: type: string example: Sunday is_working: type: boolean example: false updated_at: type: string example: '2026-01-29T12:00:00+00:00' working_day_numbers: type: array example: - 1 - 2 - 3 - 4 - 5 items: type: integer tags: - 'Admin - Working Days Management' security: [] put: summary: 'Update working days' operationId: updateWorkingDays description: 'Mark which week days are working. Send an array of day numbers (0-6) that should be working; all others will be set to non-working.' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Working days updated successfully","data":{"days":[...],"working_day_numbers":[1,2,3,4,5]}}' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: working_days: - 'At least one day selection is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: working_days: type: array example: - 'At least one day selection is required.' items: type: string tags: - 'Admin - Working Days Management' requestBody: required: true content: application/json: schema: type: object properties: working_days: type: array description: 'Array of day-of-week numbers (0=Sunday .. 6=Saturday) that are working days.' example: - 1 - 2 - 3 - 4 - 5 items: type: string required: - working_days security: [] patch: summary: 'Update working days' operationId: updateWorkingDays description: 'Mark which week days are working. Send an array of day numbers (0-6) that should be working; all others will be set to non-working.' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success":true,"message":"Working days updated successfully","data":{"days":[...],"working_day_numbers":[1,2,3,4,5]}}' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: working_days: - 'At least one day selection is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: working_days: type: array example: - 'At least one day selection is required.' items: type: string tags: - 'Admin - Working Days Management' requestBody: required: true content: application/json: schema: type: object properties: working_days: type: array description: 'Array of day-of-week numbers (0=Sunday .. 6=Saturday) that are working days.' example: - 1 - 2 - 3 - 4 - 5 items: type: string required: - working_days security: [] /api/v1/working-day: get: summary: 'Get working days configuration with shifts' operationId: getWorkingDaysConfigurationWithShifts description: 'Returns all seven week days with their working/non-working status and the shifts that apply to each day. No auth required.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Working days retrieved successfully' data: days: - id: 1 day_of_week: 0 day_name: Sunday is_working: false updated_at: ... shifts: [] - id: 2 day_of_week: 1 day_name: Monday is_working: true updated_at: ... shifts: - id: 1 name: Morning start_time: '09:00' end_time: '17:00' working_day_numbers: - 1 - 2 - 3 - 4 - 5 created_at: ... updated_at: ... working_day_numbers: - 1 - 2 - 3 - 4 - 5 properties: success: type: boolean example: true message: type: string example: 'Working days retrieved successfully' data: type: object properties: days: type: array example: - id: 1 day_of_week: 0 day_name: Sunday is_working: false updated_at: ... shifts: [] - id: 2 day_of_week: 1 day_name: Monday is_working: true updated_at: ... shifts: - id: 1 name: Morning start_time: '09:00' end_time: '17:00' working_day_numbers: - 1 - 2 - 3 - 4 - 5 created_at: ... updated_at: ... items: type: object properties: id: type: integer example: 1 day_of_week: type: integer example: 0 day_name: type: string example: Sunday is_working: type: boolean example: false updated_at: type: string example: ... shifts: type: array example: [] working_day_numbers: type: array example: - 1 - 2 - 3 - 4 - 5 items: type: integer tags: - 'Working Days (Public)' security: [] /api/v1/admin-only/dashboard: get: summary: 'Admin Dashboard' operationId: adminDashboard description: 'Get admin dashboard data. This endpoint is protected and requires admin role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Admin dashboard data' data: admin: true properties: success: type: boolean example: true message: type: string example: 'Admin dashboard data' data: type: object properties: admin: type: boolean example: true 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 403: description: '' content: application/json: schema: type: object example: success: false message: 'Forbidden - Admin access required' properties: success: type: boolean example: false message: type: string example: 'Forbidden - Admin access required' tags: - 'Example Routes' /api/v1/staff-only/dashboard: get: summary: 'Staff Dashboard' operationId: staffDashboard description: 'Get staff dashboard data. This endpoint is protected and requires staff role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Staff dashboard data' data: staff: true properties: success: type: boolean example: true message: type: string example: 'Staff dashboard data' data: type: object properties: staff: type: boolean example: true 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 403: description: '' content: application/json: schema: type: object example: success: false message: 'Forbidden - Staff access required' properties: success: type: boolean example: false message: type: string example: 'Forbidden - Staff access required' tags: - 'Example Routes' /api/v1/coach-only/dashboard: get: summary: 'Coach Dashboard' operationId: coachDashboard description: 'Get coach dashboard data. This endpoint is protected and requires coach role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coach dashboard data' data: coach: true properties: success: type: boolean example: true message: type: string example: 'Coach dashboard data' data: type: object properties: coach: type: boolean example: true 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 403: description: '' content: application/json: schema: type: object example: success: false message: 'Forbidden - Coach access required' properties: success: type: boolean example: false message: type: string example: 'Forbidden - Coach access required' tags: - 'Example Routes' /api/v1/customer-only/dashboard: get: summary: 'Customer Dashboard' operationId: customerDashboard description: 'Get customer dashboard data. This endpoint is protected and requires customer role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Customer dashboard data' data: customer: true properties: success: type: boolean example: true message: type: string example: 'Customer dashboard data' data: type: object properties: customer: type: boolean example: true 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated 403: description: '' content: application/json: schema: type: object example: success: false message: 'Forbidden - Customer access required' properties: success: type: boolean example: false message: type: string example: 'Forbidden - Customer access required' tags: - 'Example Routes' '/api/v1/program/enrollments/{enrollmentId}/modules': get: summary: '' operationId: getApiV1ProgramEnrollmentsEnrollmentIdModules description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Coach - Enrollment Module Access' security: [] patch: summary: '' operationId: patchApiV1ProgramEnrollmentsEnrollmentIdModules description: '' parameters: [] responses: { } tags: - 'Coach - Enrollment Module Access' requestBody: required: true content: application/json: schema: type: object properties: modules: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: program_structure_id: type: integer description: '' example: 16 is_locked: type: boolean description: '' example: false required: - program_structure_id - is_locked required: - modules security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/program/enrollments/{enrollmentId}/modules/{structureId}': put: summary: '' operationId: putApiV1ProgramEnrollmentsEnrollmentIdModulesStructureId description: '' parameters: [] responses: { } tags: - 'Coach - Enrollment Module Access' requestBody: required: true content: application/json: schema: type: object properties: is_locked: type: boolean description: '' example: false required: - is_locked security: [] patch: summary: '' operationId: patchApiV1ProgramEnrollmentsEnrollmentIdModulesStructureId description: '' parameters: [] responses: { } tags: - 'Coach - Enrollment Module Access' requestBody: required: true content: application/json: schema: type: object properties: is_locked: type: boolean description: '' example: true required: - is_locked security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/card-game/state': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameState description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Card Game' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/card-game/question-sets/{setId}/questions': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameQuestionSetsSetIdQuestions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Card Game' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/card-game/question-sets/{setId}/questions/{questionId}/answer': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameQuestionSetsSetIdQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Card Game' requestBody: required: false content: application/json: schema: type: object properties: answer_text: type: string description: 'Must not be greater than 10000 characters.' example: b nullable: true answer_option: type: string description: 'Must not be greater than 1000 characters.' example: 'n' nullable: true answer_options: type: array description: 'Must not be greater than 1000 characters.' example: - g items: type: string security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameQuestionSetsSetIdQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Card Game' requestBody: required: false content: application/json: schema: type: object properties: answer_text: type: string description: 'Must not be greater than 10000 characters.' example: b nullable: true answer_option: type: string description: 'Must not be greater than 1000 characters.' example: 'n' nullable: true answer_options: type: array description: 'Must not be greater than 1000 characters.' example: - g items: type: string security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/card-game/question-sets/{setId}/card-selection': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameQuestionSetsSetIdCardSelection description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Card Game' requestBody: required: false content: application/json: schema: type: object properties: card_snapshot_ids: type: array description: '' example: - 16 items: type: integer security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameQuestionSetsSetIdCardSelection description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Card Game' requestBody: required: false content: application/json: schema: type: object properties: card_snapshot_ids: type: array description: '' example: - 16 items: type: integer security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: setId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/card-game/submit': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdCardGameSubmit description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Card Game' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/find-your-motivation/words': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdFindYourMotivationWords description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Find Your Motivation' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/find-your-motivation/words/{wordId}/guess': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdFindYourMotivationWordsWordIdGuess description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Find Your Motivation' requestBody: required: true content: application/json: schema: type: object properties: guess_word: type: string description: 'Must not be greater than 255 characters.' example: b required: - guess_word security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdFindYourMotivationWordsWordIdGuess description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Find Your Motivation' requestBody: required: true content: application/json: schema: type: object properties: guess_word: type: string description: 'Must not be greater than 255 characters.' example: b required: - guess_word security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: wordId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/goal-settings/goals': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoals description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Goal Settings' security: [] post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoals description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/goal-settings/goals/{goalId}': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] delete: summary: '' operationId: deleteApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: goalId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/goal-settings/goals/{goalId}/sub-goals': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalIdSubGoals description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: goalId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/goal-settings/goals/{goalId}/sub-goals/{subGoalId}': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalIdSubGoalsSubGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalIdSubGoalsSubGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] delete: summary: '' operationId: deleteApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdGoalSettingsGoalsGoalIdSubGoalsSubGoalId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Goal Settings' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: goalId description: '' example: architecto required: true schema: type: string - in: path name: subGoalId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/habit-tracker/state': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdHabitTrackerState description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Habit Tracker' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/habit-tracker/habits': post: summary: '' operationId: postApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdHabitTrackerHabits description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Habit Tracker' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/habit-tracker/habits/{habitId}': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdHabitTrackerHabitsHabitId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Habit Tracker' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdHabitTrackerHabitsHabitId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Habit Tracker' security: [] delete: summary: '' operationId: deleteApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdHabitTrackerHabitsHabitId description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Habit Tracker' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: habitId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModules description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Modules' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Modules' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/values/questions': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdValuesQuestions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Questions' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/values/questions/{questionId}/answer': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdValuesQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Questions' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdValuesQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Questions' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/who-am-i/questions': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWhoAmIQuestions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Questions' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/who-am-i/questions/{questionId}/answer': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWhoAmIQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Questions' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWhoAmIQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Questions' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/resources/upload-documents': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdResourcesUploadDocuments description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Upload Documents' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/upload-documents/resources': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdUploadDocumentsResources description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Upload Documents' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/wheel-of-life/elements': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeElements description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Wheel Of Life' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/wheel-of-life/ratings': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeRatings description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Wheel Of Life' requestBody: required: true content: application/json: schema: type: object properties: ratings: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: element_id: type: integer description: '' example: 16 nullable: true id: type: integer description: '' example: 16 nullable: true source_element_id: type: integer description: '' example: 16 nullable: true rating: type: integer description: '' example: 16 required: - rating required: - ratings security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeRatings description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Wheel Of Life' requestBody: required: true content: application/json: schema: type: object properties: ratings: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: element_id: type: integer description: '' example: 16 nullable: true id: type: integer description: '' example: 16 nullable: true source_element_id: type: integer description: '' example: 16 nullable: true rating: type: integer description: '' example: 16 required: - rating required: - ratings security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/wheel-of-life/elements/{elementId}/questions': get: summary: '' operationId: getApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeElementsElementIdQuestions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - 'Customer - Enrollment Wheel Of Life' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string '/api/v1/customer/enrollments/{enrollmentId}/modules/{structureId}/wheel-of-life/elements/{elementId}/questions/{questionId}/answer': put: summary: '' operationId: putApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeElementsElementIdQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Wheel Of Life' security: [] patch: summary: '' operationId: patchApiV1CustomerEnrollmentsEnrollmentIdModulesStructureIdWheelOfLifeElementsElementIdQuestionsQuestionIdAnswer description: '' parameters: [] responses: { } tags: - 'Customer - Enrollment Wheel Of Life' security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: structureId description: '' example: architecto required: true schema: type: string - in: path name: elementId description: '' example: architecto required: true schema: type: string - in: path name: questionId description: '' example: architecto required: true schema: type: string /api/v1/program/sessions/calendar: get: summary: '' operationId: getApiV1ProgramSessionsCalendar description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: from: type: string description: 'Must be a valid date in the format Y-m-d.' example: '2026-04-25' to: type: string description: 'Must be a valid date in the format Y-m-d. Must be a date after or equal to from.' example: '2052-05-18' timezone: type: string description: 'Must be a valid time zone, such as Africa/Accra.' example: Asia/Ulaanbaatar security: [] '/api/v1/program/enrollments/{enrollmentId}/sessions': get: summary: '' operationId: getApiV1ProgramEnrollmentsEnrollmentIdSessions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - Endpoints security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string '/api/v1/program/enrollments/{enrollmentId}/sessions/{sessionId}': get: summary: '' operationId: getApiV1ProgramEnrollmentsEnrollmentIdSessionsSessionId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: success: false message: Unauthenticated properties: success: type: boolean example: false message: type: string example: Unauthenticated tags: - Endpoints security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string '/api/v1/program/enrollments/{enrollmentId}/sessions/{sessionId}/video-token': post: summary: '' operationId: postApiV1ProgramEnrollmentsEnrollmentIdSessionsSessionIdVideoToken description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: enrollmentId description: '' example: architecto required: true schema: type: string - in: path name: sessionId description: '' example: architecto required: true schema: type: string