openapi: 3.0.3 info: title: 'Industry Tuner API API Documentation' description: 'Industry Tuner API - A comprehensive API for authentication, user/company/expert management, projects & proposals, subscriptions, blogs, FAQs, locations, policies, site settings, and more.' version: 1.0.0 servers: - url: 'https://industry-tuner-api.test' tags: - name: 'Admin About Page' description: '' - name: 'Admin Blogs' description: '' - name: 'Admin Commission Settings' description: '' - name: 'Admin Dashboard' description: '' - name: 'Admin Dispute Categories' description: '' - name: 'Admin Disputes' description: '' - name: 'Admin Expert Milestone Payments' description: '' - name: 'Admin Expert Projects' description: '' - name: 'Admin FAQ Management' description: '' - name: 'Admin Home Page' description: '' - name: 'Admin Milestone Payments' description: '' - name: 'Admin Policies' description: '' - name: 'Admin Projects' description: '' - name: 'Admin Site Settings' description: '' - name: 'Admin Subscription Configuration' description: '' - name: 'Admin User Management' description: '' - name: Authentication description: '' - name: 'Company Profile' description: '' - name: Contact description: '' - name: Designation description: '' - name: 'Dispute Categories' description: '' - name: Disputes description: '' - name: 'Expert Payment Details' description: '' - name: 'Expert Profile' description: '' - name: 'Industry Type' description: '' - name: Location description: '' - name: 'Milestone Payments' description: '' - name: Projects description: '' - name: Proposals description: '' - name: 'Public About Page' description: '' - name: 'Public Blogs' description: '' - name: 'Public Company' description: '' - name: 'Public Expert' description: '' - name: 'Public FAQs' description: '' - name: 'Public Home Page' description: '' - name: 'Public Policies' description: '' - name: 'Public Site Settings' description: '' - name: 'Requirement Type' description: '' - name: Subscription description: '' - name: 'Subscription Configuration' 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_AUTH_TOKEN}.' security: - default: [] paths: /api/v1/admin/about-page: get: summary: 'Get current about page content.' operationId: getCurrentAboutPageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'About page content retrieved successfully' data: id: 1 page_title: 'About Us' side_image: 'http://localhost/images/about/side.jpg' heading: Welcome description: Description our_mission_text: 'Mission text' our_vision_text: 'Vision text' our_values_text: 'Values text' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'About page content retrieved successfully' data: type: object properties: id: type: integer example: 1 page_title: type: string example: 'About Us' side_image: type: string example: 'http://localhost/images/about/side.jpg' heading: type: string example: Welcome description: type: string example: Description our_mission_text: type: string example: 'Mission text' our_vision_text: type: string example: 'Vision text' our_values_text: type: string example: 'Values text' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin About Page' put: summary: 'Update about page content.' operationId: updateAboutPageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'About page content updated successfully' data: id: 1 page_title: 'About Us' side_image: 'http://localhost/images/about/side.jpg' heading: Welcome description: Description our_mission_text: 'Mission text' our_vision_text: 'Vision text' our_values_text: 'Values text' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'About page content updated successfully' data: type: object properties: id: type: integer example: 1 page_title: type: string example: 'About Us' side_image: type: string example: 'http://localhost/images/about/side.jpg' heading: type: string example: Welcome description: type: string example: Description our_mission_text: type: string example: 'Mission text' our_vision_text: type: string example: 'Vision text' our_values_text: type: string example: 'Values text' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: page_title: - 'The page title field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: page_title: type: array example: - 'The page title field is required.' items: type: string tags: - 'Admin About Page' requestBody: required: false content: multipart/form-data: schema: type: object properties: page_title: type: string description: 'optional Page title.' example: 'About Us' nullable: true side_image: type: string format: binary description: 'optional Side image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true heading: type: string description: 'optional Heading.' example: 'Welcome to Our Company' nullable: true description: type: string description: 'optional Description.' example: 'We are a leading company' nullable: true our_mission_text: type: string description: 'optional Our mission text.' example: 'Our mission is to...' nullable: true our_vision_text: type: string description: 'optional Our vision text.' example: 'Our vision is to...' nullable: true our_values_text: type: string description: 'optional Our values text.' example: 'Our values are...' nullable: true patch: summary: 'Update about page content.' operationId: updateAboutPageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'About page content updated successfully' data: id: 1 page_title: 'About Us' side_image: 'http://localhost/images/about/side.jpg' heading: Welcome description: Description our_mission_text: 'Mission text' our_vision_text: 'Vision text' our_values_text: 'Values text' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'About page content updated successfully' data: type: object properties: id: type: integer example: 1 page_title: type: string example: 'About Us' side_image: type: string example: 'http://localhost/images/about/side.jpg' heading: type: string example: Welcome description: type: string example: Description our_mission_text: type: string example: 'Mission text' our_vision_text: type: string example: 'Vision text' our_values_text: type: string example: 'Values text' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: page_title: - 'The page title field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: page_title: type: array example: - 'The page title field is required.' items: type: string tags: - 'Admin About Page' requestBody: required: false content: multipart/form-data: schema: type: object properties: page_title: type: string description: 'optional Page title.' example: 'About Us' nullable: true side_image: type: string format: binary description: 'optional Side image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true heading: type: string description: 'optional Heading.' example: 'Welcome to Our Company' nullable: true description: type: string description: 'optional Description.' example: 'We are a leading company' nullable: true our_mission_text: type: string description: 'optional Our mission text.' example: 'Our mission is to...' nullable: true our_vision_text: type: string description: 'optional Our vision text.' example: 'Our vision is to...' nullable: true our_values_text: type: string description: 'optional Our values text.' example: 'Our values are...' nullable: true /api/v1/admin/blog-categories: get: summary: 'List blog categories (admin).' operationId: listBlogCategoriesadmin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog categories retrieved' data: - id: 1 name: Tech is_active: true blogs_count: 5 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog categories retrieved' data: type: array example: - id: 1 name: Tech is_active: true blogs_count: 5 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: Tech is_active: type: boolean example: true blogs_count: type: integer example: 5 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Blogs' post: summary: 'Create a blog category.' operationId: createABlogCategory description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Blog category created' data: id: 1 name: Technology is_active: true blogs_count: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog category created' data: type: object properties: id: type: integer example: 1 name: type: string example: Technology is_active: type: boolean example: true blogs_count: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'The name has already been taken.' errors: name: - 'The name has already been taken.' properties: success: type: boolean example: false message: type: string example: 'The name has already been taken.' errors: type: object properties: name: type: array example: - 'The name has already been taken.' items: type: string tags: - 'Admin Blogs' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Category name.' example: Technology is_active: type: boolean description: 'optional Whether category is active.' example: true required: - name '/api/v1/admin/blog-categories/{id}': get: summary: 'Show a single category (admin).' operationId: showASingleCategoryadmin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog category retrieved' data: id: 1 name: Technology is_active: true blogs_count: 3 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog category retrieved' data: type: object properties: id: type: integer example: 1 name: type: string example: Technology is_active: type: boolean example: true blogs_count: type: integer example: 3 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog category not found' properties: success: type: boolean example: false message: type: string example: 'Blog category not found' tags: - 'Admin Blogs' put: summary: 'Update a category.' operationId: updateACategory description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog category updated' data: id: 1 name: AI is_active: false blogs_count: 3 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:10:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog category updated' data: type: object properties: id: type: integer example: 1 name: type: string example: AI is_active: type: boolean example: false blogs_count: type: integer example: 3 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:10:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog category not found' properties: success: type: boolean example: false message: type: string example: 'Blog category not found' tags: - 'Admin Blogs' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional Category name.' example: AI is_active: type: boolean description: 'optional Whether active.' example: false delete: summary: 'Delete a category.' operationId: deleteACategory description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog category deleted' data: null properties: success: type: boolean example: true message: type: string example: 'Blog category deleted' data: type: string example: null nullable: true 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog category not found' properties: success: type: boolean example: false message: type: string example: 'Blog category not found' tags: - 'Admin Blogs' parameters: - in: path name: id description: 'The category ID.' example: 1 required: true schema: type: integer /api/v1/admin/blogs: get: summary: 'List blogs for admin.' operationId: listBlogsForAdmin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blogs retrieved' data: - id: 1 name: 'Launch Update' blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: 'Short summary' share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blogs retrieved' data: type: array example: - id: 1 name: 'Launch Update' blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: 'Short summary' share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update' blog_category_id: type: integer example: 2 category: type: object properties: id: type: integer example: 2 name: type: string example: News is_active: type: boolean example: true blogs_count: type: integer example: 1 thumbnail_image: type: string example: 'https://cdn/img.png' description: type: string example: 'Short summary' share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Blogs' post: summary: 'Create a blog with sections.' operationId: createABlogWithSections description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Blog created' data: id: 1 name: 'Launch Update' blog_category_id: 2 thumbnail_image: 'https://cdn/img.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog created' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update' blog_category_id: type: integer example: 2 thumbnail_image: type: string example: 'https://cdn/img.png' description: type: string example: ... share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: sections.0.heading: - 'The heading field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: sections.0.heading: type: array example: - 'The heading field is required.' items: type: string tags: - 'Admin Blogs' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Blog title.' example: 'Launch Update' blog_category_id: type: integer description: 'Category ID.' example: 2 thumbnail_image: type: string description: 'Thumbnail URL/path.' example: 'https://cdn/img.png' description: type: string description: 'Blog description/summary.' example: 'Eius et animi quos velit et.' share_facebook: type: boolean description: 'optional Enable Facebook share.' example: true share_twitter: type: boolean description: 'optional Enable Twitter share.' example: false share_linkedin: type: boolean description: 'optional Enable LinkedIn share.' example: true is_active: type: boolean description: 'optional Mark blog active.' example: true sections: type: array description: 'Array of blog sections.' example: - architecto items: type: string required: - name - blog_category_id - thumbnail_image - description - sections '/api/v1/admin/blogs/{id}': get: summary: 'Show a blog (admin).' operationId: showABlogadmin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog retrieved' data: id: 1 name: 'Launch Update' blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog retrieved' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update' blog_category_id: type: integer example: 2 category: type: object properties: id: type: integer example: 2 name: type: string example: News is_active: type: boolean example: true blogs_count: type: integer example: 1 thumbnail_image: type: string example: 'https://cdn/img.png' description: type: string example: ... share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog not found' properties: success: type: boolean example: false message: type: string example: 'Blog not found' tags: - 'Admin Blogs' put: summary: 'Update a blog and its sections.' operationId: updateABlogAndItsSections description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog updated' data: id: 1 name: 'Launch Update v2' blog_category_id: 2 thumbnail_image: 'https://cdn/img2.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:10:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog updated' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update v2' blog_category_id: type: integer example: 2 thumbnail_image: type: string example: 'https://cdn/img2.png' description: type: string example: ... share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:10:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog not found' properties: success: type: boolean example: false message: type: string example: 'Blog not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'One or more section ids are invalid for this blog.' properties: success: type: boolean example: false message: type: string example: 'One or more section ids are invalid for this blog.' tags: - 'Admin Blogs' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional Blog title.' example: 'Launch Update v2' blog_category_id: type: integer description: 'optional Category ID.' example: 2 thumbnail_image: type: string description: 'optional Thumbnail URL/path.' example: 'https://cdn/img2.png' description: type: string description: 'optional Blog description/summary.' example: 'Eius et animi quos velit et.' share_facebook: type: boolean description: 'optional Enable Facebook share.' example: false share_twitter: type: boolean description: 'optional Enable Twitter share.' example: false share_linkedin: type: boolean description: 'optional Enable LinkedIn share.' example: false is_active: type: boolean description: 'optional Mark blog active.' example: false sections: type: array description: 'optional Array of sections (replaces existing; omitted keeps current).' example: - architecto items: type: string delete: summary: 'Delete a blog.' operationId: deleteABlog description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog deleted' data: null properties: success: type: boolean example: true message: type: string example: 'Blog deleted' data: type: string example: null nullable: true 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog not found' properties: success: type: boolean example: false message: type: string example: 'Blog not found' tags: - 'Admin Blogs' parameters: - in: path name: id description: 'Blog ID.' example: 1 required: true schema: type: integer /api/v1/admin/commission-settings: get: summary: 'Get current commission (platform fee) settings.' operationId: getCurrentCommissionplatformFeeSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Commission settings retrieved successfully' data: id: 1 platform_fee_company_percent: 10 platform_fee_expert_percent: 5 is_enabled: true created_at: '2026-02-12T00:00:00+00:00' updated_at: '2026-02-12T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Commission settings retrieved successfully' data: type: object properties: id: type: integer example: 1 platform_fee_company_percent: type: integer example: 10 platform_fee_expert_percent: type: integer example: 5 is_enabled: type: boolean example: true created_at: type: string example: '2026-02-12T00:00:00+00:00' updated_at: type: string example: '2026-02-12T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Commission Settings' put: summary: 'Update commission (platform fee) settings.' operationId: updateCommissionplatformFeeSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Commission settings updated successfully' data: id: 1 platform_fee_company_percent: 10 platform_fee_expert_percent: 5 is_enabled: true created_at: '2026-02-12T00:00:00+00:00' updated_at: '2026-02-12T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Commission settings updated successfully' data: type: object properties: id: type: integer example: 1 platform_fee_company_percent: type: integer example: 10 platform_fee_expert_percent: type: integer example: 5 is_enabled: type: boolean example: true created_at: type: string example: '2026-02-12T00:00:00+00:00' updated_at: type: string example: '2026-02-12T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: platform_fee_company_percent: - 'Platform fee for companies must not exceed 100.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: platform_fee_company_percent: type: array example: - 'Platform fee for companies must not exceed 100.' items: type: string tags: - 'Admin Commission Settings' requestBody: required: false content: application/json: schema: type: object properties: platform_fee_company_percent: type: number description: 'optional Platform fee percentage charged to companies on each milestone (0-100).' example: 10.0 nullable: true platform_fee_expert_percent: type: number description: 'optional Platform fee percentage deducted from expert payout per milestone (0-100).' example: 5.0 nullable: true is_enabled: type: boolean description: 'optional Whether commission is applied. Set to false to turn commission off entirely.' example: true nullable: true patch: summary: 'Update commission (platform fee) settings.' operationId: updateCommissionplatformFeeSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Commission settings updated successfully' data: id: 1 platform_fee_company_percent: 10 platform_fee_expert_percent: 5 is_enabled: true created_at: '2026-02-12T00:00:00+00:00' updated_at: '2026-02-12T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Commission settings updated successfully' data: type: object properties: id: type: integer example: 1 platform_fee_company_percent: type: integer example: 10 platform_fee_expert_percent: type: integer example: 5 is_enabled: type: boolean example: true created_at: type: string example: '2026-02-12T00:00:00+00:00' updated_at: type: string example: '2026-02-12T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: platform_fee_company_percent: - 'Platform fee for companies must not exceed 100.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: platform_fee_company_percent: type: array example: - 'Platform fee for companies must not exceed 100.' items: type: string tags: - 'Admin Commission Settings' requestBody: required: false content: application/json: schema: type: object properties: platform_fee_company_percent: type: number description: 'optional Platform fee percentage charged to companies on each milestone (0-100).' example: 10.0 nullable: true platform_fee_expert_percent: type: number description: 'optional Platform fee percentage deducted from expert payout per milestone (0-100).' example: 5.0 nullable: true is_enabled: type: boolean description: 'optional Whether commission is applied. Set to false to turn commission off entirely.' example: true nullable: true /api/v1/admin/dashboard: get: summary: 'Get admin dashboard summary: totals and recent projects, experts, companies.' operationId: getAdminDashboardSummaryTotalsAndRecentProjectsExpertsCompanies description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Dashboard data retrieved successfully' data: total_projects: 100 total_companies: 50 total_experts: 200 recent_projects: [] recent_experts: [] recent_companies: [] properties: success: type: boolean example: true message: type: string example: 'Dashboard data retrieved successfully' data: type: object properties: total_projects: type: integer example: 100 total_companies: type: integer example: 50 total_experts: type: integer example: 200 recent_projects: type: array example: [] recent_experts: type: array example: [] recent_companies: 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Dashboard' /api/v1/admin/dispute-categories: get: summary: 'List all dispute categories (admin).' operationId: listAllDisputeCategoriesadmin 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 Dispute Categories' post: summary: 'Store a new dispute category.' operationId: storeANewDisputeCategory description: '' parameters: [] responses: { } tags: - 'Admin Dispute Categories' 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 '/api/v1/admin/dispute-categories/{id}': get: summary: 'Show a single dispute category.' operationId: showASingleDisputeCategory 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 Dispute Categories' put: summary: 'Update a dispute category.' operationId: updateADisputeCategory description: '' parameters: [] responses: { } tags: - 'Admin Dispute Categories' 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 delete: summary: 'Delete a dispute category.' operationId: deleteADisputeCategory description: '' parameters: [] responses: { } tags: - 'Admin Dispute Categories' parameters: - in: path name: id description: 'The ID of the dispute category.' example: 16 required: true schema: type: integer /api/v1/admin/disputes: get: summary: 'List all disputes (admin).' operationId: listAllDisputesadmin 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' '/api/v1/admin/disputes/{dispute_id}': get: summary: 'Show a single dispute (admin).' operationId: showASingleDisputeadmin 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' parameters: - in: path name: dispute_id description: 'The ID of the dispute.' example: 16 required: true schema: type: integer '/api/v1/admin/disputes/{dispute_id}/mark-solved': post: summary: 'Mark a dispute as solved (set status to completed or ongoing).' operationId: markADisputeAsSolvedsetStatusToCompletedOrOngoing description: '' parameters: [] responses: { } tags: - 'Admin Disputes' requestBody: required: true content: application/json: schema: type: object properties: status: type: string description: '' example: completed enum: - ongoing - completed required: - status parameters: - in: path name: dispute_id description: 'The ID of the dispute.' example: 16 required: true schema: type: integer /api/v1/admin/expert-milestone-payments: get: summary: 'List milestone payments to be done for experts (company has paid; optionally filter by expert/project).' operationId: listMilestonePaymentsToBeDoneForExpertscompanyHasPaidOptionallyFilterByExpertproject description: '' parameters: - in: query name: expert_id description: 'optional Filter by expert (awarded user) ID.' example: 2 required: false schema: type: integer description: 'optional Filter by expert (awarded user) ID.' example: 2 - in: query name: project_id description: 'optional Filter by project ID.' example: 1 required: false schema: type: integer description: 'optional Filter by project ID.' example: 1 - in: query name: per_page description: 'optional Per page (1-100).' example: 15 required: false schema: type: integer description: 'optional Per page (1-100).' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert milestone payments retrieved successfully' data: data: [] properties: success: type: boolean example: true message: type: string example: 'Expert milestone payments retrieved successfully' data: type: object properties: data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Expert Milestone Payments' '/api/v1/admin/expert-milestone-payments/{milestone_payment}/mark-paid': post: summary: 'Mark expert payment as done (payment mode + upload receipt).' operationId: markExpertPaymentAsDonepaymentMode+UploadReceipt description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert payment marked as done' data: { } properties: success: type: boolean example: true message: type: string example: 'Expert payment marked as done' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Milestone not found.' properties: success: type: boolean example: false message: type: string example: 'Milestone not found.' 422: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: false message: 'Company has not paid this milestone yet.' properties: success: type: boolean example: false message: type: string example: 'Company has not paid this milestone yet.' - description: '' type: object example: success: false message: 'Expert payment for this milestone is already marked as done.' properties: success: type: boolean example: false message: type: string example: 'Expert payment for this milestone is already marked as done.' tags: - 'Admin Expert Milestone Payments' requestBody: required: true content: multipart/form-data: schema: type: object properties: payment_mode: type: string description: 'paypal or bank_transfer.' example: paypal receipt: type: string format: binary description: 'Payment receipt (jpeg, jpg, png, pdf, max 5MB).' required: - payment_mode - receipt parameters: - in: path name: milestone_payment description: '' example: 16 required: true schema: type: integer '/api/v1/admin/experts/{expert_id}/proposals': get: summary: 'List all proposals submitted by an expert.' operationId: listAllProposalsSubmittedByAnExpert description: '' parameters: - in: query name: per_page description: 'optional Per page (1-100).' example: 15 required: false schema: type: integer description: 'optional Per page (1-100).' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Proposals retrieved successfully' data: data: [] properties: success: type: boolean example: true message: type: string example: 'Proposals retrieved successfully' data: type: object properties: data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'User is not an expert.' properties: success: type: boolean example: false message: type: string example: 'User is not an expert.' tags: - 'Admin Expert Projects' parameters: - in: path name: expert_id description: 'The ID of the expert.' example: 1 required: true schema: type: integer - in: path name: expert description: 'The expert (user) ID.' example: 2 required: true schema: type: integer '/api/v1/admin/experts/{expert_id}/awarded-projects': get: summary: 'List all awarded projects for an expert (projects where this expert was awarded and accepted).' operationId: listAllAwardedProjectsForAnExpertprojectsWhereThisExpertWasAwardedAndAccepted description: '' parameters: - in: query name: per_page description: 'optional Per page (1-100).' example: 15 required: false schema: type: integer description: 'optional Per page (1-100).' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Awarded projects retrieved successfully' data: data: [] properties: success: type: boolean example: true message: type: string example: 'Awarded projects retrieved successfully' data: type: object properties: data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'User is not an expert.' properties: success: type: boolean example: false message: type: string example: 'User is not an expert.' tags: - 'Admin Expert Projects' parameters: - in: path name: expert_id description: 'The ID of the expert.' example: 1 required: true schema: type: integer - in: path name: expert description: 'The expert (user) ID.' example: 2 required: true schema: type: integer '/api/v1/admin/experts/{expert_id}/completed-projects': get: summary: 'List all completed projects for an expert (awarded projects with status completed).' operationId: listAllCompletedProjectsForAnExpertawardedProjectsWithStatusCompleted description: '' parameters: - in: query name: per_page description: 'optional Per page (1-100).' example: 15 required: false schema: type: integer description: 'optional Per page (1-100).' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Completed projects retrieved successfully' data: data: [] properties: success: type: boolean example: true message: type: string example: 'Completed projects retrieved successfully' data: type: object properties: data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'User is not an expert.' properties: success: type: boolean example: false message: type: string example: 'User is not an expert.' tags: - 'Admin Expert Projects' parameters: - in: path name: expert_id description: 'The ID of the expert.' example: 1 required: true schema: type: integer - in: path name: expert description: 'The expert (user) ID.' example: 2 required: true schema: type: integer /api/v1/admin/company-faqs: get: summary: 'Get all company FAQs.' operationId: getAllCompanyFAQs description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQs retrieved' data: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company FAQs retrieved' data: type: array example: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin FAQ Management' post: summary: 'Create a new company FAQ.' operationId: createANewCompanyFAQ description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQ created' data: id: 1 heading: 'How do I get started?' description: 'You can get started by creating an account.' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company FAQ created' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'How do I get started?' description: type: string example: 'You can get started by creating an account.' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: heading: - 'The heading field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: heading: type: array example: - 'The heading field is required.' items: type: string tags: - 'Admin FAQ Management' requestBody: required: true content: application/json: schema: type: object properties: heading: type: string description: 'The FAQ heading.' example: 'How do I get started?' description: type: string description: 'The FAQ description/answer.' example: 'You can get started by creating an account.' order: type: integer description: 'optional The display order.' example: 0 nullable: true required: - heading - description '/api/v1/admin/company-faqs/{id}': get: summary: 'Get a single company FAQ.' operationId: getASingleCompanyFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQ retrieved' data: id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company FAQ retrieved' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Company FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Company FAQ not found' tags: - 'Admin FAQ Management' put: summary: 'Update a company FAQ.' operationId: updateACompanyFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQ updated' data: id: 1 heading: 'How do I get started?' description: 'You can get started by creating an account.' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company FAQ updated' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'How do I get started?' description: type: string example: 'You can get started by creating an account.' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Company FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Company FAQ not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: heading: - 'The heading field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: heading: type: array example: - 'The heading field is required.' items: type: string tags: - 'Admin FAQ Management' requestBody: required: false content: application/json: schema: type: object properties: heading: type: string description: 'optional The FAQ heading.' example: 'How do I get started?' description: type: string description: 'optional The FAQ description/answer.' example: 'You can get started by creating an account.' order: type: integer description: 'optional The display order.' example: 0 nullable: true delete: summary: 'Delete a company FAQ.' operationId: deleteACompanyFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQ deleted' data: null properties: success: type: boolean example: true message: type: string example: 'Company FAQ deleted' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Company FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Company FAQ not found' tags: - 'Admin FAQ Management' parameters: - in: path name: id description: 'The ID of the FAQ.' example: 1 required: true schema: type: integer /api/v1/admin/expert-faqs: get: summary: 'Get all expert FAQs.' operationId: getAllExpertFAQs description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQs retrieved' data: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert FAQs retrieved' data: type: array example: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin FAQ Management' post: summary: 'Create a new expert FAQ.' operationId: createANewExpertFAQ description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQ created' data: id: 1 heading: 'How do I get started?' description: 'You can get started by creating an account.' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert FAQ created' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'How do I get started?' description: type: string example: 'You can get started by creating an account.' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: heading: - 'The heading field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: heading: type: array example: - 'The heading field is required.' items: type: string tags: - 'Admin FAQ Management' requestBody: required: true content: application/json: schema: type: object properties: heading: type: string description: 'The FAQ heading.' example: 'How do I get started?' description: type: string description: 'The FAQ description/answer.' example: 'You can get started by creating an account.' order: type: integer description: 'optional The display order.' example: 0 nullable: true required: - heading - description '/api/v1/admin/expert-faqs/{id}': get: summary: 'Get a single expert FAQ.' operationId: getASingleExpertFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQ retrieved' data: id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert FAQ retrieved' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Expert FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Expert FAQ not found' tags: - 'Admin FAQ Management' put: summary: 'Update an expert FAQ.' operationId: updateAnExpertFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQ updated' data: id: 1 heading: 'How do I get started?' description: 'You can get started by creating an account.' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert FAQ updated' data: type: object properties: id: type: integer example: 1 heading: type: string example: 'How do I get started?' description: type: string example: 'You can get started by creating an account.' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Expert FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Expert FAQ not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: heading: - 'The heading field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: heading: type: array example: - 'The heading field is required.' items: type: string tags: - 'Admin FAQ Management' requestBody: required: false content: application/json: schema: type: object properties: heading: type: string description: 'optional The FAQ heading.' example: 'How do I get started?' description: type: string description: 'optional The FAQ description/answer.' example: 'You can get started by creating an account.' order: type: integer description: 'optional The display order.' example: 0 nullable: true delete: summary: 'Delete an expert FAQ.' operationId: deleteAnExpertFAQ description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQ deleted' data: null properties: success: type: boolean example: true message: type: string example: 'Expert FAQ deleted' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Expert FAQ not found' properties: success: type: boolean example: false message: type: string example: 'Expert FAQ not found' tags: - 'Admin FAQ Management' parameters: - in: path name: id description: 'The ID of the FAQ.' example: 1 required: true schema: type: integer /api/v1/admin/home-page: get: summary: 'Get current home page content.' operationId: getCurrentHomePageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Home page content retrieved successfully' data: id: 1 section1: hero_headline: Welcome hero_description: Description hero_image: 'http://localhost/images/hero.jpg' section2: headline: 'Section 2' section3: headline: 'Section 3' description: Description button_name: Click button_url: 'https://example.com' image: 'http://localhost/images/section3.jpg' section4: headline: 'Section 4' options: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' section5: steps: - title: 'Step 1' description: 'Description 1' section6: headline: 'Section 6' button_name: Click button_url: 'https://example.com' background_image: 'http://localhost/images/bg.jpg' section7: headline: 'Section 7' description: Description created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Home page content retrieved successfully' data: type: object properties: id: type: integer example: 1 section1: type: object properties: hero_headline: type: string example: Welcome hero_description: type: string example: Description hero_image: type: string example: 'http://localhost/images/hero.jpg' section2: type: object properties: headline: type: string example: 'Section 2' section3: type: object properties: headline: type: string example: 'Section 3' description: type: string example: Description button_name: type: string example: Click button_url: type: string example: 'https://example.com' image: type: string example: 'http://localhost/images/section3.jpg' section4: type: object properties: headline: type: string example: 'Section 4' options: type: array example: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' items: type: object properties: image: type: string example: 'http://localhost/images/option1.jpg' title: type: string example: 'Option 1' description: type: string example: 'Description 1' section5: type: object properties: steps: type: array example: - title: 'Step 1' description: 'Description 1' items: type: object properties: title: type: string example: 'Step 1' description: type: string example: 'Description 1' section6: type: object properties: headline: type: string example: 'Section 6' button_name: type: string example: Click button_url: type: string example: 'https://example.com' background_image: type: string example: 'http://localhost/images/bg.jpg' section7: type: object properties: headline: type: string example: 'Section 7' description: type: string example: Description created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Home Page' put: summary: 'Update home page content.' operationId: updateHomePageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Home page content updated successfully' data: id: 1 section1: hero_headline: Welcome hero_description: Description hero_image: 'http://localhost/images/hero.jpg' section2: headline: 'Section 2' section3: headline: 'Section 3' description: Description button_name: Click button_url: 'https://example.com' image: 'http://localhost/images/section3.jpg' section4: headline: 'Section 4' options: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' section5: steps: - title: 'Step 1' description: 'Description 1' section6: headline: 'Section 6' button_name: Click button_url: 'https://example.com' background_image: 'http://localhost/images/bg.jpg' section7: headline: 'Section 7' description: Description created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Home page content updated successfully' data: type: object properties: id: type: integer example: 1 section1: type: object properties: hero_headline: type: string example: Welcome hero_description: type: string example: Description hero_image: type: string example: 'http://localhost/images/hero.jpg' section2: type: object properties: headline: type: string example: 'Section 2' section3: type: object properties: headline: type: string example: 'Section 3' description: type: string example: Description button_name: type: string example: Click button_url: type: string example: 'https://example.com' image: type: string example: 'http://localhost/images/section3.jpg' section4: type: object properties: headline: type: string example: 'Section 4' options: type: array example: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' items: type: object properties: image: type: string example: 'http://localhost/images/option1.jpg' title: type: string example: 'Option 1' description: type: string example: 'Description 1' section5: type: object properties: steps: type: array example: - title: 'Step 1' description: 'Description 1' items: type: object properties: title: type: string example: 'Step 1' description: type: string example: 'Description 1' section6: type: object properties: headline: type: string example: 'Section 6' button_name: type: string example: Click button_url: type: string example: 'https://example.com' background_image: type: string example: 'http://localhost/images/bg.jpg' section7: type: object properties: headline: type: string example: 'Section 7' description: type: string example: Description created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: hero_headline: - 'The hero headline field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: hero_headline: type: array example: - 'The hero headline field is required.' items: type: string tags: - 'Admin Home Page' requestBody: required: false content: multipart/form-data: schema: type: object properties: hero_headline: type: string description: 'optional Hero headline.' example: 'Welcome to Our Platform' nullable: true hero_description: type: string description: 'optional Hero description.' example: 'Connect with industry experts' nullable: true hero_image: type: string format: binary description: 'optional Hero image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section2_headline: type: string description: 'optional Section 2 headline.' example: 'Our Services' nullable: true section3_headline: type: string description: 'optional Section 3 headline.' example: 'Get Started' nullable: true section3_description: type: string description: 'optional Section 3 description.' example: 'Join us today' nullable: true section3_button_name: type: string description: 'optional Section 3 button name.' example: 'Sign Up' nullable: true section3_button_url: type: string description: 'optional Section 3 button URL.' example: 'https://example.com/signup' nullable: true section3_image: type: string format: binary description: 'optional Section 3 image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section4_headline: type: string description: 'optional Section 4 headline.' example: Features nullable: true section4_options: type: array description: 'optional Section 4 options array.' example: - architecto items: type: string nullable: true section4_image: type: string format: binary description: 'optional Section 4 image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section5_steps: type: array description: 'optional Section 5 steps array (must have exactly 5 steps).' example: - architecto items: type: string nullable: true section6_headline: type: string description: 'optional Section 6 headline.' example: 'Ready to Start?' nullable: true section6_button_name: type: string description: 'optional Section 6 button name.' example: 'Get Started' nullable: true section6_button_url: type: string description: 'optional Section 6 button URL.' example: 'https://example.com/start' nullable: true section6_background_image: type: string format: binary description: 'optional Section 6 background image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section7_headline: type: string description: 'optional Section 7 headline.' example: 'About Us' nullable: true section7_description: type: string description: 'optional Section 7 description.' example: 'We are a leading platform' nullable: true patch: summary: 'Update home page content.' operationId: updateHomePageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Home page content updated successfully' data: id: 1 section1: hero_headline: Welcome hero_description: Description hero_image: 'http://localhost/images/hero.jpg' section2: headline: 'Section 2' section3: headline: 'Section 3' description: Description button_name: Click button_url: 'https://example.com' image: 'http://localhost/images/section3.jpg' section4: headline: 'Section 4' options: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' section5: steps: - title: 'Step 1' description: 'Description 1' section6: headline: 'Section 6' button_name: Click button_url: 'https://example.com' background_image: 'http://localhost/images/bg.jpg' section7: headline: 'Section 7' description: Description created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Home page content updated successfully' data: type: object properties: id: type: integer example: 1 section1: type: object properties: hero_headline: type: string example: Welcome hero_description: type: string example: Description hero_image: type: string example: 'http://localhost/images/hero.jpg' section2: type: object properties: headline: type: string example: 'Section 2' section3: type: object properties: headline: type: string example: 'Section 3' description: type: string example: Description button_name: type: string example: Click button_url: type: string example: 'https://example.com' image: type: string example: 'http://localhost/images/section3.jpg' section4: type: object properties: headline: type: string example: 'Section 4' options: type: array example: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' items: type: object properties: image: type: string example: 'http://localhost/images/option1.jpg' title: type: string example: 'Option 1' description: type: string example: 'Description 1' section5: type: object properties: steps: type: array example: - title: 'Step 1' description: 'Description 1' items: type: object properties: title: type: string example: 'Step 1' description: type: string example: 'Description 1' section6: type: object properties: headline: type: string example: 'Section 6' button_name: type: string example: Click button_url: type: string example: 'https://example.com' background_image: type: string example: 'http://localhost/images/bg.jpg' section7: type: object properties: headline: type: string example: 'Section 7' description: type: string example: Description created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: hero_headline: - 'The hero headline field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: hero_headline: type: array example: - 'The hero headline field is required.' items: type: string tags: - 'Admin Home Page' requestBody: required: false content: multipart/form-data: schema: type: object properties: hero_headline: type: string description: 'optional Hero headline.' example: 'Welcome to Our Platform' nullable: true hero_description: type: string description: 'optional Hero description.' example: 'Connect with industry experts' nullable: true hero_image: type: string format: binary description: 'optional Hero image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section2_headline: type: string description: 'optional Section 2 headline.' example: 'Our Services' nullable: true section3_headline: type: string description: 'optional Section 3 headline.' example: 'Get Started' nullable: true section3_description: type: string description: 'optional Section 3 description.' example: 'Join us today' nullable: true section3_button_name: type: string description: 'optional Section 3 button name.' example: 'Sign Up' nullable: true section3_button_url: type: string description: 'optional Section 3 button URL.' example: 'https://example.com/signup' nullable: true section3_image: type: string format: binary description: 'optional Section 3 image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section4_headline: type: string description: 'optional Section 4 headline.' example: Features nullable: true section4_options: type: array description: 'optional Section 4 options array.' example: - architecto items: type: string nullable: true section4_image: type: string format: binary description: 'optional Section 4 image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section5_steps: type: array description: 'optional Section 5 steps array (must have exactly 5 steps).' example: - architecto items: type: string nullable: true section6_headline: type: string description: 'optional Section 6 headline.' example: 'Ready to Start?' nullable: true section6_button_name: type: string description: 'optional Section 6 button name.' example: 'Get Started' nullable: true section6_button_url: type: string description: 'optional Section 6 button URL.' example: 'https://example.com/start' nullable: true section6_background_image: type: string format: binary description: 'optional Section 6 background image (max 5MB, jpeg/png/jpg/gif/webp).' nullable: true section7_headline: type: string description: 'optional Section 7 headline.' example: 'About Us' nullable: true section7_description: type: string description: 'optional Section 7 description.' example: 'We are a leading platform' nullable: true /api/v1/admin/milestone-payments: get: summary: 'List all milestone payments (paid by companies) with optional filters.' operationId: listAllMilestonePaymentspaidByCompaniesWithOptionalFilters description: '' parameters: - in: query name: project_id description: 'optional Filter by project ID.' example: 1 required: false schema: type: integer description: 'optional Filter by project ID.' example: 1 - in: query name: company_id description: 'optional Filter by company (project owner) user ID.' example: 1 required: false schema: type: integer description: 'optional Filter by company (project owner) user ID.' example: 1 - in: query name: per_page description: 'optional Per page (1-100).' example: 15 required: false schema: type: integer description: 'optional Per page (1-100).' example: 15 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestone payments retrieved successfully' data: data: [] properties: success: type: boolean example: true message: type: string example: 'Milestone payments retrieved successfully' data: type: object properties: 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Milestone Payments' /api/v1/admin/policies/privacy-policy: get: summary: 'Get privacy policy.' operationId: getPrivacyPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Privacy policy retrieved successfully' data: id: 1 type: privacy_policy content: 'Privacy policy content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Privacy policy retrieved successfully' data: type: object properties: id: type: integer example: 1 type: type: string example: privacy_policy content: type: string example: 'Privacy policy content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Policies' put: summary: 'Update privacy policy.' operationId: updatePrivacyPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Privacy policy updated successfully' data: id: 1 type: privacy_policy content: 'Updated privacy policy content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Privacy policy updated successfully' data: type: object properties: id: type: integer example: 1 type: type: string example: privacy_policy content: type: string example: 'Updated privacy policy content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The privacy policy content.' example: 'This is the privacy policy content...' required: - content patch: summary: 'Update privacy policy.' operationId: updatePrivacyPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Privacy policy updated successfully' data: id: 1 type: privacy_policy content: 'Updated privacy policy content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Privacy policy updated successfully' data: type: object properties: id: type: integer example: 1 type: type: string example: privacy_policy content: type: string example: 'Updated privacy policy content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The privacy policy content.' example: 'This is the privacy policy content...' required: - content /api/v1/admin/policies/terms-conditions: get: summary: 'Get terms & conditions.' operationId: getTermsConditions description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Terms & conditions retrieved successfully' data: id: 2 type: terms_conditions content: 'Terms & conditions content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Terms & conditions retrieved successfully' data: type: object properties: id: type: integer example: 2 type: type: string example: terms_conditions content: type: string example: 'Terms & conditions content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Policies' put: summary: 'Update terms & conditions.' operationId: updateTermsConditions description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Terms & conditions updated successfully' data: id: 2 type: terms_conditions content: 'Updated terms & conditions content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Terms & conditions updated successfully' data: type: object properties: id: type: integer example: 2 type: type: string example: terms_conditions content: type: string example: 'Updated terms & conditions content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The terms & conditions content.' example: 'This is the terms & conditions content...' required: - content patch: summary: 'Update terms & conditions.' operationId: updateTermsConditions description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Terms & conditions updated successfully' data: id: 2 type: terms_conditions content: 'Updated terms & conditions content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Terms & conditions updated successfully' data: type: object properties: id: type: integer example: 2 type: type: string example: terms_conditions content: type: string example: 'Updated terms & conditions content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The terms & conditions content.' example: 'This is the terms & conditions content...' required: - content /api/v1/admin/policies/refund-cancellation: get: summary: 'Get refund & cancellation policy.' operationId: getRefundCancellationPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Refund & cancellation policy retrieved successfully' data: id: 3 type: refund_cancellation content: 'Refund & cancellation policy content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Refund & cancellation policy retrieved successfully' data: type: object properties: id: type: integer example: 3 type: type: string example: refund_cancellation content: type: string example: 'Refund & cancellation policy content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Policies' put: summary: 'Update refund & cancellation policy.' operationId: updateRefundCancellationPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Refund & cancellation policy updated successfully' data: id: 3 type: refund_cancellation content: 'Updated refund & cancellation policy content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Refund & cancellation policy updated successfully' data: type: object properties: id: type: integer example: 3 type: type: string example: refund_cancellation content: type: string example: 'Updated refund & cancellation policy content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The refund & cancellation policy content.' example: 'This is the refund & cancellation policy content...' required: - content patch: summary: 'Update refund & cancellation policy.' operationId: updateRefundCancellationPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Refund & cancellation policy updated successfully' data: id: 3 type: refund_cancellation content: 'Updated refund & cancellation policy content...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Refund & cancellation policy updated successfully' data: type: object properties: id: type: integer example: 3 type: type: string example: refund_cancellation content: type: string example: 'Updated refund & cancellation policy content...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: content: - 'The content field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: content: type: array example: - 'The content field is required.' items: type: string tags: - 'Admin Policies' requestBody: required: true content: application/json: schema: type: object properties: content: type: string description: 'The refund & cancellation policy content.' example: 'This is the refund & cancellation policy content...' required: - content /api/v1/admin/projects: get: summary: 'List all projects for admin (optionally filter by company_id).' operationId: listAllProjectsForAdminoptionallyFilterByCompanyId description: '' parameters: - in: query name: company_id description: 'optional Filter by company (user) ID.' example: 1 required: false schema: type: integer description: 'optional Filter by company (user) ID.' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Projects retrieved successfully' data: data: [] meta: { } properties: success: type: boolean example: true message: type: string example: 'Projects retrieved successfully' data: type: object properties: data: type: array example: [] meta: type: object properties: { } 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Projects' '/api/v1/admin/projects/{project_id}': get: summary: 'Get full project details for admin: project, company, all proposals, milestones with payment status.' operationId: getFullProjectDetailsForAdminProjectCompanyAllProposalsMilestonesWithPaymentStatus description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project details retrieved successfully' data: project: { } company: { } proposals: [] milestones: [] properties: success: type: boolean example: true message: type: string example: 'Project details retrieved successfully' data: type: object properties: project: type: object properties: { } company: type: object properties: { } proposals: type: array example: [] milestones: 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found.' properties: success: type: boolean example: false message: type: string example: 'Project not found.' tags: - 'Admin Projects' parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer /api/v1/admin/site-settings: get: summary: 'Get current site settings.' operationId: getCurrentSiteSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Site settings retrieved successfully' data: id: 1 favicon: 'http://localhost/favicon.ico' logo: 'http://localhost/logos/logo.png' footer_logo: 'http://localhost/logos/footer-logo.png' footer_description: 'Company description' address: '123 Main St' email: info@example.com phone: '1234567890' phone_country_code: '+1' facebook_url: 'https://facebook.com/company' instagram_url: 'https://instagram.com/company' linkedin_url: 'https://linkedin.com/company' copyright: '© 2024 Company' header_image: 'http://localhost/images/header.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00: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/favicon.ico' logo: type: string example: 'http://localhost/logos/logo.png' footer_logo: type: string example: 'http://localhost/logos/footer-logo.png' footer_description: type: string example: 'Company description' address: type: string example: '123 Main St' email: type: string example: info@example.com phone: type: string example: '1234567890' phone_country_code: type: string example: '+1' facebook_url: type: string example: 'https://facebook.com/company' instagram_url: type: string example: 'https://instagram.com/company' linkedin_url: type: string example: 'https://linkedin.com/company' copyright: type: string example: '© 2024 Company' header_image: type: string example: 'http://localhost/images/header.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Site Settings' put: summary: 'Update site settings.' operationId: updateSiteSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Site settings updated successfully' data: id: 1 favicon: 'http://localhost/favicon.ico' logo: 'http://localhost/logos/logo.png' footer_logo: 'http://localhost/logos/footer-logo.png' footer_description: 'Company description' address: '123 Main St' email: info@example.com phone: '1234567890' phone_country_code: '+1' facebook_url: 'https://facebook.com/company' instagram_url: 'https://instagram.com/company' linkedin_url: 'https://linkedin.com/company' copyright: '© 2024 Company' header_image: 'http://localhost/images/header.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Site settings updated successfully' data: type: object properties: id: type: integer example: 1 favicon: type: string example: 'http://localhost/favicon.ico' logo: type: string example: 'http://localhost/logos/logo.png' footer_logo: type: string example: 'http://localhost/logos/footer-logo.png' footer_description: type: string example: 'Company description' address: type: string example: '123 Main St' email: type: string example: info@example.com phone: type: string example: '1234567890' phone_country_code: type: string example: '+1' facebook_url: type: string example: 'https://facebook.com/company' instagram_url: type: string example: 'https://instagram.com/company' linkedin_url: type: string example: 'https://linkedin.com/company' copyright: type: string example: '© 2024 Company' header_image: type: string example: 'http://localhost/images/header.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email must be a valid email address.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email must be a valid email address.' items: type: string tags: - 'Admin Site Settings' requestBody: required: false content: multipart/form-data: schema: type: object properties: favicon: type: string format: binary description: 'optional Favicon file (max 2MB, ico/png/jpg/jpeg).' nullable: true logo: type: string format: binary description: 'optional Logo file (max 2MB, jpeg/png/jpg/gif).' nullable: true footer_logo: type: string format: binary description: 'optional Footer logo file (max 2MB, jpeg/png/jpg/gif).' nullable: true footer_description: type: string description: 'optional Footer description.' example: 'Company description' nullable: true address: type: string description: 'optional Address.' example: '123 Main St, City, State' nullable: true email: type: string description: 'optional Email address.' example: info@example.com nullable: true phone: type: string description: 'optional Phone number.' example: '1234567890' nullable: true phone_country_code: type: string description: 'optional Phone country code.' example: '+1' nullable: true facebook_url: type: string description: 'optional Facebook URL.' example: 'https://facebook.com/company' nullable: true instagram_url: type: string description: 'optional Instagram URL.' example: 'https://instagram.com/company' nullable: true linkedin_url: type: string description: 'optional LinkedIn URL.' example: 'https://linkedin.com/company' nullable: true copyright: type: string description: 'optional Copyright text.' example: '© 2024 Company' nullable: true header_image: type: string format: binary description: 'optional Header image file (max 2MB, jpeg/png/jpg/gif).' nullable: true patch: summary: 'Update site settings.' operationId: updateSiteSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Site settings updated successfully' data: id: 1 favicon: 'http://localhost/favicon.ico' logo: 'http://localhost/logos/logo.png' footer_logo: 'http://localhost/logos/footer-logo.png' footer_description: 'Company description' address: '123 Main St' email: info@example.com phone: '1234567890' phone_country_code: '+1' facebook_url: 'https://facebook.com/company' instagram_url: 'https://instagram.com/company' linkedin_url: 'https://linkedin.com/company' copyright: '© 2024 Company' header_image: 'http://localhost/images/header.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Site settings updated successfully' data: type: object properties: id: type: integer example: 1 favicon: type: string example: 'http://localhost/favicon.ico' logo: type: string example: 'http://localhost/logos/logo.png' footer_logo: type: string example: 'http://localhost/logos/footer-logo.png' footer_description: type: string example: 'Company description' address: type: string example: '123 Main St' email: type: string example: info@example.com phone: type: string example: '1234567890' phone_country_code: type: string example: '+1' facebook_url: type: string example: 'https://facebook.com/company' instagram_url: type: string example: 'https://instagram.com/company' linkedin_url: type: string example: 'https://linkedin.com/company' copyright: type: string example: '© 2024 Company' header_image: type: string example: 'http://localhost/images/header.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email must be a valid email address.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email must be a valid email address.' items: type: string tags: - 'Admin Site Settings' requestBody: required: false content: multipart/form-data: schema: type: object properties: favicon: type: string format: binary description: 'optional Favicon file (max 2MB, ico/png/jpg/jpeg).' nullable: true logo: type: string format: binary description: 'optional Logo file (max 2MB, jpeg/png/jpg/gif).' nullable: true footer_logo: type: string format: binary description: 'optional Footer logo file (max 2MB, jpeg/png/jpg/gif).' nullable: true footer_description: type: string description: 'optional Footer description.' example: 'Company description' nullable: true address: type: string description: 'optional Address.' example: '123 Main St, City, State' nullable: true email: type: string description: 'optional Email address.' example: info@example.com nullable: true phone: type: string description: 'optional Phone number.' example: '1234567890' nullable: true phone_country_code: type: string description: 'optional Phone country code.' example: '+1' nullable: true facebook_url: type: string description: 'optional Facebook URL.' example: 'https://facebook.com/company' nullable: true instagram_url: type: string description: 'optional Instagram URL.' example: 'https://instagram.com/company' nullable: true linkedin_url: type: string description: 'optional LinkedIn URL.' example: 'https://linkedin.com/company' nullable: true copyright: type: string description: 'optional Copyright text.' example: '© 2024 Company' nullable: true header_image: type: string format: binary description: 'optional Header image file (max 2MB, jpeg/png/jpg/gif).' nullable: true /api/v1/admin/subscription-config: get: summary: 'Get subscription configuration(s).' operationId: getSubscriptionConfigurations description: '' parameters: - in: query name: role description: 'optional The role to get configuration for (company or expert). If not provided, returns all configurations.' example: architecto required: false schema: type: string description: 'optional The role to get configuration for (company or expert). If not provided, returns all configurations.' example: architecto responses: 200: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: true message: 'Subscription configuration retrieved' data: role: company price: 9999 currency: INR validity_type: lifetime validity_value: null properties: success: type: boolean example: true message: type: string example: 'Subscription configuration retrieved' data: type: object properties: role: type: string example: company price: type: integer example: 9999 currency: type: string example: INR validity_type: type: string example: lifetime validity_value: type: string example: null nullable: true - description: '' type: object example: success: true message: 'Subscription configurations retrieved' data: - role: company price: 9999 currency: INR validity_type: lifetime validity_value: null - role: expert price: 4999 currency: INR validity_type: lifetime validity_value: null properties: success: type: boolean example: true message: type: string example: 'Subscription configurations retrieved' data: type: array example: - role: company price: 9999 currency: INR validity_type: lifetime validity_value: null - role: expert price: 4999 currency: INR validity_type: lifetime validity_value: null items: type: object properties: role: type: string example: company price: type: integer example: 9999 currency: type: string example: INR validity_type: type: string example: lifetime validity_value: type: string example: null nullable: true - description: '' type: object example: success: true message: 'No subscription configuration found' data: null properties: success: type: boolean example: true message: type: string example: 'No subscription configuration found' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin Subscription Configuration' post: summary: 'Create or update subscription configuration.' operationId: createOrUpdateSubscriptionConfiguration description: '' parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: true message: 'Subscription configuration saved' data: role: company price: 9999 currency: INR validity_type: lifetime validity_value: null properties: success: type: boolean example: true message: type: string example: 'Subscription configuration saved' data: type: object properties: role: type: string example: company price: type: integer example: 9999 currency: type: string example: INR validity_type: type: string example: lifetime validity_value: type: string example: null nullable: true - description: '' type: object example: success: true message: 'Subscription configuration saved' data: role: expert price: 5000 currency: INR validity_type: months validity_value: 12 properties: success: type: boolean example: true message: type: string example: 'Subscription configuration saved' data: type: object properties: role: type: string example: expert price: type: integer example: 5000 currency: type: string example: INR validity_type: type: string example: months validity_value: type: integer example: 12 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: price: - 'The price field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: price: type: array example: - 'The price field is required.' items: type: string tags: - 'Admin Subscription Configuration' requestBody: required: true content: application/json: schema: type: object properties: role: type: string description: 'The role for this subscription plan (company or expert).' example: company price: type: number description: 'The subscription price.' example: 9999.0 currency: type: string description: 'The currency code (e.g., INR, USD).' example: INR validity_type: type: string description: 'The validity type: lifetime, days, months, or years.' example: lifetime validity_value: type: integer description: 'nullable The validity value (required if validity_type is not lifetime).' example: null nullable: true required: - role - price - currency - validity_type /api/v1/admin/companies: get: summary: 'Get list of all registered companies with subscription status and profile data.' operationId: getListOfAllRegisteredCompaniesWithSubscriptionStatusAndProfileData description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Companies retrieved successfully' data: - id: 1 name: 'Company Name' company_name: 'Company Name' email: company@example.com email_verified_at: '2024-01-01T00:00:00+00:00' has_subscription: true subscription: id: 1 status: active lifetime: true starts_at: '2024-01-01T00:00:00+00:00' ends_at: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' profile: id: 1 user_id: 1 company_name: 'Company Name' email: company@example.com address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' phone: '1234567890' company_logo: 'http://localhost/logos/image.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Companies retrieved successfully' data: type: array example: - id: 1 name: 'Company Name' company_name: 'Company Name' email: company@example.com email_verified_at: '2024-01-01T00:00:00+00:00' has_subscription: true subscription: id: 1 status: active lifetime: true starts_at: '2024-01-01T00:00:00+00:00' ends_at: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' profile: id: 1 user_id: 1 company_name: 'Company Name' email: company@example.com address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' phone: '1234567890' company_logo: 'http://localhost/logos/image.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Company Name' company_name: type: string example: 'Company Name' email: type: string example: company@example.com email_verified_at: type: string example: '2024-01-01T00:00:00+00:00' has_subscription: type: boolean example: true subscription: type: object properties: id: type: integer example: 1 status: type: string example: active lifetime: type: boolean example: true starts_at: type: string example: '2024-01-01T00:00:00+00:00' ends_at: type: string example: null nullable: true created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' profile: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 company_name: type: string example: 'Company Name' email: type: string example: company@example.com address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' phone: type: string example: '1234567890' company_logo: type: string example: 'http://localhost/logos/image.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin User Management' /api/v1/admin/experts: get: summary: 'Get list of all registered experts with subscription status, payment details, and profile data.' operationId: getListOfAllRegisteredExpertsWithSubscriptionStatusPaymentDetailsAndProfileData description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Experts retrieved successfully' data: - id: 2 name: 'John Doe' first_name: John last_name: Doe email: expert@example.com email_verified_at: '2024-01-01T00:00:00+00:00' has_subscription: false subscription: null payment_details: id: 1 user_id: 2 payment_method: paypal paypal_email: expert@example.com country: null state: null city: null zip_postal_code: null address: null bank_name: null swift_code_or_ifsc: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' profile: id: 1 user_id: 2 first_name: John last_name: Doe email: expert@example.com designation_id: 1 experience: 5 bio: 'Expert in software development' phone: '1234567890' address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' profile_image: 'http://localhost/profiles/image.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Experts retrieved successfully' data: type: array example: - id: 2 name: 'John Doe' first_name: John last_name: Doe email: expert@example.com email_verified_at: '2024-01-01T00:00:00+00:00' has_subscription: false subscription: null payment_details: id: 1 user_id: 2 payment_method: paypal paypal_email: expert@example.com country: null state: null city: null zip_postal_code: null address: null bank_name: null swift_code_or_ifsc: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' profile: id: 1 user_id: 2 first_name: John last_name: Doe email: expert@example.com designation_id: 1 experience: 5 bio: 'Expert in software development' phone: '1234567890' address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' profile_image: 'http://localhost/profiles/image.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 2 name: type: string example: 'John Doe' first_name: type: string example: John last_name: type: string example: Doe email: type: string example: expert@example.com email_verified_at: type: string example: '2024-01-01T00:00:00+00:00' has_subscription: type: boolean example: false subscription: type: string example: null nullable: true payment_details: type: object properties: id: type: integer example: 1 user_id: type: integer example: 2 payment_method: type: string example: paypal paypal_email: type: string example: expert@example.com country: type: string example: null nullable: true state: type: string example: null nullable: true city: type: string example: null nullable: true zip_postal_code: type: string example: null nullable: true address: type: string example: null nullable: true bank_name: type: string example: null nullable: true swift_code_or_ifsc: type: string example: null nullable: true created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' profile: type: object properties: id: type: integer example: 1 user_id: type: integer example: 2 first_name: type: string example: John last_name: type: string example: Doe email: type: string example: expert@example.com designation_id: type: integer example: 1 experience: type: integer example: 5 bio: type: string example: 'Expert in software development' phone: type: string example: '1234567890' address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' profile_image: type: string example: 'http://localhost/profiles/image.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Admin User Management' /api/v1/auth/register: post: summary: 'Register a new user (expert or company).' operationId: registerANewUserexpertOrCompany description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Registration successful. Please verify your email.' data: [] properties: success: type: boolean example: true message: type: string example: 'Registration successful. Please verify your email.' data: type: array example: [] 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email has already been taken.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email has already been taken.' items: type: string tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: user_type: type: string description: 'The type of user. Must be either "expert" or "company".' example: expert email: type: string description: "The user's email address. Must be unique." example: john.doe@example.com password: type: string description: "The user's password. Must be at least 8 characters." example: password123 confirm_password: type: string description: 'Password confirmation. Must match password.' example: password123 agree_terms: type: boolean description: 'Whether the user agrees to the terms. Must be true.' example: true first_name: type: string description: 'required_if:user_type,expert First name (required for experts).' example: John last_name: type: string description: 'required_if:user_type,expert Last name (required for experts).' example: Doe company_name: type: string description: 'required_if:user_type,company Company name (required for companies).' example: 'Acme Corp' required: - user_type - email - password - confirm_password - agree_terms security: [] /api/v1/auth/login: post: summary: 'Login user (expert or company).' operationId: loginUserexpertOrCompany description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Login successful' data: token: 1|abcdefghijklmnopqrstuvwxyz1234567890 user: id: 1 name: 'John Doe' first_name: John last_name: Doe email: john.doe@example.com email_verified_at: '2024-01-01T00:00:00+00:00' roles: - expert created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' role: expert subscription: id: 1 status: active lifetime: true starts_at: '2024-01-01T00:00:00+00:00' ends_at: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Login successful' data: type: object properties: token: type: string example: 1|abcdefghijklmnopqrstuvwxyz1234567890 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: '2024-01-01T00:00:00+00:00' roles: type: array example: - expert items: type: string created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' role: type: string example: expert subscription: type: object properties: id: type: integer example: 1 status: type: string example: active lifetime: type: boolean example: true starts_at: type: string example: '2024-01-01T00:00:00+00:00' ends_at: type: string example: null nullable: true created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' 401: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid credentials' properties: success: type: boolean example: false message: type: string example: 'Invalid credentials' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Admin users cannot login through this endpoint. Please use the admin login.' properties: success: type: boolean example: false message: type: string example: 'Admin users cannot login through this endpoint. Please use the admin login.' 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: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The user's email address." example: john.doe@example.com password: type: string description: "The user's password." example: password123 user_type: type: string description: 'optional The type of user. Must be either "expert" or "company". If not provided, will be auto-detected from user''s role.' example: expert nullable: true required: - email - password security: [] /api/v1/auth/forgot-password: post: summary: 'Send password reset link.' operationId: sendPasswordResetLink description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password reset link sent to your email.' data: [] properties: success: type: boolean example: true message: type: string example: 'Password reset link sent to your email.' data: type: array example: [] 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: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The user's email address." example: john.doe@example.com required: - email security: [] /api/v1/auth/reset-password: post: summary: 'Reset password.' operationId: resetPassword description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password reset successful.' data: [] properties: success: type: boolean example: true message: type: string example: 'Password reset successful.' data: type: array example: [] 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: token: - 'The token field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: token: type: array example: - 'The token field is required.' items: type: string tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: 'The password reset token received via email.' example: abc123def456ghi789 email: type: string description: "The user'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/verify-email/{id}/{hash}': get: summary: 'Verify email.' operationId: verifyEmail description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'User email verified successfully.' data: [] properties: success: type: boolean example: true message: type: string example: 'User email verified successfully.' data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid verification link' properties: success: type: boolean example: false message: type: string example: 'Invalid verification link' tags: - Authentication security: [] parameters: - in: path name: id description: 'The user ID.' example: 1 required: true schema: type: integer - in: path name: hash description: 'The email verification hash.' example: abc123def456ghi789 required: true schema: type: string /api/v1/auth/logout: post: summary: 'Logout user.' operationId: logoutUser description: '' 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: - Authentication /api/v1/auth/change-password: post: summary: 'Change password for authenticated user.' operationId: changePasswordForAuthenticatedUser description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Password changed successfully.' data: [] properties: success: type: boolean example: true message: type: string example: 'Password changed 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only expert and company users can change their password.' properties: success: type: boolean example: false message: type: string example: 'Only expert and company users can change their password.' 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: - Authentication requestBody: required: true content: application/json: schema: type: object properties: current_password: type: string description: "The user'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/resend-verification: get: summary: 'Resend email verification notification.' operationId: resendEmailVerificationNotification description: '' parameters: - in: query name: email description: "The user's email address." example: john.doe@example.com required: true schema: type: string description: "The user's email address." example: john.doe@example.com responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Verification email sent successfully.' data: [] properties: success: type: boolean example: true message: type: string example: 'Verification email sent successfully.' data: type: array example: [] 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: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address. The email of an existing record in the users table.' example: gbailey@example.net required: - email security: [] /api/v1/admin/auth/login: post: summary: 'Login admin user.' operationId: loginAdminUser description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Login successful' data: token: 1|abcdefghijklmnopqrstuvwxyz1234567890 user: id: 1 name: 'Admin User' first_name: Admin last_name: User email: admin@example.com email_verified_at: '2024-01-01T00:00:00+00:00' roles: - admin created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' role: admin properties: success: type: boolean example: true message: type: string example: 'Login successful' data: type: object properties: token: type: string example: 1|abcdefghijklmnopqrstuvwxyz1234567890 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@example.com email_verified_at: type: string example: '2024-01-01T00:00:00+00:00' roles: type: array example: - admin items: type: string created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' role: type: string example: admin 401: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid credentials' properties: success: type: boolean example: false message: type: string example: 'Invalid credentials' 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: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: "The admin's email address." example: admin@example.com password: type: string description: "The admin's password." example: adminpassword123 required: - email - password security: [] /api/v1/admin/auth/logout: post: summary: 'Logout admin user.' operationId: logoutAdminUser description: '' 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - Authentication /api/v1/company/profile: get: summary: "Get the current company's profile." operationId: getTheCurrentCompanysProfile description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile retrieved successfully' data: id: 1 user_id: 1 company_name: 'Acme Corp' email: company@example.com address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' phone: '1234567890' company_logo: 'http://localhost/storage/logos/image.jpg' created_at: '2026-01-15T10:00:00+00:00' updated_at: '2026-01-15T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Profile retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 company_name: type: string example: 'Acme Corp' email: type: string example: company@example.com address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' phone: type: string example: '1234567890' company_logo: type: string example: 'http://localhost/storage/logos/image.jpg' created_at: type: string example: '2026-01-15T10:00:00+00:00' updated_at: type: string example: '2026-01-15T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only companies can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only companies can access this endpoint.' tags: - 'Company Profile' put: summary: "Update or create the company's profile." operationId: updateOrCreateTheCompanysProfile description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile updated successfully' data: id: 1 user_id: 1 company_name: 'Acme Corp' email: company@example.com address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' phone: '1234567890' company_logo: 'http://localhost/storage/logos/image.jpg' created_at: '2026-01-15T10:00:00+00:00' updated_at: '2026-01-15T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Profile updated successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 company_name: type: string example: 'Acme Corp' email: type: string example: company@example.com address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' phone: type: string example: '1234567890' company_logo: type: string example: 'http://localhost/storage/logos/image.jpg' created_at: type: string example: '2026-01-15T10:00:00+00:00' updated_at: type: string example: '2026-01-15T10:00:00+00:00' 201: description: '' content: application/json: schema: type: object example: success: true message: 'Profile created successfully' data: id: 1 user_id: 1 company_name: 'Acme Corp' email: company@example.com address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' phone: '1234567890' company_logo: null created_at: '2026-01-15T10:00:00+00:00' updated_at: '2026-01-15T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Profile created successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 company_name: type: string example: 'Acme Corp' email: type: string example: company@example.com address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' phone: type: string example: '1234567890' company_logo: type: string example: null nullable: true created_at: type: string example: '2026-01-15T10:00:00+00:00' updated_at: type: string example: '2026-01-15T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only companies can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only companies can access this endpoint.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email has already been taken.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email has already been taken.' items: type: string tags: - 'Company Profile' requestBody: required: false content: multipart/form-data: schema: type: object properties: company_name: type: string description: 'optional Company name.' example: 'Acme Corporation' nullable: true email: type: string description: 'optional Email address.' example: company@example.com nullable: true address_line_1: type: string description: 'optional Address line 1.' example: '123 Main Street' 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.' 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 zip_postal_code: type: string description: 'optional ZIP/Postal code.' example: '12345' nullable: true phone: type: string description: 'optional Phone number.' example: '1234567890' nullable: true phone_country_code_id: type: integer description: 'optional Phone country code ID.' example: 1 nullable: true company_logo: type: string format: binary description: 'optional Company logo file (max 2MB, jpeg/png/jpg/gif).' nullable: true /api/v1/contact: post: summary: 'Store a new contact form submission.' operationId: storeANewContactFormSubmission description: '' parameters: [] responses: 200: 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' message: 'Hello, I would like to know more about your services.' created_at: '2024-01-11T16:00:00+00:00' updated_at: '2024-01-11T16:00:00+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' message: type: string example: 'Hello, I would like to know more about your services.' created_at: type: string example: '2024-01-11T16:00:00+00:00' updated_at: type: string example: '2024-01-11T16:00:00+00:00' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' email: - 'Email is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string email: type: array example: - 'Email is required.' items: type: string tags: - Contact requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The name of the contact.' example: 'John Doe' email: type: string description: 'The email address of the contact.' example: john@example.com phone: type: string description: 'optional The phone number of the contact.' example: '+1234567890' nullable: true message: type: string description: 'The message from the contact.' example: 'Hello, I would like to know more about your services.' required: - name - email - message security: [] /api/v1/admin/contacts: get: summary: 'Get list of all contact form submissions (Admin only).' operationId: getListOfAllContactFormSubmissionsAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Contacts retrieved successfully' data: - id: 1 name: 'John Doe' email: john@example.com phone: '+1234567890' message: 'Hello, I would like to know more about your services.' created_at: '2024-01-11T16:00:00+00:00' updated_at: '2024-01-11T16:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Contacts retrieved successfully' data: type: array example: - id: 1 name: 'John Doe' email: john@example.com phone: '+1234567890' message: 'Hello, I would like to know more about your services.' created_at: '2024-01-11T16:00:00+00:00' updated_at: '2024-01-11T16:00:00+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' message: type: string example: 'Hello, I would like to know more about your services.' created_at: type: string example: '2024-01-11T16:00:00+00:00' updated_at: type: string example: '2024-01-11T16:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - Contact '/api/v1/admin/contacts/{id}': delete: summary: 'Delete a contact form submission (Admin only).' operationId: deleteAContactFormSubmissionAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Contact deleted successfully' data: null properties: success: type: boolean example: true message: type: string example: 'Contact deleted successfully' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Contact not found.' properties: success: type: boolean example: false message: type: string example: 'Contact not found.' tags: - Contact parameters: - in: path name: id description: 'The ID of the contact to delete.' example: 1 required: true schema: type: integer /api/v1/designations: get: summary: 'Get list of all designations (Public endpoint for frontend users).' operationId: getListOfAllDesignationsPublicEndpointForFrontendUsers description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Designations retrieved successfully' data: - id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' properties: success: type: boolean example: true message: type: string example: 'Designations retrieved successfully' data: type: array example: - id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Software Engineer' description: type: string example: 'Develops software applications' is_active: type: boolean example: true created_at: type: string example: '2024-01-14 11:32:19' updated_at: type: string example: '2024-01-14 11:32:19' tags: - Designation security: [] /api/v1/admin/designations: get: summary: 'Get list of all designations (Admin only).' operationId: getListOfAllDesignationsAdminOnly description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Designations retrieved successfully' data: - id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' properties: success: type: boolean example: true message: type: string example: 'Designations retrieved successfully' data: type: array example: - id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Software Engineer' description: type: string example: 'Develops software applications' is_active: type: boolean example: true created_at: type: string example: '2024-01-14 11:32:19' updated_at: type: string example: '2024-01-14 11:32:19' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - Designation post: summary: 'Store a new designation (Admin only).' operationId: storeANewDesignationAdminOnly description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Designation created successfully' data: id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' properties: success: type: boolean example: true message: type: string example: 'Designation created successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Software Engineer' description: type: string example: 'Develops software applications' is_active: type: boolean example: true created_at: type: string example: '2024-01-14 11:32:19' updated_at: type: string example: '2024-01-14 11:32:19' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - Designation requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The name of the designation.' example: 'Software Engineer' description: type: string description: 'optional The description of the designation.' example: 'Develops software applications' nullable: true is_active: type: boolean description: 'optional Whether the designation is active. Defaults to true.' example: true nullable: true required: - name '/api/v1/admin/designations/{id}': get: summary: 'Get a specific designation (Admin only).' operationId: getASpecificDesignationAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Designation retrieved successfully' data: id: 1 name: 'Software Engineer' description: 'Develops software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:32:19' properties: success: type: boolean example: true message: type: string example: 'Designation retrieved successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Software Engineer' description: type: string example: 'Develops software applications' is_active: type: boolean example: true created_at: type: string example: '2024-01-14 11:32:19' updated_at: type: string example: '2024-01-14 11:32:19' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Designation not found.' properties: success: type: boolean example: false message: type: string example: 'Designation not found.' tags: - Designation put: summary: 'Update a designation (Admin only).' operationId: updateADesignationAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Designation updated successfully' data: id: 1 name: 'Senior Software Engineer' description: 'Develops and maintains software applications' is_active: true created_at: '2024-01-14 11:32:19' updated_at: '2024-01-14 11:33:00' properties: success: type: boolean example: true message: type: string example: 'Designation updated successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Senior Software Engineer' description: type: string example: 'Develops and maintains software applications' is_active: type: boolean example: true created_at: type: string example: '2024-01-14 11:32:19' updated_at: type: string example: '2024-01-14 11:33: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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Designation not found.' properties: success: type: boolean example: false message: type: string example: 'Designation not found.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - Designation requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'The name of the designation.' example: 'Senior Software Engineer' description: type: string description: 'optional The description of the designation.' example: 'Develops and maintains software applications' nullable: true is_active: type: boolean description: 'optional Whether the designation is active.' example: true nullable: true required: - name delete: summary: 'Delete a designation (Admin only).' operationId: deleteADesignationAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Designation deleted successfully' data: null properties: success: type: boolean example: true message: type: string example: 'Designation deleted successfully' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Designation not found.' properties: success: type: boolean example: false message: type: string example: 'Designation not found.' tags: - Designation parameters: - in: path name: id description: 'The ID of the designation.' example: 1 required: true schema: type: integer /api/v1/dispute-categories: get: summary: 'List dispute categories (public - for dropdown when raising dispute).' operationId: listDisputeCategoriespublicForDropdownWhenRaisingDispute description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Dispute categories retrieved successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Dispute categories retrieved successfully' data: type: array example: [] tags: - 'Dispute Categories' security: [] /api/v1/disputes/form-data: get: summary: 'Get form data for raising a dispute: dispute categories and eligible projects.' operationId: getFormDataForRaisingADisputeDisputeCategoriesAndEligibleProjects 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: - Disputes /api/v1/disputes: get: summary: 'List disputes for the logged-in company or expert.' operationId: listDisputesForTheLoggedInCompanyOrExpert 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: - Disputes post: summary: 'Store a new dispute.' operationId: storeANewDispute description: '' parameters: [] responses: { } tags: - Disputes requestBody: required: true content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Must not be greater than 255 characters.' example: b dispute_category_id: type: integer description: 'The id of an existing record in the dispute_categories table.' example: 16 project_id: type: integer description: 'The id of an existing record in the projects table.' example: 16 description: type: string description: '' example: 'Eius et animi quos velit et.' files: type: array description: 'Must be a file. Must not be greater than 10240 kilobytes.' items: type: string format: binary required: - subject - dispute_category_id - project_id - description '/api/v1/disputes/{dispute_id}': get: summary: 'Show a single dispute.' operationId: showASingleDispute 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: - Disputes put: summary: 'Update a dispute (only ongoing disputes).' operationId: updateADisputeonlyOngoingDisputes description: '' parameters: [] responses: { } tags: - Disputes requestBody: required: false content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Must not be greater than 255 characters.' example: b dispute_category_id: type: integer description: 'The id of an existing record in the dispute_categories table.' example: 16 project_id: type: integer description: 'The id of an existing record in the projects table.' example: 16 description: type: string description: '' example: 'Eius et animi quos velit et.' files: type: array description: 'Must be a file. Must not be greater than 10240 kilobytes.' items: type: string format: binary patch: summary: 'Update a dispute (only ongoing disputes).' operationId: updateADisputeonlyOngoingDisputes description: '' parameters: [] responses: { } tags: - Disputes requestBody: required: false content: multipart/form-data: schema: type: object properties: subject: type: string description: 'Must not be greater than 255 characters.' example: b dispute_category_id: type: integer description: 'The id of an existing record in the dispute_categories table.' example: 16 project_id: type: integer description: 'The id of an existing record in the projects table.' example: 16 description: type: string description: '' example: 'Eius et animi quos velit et.' files: type: array description: 'Must be a file. Must not be greater than 10240 kilobytes.' items: type: string format: binary delete: summary: 'Delete a dispute (only ongoing disputes).' operationId: deleteADisputeonlyOngoingDisputes description: '' parameters: [] responses: { } tags: - Disputes parameters: - in: path name: dispute_id description: 'The ID of the dispute.' example: 16 required: true schema: type: integer /api/v1/expert/payment-details: get: summary: "Get the current expert's payment details." operationId: getTheCurrentExpertsPaymentDetails description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Payment details retrieved successfully' data: id: 1 user_id: 1 payment_method: paypal paypal_email: expert@example.com country_id: null state_id: null city_id: null zip_postal_code: null address: null bank_name: null swift_code_or_ifsc: null country: null state: null city: null created_at: '2026-01-14T12:00:00+00:00' updated_at: '2026-01-14T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Payment details retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 payment_method: type: string example: paypal paypal_email: type: string example: expert@example.com country_id: type: string example: null nullable: true state_id: type: string example: null nullable: true city_id: type: string example: null nullable: true zip_postal_code: type: string example: null nullable: true address: type: string example: null nullable: true bank_name: type: string example: null nullable: true swift_code_or_ifsc: type: string example: null nullable: true country: type: string example: null nullable: true state: type: string example: null nullable: true city: type: string example: null nullable: true created_at: type: string example: '2026-01-14T12:00:00+00:00' updated_at: type: string example: '2026-01-14T12:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only experts can access this endpoint.' tags: - 'Expert Payment Details' put: summary: "Update or create the expert's payment details." operationId: updateOrCreateTheExpertsPaymentDetails description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Payment details updated successfully' data: id: 1 user_id: 1 payment_method: paypal paypal_email: expert@example.com country: null state: null city: null zip_postal_code: null address: null bank_name: null swift_code_or_ifsc: null created_at: '2026-01-14T12:00:00+00:00' updated_at: '2026-01-14T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Payment details updated successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 payment_method: type: string example: paypal paypal_email: type: string example: expert@example.com country: type: string example: null nullable: true state: type: string example: null nullable: true city: type: string example: null nullable: true zip_postal_code: type: string example: null nullable: true address: type: string example: null nullable: true bank_name: type: string example: null nullable: true swift_code_or_ifsc: type: string example: null nullable: true created_at: type: string example: '2026-01-14T12:00:00+00:00' updated_at: type: string example: '2026-01-14T12:00:00+00:00' 201: description: '' content: application/json: schema: type: object example: success: true message: 'Payment details created successfully' data: id: 1 user_id: 1 payment_method: bank_transfer paypal_email: null country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '90001' address: '123 Main Street' bank_name: 'Bank of America' swift_code_or_ifsc: BOFAUS3N country: id: 1 name: 'United States' state: id: 1 name: California city: id: 1 name: 'Los Angeles' created_at: '2026-01-14T12:00:00+00:00' updated_at: '2026-01-14T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Payment details created successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 payment_method: type: string example: bank_transfer paypal_email: type: string example: null nullable: true country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '90001' address: type: string example: '123 Main Street' bank_name: type: string example: 'Bank of America' swift_code_or_ifsc: type: string example: BOFAUS3N 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: California city: type: object properties: id: type: integer example: 1 name: type: string example: 'Los Angeles' created_at: type: string example: '2026-01-14T12:00:00+00:00' updated_at: type: string example: '2026-01-14T12:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only experts can access this endpoint.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: payment_method: - 'The payment method field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: payment_method: type: array example: - 'The payment method field is required.' items: type: string tags: - 'Expert Payment Details' requestBody: required: true content: application/json: schema: type: object properties: payment_method: type: string description: 'The payment method. Must be either "bank_transfer" or "paypal".' example: paypal paypal_email: type: string description: 'required_if:payment_method,paypal The PayPal email address.' example: expert@example.com nullable: true country_id: type: integer description: 'required_if:payment_method,bank_transfer The country ID.' example: 1 nullable: true state_id: type: integer description: 'required_if:payment_method,bank_transfer The state ID.' example: 1 nullable: true city_id: type: integer description: 'required_if:payment_method,bank_transfer The city ID.' example: 1 nullable: true zip_postal_code: type: string description: 'required_if:payment_method,bank_transfer The ZIP/Postal code.' example: '90001' nullable: true address: type: string description: 'required_if:payment_method,bank_transfer The address.' example: '123 Main Street' nullable: true bank_name: type: string description: 'required_if:payment_method,bank_transfer The bank name.' example: 'Bank of America' nullable: true swift_code_or_ifsc: type: string description: 'required_if:payment_method,bank_transfer The SWIFT code or IFSC code.' example: BOFAUS3N nullable: true required: - payment_method /api/v1/expert/profile: get: summary: "Get the current expert's profile." operationId: getTheCurrentExpertsProfile description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile retrieved successfully' data: id: 1 user_id: 1 first_name: John last_name: Doe email: expert@example.com designation_id: 1 experience: 5 bio: 'Expert in software development' phone: '1234567890' address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' profile_image: 'http://localhost/storage/profiles/image.jpg' created_at: '2026-01-15T05:14:18+00:00' updated_at: '2026-01-15T05:14:18+00:00' properties: success: type: boolean example: true message: type: string example: '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: expert@example.com designation_id: type: integer example: 1 experience: type: integer example: 5 bio: type: string example: 'Expert in software development' phone: type: string example: '1234567890' address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' profile_image: type: string example: 'http://localhost/storage/profiles/image.jpg' created_at: type: string example: '2026-01-15T05:14:18+00:00' updated_at: type: string example: '2026-01-15T05:14:18+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only experts can access this endpoint.' tags: - 'Expert Profile' put: summary: "Update or create the expert's profile." operationId: updateOrCreateTheExpertsProfile description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Profile updated successfully' data: id: 1 user_id: 1 first_name: John last_name: Doe email: expert@example.com designation_id: 1 experience: 5 bio: 'Expert in software development' phone: '1234567890' address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' profile_image: 'http://localhost/storage/profiles/image.jpg' created_at: '2026-01-15T05:14:18+00:00' updated_at: '2026-01-15T05:14:18+00:00' properties: success: type: boolean example: true message: type: string example: 'Profile updated 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: expert@example.com designation_id: type: integer example: 1 experience: type: integer example: 5 bio: type: string example: 'Expert in software development' phone: type: string example: '1234567890' address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' profile_image: type: string example: 'http://localhost/storage/profiles/image.jpg' created_at: type: string example: '2026-01-15T05:14:18+00:00' updated_at: type: string example: '2026-01-15T05:14:18+00:00' 201: description: '' content: application/json: schema: type: object example: success: true message: 'Profile created successfully' data: id: 1 user_id: 1 first_name: John last_name: Doe email: expert@example.com designation_id: 1 experience: 5 bio: 'Expert in software development' phone: '1234567890' address_line_1: '123 Main St' country_id: 1 state_id: 1 city_id: 1 zip_postal_code: '12345' profile_image: null created_at: '2026-01-15T05:14:18+00:00' updated_at: '2026-01-15T05:14:18+00:00' properties: success: type: boolean example: true message: type: string example: 'Profile created 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: expert@example.com designation_id: type: integer example: 1 experience: type: integer example: 5 bio: type: string example: 'Expert in software development' phone: type: string example: '1234567890' address_line_1: type: string example: '123 Main St' country_id: type: integer example: 1 state_id: type: integer example: 1 city_id: type: integer example: 1 zip_postal_code: type: string example: '12345' profile_image: type: string example: null nullable: true created_at: type: string example: '2026-01-15T05:14:18+00:00' updated_at: type: string example: '2026-01-15T05:14:18+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can access this endpoint.' properties: success: type: boolean example: false message: type: string example: 'Only experts can access this endpoint.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: email: - 'The email has already been taken.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: email: type: array example: - 'The email has already been taken.' items: type: string tags: - 'Expert Profile' requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: 'optional First name.' example: John nullable: true last_name: type: string description: 'optional Last name.' example: Doe nullable: true email: type: string description: 'optional Email address.' example: expert@example.com nullable: true designation_id: type: integer description: 'optional Designation ID.' example: 1 nullable: true experience: type: integer description: 'optional Experience in years.' example: 5 nullable: true bio: type: string description: 'optional Bio/Description.' example: 'Expert in software development' nullable: true phone: type: string description: 'optional Phone number.' example: '1234567890' nullable: true phone_country_code_id: type: integer description: 'optional Phone country code ID.' example: 1 nullable: true address_line_1: type: string description: 'optional Address line 1.' example: '123 Main Street' nullable: true address_line_2: type: string description: 'optional Address line 2.' 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 zip_postal_code: type: string description: 'optional ZIP/Postal code.' example: '12345' nullable: true profile_image: type: string format: binary description: 'optional Profile image file (max 2MB, jpeg/png/jpg/gif).' nullable: true /api/v1/industry-types: get: summary: 'Get list of all industry types (Public endpoint for frontend users).' operationId: getListOfAllIndustryTypesPublicEndpointForFrontendUsers description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Industry types retrieved successfully' data: - id: 1 name: Technology description: 'Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Industry types retrieved successfully' data: type: array example: - id: 1 name: Technology description: 'Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' items: type: object properties: id: type: integer example: 1 name: type: string example: Technology description: type: string example: 'Technology industry' image: type: string example: 'http://localhost/industry-types/tech.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' tags: - 'Industry Type' security: [] /api/v1/admin/industry-types: get: summary: 'Get list of all industry types (Admin only).' operationId: getListOfAllIndustryTypesAdminOnly description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Industry types retrieved successfully' data: - id: 1 name: Technology description: 'Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Industry types retrieved successfully' data: type: array example: - id: 1 name: Technology description: 'Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' items: type: object properties: id: type: integer example: 1 name: type: string example: Technology description: type: string example: 'Technology industry' image: type: string example: 'http://localhost/industry-types/tech.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Industry Type' post: summary: 'Store a new industry type (Admin only).' operationId: storeANewIndustryTypeAdminOnly description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Industry type created successfully' data: id: 1 name: Technology description: 'Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Industry type created successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: Technology description: type: string example: 'Technology industry' image: type: string example: 'http://localhost/industry-types/tech.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - 'Industry Type' requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'The name of the industry type.' example: Technology description: type: string description: 'optional The description of the industry type.' example: 'Technology industry' nullable: true image: type: string format: binary description: 'optional Industry type image (max 2MB, jpeg/png/jpg/gif).' nullable: true is_active: type: boolean description: 'optional Whether the industry type is active. Defaults to true.' example: true nullable: true required: - name '/api/v1/admin/industry-types/{id}': put: summary: 'Update an industry type (Admin only).' operationId: updateAnIndustryTypeAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Industry type updated successfully' data: id: 1 name: 'Information Technology' description: 'Information Technology industry' image: 'http://localhost/industry-types/tech.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:27:00' properties: success: type: boolean example: true message: type: string example: 'Industry type updated successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Information Technology' description: type: string example: 'Information Technology industry' image: type: string example: 'http://localhost/industry-types/tech.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:27: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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Industry type not found.' properties: success: type: boolean example: false message: type: string example: 'Industry type not found.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - 'Industry Type' requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'The name of the industry type.' example: 'Information Technology' description: type: string description: 'optional The description of the industry type.' example: 'Information Technology industry' nullable: true image: type: string format: binary description: 'optional Industry type image (max 2MB, jpeg/png/jpg/gif).' nullable: true is_active: type: boolean description: 'optional Whether the industry type is active.' example: true nullable: true required: - name delete: summary: 'Delete an industry type (Admin only).' operationId: deleteAnIndustryTypeAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Industry type deleted successfully' data: null properties: success: type: boolean example: true message: type: string example: 'Industry type deleted successfully' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Industry type not found.' properties: success: type: boolean example: false message: type: string example: 'Industry type not found.' tags: - 'Industry Type' parameters: - in: path name: id description: 'The ID of the industry type.' example: 1 required: true schema: type: integer /api/v1/location/countries: get: summary: 'Get list of all active countries.' operationId: getListOfAllActiveCountries description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Countries retrieved successfully' data: - id: 1 name: 'United States' code: US code3: USA is_active: true sort_order: 0 properties: success: type: boolean example: true message: type: string example: 'Countries retrieved successfully' data: type: array example: - id: 1 name: 'United States' code: US code3: USA is_active: true sort_order: 0 items: type: object properties: id: type: integer example: 1 name: type: string example: 'United States' code: type: string example: US code3: type: string example: USA is_active: type: boolean example: true sort_order: type: integer example: 0 tags: - Location security: [] '/api/v1/location/countries/{countryId}/states': get: summary: 'Get list of all active states for a specific country.' operationId: getListOfAllActiveStatesForASpecificCountry description: '' 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 code: CA is_active: true sort_order: 0 properties: success: type: boolean example: true message: type: string example: 'States retrieved successfully' data: type: array example: - id: 1 country_id: 1 name: California code: CA is_active: true sort_order: 0 items: type: object properties: id: type: integer example: 1 country_id: type: integer example: 1 name: type: string example: California code: type: string example: CA is_active: type: boolean example: true sort_order: type: integer example: 0 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: '' example: architecto required: true schema: type: string - in: path name: country_id 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 active cities for a specific state.' operationId: getListOfAllActiveCitiesForASpecificState description: '' 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' is_active: true sort_order: 0 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' is_active: true sort_order: 0 items: type: object properties: id: type: integer example: 1 state_id: type: integer example: 1 name: type: string example: 'Los Angeles' is_active: type: boolean example: true sort_order: type: integer example: 0 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: '' example: architecto required: true schema: type: string - in: path name: state_id 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: '' 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/project/{project_id}/expert-milestones': get: summary: 'List milestone payments for an awarded project (expert only – the awarded expert).' operationId: listMilestonePaymentsForAnAwardedProjectexpertOnlyTheAwardedExpert description: 'Shows expert_payout (milestone amount minus platform fee). Payment status is set by admin when paying manually.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestones retrieved successfully' data: milestones: [] properties: success: type: boolean example: true message: type: string example: 'Milestones retrieved successfully' data: type: object properties: milestones: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only view milestones for projects you are awarded on.' properties: success: type: boolean example: false message: type: string example: 'You can only view milestones for projects you are awarded on.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Project must be awarded before viewing milestones.' properties: success: type: boolean example: false message: type: string example: 'Project must be awarded before viewing milestones.' tags: - 'Milestone Payments' parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/milestones': get: summary: 'List milestone payments for an awarded project (company only).' operationId: listMilestonePaymentsForAnAwardedProjectcompanyOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestones retrieved successfully' data: milestones: [] project_total_cost: 1000 allocated_amount: 0 remaining_amount: 1000 properties: success: type: boolean example: true message: type: string example: 'Milestones retrieved successfully' data: type: object properties: milestones: type: array example: [] project_total_cost: type: integer example: 1000 allocated_amount: type: integer example: 0 remaining_amount: type: integer example: 1000 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only manage milestones for your own awarded projects.' properties: success: type: boolean example: false message: type: string example: 'You can only manage milestones for your own awarded projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Project must be awarded to an expert before adding milestones.' properties: success: type: boolean example: false message: type: string example: 'Project must be awarded to an expert before adding milestones.' tags: - 'Milestone Payments' post: summary: 'Add a milestone payment. Sum of all milestone amounts must not exceed project total cost.' operationId: addAMilestonePaymentSumOfAllMilestoneAmountsMustNotExceedProjectTotalCost description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Milestone added successfully' data: milestone: { } remaining_amount: 500 properties: success: type: boolean example: true message: type: string example: 'Milestone added successfully' data: type: object properties: milestone: type: object properties: { } remaining_amount: type: integer example: 500 422: description: '' content: application/json: schema: type: object example: success: false message: 'Milestone total would exceed project cost. Remaining amount: 500.00' properties: success: type: boolean example: false message: type: string example: 'Milestone total would exceed project cost. Remaining amount: 500.00' tags: - 'Milestone Payments' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Milestone name.' example: 'Design approval' description: type: string description: 'optional Description.' example: 'Final design sign-off' nullable: true amount: type: number description: 'Amount for this milestone.' example: 500.0 milestone_completion_date: type: date description: 'Completion date (today or future).' example: '2026-03-01' required: - name - amount - milestone_completion_date parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/milestones/{milestone_id}/create-checkout-session': post: summary: 'Create Stripe checkout session to pay for a milestone. Redirect user to checkout_url; on success Stripe webhook marks milestone completed.' operationId: createStripeCheckoutSessionToPayForAMilestoneRedirectUserToCheckoutUrlOnSuccessStripeWebhookMarksMilestoneCompleted description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Checkout session created' data: checkout_url: 'https://checkout.stripe.com/...' session_id: cs_xxx amount: 500 currency: USD properties: success: type: boolean example: true message: type: string example: 'Checkout session created' data: type: object properties: checkout_url: type: string example: 'https://checkout.stripe.com/...' session_id: type: string example: cs_xxx amount: type: integer example: 500 currency: type: string example: USD 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only manage milestones for your own awarded projects.' properties: success: type: boolean example: false message: type: string example: 'You can only manage milestones for your own awarded projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'This milestone has already been paid and completed.' properties: success: type: boolean example: false message: type: string example: 'This milestone has already been paid and completed.' tags: - 'Milestone Payments' parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: milestone_id description: 'The ID of the milestone.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/milestones/{milestone_id}': put: summary: 'Update a milestone payment. Total of all milestones must not exceed project cost.' operationId: updateAMilestonePaymentTotalOfAllMilestonesMustNotExceedProjectCost description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestone updated successfully' data: milestone: { } remaining_amount: 0 properties: success: type: boolean example: true message: type: string example: 'Milestone updated successfully' data: type: object properties: milestone: type: object properties: { } remaining_amount: type: integer example: 0 422: description: '' content: application/json: schema: type: object example: success: false message: 'Milestone total would exceed project cost. Max allowed for this milestone: 500.00' properties: success: type: boolean example: false message: type: string example: 'Milestone total would exceed project cost. Max allowed for this milestone: 500.00' tags: - 'Milestone Payments' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional Milestone name.' example: architecto description: type: string description: 'optional Description.' example: 'Eius et animi quos velit et.' nullable: true amount: type: number description: 'optional Amount.' example: 4326.41688 milestone_completion_date: type: date description: 'optional Completion date.' example: architecto patch: summary: 'Update a milestone payment. Total of all milestones must not exceed project cost.' operationId: updateAMilestonePaymentTotalOfAllMilestonesMustNotExceedProjectCost description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestone updated successfully' data: milestone: { } remaining_amount: 0 properties: success: type: boolean example: true message: type: string example: 'Milestone updated successfully' data: type: object properties: milestone: type: object properties: { } remaining_amount: type: integer example: 0 422: description: '' content: application/json: schema: type: object example: success: false message: 'Milestone total would exceed project cost. Max allowed for this milestone: 500.00' properties: success: type: boolean example: false message: type: string example: 'Milestone total would exceed project cost. Max allowed for this milestone: 500.00' tags: - 'Milestone Payments' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'optional Milestone name.' example: architecto description: type: string description: 'optional Description.' example: 'Eius et animi quos velit et.' nullable: true amount: type: number description: 'optional Amount.' example: 4326.41688 milestone_completion_date: type: date description: 'optional Completion date.' example: architecto delete: summary: 'Delete a milestone payment.' operationId: deleteAMilestonePayment description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Milestone deleted successfully' data: remaining_amount: 1000 properties: success: type: boolean example: true message: type: string example: 'Milestone deleted successfully' data: type: object properties: remaining_amount: type: integer example: 1000 404: description: '' content: application/json: schema: type: object example: success: false message: 'Milestone not found' properties: success: type: boolean example: false message: type: string example: 'Milestone not found' tags: - 'Milestone Payments' parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: milestone_id description: 'The ID of the milestone.' example: 16 required: true schema: type: integer /api/v1/project/my-projects: get: summary: 'List all projects for the logged-in company (draft, published, cancelled).' operationId: listAllProjectsForTheLoggedInCompanydraftPublishedCancelled description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company projects retrieved successfully' data: - id: 1 user_id: 1 status: draft industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company projects retrieved successfully' data: type: array example: - id: 1 user_id: 1 status: draft industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' items: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: draft industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only companies can view their projects.' properties: success: type: boolean example: false message: type: string example: 'Only companies can view their projects.' tags: - Projects '/api/v1/project/my-projects/{project_id}': get: summary: 'Get a single project for the logged-in company (any status: draft, published, cancelled).' operationId: getASingleProjectForTheLoggedInCompanyanyStatusDraftPublishedCancelled description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project retrieved successfully' data: id: 1 user_id: 1 status: draft industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: draft industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only view your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only view your own projects.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' tags: - Projects parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: project description: 'The ID of the project.' example: 1 required: true schema: type: integer /api/v1/project: post: summary: 'Create a new project.' operationId: createANewProject description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Project created successfully' data: id: 1 user_id: 1 industry_type_id: 1 requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project created successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 industry_type_id: type: integer example: 1 requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only companies can create projects.' properties: success: type: boolean example: false message: type: string example: 'Only companies can create projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: industry_type_id: - 'The industry type id field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: industry_type_id: type: array example: - 'The industry type id field is required.' items: type: string tags: - Projects requestBody: required: true content: application/json: schema: type: object properties: industry_type_id: type: integer description: 'The ID of the industry type.' example: 1 requirement_type_id: type: integer description: 'The id of an existing record in the requirement_types table.' example: 16 requirement_title: type: string description: 'The title of the requirement.' example: 'Need a Laravel Developer' requirement_details: type: string description: 'Detailed description of the requirement.' example: 'We need an experienced Laravel developer for our project.' experience_level_years: type: integer description: 'Required experience in years.' example: 5 project_type: type: string description: 'The type of project. Must be "hourly" or "fixed".' example: hourly estimated_hours: type: integer description: 'required_if:project_type,hourly Estimated hours for hourly projects.' example: 40 nullable: true rate: type: numeric description: 'required_if:project_type,hourly Rate per hour for hourly projects.' example: '50.00' nullable: true amount: type: numeric description: 'required_if:project_type,fixed Total amount for fixed projects.' example: '2000.00' nullable: true is_close_bidding: type: boolean description: 'optional When true, project is not shown publicly and no proposal submission.' example: false questions: type: array description: 'optional Array of questions for proposal submission.' example: - architecto items: type: string requirement_type: type: string description: 'The type of requirement.' example: Development required: - industry_type_id - requirement_type_id - requirement_title - requirement_details - experience_level_years - project_type - requirement_type get: summary: 'List all published projects that are open for proposals (excludes close-bid and awarded projects).' operationId: listAllPublishedProjectsThatAreOpenForProposalsexcludesCloseBidAndAwardedProjects description: 'Close-bid projects and awarded projects are not returned. Each project includes `is_awarded` and `is_close_bidding`.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Published projects retrieved successfully' data: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' is_awarded: false questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Published projects retrieved successfully' data: type: array example: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' is_awarded: false questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' items: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' is_awarded: type: boolean example: false questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+00:00' tags: - Projects security: [] '/api/v1/project/{project_id}': put: summary: 'Update an existing project.' operationId: updateAnExistingProject description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project updated successfully' data: id: 1 user_id: 1 status: draft industry_type_id: 1 requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project updated successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: draft industry_type_id: type: integer example: 1 requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only edit projects that are in draft mode.' properties: success: type: boolean example: false message: type: string example: 'You can only edit projects that are in draft mode.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: industry_type_id: - 'The industry type id field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: industry_type_id: type: array example: - 'The industry type id field is required.' items: type: string tags: - Projects requestBody: required: false content: application/json: schema: type: object properties: industry_type_id: type: integer description: 'optional The ID of the industry type.' example: 1 requirement_type_id: type: integer description: 'The id of an existing record in the requirement_types table.' example: 16 requirement_title: type: string description: 'optional The title of the requirement.' example: 'Need a Laravel Developer' requirement_details: type: string description: 'optional Detailed description of the requirement.' example: 'We need an experienced Laravel developer for our project.' experience_level_years: type: integer description: 'optional Required experience in years.' example: 5 project_type: type: string description: 'optional The type of project. Must be "hourly" or "fixed".' example: hourly estimated_hours: type: integer description: 'required_if:project_type,hourly Estimated hours for hourly projects.' example: 40 nullable: true rate: type: numeric description: 'required_if:project_type,hourly Rate per hour for hourly projects.' example: '50.00' nullable: true amount: type: numeric description: 'required_if:project_type,fixed Total amount for fixed projects.' example: '2000.00' nullable: true is_close_bidding: type: boolean description: 'optional When true, project is not shown publicly and no proposal submission.' example: false questions: type: array description: 'optional Array of questions for proposal submission.' example: - architecto items: type: string requirement_type: type: string description: 'optional The type of requirement.' example: Development patch: summary: 'Update an existing project.' operationId: updateAnExistingProject description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project updated successfully' data: id: 1 user_id: 1 status: draft industry_type_id: 1 requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project updated successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: draft industry_type_id: type: integer example: 1 requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only edit projects that are in draft mode.' properties: success: type: boolean example: false message: type: string example: 'You can only edit projects that are in draft mode.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: industry_type_id: - 'The industry type id field is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: industry_type_id: type: array example: - 'The industry type id field is required.' items: type: string tags: - Projects requestBody: required: false content: application/json: schema: type: object properties: industry_type_id: type: integer description: 'optional The ID of the industry type.' example: 1 requirement_type_id: type: integer description: 'The id of an existing record in the requirement_types table.' example: 16 requirement_title: type: string description: 'optional The title of the requirement.' example: 'Need a Laravel Developer' requirement_details: type: string description: 'optional Detailed description of the requirement.' example: 'We need an experienced Laravel developer for our project.' experience_level_years: type: integer description: 'optional Required experience in years.' example: 5 project_type: type: string description: 'optional The type of project. Must be "hourly" or "fixed".' example: hourly estimated_hours: type: integer description: 'required_if:project_type,hourly Estimated hours for hourly projects.' example: 40 nullable: true rate: type: numeric description: 'required_if:project_type,hourly Rate per hour for hourly projects.' example: '50.00' nullable: true amount: type: numeric description: 'required_if:project_type,fixed Total amount for fixed projects.' example: '2000.00' nullable: true is_close_bidding: type: boolean description: 'optional When true, project is not shown publicly and no proposal submission.' example: false questions: type: array description: 'optional Array of questions for proposal submission.' example: - architecto items: type: string requirement_type: type: string description: 'optional The type of requirement.' example: Development delete: summary: 'Delete a project completely.' operationId: deleteAProjectCompletely description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project deleted successfully' properties: success: type: boolean example: true message: type: string example: 'Project deleted 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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only delete your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only delete your own projects.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' tags: - Projects get: summary: 'Get a single published project by ID.' operationId: getASinglePublishedProjectByID description: 'Close-bid projects return 404 (no public view). Response includes `is_awarded` and `is_close_bidding`.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project retrieved successfully' data: id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' is_awarded: false questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' is_awarded: type: boolean example: false questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' tags: - Projects security: [] parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/publish': post: summary: 'Publish a draft project.' operationId: publishADraftProject description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project published successfully' data: id: 1 user_id: 1 status: published industry_type_id: 1 requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project published successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only publish your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only publish your own projects.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Project is already published.' properties: success: type: boolean example: false message: type: string example: 'Project is already published.' tags: - Projects parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/cancel': post: summary: 'Cancel a project.' operationId: cancelAProject description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project cancelled successfully' data: id: 1 user_id: 1 status: cancelled industry_type_id: 1 requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project cancelled successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: cancelled industry_type_id: type: integer example: 1 requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only cancel your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only cancel your own projects.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found' properties: success: type: boolean example: false message: type: string example: 'Project not found' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Project is already cancelled.' properties: success: type: boolean example: false message: type: string example: 'Project is already cancelled.' tags: - Projects parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/close-bidding': post: summary: 'Close bidding on a project. Project is hidden from public listing and single view; no proposal submission.' operationId: closeBiddingOnAProjectProjectIsHiddenFromPublicListingAndSingleViewNoProposalSubmission description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Bidding closed successfully' data: { } properties: success: type: boolean example: true message: type: string example: 'Bidding closed successfully' data: type: object properties: { } 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: 'You can only manage your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only manage your own projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Bidding is already closed for this project.' properties: success: type: boolean example: false message: type: string example: 'Bidding is already closed for this project.' tags: - Projects parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: project description: 'The ID of the project.' example: 1 required: true schema: type: integer '/api/v1/project/{project_id}/open-bidding': post: summary: 'Open bidding on a project. Project is visible publicly and can receive proposals (if published and not awarded).' operationId: openBiddingOnAProjectProjectIsVisiblePubliclyAndCanReceiveProposalsifPublishedAndNotAwarded description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Bidding opened successfully' data: { } properties: success: type: boolean example: true message: type: string example: 'Bidding opened successfully' data: type: object properties: { } 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: 'You can only manage your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only manage your own projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Bidding is already open for this project.' properties: success: type: boolean example: false message: type: string example: 'Bidding is already open for this project.' tags: - Projects parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: project description: 'The ID of the project.' example: 1 required: true schema: type: integer '/api/v1/project/{project_id}/review-expert': post: summary: 'Submit a review for the expert who worked on this completed project.' operationId: submitAReviewForTheExpertWhoWorkedOnThisCompletedProject description: 'Only the owning company can submit one review per project after completion.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Review submitted successfully' data: id: 1 project_id: 1 expert_id: 2 company_id: 1 rating: 5 message: 'Great work' created_at: '2026-03-12T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Review submitted successfully' data: type: object properties: id: type: integer example: 1 project_id: type: integer example: 1 expert_id: type: integer example: 2 company_id: type: integer example: 1 rating: type: integer example: 5 message: type: string example: 'Great work' created_at: type: string example: '2026-03-12T10:00:00+00:00' 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only review your own completed projects.' properties: success: type: boolean example: false message: type: string example: 'You can only review your own completed projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Project must be completed and awarded before reviewing.' properties: success: type: boolean example: false message: type: string example: 'Project must be completed and awarded before reviewing.' tags: - Projects requestBody: required: true content: application/json: schema: type: object properties: rating: type: integer description: 'Rating between 1 and 5.' example: 5 message: type: string description: 'optional Review message.' example: 'Great work and communication throughout the project.' nullable: true required: - rating parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/industry-type/{industry_type_id}': get: summary: 'List all published projects for a specific industry type (excludes close-bid and awarded projects).' operationId: listAllPublishedProjectsForASpecificIndustryTypeexcludesCloseBidAndAwardedProjects description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Published projects retrieved successfully' data: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' is_awarded: false questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Published projects retrieved successfully' data: type: array example: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' is_awarded: false questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' items: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' is_awarded: type: boolean example: false questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Industry type not found' properties: success: type: boolean example: false message: type: string example: 'Industry type not found' tags: - Projects security: [] parameters: - in: path name: industry_type_id description: 'The ID of the industry type.' example: 1 required: true schema: type: integer /api/v1/project/my-applied-projects: get: summary: 'List all projects the logged-in expert has submitted a proposal to.' operationId: listAllProjectsTheLoggedInExpertHasSubmittedAProposalTo description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Projects you applied to retrieved successfully' data: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Projects you applied to retrieved successfully' data: type: array example: - id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' items: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can view projects they have applied to.' properties: success: type: boolean example: false message: type: string example: 'Only experts can view projects they have applied to.' tags: - Proposals '/api/v1/project/my-applied-projects/{project_id}': get: summary: 'Get a single project the logged-in expert has submitted a proposal to.' operationId: getASingleProjectTheLoggedInExpertHasSubmittedAProposalTo description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project retrieved successfully' data: id: 1 user_id: 1 status: published industry_type_id: 1 industry_type: id: 1 name: Technology requirement_title: 'Need a Laravel Developer' requirement_type: Development requirement_details: 'We need an experienced Laravel developer' experience_level_years: 5 project_type: hourly estimated_hours: 40 rate: '50.00' amount: null questions: [] created_at: '2026-01-16T10:00:00+00:00' updated_at: '2026-01-16T10:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Project retrieved successfully' data: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 status: type: string example: published industry_type_id: type: integer example: 1 industry_type: type: object properties: id: type: integer example: 1 name: type: string example: Technology requirement_title: type: string example: 'Need a Laravel Developer' requirement_type: type: string example: Development requirement_details: type: string example: 'We need an experienced Laravel developer' experience_level_years: type: integer example: 5 project_type: type: string example: hourly estimated_hours: type: integer example: 40 rate: type: string example: '50.00' amount: type: string example: null nullable: true questions: type: array example: [] created_at: type: string example: '2026-01-16T10:00:00+00:00' updated_at: type: string example: '2026-01-16T10:00:00+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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can view projects they have applied to.' properties: success: type: boolean example: false message: type: string example: 'Only experts can view projects they have applied to.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Project not found or you have not applied to this project.' properties: success: type: boolean example: false message: type: string example: 'Project not found or you have not applied to this project.' tags: - Proposals parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer - in: path name: project description: 'The ID of the project.' example: 1 required: true schema: type: integer /api/v1/project/proposals: get: summary: 'List proposals for the authenticated user.' operationId: listProposalsForTheAuthenticatedUser description: "Experts: proposals they submitted. Companies: not used; use indexByProject for their project's proposals." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Proposals retrieved successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Proposals retrieved successfully' data: type: array example: [] tags: - Proposals '/api/v1/project/proposal/{proposal_id}': get: summary: 'Show a single proposal. Visible to the expert who submitted it or the company that owns the project.' operationId: showASingleProposalVisibleToTheExpertWhoSubmittedItOrTheCompanyThatOwnsTheProject description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Proposal retrieved successfully' data: { } properties: success: type: boolean example: true message: type: string example: 'Proposal retrieved successfully' data: type: object properties: { } 404: description: '' content: application/json: schema: type: object example: success: false message: 'Proposal not found' properties: success: type: boolean example: false message: type: string example: 'Proposal not found' tags: - Proposals parameters: - in: path name: proposal_id description: 'The ID of the proposal.' example: 16 required: true schema: type: integer '/api/v1/project/proposal/{proposal_id}/award': post: summary: 'Award the project to an expert (company only - project owner).' operationId: awardTheProjectToAnExpertcompanyOnlyProjectOwner description: 'Sets the proposal as "pending" until the expert accepts or declines.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Project awarded to expert successfully. Waiting for expert response.' properties: success: type: boolean example: true message: type: string example: 'Project awarded to expert successfully. Waiting for expert response.' 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only award proposals for your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only award proposals for your own projects.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'This project has already been awarded to an expert.' properties: success: type: boolean example: false message: type: string example: 'This project has already been awarded to an expert.' tags: - Proposals parameters: - in: path name: proposal_id description: 'The ID of the proposal.' example: 16 required: true schema: type: integer '/api/v1/project/proposal/{proposal_id}/accept-award': post: summary: 'Expert accepts the award. Project is then awarded to this expert and proposal submission is closed.' operationId: expertAcceptsTheAwardProjectIsThenAwardedToThisExpertAndProposalSubmissionIsClosed description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'You have accepted the award. The project is now awarded to you.' properties: success: type: boolean example: true message: type: string example: 'You have accepted the award. The project is now awarded to you.' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only the expert who received the award can accept it.' properties: success: type: boolean example: false message: type: string example: 'Only the expert who received the award can accept it.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'This proposal is not pending your response.' properties: success: type: boolean example: false message: type: string example: 'This proposal is not pending your response.' tags: - Proposals parameters: - in: path name: proposal_id description: 'The ID of the proposal.' example: 16 required: true schema: type: integer '/api/v1/project/proposal/{proposal_id}/decline-award': post: summary: 'Expert declines the award. Proposal submission for the project continues; company can see the decline.' operationId: expertDeclinesTheAwardProposalSubmissionForTheProjectContinuesCompanyCanSeeTheDecline description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'You have declined the award.' properties: success: type: boolean example: true message: type: string example: 'You have declined the award.' 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only the expert who received the award can decline it.' properties: success: type: boolean example: false message: type: string example: 'Only the expert who received the award can decline it.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'This proposal is not pending your response.' properties: success: type: boolean example: false message: type: string example: 'This proposal is not pending your response.' tags: - Proposals parameters: - in: path name: proposal_id description: 'The ID of the proposal.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/proposal-form': get: summary: 'Get proposal form data for a project (when expert clicks "Apply now").' operationId: getProposalFormDataForAProjectwhenExpertClicksApplyNow description: 'Returns project details and questions so the frontend can render the proposal form.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Proposal form retrieved successfully' data: project: { } questions: [] already_submitted: false properties: success: type: boolean example: true message: type: string example: 'Proposal form retrieved successfully' data: type: object properties: project: type: object properties: { } questions: type: array example: [] already_submitted: type: boolean example: false 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only published projects can receive proposals.' properties: success: type: boolean example: false message: type: string example: 'Only published projects can receive proposals.' tags: - Proposals parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/proposals': get: summary: 'List proposals for a project (company only - project owner).' operationId: listProposalsForAProjectcompanyOnlyProjectOwner description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Proposals retrieved successfully' data: [] properties: success: type: boolean example: true message: type: string example: 'Proposals retrieved successfully' data: type: array example: [] 403: description: '' content: application/json: schema: type: object example: success: false message: 'You can only view proposals for your own projects.' properties: success: type: boolean example: false message: type: string example: 'You can only view proposals for your own projects.' tags: - Proposals parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer '/api/v1/project/{project_id}/proposal': post: summary: 'Submit a proposal for a published project.' operationId: submitAProposalForAPublishedProject description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Proposal submitted successfully' data: { } properties: success: type: boolean example: true message: type: string example: 'Proposal submitted successfully' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: success: false message: 'Only experts can submit proposals.' properties: success: type: boolean example: false message: type: string example: 'Only experts can submit proposals.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'You have already submitted a proposal for this project.' properties: success: type: boolean example: false message: type: string example: 'You have already submitted a proposal for this project.' tags: - Proposals requestBody: required: true content: application/json: schema: type: object properties: heading: type: string description: 'Proposal heading.' example: 'My approach to your Laravel project' cover_letter: type: string description: 'Cover letter.' example: 'I have 5 years of experience...' work_samples: type: array description: 'optional Work samples (pdf, video, link, image).' example: - architecto items: type: string question_answers: type: array description: 'Answers to all project questions.' example: - architecto items: type: string estimated_total_hours: type: integer description: 'required_if:project_type,hourly Total hours (hourly projects).' example: 40 nullable: true estimated_rate: type: number description: 'required_if:project_type,hourly Rate per hour (hourly projects).' example: 50.0 nullable: true estimated_amount: type: number description: 'required_if:project_type,fixed Total price (fixed projects).' example: 2000.0 nullable: true required: - heading - cover_letter - question_answers parameters: - in: path name: project_id description: 'The ID of the project.' example: 16 required: true schema: type: integer /api/v1/about-page: get: summary: 'Get public about page content.' operationId: getPublicAboutPageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'About page content retrieved successfully' data: id: 1 page_title: 'About Us' side_image: 'http://localhost/images/about/side.jpg' heading: Welcome description: Description our_mission_text: 'Mission text' our_vision_text: 'Vision text' our_values_text: 'Values text' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'About page content retrieved successfully' data: type: object properties: id: type: integer example: 1 page_title: type: string example: 'About Us' side_image: type: string example: 'http://localhost/images/about/side.jpg' heading: type: string example: Welcome description: type: string example: Description our_mission_text: type: string example: 'Mission text' our_vision_text: type: string example: 'Vision text' our_values_text: type: string example: 'Values text' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public About Page' security: [] /api/v1/blog-categories: get: summary: 'Get active blog categories with blog counts.' operationId: getActiveBlogCategoriesWithBlogCounts description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog categories retrieved' data: - id: 1 name: Technology is_active: true blogs_count: 3 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog categories retrieved' data: type: array example: - id: 1 name: Technology is_active: true blogs_count: 3 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: Technology is_active: type: boolean example: true blogs_count: type: integer example: 3 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' tags: - 'Public Blogs' security: [] '/api/v1/blog-categories/{id}': get: summary: 'Show a single active category.' operationId: showASingleActiveCategory description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog category retrieved' data: id: 1 name: Technology is_active: true blogs_count: 3 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog category retrieved' data: type: object properties: id: type: integer example: 1 name: type: string example: Technology is_active: type: boolean example: true blogs_count: type: integer example: 3 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog category not found' properties: success: type: boolean example: false message: type: string example: 'Blog category not found' tags: - 'Public Blogs' security: [] parameters: - in: path name: id description: 'The category ID.' example: 1 required: true schema: type: integer /api/v1/blogs: get: summary: 'List active blogs with optional category filter.' operationId: listActiveBlogsWithOptionalCategoryFilter description: '' parameters: - in: query name: category_id description: 'optional Filter by category ID.' example: 2 required: false schema: type: integer description: 'optional Filter by category ID.' example: 2 responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blogs retrieved' data: - id: 1 name: 'Launch Update' blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blogs retrieved' data: type: array example: - id: 1 name: 'Launch Update' blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update' blog_category_id: type: integer example: 2 category: type: object properties: id: type: integer example: 2 name: type: string example: News is_active: type: boolean example: true blogs_count: type: integer example: 1 thumbnail_image: type: string example: 'https://cdn/img.png' description: type: string example: ... share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' tags: - 'Public Blogs' security: [] '/api/v1/blogs/{slug}': get: summary: 'Show a single active blog.' operationId: showASingleActiveBlog description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Blog retrieved' data: id: 1 name: 'Launch Update' slug: launch-update blog_category_id: 2 category: id: 2 name: News is_active: true blogs_count: 1 thumbnail_image: 'https://cdn/img.png' description: ... share_facebook: true share_twitter: false share_linkedin: true is_active: true sections: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 created_at: '2026-01-21T12:00:00+00:00' updated_at: '2026-01-21T12:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Blog retrieved' data: type: object properties: id: type: integer example: 1 name: type: string example: 'Launch Update' slug: type: string example: launch-update blog_category_id: type: integer example: 2 category: type: object properties: id: type: integer example: 2 name: type: string example: News is_active: type: boolean example: true blogs_count: type: integer example: 1 thumbnail_image: type: string example: 'https://cdn/img.png' description: type: string example: ... share_facebook: type: boolean example: true share_twitter: type: boolean example: false share_linkedin: type: boolean example: true is_active: type: boolean example: true sections: type: array example: - id: 1 heading: Intro description: ... image: null position: left button_name: null button_url: null order: 0 items: type: object properties: id: type: integer example: 1 heading: type: string example: Intro description: type: string example: ... image: type: string example: null nullable: true position: type: string example: left button_name: type: string example: null nullable: true button_url: type: string example: null nullable: true order: type: integer example: 0 created_at: type: string example: '2026-01-21T12:00:00+00:00' updated_at: type: string example: '2026-01-21T12:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Blog not found' properties: success: type: boolean example: false message: type: string example: 'Blog not found' tags: - 'Public Blogs' security: [] parameters: - in: path name: slug description: 'Blog slug.' example: launch-update required: true schema: type: string /api/v1/company: get: summary: 'List all companies in the system (public endpoint).' operationId: listAllCompaniesInTheSystempublicEndpoint description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Companies retrieved successfully' data: - id: 1 name: 'Company Name' company_name: 'Company Name' email: company@example.com profile: id: 1 company_name: 'Company Name' company_logo: 'http://localhost/logos/image.jpg' address_line_1: '123 Main St' country: id: 1 name: India state: id: 1 name: State city: id: 1 name: City created_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Companies retrieved successfully' data: type: array example: - id: 1 name: 'Company Name' company_name: 'Company Name' email: company@example.com profile: id: 1 company_name: 'Company Name' company_logo: 'http://localhost/logos/image.jpg' address_line_1: '123 Main St' country: id: 1 name: India state: id: 1 name: State city: id: 1 name: City created_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Company Name' company_name: type: string example: 'Company Name' email: type: string example: company@example.com profile: type: object properties: id: type: integer example: 1 company_name: type: string example: 'Company Name' company_logo: type: string example: 'http://localhost/logos/image.jpg' address_line_1: type: string example: '123 Main St' country: type: object properties: id: type: integer example: 1 name: type: string example: India state: type: object properties: id: type: integer example: 1 name: type: string example: State city: type: object properties: id: type: integer example: 1 name: type: string example: City created_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Company' security: [] /api/v1/company/check-email: get: summary: 'Check if the given email exists in the system as a company.' operationId: checkIfTheGivenEmailExistsInTheSystemAsACompany description: '' parameters: - in: query name: email description: 'The email address to check.' example: company@example.com required: true schema: type: string description: 'The email address to check.' example: company@example.com responses: 200: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: true message: OK data: exists: true properties: success: type: boolean example: true message: type: string example: OK data: type: object properties: exists: type: boolean example: true - description: '' type: object example: success: true message: OK data: exists: false properties: success: type: boolean example: true message: type: string example: OK data: type: object properties: exists: type: boolean example: false 422: description: '' content: application/json: schema: type: object example: success: false message: 'The given data was invalid.' errors: email: - 'The email field is required.' properties: success: type: boolean example: false message: type: string example: 'The given data was invalid.' errors: type: object properties: email: type: array example: - 'The email field is required.' items: type: string tags: - 'Public Company' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: gbailey@example.net required: - email security: [] /api/v1/expert: get: summary: 'List all experts in the system (public endpoint).' operationId: listAllExpertsInTheSystempublicEndpoint description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Experts retrieved successfully' data: - id: 1 name: 'John Doe' first_name: John last_name: Doe email: expert@example.com profile: id: 1 designation: id: 1 name: Developer experience: 5 bio: 'Expert in software development' profile_image: 'http://localhost/profiles/image.jpg' country: id: 1 name: India created_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Experts retrieved successfully' data: type: array example: - id: 1 name: 'John Doe' first_name: John last_name: Doe email: expert@example.com profile: id: 1 designation: id: 1 name: Developer experience: 5 bio: 'Expert in software development' profile_image: 'http://localhost/profiles/image.jpg' country: id: 1 name: India created_at: '2024-01-01T00:00:00+00:00' items: 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: expert@example.com profile: type: object properties: id: type: integer example: 1 designation: type: object properties: id: type: integer example: 1 name: type: string example: Developer experience: type: integer example: 5 bio: type: string example: 'Expert in software development' profile_image: type: string example: 'http://localhost/profiles/image.jpg' country: type: object properties: id: type: integer example: 1 name: type: string example: India created_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Expert' security: [] '/api/v1/expert/{id}': get: summary: 'Get a single expert by ID (public endpoint).' operationId: getASingleExpertByIDpublicEndpoint description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert retrieved successfully' data: id: 1 name: 'John Doe' first_name: John last_name: Doe email: expert@example.com profile: id: 1 designation: id: 1 name: Developer experience: 5 bio: 'Expert in software development' profile_image: 'http://localhost/profiles/image.jpg' country: id: 1 name: India created_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert retrieved successfully' data: 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: expert@example.com profile: type: object properties: id: type: integer example: 1 designation: type: object properties: id: type: integer example: 1 name: type: string example: Developer experience: type: integer example: 5 bio: type: string example: 'Expert in software development' profile_image: type: string example: 'http://localhost/profiles/image.jpg' country: type: object properties: id: type: integer example: 1 name: type: string example: India created_at: type: string example: '2024-01-01T00:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Expert not found.' properties: success: type: boolean example: false message: type: string example: 'Expert not found.' tags: - 'Public Expert' security: [] parameters: - in: path name: id description: 'The expert user ID.' example: 1 required: true schema: type: integer /api/v1/faq/company: get: summary: 'Get all company FAQs (Public).' operationId: getAllCompanyFAQsPublic description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Company FAQs retrieved' data: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Company FAQs retrieved' data: type: array example: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public FAQs' security: [] /api/v1/faq/expert: get: summary: 'Get all expert FAQs (Public).' operationId: getAllExpertFAQsPublic description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Expert FAQs retrieved' data: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Expert FAQs retrieved' data: type: array example: - id: 1 heading: 'Question 1' description: 'Answer 1' order: 0 created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' items: type: object properties: id: type: integer example: 1 heading: type: string example: 'Question 1' description: type: string example: 'Answer 1' order: type: integer example: 0 created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public FAQs' security: [] /api/v1/home-page: get: summary: 'Get public home page content.' operationId: getPublicHomePageContent description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Home page content retrieved successfully' data: id: 1 section1: hero_headline: Welcome hero_description: Description hero_image: 'http://localhost/images/hero.jpg' section2: headline: 'Section 2' section3: headline: 'Section 3' description: Description button_name: Click button_url: 'https://example.com' image: 'http://localhost/images/section3.jpg' section4: headline: 'Section 4' options: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' section5: steps: - title: 'Step 1' description: 'Description 1' section6: headline: 'Section 6' button_name: Click button_url: 'https://example.com' background_image: 'http://localhost/images/bg.jpg' section7: headline: 'Section 7' description: Description created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Home page content retrieved successfully' data: type: object properties: id: type: integer example: 1 section1: type: object properties: hero_headline: type: string example: Welcome hero_description: type: string example: Description hero_image: type: string example: 'http://localhost/images/hero.jpg' section2: type: object properties: headline: type: string example: 'Section 2' section3: type: object properties: headline: type: string example: 'Section 3' description: type: string example: Description button_name: type: string example: Click button_url: type: string example: 'https://example.com' image: type: string example: 'http://localhost/images/section3.jpg' section4: type: object properties: headline: type: string example: 'Section 4' options: type: array example: - image: 'http://localhost/images/option1.jpg' title: 'Option 1' description: 'Description 1' items: type: object properties: image: type: string example: 'http://localhost/images/option1.jpg' title: type: string example: 'Option 1' description: type: string example: 'Description 1' section5: type: object properties: steps: type: array example: - title: 'Step 1' description: 'Description 1' items: type: object properties: title: type: string example: 'Step 1' description: type: string example: 'Description 1' section6: type: object properties: headline: type: string example: 'Section 6' button_name: type: string example: Click button_url: type: string example: 'https://example.com' background_image: type: string example: 'http://localhost/images/bg.jpg' section7: type: object properties: headline: type: string example: 'Section 7' description: type: string example: Description created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Home Page' security: [] /api/v1/policies/privacy-policy: get: summary: 'Get privacy policy.' operationId: getPrivacyPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Privacy policy retrieved successfully' data: id: 1 type: privacy_policy content: 'Privacy policy content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Privacy policy retrieved successfully' data: type: object properties: id: type: integer example: 1 type: type: string example: privacy_policy content: type: string example: 'Privacy policy content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Policies' security: [] /api/v1/policies/terms-conditions: get: summary: 'Get terms & conditions.' operationId: getTermsConditions description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Terms & conditions retrieved successfully' data: id: 2 type: terms_conditions content: 'Terms & conditions content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Terms & conditions retrieved successfully' data: type: object properties: id: type: integer example: 2 type: type: string example: terms_conditions content: type: string example: 'Terms & conditions content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Policies' security: [] /api/v1/policies/refund-cancellation: get: summary: 'Get refund & cancellation policy.' operationId: getRefundCancellationPolicy description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Refund & cancellation policy retrieved successfully' data: id: 3 type: refund_cancellation content: 'Refund & cancellation policy content here...' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Refund & cancellation policy retrieved successfully' data: type: object properties: id: type: integer example: 3 type: type: string example: refund_cancellation content: type: string example: 'Refund & cancellation policy content here...' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Policies' security: [] /api/v1/site-settings: get: summary: 'Get public site settings.' operationId: getPublicSiteSettings description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Site settings retrieved successfully' data: id: 1 favicon: 'http://localhost/favicon.ico' logo: 'http://localhost/logos/logo.png' footer_logo: 'http://localhost/logos/footer-logo.png' footer_description: 'Company description' address: '123 Main St' email: info@example.com phone: '1234567890' phone_country_code: '+1' facebook_url: 'https://facebook.com/company' instagram_url: 'https://instagram.com/company' linkedin_url: 'https://linkedin.com/company' copyright: '© 2024 Company' header_image: 'http://localhost/images/header.jpg' created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00: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/favicon.ico' logo: type: string example: 'http://localhost/logos/logo.png' footer_logo: type: string example: 'http://localhost/logos/footer-logo.png' footer_description: type: string example: 'Company description' address: type: string example: '123 Main St' email: type: string example: info@example.com phone: type: string example: '1234567890' phone_country_code: type: string example: '+1' facebook_url: type: string example: 'https://facebook.com/company' instagram_url: type: string example: 'https://instagram.com/company' linkedin_url: type: string example: 'https://linkedin.com/company' copyright: type: string example: '© 2024 Company' header_image: type: string example: 'http://localhost/images/header.jpg' created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' tags: - 'Public Site Settings' security: [] /api/v1/requirement-types: get: summary: 'Get list of all requirement types (Public endpoint for frontend users).' operationId: getListOfAllRequirementTypesPublicEndpointForFrontendUsers description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Requirement types retrieved successfully' data: - id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Requirement types retrieved successfully' data: type: array example: - id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' items: type: object properties: id: type: integer example: 1 name: type: string example: Consulting description: type: string example: 'Consulting requirement' image: type: string example: 'http://localhost/requirement-types/consulting.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' tags: - 'Requirement Type' security: [] /api/v1/admin/requirement-types: get: summary: 'Get list of all requirement types (Admin only).' operationId: getListOfAllRequirementTypesAdminOnly description: '' parameters: - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Requirement types retrieved successfully' data: - id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Requirement types retrieved successfully' data: type: array example: - id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' items: type: object properties: id: type: integer example: 1 name: type: string example: Consulting description: type: string example: 'Consulting requirement' image: type: string example: 'http://localhost/requirement-types/consulting.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' tags: - 'Requirement Type' post: summary: 'Store a new requirement type (Admin only).' operationId: storeANewRequirementTypeAdminOnly description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Requirement type created successfully' data: id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:26:06' properties: success: type: boolean example: true message: type: string example: 'Requirement type created successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: Consulting description: type: string example: 'Consulting requirement' image: type: string example: 'http://localhost/requirement-types/consulting.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:26:06' 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - 'Requirement Type' requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'The name of the requirement type.' example: Consulting description: type: string description: 'optional The description of the requirement type.' example: 'Consulting requirement' nullable: true image: type: string format: binary description: 'optional Requirement type image (max 2MB, jpeg/png/jpg/gif).' nullable: true is_active: type: boolean description: 'optional Whether the requirement type is active. Defaults to true.' example: true nullable: true required: - name '/api/v1/admin/requirement-types/{id}': put: summary: 'Update a requirement type (Admin only).' operationId: updateARequirementTypeAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Requirement type updated successfully' data: id: 1 name: Consulting description: 'Consulting requirement' image: 'http://localhost/requirement-types/consulting.jpg' is_active: true created_at: '2024-01-16 03:26:06' updated_at: '2024-01-16 03:27:00' properties: success: type: boolean example: true message: type: string example: 'Requirement type updated successfully' data: type: object properties: id: type: integer example: 1 name: type: string example: Consulting description: type: string example: 'Consulting requirement' image: type: string example: 'http://localhost/requirement-types/consulting.jpg' is_active: type: boolean example: true created_at: type: string example: '2024-01-16 03:26:06' updated_at: type: string example: '2024-01-16 03:27: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 403: description: '' content: application/json: schema: type: object example: success: false message: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Requirement type not found.' properties: success: type: boolean example: false message: type: string example: 'Requirement type not found.' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Validation failed' errors: name: - 'Name is required.' properties: success: type: boolean example: false message: type: string example: 'Validation failed' errors: type: object properties: name: type: array example: - 'Name is required.' items: type: string tags: - 'Requirement Type' requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'The name of the requirement type.' example: Consulting description: type: string description: 'optional The description of the requirement type.' example: 'Consulting requirement' nullable: true image: type: string format: binary description: 'optional Requirement type image (max 2MB, jpeg/png/jpg/gif).' nullable: true is_active: type: boolean description: 'optional Whether the requirement type is active.' example: true nullable: true required: - name delete: summary: 'Delete a requirement type (Admin only).' operationId: deleteARequirementTypeAdminOnly description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Requirement type deleted successfully' data: null properties: success: type: boolean example: true message: type: string example: 'Requirement type deleted successfully' data: type: string example: null nullable: 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: 'Unauthorized. Admin role required.' properties: success: type: boolean example: false message: type: string example: 'Unauthorized. Admin role required.' 404: description: '' content: application/json: schema: type: object example: success: false message: 'Requirement type not found.' properties: success: type: boolean example: false message: type: string example: 'Requirement type not found.' tags: - 'Requirement Type' parameters: - in: path name: id description: 'The ID of the requirement type.' example: 1 required: true schema: type: integer /api/v1/subscription/subscription: get: summary: 'Get current subscription status for authenticated user (company or expert).' operationId: getCurrentSubscriptionStatusForAuthenticatedUsercompanyOrExpert description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Subscription retrieved successfully' data: id: 1 status: active lifetime: true starts_at: '2024-01-01T00:00:00+00:00' ends_at: null created_at: '2024-01-01T00:00:00+00:00' updated_at: '2024-01-01T00:00:00+00:00' properties: success: type: boolean example: true message: type: string example: 'Subscription retrieved successfully' data: type: object properties: id: type: integer example: 1 status: type: string example: active lifetime: type: boolean example: true starts_at: type: string example: '2024-01-01T00:00:00+00:00' ends_at: type: string example: null nullable: true created_at: type: string example: '2024-01-01T00:00:00+00:00' updated_at: type: string example: '2024-01-01T00:00:00+00:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 'No subscription found' data: null properties: success: type: boolean example: false message: type: string example: 'No subscription found' data: type: string example: null nullable: true tags: - Subscription /api/v1/subscription/create-checkout-session: post: summary: 'Create Stripe checkout session for subscription.' operationId: createStripeCheckoutSessionForSubscription description: "This endpoint creates a checkout session in Stripe and returns the checkout URL\nwhich the frontend should redirect to. Works for both company and expert users." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Checkout session created successfully' data: checkout_url: 'https://checkout.stripe.com/...' session_id: cs_xxx amount: 9999 currency: INR properties: success: type: boolean example: true message: type: string example: 'Checkout session created successfully' data: type: object properties: checkout_url: type: string example: 'https://checkout.stripe.com/...' session_id: type: string example: cs_xxx amount: type: integer example: 9999 currency: type: string example: INR 400: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: false message: 'Subscription configuration not found. Please contact administrator.' properties: success: type: boolean example: false message: type: string example: 'Subscription configuration not found. Please contact administrator.' - description: '' type: object example: success: false message: 'Subscription is only available for company or expert users.' properties: success: type: boolean example: false message: type: string example: 'Subscription is only available for company or expert users.' 403: description: '' content: application/json: schema: type: object example: success: false message: 'You already have an active subscription.' properties: success: type: boolean example: false message: type: string example: 'You already have an active subscription.' tags: - Subscription /api/v1/subscription/create-payment-intent: post: summary: 'Create Stripe payment intent for subscription.' operationId: createStripePaymentIntentForSubscription description: "This endpoint creates a payment intent in Stripe and returns the client secret\nwhich is used by the frontend to complete the payment. Works for both company and expert users." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Payment intent created successfully' data: client_secret: pi_xxx_secret_xxx payment_intent_id: pi_xxx amount: 9999 currency: INR properties: success: type: boolean example: true message: type: string example: 'Payment intent created successfully' data: type: object properties: client_secret: type: string example: pi_xxx_secret_xxx payment_intent_id: type: string example: pi_xxx amount: type: integer example: 9999 currency: type: string example: INR 400: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: false message: 'Subscription configuration not found. Please contact administrator.' properties: success: type: boolean example: false message: type: string example: 'Subscription configuration not found. Please contact administrator.' - description: '' type: object example: success: false message: 'Subscription is only available for company or expert users.' properties: success: type: boolean example: false message: type: string example: 'Subscription is only available for company or expert users.' 403: description: '' content: application/json: schema: type: object example: success: false message: 'You already have an active subscription.' properties: success: type: boolean example: false message: type: string example: 'You already have an active subscription.' tags: - Subscription /api/v1/subscription/confirm-payment: post: summary: 'Confirm payment and activate subscription.' operationId: confirmPaymentAndActivateSubscription description: "This endpoint confirms the payment intent and activates the subscription\nif payment is successful. The subscription is also activated via webhook\nfor reliability, but this provides immediate feedback. Works for both company and expert users." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Payment confirmed successfully' data: status: succeeded subscription_activated: true properties: success: type: boolean example: true message: type: string example: 'Payment confirmed successfully' data: type: object properties: status: type: string example: succeeded subscription_activated: type: boolean example: true 400: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: false message: 'Payment not found.' properties: success: type: boolean example: false message: type: string example: 'Payment not found.' - description: '' type: object example: success: false message: 'Failed to confirm payment: ...' properties: success: type: boolean example: false message: type: string example: 'Failed to confirm payment: ...' tags: - Subscription requestBody: required: true content: application/json: schema: type: object properties: payment_intent_id: type: string description: 'The Stripe payment intent ID.' example: pi_xxx required: - payment_intent_id /api/v1/stripe/webhook: post: summary: 'Handle Stripe webhook events.' operationId: handleStripeWebhookEvents description: "This endpoint receives webhook events from Stripe and processes them.\nIt handles payment_intent.succeeded and payment_intent.payment_failed events." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Webhook processed successfully' properties: success: type: boolean example: true message: type: string example: 'Webhook processed successfully' 400: description: '' content: application/json: schema: type: object example: success: false message: 'Invalid webhook signature.' properties: success: type: boolean example: false message: type: string example: 'Invalid webhook signature.' tags: - Subscription security: [] /api/v1/subscription/subscription-config: get: summary: 'Get subscription configuration (Public).' operationId: getSubscriptionConfigurationPublic description: '' parameters: - in: query name: role description: 'optional The role to get configuration for (company or expert). If not provided, returns all configurations.' example: architecto required: false schema: type: string description: 'optional The role to get configuration for (company or expert). If not provided, returns all configurations.' example: architecto responses: 200: description: '' content: application/json: schema: oneOf: - description: '' type: object example: success: true message: 'Subscription configuration retrieved' data: role: company price: 9999 currency: INR validity_type: lifetime validity_value: null properties: success: type: boolean example: true message: type: string example: 'Subscription configuration retrieved' data: type: object properties: role: type: string example: company price: type: integer example: 9999 currency: type: string example: INR validity_type: type: string example: lifetime validity_value: type: string example: null nullable: true - description: '' type: object example: success: true message: 'Subscription configurations retrieved' data: - role: company price: 9999 currency: INR validity_type: lifetime validity_value: null - role: expert price: 4999 currency: INR validity_type: lifetime validity_value: null properties: success: type: boolean example: true message: type: string example: 'Subscription configurations retrieved' data: type: array example: - role: company price: 9999 currency: INR validity_type: lifetime validity_value: null - role: expert price: 4999 currency: INR validity_type: lifetime validity_value: null items: type: object properties: role: type: string example: company price: type: integer example: 9999 currency: type: string example: INR validity_type: type: string example: lifetime validity_value: type: string example: null nullable: true - description: '' type: object example: success: true message: 'No subscription configuration found' data: null properties: success: type: boolean example: true message: type: string example: 'No subscription configuration found' data: type: string example: null nullable: true tags: - 'Subscription Configuration' security: []