openapi: 3.0.3 info: title: 'Laravel API Documentation' description: '' version: 1.0.0 servers: - url: 'https://finweb-api.on-forge.com' tags: - name: 'Broker Sync' description: '' - name: Endpoints description: '' - name: 'Zoho CRM' description: '' paths: /api/admin/brokers/sync: post: summary: 'Manually sync brokers from Zoho CRM.' operationId: manuallySyncBrokersFromZohoCRM description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: message: 'Zoho broker sync completed.' summary: total: 10 created: 2 updated: 8 skipped: 0 failed: 0 properties: data: type: object properties: message: type: string example: 'Zoho broker sync completed.' summary: type: object properties: total: type: integer example: 10 created: type: integer example: 2 updated: type: integer example: 8 skipped: type: integer example: 0 failed: type: integer example: 0 tags: - 'Broker Sync' /api/admin/brokers/sync-status: get: summary: 'Get latest broker sync status.' operationId: getLatestBrokerSyncStatus description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 broker_id: null action: zoho.sync status: success source_system: zoho message: 'Zoho broker sync completed.' created_at: '2026-04-09T10:12:30Z' properties: data: type: object properties: id: type: integer example: 1 broker_id: type: string example: null nullable: true action: type: string example: zoho.sync status: type: string example: success source_system: type: string example: zoho message: type: string example: 'Zoho broker sync completed.' created_at: type: string example: '2026-04-09T10:12:30Z' tags: - 'Broker Sync' /api/admin/brokers/sync-logs: get: summary: 'Get Zoho sync logs.' operationId: getZohoSyncLogs description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 broker_id: null action: zoho.sync status: success source_system: zoho message: 'Zoho broker sync completed.' created_at: '2026-04-09T10:12:30Z' properties: data: type: array example: - id: 1 broker_id: null action: zoho.sync status: success source_system: zoho message: 'Zoho broker sync completed.' created_at: '2026-04-09T10:12:30Z' items: type: object properties: id: type: integer example: 1 broker_id: type: string example: null nullable: true action: type: string example: zoho.sync status: type: string example: success source_system: type: string example: zoho message: type: string example: 'Zoho broker sync completed.' created_at: type: string example: '2026-04-09T10:12:30Z' tags: - 'Broker Sync' 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 1000.' example: 1 nullable: true '/api/admin/brokers/{broker_id}/logs': get: summary: 'Get broker logs.' operationId: getBrokerLogs description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 broker_id: 5 action: zoho.sync.record status: success source_system: zoho message: 'Zoho broker record updated.' created_at: '2026-04-09T10:12:30Z' properties: data: type: array example: - id: 1 broker_id: 5 action: zoho.sync.record status: success source_system: zoho message: 'Zoho broker record updated.' created_at: '2026-04-09T10:12:30Z' items: type: object properties: id: type: integer example: 1 broker_id: type: integer example: 5 action: type: string example: zoho.sync.record status: type: string example: success source_system: type: string example: zoho message: type: string example: 'Zoho broker record updated.' created_at: type: string example: '2026-04-09T10:12:30Z' tags: - 'Broker Sync' 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 1000.' example: 1 nullable: true parameters: - in: path name: broker_id description: 'The ID of the broker.' example: 16 required: true schema: type: integer /api/login: post: summary: '' operationId: postApiLogin description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: gbailey@example.net password: type: string description: '' example: '|]|{+-' remember: type: boolean description: '' example: true required: - email - password security: [] /api/portal-onboarding/validate: get: summary: '' operationId: getApiPortalOnboardingValidate description: '' parameters: [] responses: 422: description: '' content: application/json: schema: type: object example: message: 'This onboarding link is invalid.' code: invalid_token properties: message: type: string example: 'This onboarding link is invalid.' code: type: string example: invalid_token tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'Must be at least 32 characters.' example: bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn required: - token security: [] /api/portal-onboarding/set-password: post: summary: '' operationId: postApiPortalOnboardingSetPassword description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'Must be at least 32 characters.' example: bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn password: type: string description: 'Must be at least 8 characters.' example: 'Ou.*,JH' required: - token - password security: [] /api/brokers: get: summary: '' operationId: getApiBrokers description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: [] properties: data: type: array example: [] tags: - Endpoints security: [] '/api/brokers/{slug}': get: summary: '' operationId: getApiBrokersSlug description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: message: 'Broker not found.' properties: message: type: string example: 'Broker not found.' tags: - Endpoints security: [] parameters: - in: path name: slug description: 'The slug of the broker.' example: 16 required: true schema: type: integer /api/insights: get: summary: '' operationId: getApiInsights description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: [] properties: data: type: array example: [] tags: - Endpoints security: [] '/api/insights/{slug}': get: summary: '' operationId: getApiInsightsSlug description: '' parameters: [] responses: 404: description: '' content: application/json: schema: type: object example: message: 'Insight not found.' properties: message: type: string example: 'Insight not found.' tags: - Endpoints security: [] parameters: - in: path name: slug description: 'The slug of the insight.' example: 16 required: true schema: type: integer /api/testimonials: get: summary: '' operationId: getApiTestimonials description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: [] properties: data: type: array example: [] tags: - Endpoints security: [] /api/join-us: post: summary: '' operationId: postApiJoinUs description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: first_name: type: string description: 'Must not be greater than 255 characters.' example: b last_name: type: string description: 'Must not be greater than 255 characters.' example: 'n' email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com mobile: type: string description: 'Must not be greater than 50 characters.' example: v nullable: true state: type: string description: 'Must not be greater than 50 characters.' example: d nullable: true enquiry_type: type: string description: 'Must not be greater than 120 characters.' example: l message: type: string description: '' example: architecto nullable: true source: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true required: - first_name - last_name - email - enquiry_type security: [] /api/get-in-touch: post: summary: '' operationId: postApiGetInTouch description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: zbailey@example.net message: type: string description: '' example: architecto nullable: true source: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true required: - name - email security: [] /api/get-in-touch/content: get: summary: '' operationId: getApiGetInTouchContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: badge_label: Contact title: 'Get in touch' phone_label: Phone phone_value: '0424 191 095' email_label: Email email_value: bdm@finweb.com.au location_label: Location location_value: '9C Whitfield Bvd, Cranbourne West VIC 3977' properties: data: type: object properties: badge_label: type: string example: Contact title: type: string example: 'Get in touch' phone_label: type: string example: Phone phone_value: type: string example: '0424 191 095' email_label: type: string example: Email email_value: type: string example: bdm@finweb.com.au location_label: type: string example: Location location_value: type: string example: '9C Whitfield Bvd, Cranbourne West VIC 3977' tags: - Endpoints security: [] /api/me: get: summary: '' operationId: getApiMe description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiMe description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: zbailey@example.net required: - name - email security: [] /api/me/avatar: post: summary: '' operationId: postApiMeAvatar description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: avatar: type: string format: binary description: 'This field is required when avatars is not present. Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' avatars: type: array description: 'Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' items: type: string format: binary security: [] delete: summary: '' operationId: deleteApiMeAvatar description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/logout: post: summary: '' operationId: postApiLogout description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/auth/password: put: summary: '' operationId: putApiAuthPassword description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: current_password: type: string description: '' example: architecto password: type: string description: 'Must be at least 8 characters.' example: ']|{+-0pBNvYg' required: - current_password - password security: [] /api/dashboard/metrics: get: summary: '' operationId: getApiDashboardMetrics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] /api/admin/brokers: get: summary: '' operationId: getApiAdminBrokers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true status: type: string description: '' example: pending enum: - active - pending - inactive nullable: true active: type: boolean description: '' example: false nullable: true approved: type: boolean description: '' example: true nullable: true per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 22 nullable: true page: type: integer description: 'Must be at least 1.' example: 67 nullable: true sort: type: string description: 'Must match the regex /^-?(name|email|company_name|license_no|active|approved|created_at|updated_at|slug)$/. Must not be greater than 255 characters.' example: z nullable: true security: [] post: summary: '' operationId: postApiAdminBrokers description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: zbailey@example.net password: type: string description: 'Must be at least 8 characters.' example: '-0pBNvYgxw' slug: type: string description: 'Must not be greater than 255 characters.' example: a nullable: true summary: type: string description: '' example: architecto nullable: true profile_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true featured_image: type: string description: 'Must not be greater than 2048 characters.' example: m nullable: true avatar: type: string description: 'Must not be greater than 2048 characters.' example: i nullable: true company_name: type: string description: 'Must not be greater than 255 characters.' example: 'y' phone: type: string description: 'Must not be greater than 50 characters.' example: v nullable: true license_no: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true active: type: boolean description: '' example: true profile_content: type: object description: '' example: null properties: intro: type: object description: '' example: null properties: headline: type: string description: 'Must not be greater than 255 characters.' example: l nullable: true paragraphs: type: array description: '' example: - architecto items: type: string nullable: true ctaLabel: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true nullable: true sections: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: r nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.sections.*.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: ['yes', 'no', auto] nullable: true nullable: true homeLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: g nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.homeLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true commercialLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.commercialLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'yes' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true otherLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.otherLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'yes' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true contact: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true formEmbedUrl: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true mapEmbedUrl: type: string description: 'Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true nullable: true nullable: true required: - name - email - password - company_name security: [] '/api/admin/brokers/{broker_id}': get: summary: '' operationId: getApiAdminBrokersBroker_id description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiAdminBrokersBroker_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: summary: type: string description: '' example: architecto nullable: true profile_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true featured_image: type: string description: 'Must not be greater than 2048 characters.' example: m nullable: true avatar: type: string description: 'Must not be greater than 2048 characters.' example: i nullable: true profile_content: type: object description: '' example: null properties: intro: type: object description: '' example: null properties: headline: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true paragraphs: type: array description: '' example: - architecto items: type: string nullable: true ctaLabel: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true nullable: true sections: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: r nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.sections.*.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: ['yes', 'no', auto] nullable: true nullable: true homeLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: g nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.homeLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true commercialLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.commercialLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true otherLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.otherLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true contact: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true formEmbedUrl: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true mapEmbedUrl: type: string description: 'Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true nullable: true nullable: true security: [] patch: summary: '' operationId: patchApiAdminBrokersBroker_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: summary: type: string description: '' example: architecto nullable: true profile_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true featured_image: type: string description: 'Must not be greater than 2048 characters.' example: m nullable: true avatar: type: string description: 'Must not be greater than 2048 characters.' example: i nullable: true profile_content: type: object description: '' example: null properties: intro: type: object description: '' example: null properties: headline: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true paragraphs: type: array description: '' example: - architecto items: type: string nullable: true ctaLabel: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true nullable: true sections: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: r nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.sections.*.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: ['yes', 'no', auto] nullable: true nullable: true homeLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: g nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.homeLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true commercialLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.commercialLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true otherLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.otherLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true contact: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true formEmbedUrl: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true mapEmbedUrl: type: string description: 'Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true nullable: true nullable: true security: [] delete: summary: '' operationId: deleteApiAdminBrokersBroker_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: broker_id description: 'The ID of the broker.' example: 16 required: true schema: type: integer '/api/admin/brokers/{broker_id}/send-portal-invite': post: summary: '' operationId: postApiAdminBrokersBroker_idSendPortalInvite description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: broker_id description: 'The ID of the broker.' example: 16 required: true schema: type: integer '/api/admin/brokers/{broker_id}/images': post: summary: '' operationId: postApiAdminBrokersBroker_idImages description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: featured_image: type: string format: binary description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' featured_images: type: array description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary avatar: type: string format: binary description: 'Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' avatars: type: array description: 'Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' items: type: string format: binary security: [] parameters: - in: path name: broker_id description: 'The ID of the broker.' example: 16 required: true schema: type: integer '/api/admin/brokers/{broker_id}/audits': get: summary: '' operationId: getApiAdminBrokersBroker_idAudits description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints 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 1000.' example: 1 nullable: true security: [] parameters: - in: path name: broker_id description: 'The ID of the broker.' example: 16 required: true schema: type: integer /api/admin/insights: get: summary: '' operationId: getApiAdminInsights description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b is_published: type: boolean description: '' example: true sort: type: string description: 'Must not be greater than 255 characters.' example: 'n' per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 7 security: [] post: summary: '' operationId: postApiAdminInsights description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b slug: type: string description: 'Must not be greater than 255 characters.' example: 'n' published_at: type: string description: 'Must be a valid date.' example: '2026-04-20T12:46:34' excerpt: type: string description: '' example: architecto nullable: true body: type: string description: '' example: architecto nullable: true image_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true button_text: type: string description: 'Must not be greater than 255 characters.' example: m nullable: true button_url: type: string description: 'Must not be greater than 2048 characters.' example: 'https://www.gulgowski.com/nihil-accusantium-harum-mollitia-modi-deserunt' nullable: true link_type: type: string description: '' example: external enum: - internal - external is_published: type: boolean description: '' example: false required: - title - slug - published_at - link_type security: [] '/api/admin/insights/{insight_id}': get: summary: '' operationId: getApiAdminInsightsInsight_id description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiAdminInsightsInsight_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b slug: type: string description: 'Must not be greater than 255 characters.' example: 'n' published_at: type: string description: 'Must be a valid date.' example: '2026-04-20T12:46:34' excerpt: type: string description: '' example: architecto nullable: true body: type: string description: '' example: architecto nullable: true image_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true button_text: type: string description: 'Must not be greater than 255 characters.' example: m nullable: true button_url: type: string description: 'Must not be greater than 2048 characters.' example: 'https://www.gulgowski.com/nihil-accusantium-harum-mollitia-modi-deserunt' nullable: true link_type: type: string description: '' example: internal enum: - internal - external is_published: type: boolean description: '' example: false security: [] patch: summary: '' operationId: patchApiAdminInsightsInsight_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b slug: type: string description: 'Must not be greater than 255 characters.' example: 'n' published_at: type: string description: 'Must be a valid date.' example: '2026-04-20T12:46:34' excerpt: type: string description: '' example: architecto nullable: true body: type: string description: '' example: architecto nullable: true image_url: type: string description: 'Must not be greater than 2048 characters.' example: 'http://bailey.com/' nullable: true button_text: type: string description: 'Must not be greater than 255 characters.' example: m nullable: true button_url: type: string description: 'Must not be greater than 2048 characters.' example: 'https://www.gulgowski.com/nihil-accusantium-harum-mollitia-modi-deserunt' nullable: true link_type: type: string description: '' example: internal enum: - internal - external is_published: type: boolean description: '' example: false security: [] delete: summary: '' operationId: deleteApiAdminInsightsInsight_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: insight_id description: 'The ID of the insight.' example: 16 required: true schema: type: integer /api/admin/insights/upload: post: summary: '' operationId: postApiAdminInsightsUpload description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: image: type: string format: binary description: 'This field is required when images is not present. Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' images: type: array description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary security: [] /api/admin/testimonials: get: summary: '' operationId: getApiAdminTestimonials description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b is_active: type: boolean description: '' example: true sort: type: string description: 'Must not be greater than 255 characters.' example: 'n' per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 7 security: [] post: summary: '' operationId: postApiAdminTestimonials description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b role: type: string description: 'Must not be greater than 255 characters.' example: 'n' quote: type: string description: '' example: architecto rating: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 2 sort_order: type: integer description: 'Must be at least 0. Must not be greater than 100000.' example: 7 nullable: true is_active: type: boolean description: '' example: true required: - name - role - quote - rating security: [] '/api/admin/testimonials/{testimonial_id}': get: summary: '' operationId: getApiAdminTestimonialsTestimonial_id description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiAdminTestimonialsTestimonial_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b role: type: string description: 'Must not be greater than 255 characters.' example: 'n' quote: type: string description: '' example: architecto rating: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 2 sort_order: type: integer description: 'Must be at least 0. Must not be greater than 100000.' example: 7 nullable: true is_active: type: boolean description: '' example: true security: [] patch: summary: '' operationId: patchApiAdminTestimonialsTestimonial_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b role: type: string description: 'Must not be greater than 255 characters.' example: 'n' quote: type: string description: '' example: architecto rating: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 2 sort_order: type: integer description: 'Must be at least 0. Must not be greater than 100000.' example: 7 nullable: true is_active: type: boolean description: '' example: false security: [] delete: summary: '' operationId: deleteApiAdminTestimonialsTestimonial_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: testimonial_id description: 'The ID of the testimonial.' example: 16 required: true schema: type: integer /api/admin/join-us: get: summary: '' operationId: getApiAdminJoinUs description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true enquiry_type: type: string description: 'Must not be greater than 120 characters.' example: 'n' nullable: true source: type: string description: 'Must not be greater than 100 characters.' example: g nullable: true per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 16 nullable: true sort: type: string description: 'Must not be greater than 50 characters.' example: m nullable: true security: [] /api/admin/get-in-touch: get: summary: '' operationId: getApiAdminGetInTouch description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true source: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 7 nullable: true sort: type: string description: 'Must not be greater than 50 characters.' example: z nullable: true security: [] /api/admin/get-in-touch/content: get: summary: '' operationId: getApiAdminGetInTouchContent description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiAdminGetInTouchContent description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: badge_label: type: string description: 'Must not be greater than 255 characters.' example: b title: type: string description: 'Must not be greater than 255 characters.' example: 'n' phone_label: type: string description: 'Must not be greater than 255 characters.' example: g phone_value: type: string description: 'Must not be greater than 255 characters.' example: z email_label: type: string description: 'Must not be greater than 255 characters.' example: m email_value: type: string description: 'Must not be greater than 255 characters.' example: i location_label: type: string description: 'Must not be greater than 255 characters.' example: 'y' location_value: type: string description: 'Must not be greater than 255 characters.' example: v required: - badge_label - title - phone_label - phone_value - email_label - email_value - location_label - location_value security: [] patch: summary: '' operationId: patchApiAdminGetInTouchContent description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: badge_label: type: string description: 'Must not be greater than 255 characters.' example: b title: type: string description: 'Must not be greater than 255 characters.' example: 'n' phone_label: type: string description: 'Must not be greater than 255 characters.' example: g phone_value: type: string description: 'Must not be greater than 255 characters.' example: z email_label: type: string description: 'Must not be greater than 255 characters.' example: m email_value: type: string description: 'Must not be greater than 255 characters.' example: i location_label: type: string description: 'Must not be greater than 255 characters.' example: 'y' location_value: type: string description: 'Must not be greater than 255 characters.' example: v required: - badge_label - title - phone_label - phone_value - email_label - email_value - location_label - location_value security: [] /api/admin/users: get: summary: '' operationId: getApiAdminUsers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Must not be greater than 255 characters.' example: b role: type: string description: '' example: admin enum: - admin - agent - client active: type: boolean description: '' example: true approved: type: boolean description: '' example: true per_page: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 22 security: [] '/api/admin/users/{user_id}': get: summary: '' operationId: getApiAdminUsersUser_id description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiAdminUsersUser_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: zbailey@example.net password: type: string description: 'Must be at least 8 characters.' example: '-0pBNvYgxw' role: type: string description: '' example: client enum: - admin - agent - broker - client permissions: type: array description: '' example: - 'testimonials:edit' items: type: string enum: - 'dashboard:view' - 'dashboard:edit' - 'brokers:view' - 'brokers:edit' - 'insights:view' - 'insights:edit' - 'testimonials:view' - 'testimonials:edit' - 'services:view' - 'services:edit' - 'profile:view' - 'profile:edit' - 'users:view' - 'users:edit' - 'join-us:view' - 'join-us:edit' - 'get-in-touch:view' - 'get-in-touch:edit' active: type: boolean description: '' example: false approved: type: boolean description: '' example: true security: [] patch: summary: '' operationId: patchApiAdminUsersUser_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: zbailey@example.net password: type: string description: 'Must be at least 8 characters.' example: '-0pBNvYgxw' role: type: string description: '' example: broker enum: - admin - agent - broker - client permissions: type: array description: '' example: - 'services:edit' items: type: string enum: - 'dashboard:view' - 'dashboard:edit' - 'brokers:view' - 'brokers:edit' - 'insights:view' - 'insights:edit' - 'testimonials:view' - 'testimonials:edit' - 'services:view' - 'services:edit' - 'profile:view' - 'profile:edit' - 'users:view' - 'users:edit' - 'join-us:view' - 'join-us:edit' - 'get-in-touch:view' - 'get-in-touch:edit' active: type: boolean description: '' example: true approved: type: boolean description: '' example: true security: [] parameters: - in: path name: user_id description: 'The ID of the user.' example: 16 required: true schema: type: integer /api/profile: get: summary: '' operationId: getApiProfile description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints security: [] put: summary: '' operationId: putApiProfile description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: summary: type: string description: '' example: architecto nullable: true profile_content: type: object description: '' example: null properties: intro: type: object description: '' example: null properties: headline: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true paragraphs: type: array description: '' example: - architecto items: type: string nullable: true ctaLabel: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true nullable: true sections: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: r nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.sections.*.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: ['yes', 'no', auto] nullable: true nullable: true homeLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: g nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.homeLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true commercialLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.commercialLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true otherLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.otherLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true contact: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true formEmbedUrl: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true mapEmbedUrl: type: string description: 'Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true nullable: true nullable: true security: [] patch: summary: '' operationId: patchApiProfile description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: summary: type: string description: '' example: architecto nullable: true profile_content: type: object description: '' example: null properties: intro: type: object description: '' example: null properties: headline: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true paragraphs: type: array description: '' example: - architecto items: type: string nullable: true ctaLabel: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true nullable: true sections: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: r nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.sections.*.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'no' enum: ['yes', 'no', auto] nullable: true nullable: true homeLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: g nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.homeLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'yes' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true commercialLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.commercialLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: auto enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true otherLoans: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true highlights: type: array description: 'Must not be greater than 255 characters.' example: - v items: type: string nullable: true accordion: type: array description: '' example: null items: type: object nullable: true properties: title: type: string description: 'Must not be greater than 255 characters.' example: 'y' nullable: true body: type: string description: '' example: architecto nullable: true embed: type: object description: '' example: null properties: iframeUrl: type: string description: 'This field is required when profile_content.otherLoans.accordion.*.embed is present. Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' height: type: integer description: 'Must be at least 100. Must not be greater than 2000.' example: 17 nullable: true allow: type: string description: 'Must not be greater than 255 characters.' example: i nullable: true scrolling: type: string description: '' example: 'yes' enum: - 'yes' - 'no' - auto nullable: true nullable: true nullable: true contact: type: object description: '' example: null properties: title: type: string description: 'Must not be greater than 255 characters.' example: d nullable: true formEmbedUrl: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true mapEmbedUrl: type: string description: 'Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true nullable: true nullable: true security: [] /api/profile/images: post: summary: '' operationId: postApiProfileImages description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: featured_image: type: string format: binary description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' featured_images: type: array description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' items: type: string format: binary avatar: type: string format: binary description: 'Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' avatars: type: array description: 'Must be a file. Must be an image. Must not be greater than 4096 kilobytes.' items: type: string format: binary security: [] /api/admin/zoho/status: get: summary: 'Get Zoho connection status.' operationId: getZohoConnectionStatus description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: connected: true expires_at: '2026-04-09T10:12:30Z' api_domain: 'https://www.zohoapis.com' scope: ZohoCRM.modules.ALL properties: data: type: object properties: connected: type: boolean example: true expires_at: type: string example: '2026-04-09T10:12:30Z' api_domain: type: string example: 'https://www.zohoapis.com' scope: type: string example: ZohoCRM.modules.ALL tags: - 'Zoho CRM' /api/admin/zoho/oauth/url: get: summary: 'Get Zoho OAuth authorization URL.' operationId: getZohoOAuthAuthorizationURL description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: url: 'https://accounts.zoho.com/oauth/v2/auth?...' properties: data: type: object properties: url: type: string example: 'https://accounts.zoho.com/oauth/v2/auth?...' tags: - 'Zoho CRM' /api/admin/zoho/oauth/callback: post: summary: 'Exchange Zoho OAuth code for tokens.' operationId: exchangeZohoOAuthCodeForTokens description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: connected: true expires_at: '2026-04-09T10:12:30Z' api_domain: 'https://www.zohoapis.com' scope: ZohoCRM.modules.ALL properties: data: type: object properties: connected: type: boolean example: true expires_at: type: string example: '2026-04-09T10:12:30Z' api_domain: type: string example: 'https://www.zohoapis.com' scope: type: string example: ZohoCRM.modules.ALL tags: - 'Zoho CRM' requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: '' example: architecto accounts_server: type: string description: '' example: architecto nullable: true location: type: string description: '' example: architecto nullable: true required: - code /api/admin/zoho/oauth/revoke: post: summary: 'Revoke Zoho OAuth tokens.' operationId: revokeZohoOAuthTokens description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: message: 'Zoho CRM connection revoked.' properties: data: type: object properties: message: type: string example: 'Zoho CRM connection revoked.' tags: - 'Zoho CRM'