openapi: 3.1.0
info:
  title: Booked55 API
  description: |-
    Public API reference for Booked55 — a CRM and sales management platform.

    ## Authentication
    Most endpoints require a Bearer token in the `Authorization` header:
    ```
    Authorization: Bearer <your_api_key>
    ```
    Create an API key in your workspace settings. Keys are prefixed with `vg_` and shown only once at creation.

    ## Rate Limiting
    API requests are rate limited in production and staging. Check response headers for limit details.
  version: 1.0.0
  contact:
    name: Booked55 Support
  license:
    name: Proprietary
servers:
  - url: https://api.booked55.com
    description: Production
  - url: https://api.stage.booked55.com
    description: Staging
tags:
  - name: Contacts
    description: Contact management and bulk operations
  - name: Companies
    description: Company records
  - name: Events
    description: Events and attendance tracking
  - name: Tasks
    description: Tasks and follow-ups
  - name: Pipelines
    description: Sales pipelines, stages, and items
  - name: Campaigns
    description: Marketing and activity campaigns
  - name: Email Templates
    description: Reusable email templates
  - name: Client Types
    description: Client classification types
paths:
  /contact:
    post:
      tags:
        - Contacts
      summary: Create contact
      description: Create a new contact in your organization.
      security: &ref_1
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ContactCreateRequest"
            examples:
              basic:
                summary: Basic contact
                value:
                  name: Jane Smith
                  email: jane@example.com
                  phone_numbers:
                    - label: primary
                      phone_number: "+15551234567"
                  tags:
                    - prospect
                  company_id: 674a1b2c3d4e5f6789012345
      responses:
        "200":
          description: Created contact
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Contact"
        "400": &ref_0
          $ref: "#/components/responses/Error"
        "401": *ref_0
  /contact/{contactId}:
    get:
      tags:
        - Contacts
      summary: Get contact
      security: *ref_1
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
          description: Contact ID
      responses:
        "200":
          description: Contact details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Contact"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Contacts
      summary: Update contact
      security: *ref_1
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
          description: Contact ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ContactUpdateRequest"
      responses:
        "200":
          description: Updated contact
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Contact"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Contacts
      summary: Delete contact
      security: *ref_1
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
          description: Contact ID
      responses:
        "200":
          description: Contact deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /contacts:
    get:
      tags:
        - Contacts
      summary: List contacts
      description: Paginated list of contacts with optional filters.
      security: *ref_1
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
        - name: offset
          in: query
          required: false
          schema:
            type: integer
        - name: source_id
          in: query
          required: false
          schema:
            type: string
        - name: company_id
          in: query
          required: false
          schema:
            type: string
        - name: event_id
          in: query
          required: false
          schema:
            type: string
        - name: assigned_to
          in: query
          required: false
          schema:
            type: string
        - name: is_client
          in: query
          required: false
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: pipeline_id
          in: query
          required: false
          schema:
            type: string
        - name: stage_id
          in: query
          required: false
          schema:
            type: string
        - name: tags
          in: query
          required: false
          schema:
            type: string
            description: Comma-separated tags
          description: Comma-separated tags
        - name: sort_by
          in: query
          required: false
          schema:
            type: string
        - name: sort_order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: Paginated contacts
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PaginatedContacts"
        "401": *ref_0
  /contacts/search:
    get:
      tags:
        - Contacts
      summary: Search contacts
      description: Full-text search across name, email, phone, and company. Minimum query length is 2 characters.
      security: *ref_1
      parameters:
        - name: query
          in: query
          required: true
          schema:
            type: string
            minLength: 2
          description: Search query
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 50
            default: 20
        - name: assigned_to
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Matching contacts ranked by relevance
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Contact"
              examples:
                results:
                  summary: Search results
                  value:
                    - id: 674a1b2c3d4e5f6789012345
                      name: Jane Smith
                      email: jane@example.com
                      tags:
                        - prospect
        "400": *ref_0
        "401": *ref_0
  /contact/{contactId}/referrals:
    get:
      tags:
        - Contacts
      summary: Get referrals
      description: Contacts referred by the given contact.
      security: *ref_1
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
          description: Contact ID
      responses:
        "200":
          description: Referral list
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReferralsResponse"
        "401": *ref_0
        "404": *ref_0
  /contacts/check-duplicates:
    get:
      tags:
        - Contacts
      summary: Check duplicates
      description: Check for existing contacts by email or phone.
      security: *ref_1
      parameters:
        - name: email
          in: query
          required: false
          schema:
            type: string
            format: email
        - name: phone
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Duplicate check result
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DuplicateCheckResponse"
        "400": *ref_0
        "401": *ref_0
  /contacts/bulk-update-tags:
    post:
      tags:
        - Contacts
      summary: Bulk update tags
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkUpdateTagsRequest"
      responses:
        "200":
          description: Tags updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  updated:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /contacts/bulk-add-event:
    post:
      tags:
        - Contacts
      summary: Bulk add to event
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkAddEventRequest"
      responses:
        "200":
          description: Contacts added to event
          content:
            application/json:
              schema:
                type: object
                properties:
                  updated:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /contacts/bulk-update-pipeline:
    post:
      tags:
        - Contacts
      summary: Bulk update pipeline
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkUpdatePipelineRequest"
      responses:
        "200":
          description: Pipeline updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  updated:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /contacts/bulk-delete:
    post:
      tags:
        - Contacts
      summary: Bulk delete contacts
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkDeleteContactsRequest"
      responses:
        "200":
          description: Contacts deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  deleted:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /contacts/export:
    post:
      tags:
        - Contacts
      summary: Export contacts
      description: Initiate an async contact export. Returns a request ID to poll for completion.
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ContactExportRequest"
      responses:
        "202":
          description: Export job accepted
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
        "400": *ref_0
        "401": *ref_0
  /company:
    post:
      tags:
        - Companies
      summary: Create company
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CompanyCreateRequest"
      responses:
        "200":
          description: Created company
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Company"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /company/{companyId}:
    get:
      tags:
        - Companies
      summary: Get company
      security: *ref_1
      parameters:
        - name: companyId
          in: path
          required: true
          schema:
            type: string
          description: Company ID
      responses:
        "200":
          description: Company details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Company"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Companies
      summary: Update company
      security: *ref_1
      parameters:
        - name: companyId
          in: path
          required: true
          schema:
            type: string
          description: Company ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CompanyUpdateRequest"
      responses:
        "200":
          description: Updated company
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Company"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Companies
      summary: Delete company
      security: *ref_1
      parameters:
        - name: companyId
          in: path
          required: true
          schema:
            type: string
          description: Company ID
      responses:
        "200":
          description: Company deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /companies:
    get:
      tags:
        - Companies
      summary: List companies
      security: *ref_1
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
        - name: sort_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - created_at
              - updated_at
              - name
        - name: sort_order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: Paginated companies
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PaginatedCompanies"
        "401": *ref_0
  /companies/search:
    get:
      tags:
        - Companies
      summary: Search companies
      security: *ref_1
      parameters:
        - name: search
          in: query
          required: true
          schema:
            type: string
          description: Search query
      responses:
        "200":
          description: Matching companies
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Company"
        "400": *ref_0
        "401": *ref_0
  /event:
    post:
      tags:
        - Events
      summary: Create event
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EventCreateRequest"
      responses:
        "200":
          description: Created event
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Event"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /event/{eventId}:
    get:
      tags:
        - Events
      summary: Get event
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
      responses:
        "200":
          description: Event details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Event"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Events
      summary: Update event
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EventUpdateRequest"
      responses:
        "200":
          description: Updated event
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Event"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Events
      summary: Delete event
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
      responses:
        "200":
          description: Event deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /events:
    get:
      tags:
        - Events
      summary: List events
      security: *ref_1
      responses:
        "200":
          description: Event list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Event"
        "401": *ref_0
  /events/search:
    get:
      tags:
        - Events
      summary: Search events
      security: *ref_1
      parameters:
        - name: search
          in: query
          required: true
          schema:
            type: string
          description: Search query
      responses:
        "200":
          description: Matching events
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Event"
        "400": *ref_0
        "401": *ref_0
  /event/{eventId}/attendance:
    get:
      tags:
        - Events
      summary: Get attendance
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
        - name: attended_date
          in: query
          required: false
          schema:
            type: string
            format: date
      responses:
        "200":
          description: Attendance records
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EventAttendance"
        "401": *ref_0
        "404": *ref_0
    post:
      tags:
        - Events
      summary: Mark attendance
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MarkAttendanceRequest"
      responses:
        "201":
          description: Attendance marked
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EventAttendance"
        "400": *ref_0
        "401": *ref_0
  /event/{eventId}/attendance/{attendanceId}:
    put:
      tags:
        - Events
      summary: Update attendance
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
        - name: attendanceId
          in: path
          required: true
          schema:
            type: string
          description: Attendance ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateAttendanceRequest"
      responses:
        "200":
          description: Updated attendance
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EventAttendance"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Events
      summary: Remove attendance
      security: *ref_1
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
          description: Event ID
        - name: attendanceId
          in: path
          required: true
          schema:
            type: string
          description: Attendance ID
      responses:
        "200":
          description: Attendance removed
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /task:
    post:
      tags:
        - Tasks
      summary: Create task
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TaskCreateRequest"
      responses:
        "200":
          description: Created task
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Task"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /task/{taskId}:
    get:
      tags:
        - Tasks
      summary: Get task
      security: *ref_1
      parameters:
        - name: taskId
          in: path
          required: true
          schema:
            type: string
          description: Task ID
      responses:
        "200":
          description: Task details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Task"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Tasks
      summary: Update task
      security: *ref_1
      parameters:
        - name: taskId
          in: path
          required: true
          schema:
            type: string
          description: Task ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TaskUpdateRequest"
      responses:
        "200":
          description: Updated task
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Task"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Tasks
      summary: Delete task
      security: *ref_1
      parameters:
        - name: taskId
          in: path
          required: true
          schema:
            type: string
          description: Task ID
        - name: delete_reason
          in: query
          required: true
          schema:
            type: string
            enum: &ref_5
              - not_relevant
              - contacted_too_many_times
              - removing_contact
              - moving_contact
              - other
        - name: delete_other_reason
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Task deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /tasks:
    get:
      tags:
        - Tasks
      summary: List tasks
      security: *ref_1
      parameters:
        - name: assigned_to
          in: query
          required: false
          schema:
            type: string
        - name: contact_id
          in: query
          required: false
          schema:
            type: string
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum: &ref_3
              - active
              - completed
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 500
            default: 500
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
        - name: sort_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - date
              - created_at
              - status
              - activity_type
              - description
        - name: sort_order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: Paginated tasks
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PaginatedTasks"
        "401": *ref_0
  /tasks/search:
    get:
      tags:
        - Tasks
      summary: Search tasks
      security: *ref_1
      parameters:
        - name: q
          in: query
          required: true
          schema:
            type: string
            minLength: 1
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            default: 50
      responses:
        "200":
          description: Matching tasks
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Task"
        "400": *ref_0
        "401": *ref_0
  /tasks/bulk-delete:
    post:
      tags:
        - Tasks
      summary: Bulk delete tasks
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkDeleteTasksRequest"
      responses:
        "200":
          description: Tasks deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  deleted:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /tasks/bulk-complete:
    post:
      tags:
        - Tasks
      summary: Bulk complete tasks
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BulkCompleteTasksRequest"
      responses:
        "200":
          description: Tasks completed
          content:
            application/json:
              schema:
                type: object
                properties:
                  completed:
                    type: integer
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline:
    post:
      tags:
        - Pipelines
      summary: Create pipeline
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineCreateRequest"
      responses:
        "200":
          description: Created pipeline
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pipeline"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline/{pipelineId}:
    get:
      tags:
        - Pipelines
      summary: Get pipeline
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      responses:
        "200":
          description: Pipeline details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pipeline"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Pipelines
      summary: Update pipeline
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineUpdateRequest"
      responses:
        "200":
          description: Updated pipeline
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pipeline"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Pipelines
      summary: Delete pipeline
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      responses:
        "200":
          description: Pipeline deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipelines:
    get:
      tags:
        - Pipelines
      summary: List pipelines
      security: *ref_1
      responses:
        "200":
          description: Pipeline list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Pipeline"
        "401": *ref_0
  /pipeline/{pipelineId}/stage:
    post:
      tags:
        - Pipelines
      summary: Create stage
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineStageCreateRequest"
      responses:
        "200":
          description: Created stage
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PipelineStage"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline/{pipelineId}/stages:
    get:
      tags:
        - Pipelines
      summary: List stages
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      responses:
        "200":
          description: Stage list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PipelineStage"
        "401": *ref_0
  /pipeline/{pipelineId}/stage/{stageId}:
    get:
      tags:
        - Pipelines
      summary: Get stage
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
        - name: stageId
          in: path
          required: true
          schema:
            type: string
          description: Stage ID
      responses:
        "200":
          description: Stage details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PipelineStage"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Pipelines
      summary: Update stage
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
        - name: stageId
          in: path
          required: true
          schema:
            type: string
          description: Stage ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineStageUpdateRequest"
      responses:
        "200":
          description: Updated stage
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PipelineStage"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Pipelines
      summary: Delete stage
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
        - name: stageId
          in: path
          required: true
          schema:
            type: string
          description: Stage ID
      responses:
        "200":
          description: Stage deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline/{pipelineId}/item:
    post:
      tags:
        - Pipelines
      summary: Create pipeline item
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineItemCreateRequest"
      responses:
        "200":
          description: Created pipeline item
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PipelineItem"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline/{pipelineId}/items:
    get:
      tags:
        - Pipelines
      summary: List pipeline items
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
      responses:
        "200":
          description: Pipeline items
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PipelineItem"
        "401": *ref_0
  /pipeline/{pipelineId}/item/{pipelineItemId}:
    put:
      tags:
        - Pipelines
      summary: Update pipeline item
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
        - name: pipelineItemId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline item ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PipelineItemUpdateRequest"
      responses:
        "200":
          description: Updated pipeline item
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PipelineItem"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Pipelines
      summary: Delete pipeline item
      security: *ref_1
      parameters:
        - name: pipelineId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline ID
        - name: pipelineItemId
          in: path
          required: true
          schema:
            type: string
          description: Pipeline item ID
      responses:
        "200":
          description: Pipeline item deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /pipeline-items/search:
    get:
      tags:
        - Pipelines
      summary: Search pipeline items
      security: *ref_1
      parameters:
        - name: contact_id
          in: query
          required: false
          schema:
            type: string
        - name: pipeline_id
          in: query
          required: false
          schema:
            type: string
        - name: stage_id
          in: query
          required: false
          schema:
            type: string
        - name: assigned_to
          in: query
          required: false
          schema:
            type: string
        - name: status
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Matching pipeline items
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PipelineItem"
        "401": *ref_0
  /campaign:
    post:
      tags:
        - Campaigns
      summary: Create campaign
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CampaignCreateRequest"
      responses:
        "200":
          description: Created campaign
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Campaign"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /campaign/{campaignId}:
    get:
      tags:
        - Campaigns
      summary: Get campaign
      security: *ref_1
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
          description: Campaign ID
      responses:
        "200":
          description: Campaign details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Campaign"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Campaigns
      summary: Update campaign
      security: *ref_1
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
          description: Campaign ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CampaignUpdateRequest"
      responses:
        "200":
          description: Updated campaign
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Campaign"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Campaigns
      summary: Delete campaign
      security: *ref_1
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
          description: Campaign ID
      responses:
        "200":
          description: Campaign deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /campaigns:
    get:
      tags:
        - Campaigns
      summary: List campaigns
      security: *ref_1
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            default: 50
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - pending
              - contact_filtering
              - contact_filtered
              - running
              - completed
              - error
      responses:
        "200":
          description: Paginated campaigns
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PaginatedCampaigns"
        "401": *ref_0
  /campaign/{campaignId}/launch:
    post:
      tags:
        - Campaigns
      summary: Launch campaign
      security: *ref_1
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
          description: Campaign ID
      responses:
        "200":
          description: Campaign launched
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Campaign"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /campaign/{campaignId}/contacts:
    get:
      tags:
        - Campaigns
      summary: Get campaign contacts
      security: *ref_1
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
          description: Campaign ID
      responses:
        "200":
          description: Campaign contacts
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Contact"
        "401": *ref_0
        "404": *ref_0
  /email-template:
    post:
      tags:
        - Email Templates
      summary: Create template
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmailTemplateCreateRequest"
      responses:
        "200":
          description: Created template
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EmailTemplate"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /email-template/{templateId}:
    get:
      tags:
        - Email Templates
      summary: Get template
      security: *ref_1
      parameters:
        - name: templateId
          in: path
          required: true
          schema:
            type: string
          description: Template ID
      responses:
        "200":
          description: Template details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EmailTemplate"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Email Templates
      summary: Update template
      security: *ref_1
      parameters:
        - name: templateId
          in: path
          required: true
          schema:
            type: string
          description: Template ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmailTemplateUpdateRequest"
      responses:
        "200":
          description: Updated template
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EmailTemplate"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Email Templates
      summary: Delete template
      security: *ref_1
      parameters:
        - name: templateId
          in: path
          required: true
          schema:
            type: string
          description: Template ID
      responses:
        "200":
          description: Template deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /email-templates:
    get:
      tags:
        - Email Templates
      summary: List templates
      security: *ref_1
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            default: 50
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
      responses:
        "200":
          description: Paginated templates
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PaginatedEmailTemplates"
        "401": *ref_0
  /email-templates/search:
    get:
      tags:
        - Email Templates
      summary: Search templates
      security: *ref_1
      parameters:
        - name: query
          in: query
          required: true
          schema:
            type: string
            minLength: 2
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 50
            default: 20
      responses:
        "200":
          description: Matching templates
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EmailTemplate"
        "401": *ref_0
  /client-type:
    post:
      tags:
        - Client Types
      summary: Create client type
      security: *ref_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ClientTypeCreateRequest"
      responses:
        "200":
          description: Created client type
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ClientType"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /client-type/{clientTypeId}:
    get:
      tags:
        - Client Types
      summary: Get client type
      security: *ref_1
      parameters:
        - name: clientTypeId
          in: path
          required: true
          schema:
            type: string
          description: Client type ID
      responses:
        "200":
          description: Client type details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ClientType"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    put:
      tags:
        - Client Types
      summary: Update client type
      security: *ref_1
      parameters:
        - name: clientTypeId
          in: path
          required: true
          schema:
            type: string
          description: Client type ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ClientTypeUpdateRequest"
      responses:
        "200":
          description: Updated client type
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ClientType"
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
    delete:
      tags:
        - Client Types
      summary: Delete client type
      security: *ref_1
      parameters:
        - name: clientTypeId
          in: path
          required: true
          schema:
            type: string
          description: Client type ID
      responses:
        "200":
          description: Client type deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
        "400": *ref_0
        "401": *ref_0
        "403": *ref_0
        "404": *ref_0
  /client-types:
    get:
      tags:
        - Client Types
      summary: List client types
      security: *ref_1
      responses:
        "200":
          description: Client type list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ClientType"
        "401": *ref_0
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: vg_ API key
      description: Bearer token in Authorization header
  responses:
    Error:
      description: Error response
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
            code:
              type: string
    Pagination:
      type: object
      properties:
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
        has_more:
          type: boolean
    PaginatedContacts:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/Contact"
        pagination:
          $ref: "#/components/schemas/Pagination"
    PaginatedCompanies:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/Company"
        pagination:
          $ref: "#/components/schemas/Pagination"
    PaginatedTasks:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/Task"
        pagination:
          $ref: "#/components/schemas/Pagination"
    PaginatedCampaigns:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/Campaign"
        pagination:
          $ref: "#/components/schemas/Pagination"
    PaginatedEmailTemplates:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/EmailTemplate"
        pagination:
          $ref: "#/components/schemas/Pagination"
    ContactBio:
      type: object
      description: Professional and business-relevant bio fields only
      properties:
        personal_info:
          type: object
          properties:
            nick_name:
              type: string
            first_name:
              type: string
            last_name:
              type: string
            middle_name:
              type: string
            suffix:
              type: string
            birth_date:
              oneOf:
                - type: string
                  maxLength: 0
                - type: string
                  format: date
            birth_place:
              type: string
            nationality:
              type: string
        social_media:
          type: object
          properties:
            facebook:
              type: string
              format: uri
            twitter:
              type: string
              format: uri
            instagram:
              type: string
              format: uri
            linkedin:
              type: string
              format: uri
            youtube:
              type: string
              format: uri
            website:
              type: string
              format: uri
            tiktok:
              type: string
              format: uri
            others:
              type: array
              items:
                type: string
        hobbies:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              description:
                type: string
              interest_score:
                type: number
                minimum: 0
                maximum: 100
        education:
          type: array
          items:
            type: object
            properties:
              school:
                type: string
              degree:
                type: string
              duration:
                type: string
              start_date:
                type: string
                format: date
              end_date:
                type: string
                format: date
        work_history:
          type: array
          items:
            type: object
            properties:
              company:
                type: string
              title:
                type: string
              duration:
                type: string
              start_date:
                type: string
                format: date
              end_date:
                type: string
                format: date
        location:
          type: object
          properties:
            city:
              type: string
            state:
              type: string
            country:
              type: string
            zip_code:
              type: string
        languages:
          type: array
          items:
            type: object
            properties:
              categories:
                type: array
                items:
                  type: string
              primary:
                type: boolean
              proficiency:
                type: number
                minimum: 0
                maximum: 100
        interests:
          type: object
          properties:
            sports:
              type: object
            music:
              type: object
            movies:
              type: object
            books:
              type: object
            others:
              type: array
              items:
                type: object
    ContactMeetingDetails:
      type: object
      properties:
        conversation_summary:
          type: array
          items: &ref_2
            type: object
            properties:
              summary:
                type: string
              timestamp:
                oneOf:
                  - type: string
                    maxLength: 0
                  - type: string
                    format: date-time
        occupation_learnings:
          type: array
          items: *ref_2
        outside_work_interests:
          type: array
          items: *ref_2
        dream:
          type: array
          items: *ref_2
    ContactFields:
      type: object
      properties:
        email:
          oneOf:
            - type: string
              maxLength: 0
            - type: string
              format: email
        name:
          type: string
        phone_numbers:
          type: array
          items:
            type: object
            properties:
              label:
                type: string
                enum:
                  - primary
                  - mobile
                  - work
                  - home
                  - fax
                  - other
              phone_number:
                type: string
            required:
              - phone_number
        external_id:
          type: string
          nullable: true
        source_id:
          type: string
        company_id:
          type: string
          nullable: true
        client_type_id:
          type: string
        is_client:
          type: boolean
        mark_as_client_on:
          type: string
          format: date-time
          nullable: true
        owned_by_id:
          type: string
        assigned_to_id:
          type: string
        referred_by:
          type: string
          nullable: true
        referred_by_on:
          type: string
          format: date-time
          nullable: true
        event_id:
          type: string
        event_ids:
          type: array
          items:
            type: string
        attached_files:
          type: array
          items:
            type: string
        tags:
          type: array
          items:
            type: string
        gender:
          type: string
        intension:
          type: string
          enum:
            - sell-right-now
            - sell-later
            - networking
            - other
            - ""
        describe_intension_reasoning:
          type: string
        met_at:
          type: string
        met_at_description:
          type: string
        meeting_details:
          $ref: "#/components/schemas/ContactMeetingDetails"
        bio:
          $ref: "#/components/schemas/ContactBio"
    ContactCreateRequest:
      allOf:
        - $ref: "#/components/schemas/ContactFields"
        - type: object
          required:
            - name
    ContactUpdateRequest:
      $ref: "#/components/schemas/ContactFields"
    Contact:
      allOf:
        - $ref: "#/components/schemas/ContactFields"
        - type: object
          properties:
            id:
              type: string
            org_id:
              type: string
            email_verified:
              type: boolean
            company:
              type: object
              nullable: true
              properties:
                id:
                  type: string
                name:
                  type: string
                email:
                  type: string
                phone:
                  type: string
                website:
                  type: string
            assigned_to:
              type: string
              nullable: true
            owned_by:
              type: string
              nullable: true
            referred_by_contact:
              type: object
              nullable: true
              properties:
                id:
                  type: string
                name:
                  type: string
                email:
                  type: string
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    ReferralsResponse:
      type: object
      properties:
        total:
          type: integer
        referrals:
          type: array
          items:
            $ref: "#/components/schemas/Contact"
    DuplicateCheckResponse:
      type: object
      properties:
        has_duplicates:
          type: boolean
        duplicates:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              email:
                type: string
    BulkUpdateTagsRequest:
      type: object
      required:
        - contact_ids
        - tags
      properties:
        contact_ids:
          type: array
          items:
            type: string
          minItems: 1
        tags:
          type: array
          items:
            type: string
          minItems: 1
        action:
          type: string
          enum:
            - add
            - remove
          default: add
    BulkAddEventRequest:
      type: object
      required:
        - contact_ids
        - event_id
      properties:
        contact_ids:
          type: array
          items:
            type: string
          minItems: 1
        event_id:
          type: string
    BulkUpdatePipelineRequest:
      type: object
      required:
        - contact_ids
        - pipeline_id
        - stage_id
      properties:
        contact_ids:
          type: array
          items:
            type: string
          minItems: 1
        pipeline_id:
          type: string
        stage_id:
          type: string
    BulkDeleteContactsRequest:
      type: object
      required:
        - contact_ids
      properties:
        contact_ids:
          type: array
          items:
            type: string
          minItems: 1
    ContactFilters:
      type: object
      properties:
        source_id:
          type: string
        company_id:
          type: string
        created_by:
          type: string
        assigned_to:
          type: string
        is_client:
          type: boolean
        event_id:
          type: string
        pipeline_id:
          type: string
        stage_id:
          type: string
        no_pipeline:
          type: boolean
        no_event:
          type: boolean
        missing_email:
          type: boolean
        missing_phone:
          type: boolean
        tags:
          type: array
          items:
            type: string
    ContactExportRequest:
      type: object
      properties:
        selection_type:
          type: string
          enum:
            - contact_list
            - filter
        contact_ids:
          type: array
          items:
            type: string
        contact_filters:
          $ref: "#/components/schemas/ContactFilters"
        excluded_contact_ids:
          type: array
          items:
            type: string
    CompanyFields:
      type: object
      properties:
        name:
          type: string
        email:
          oneOf:
            - type: string
              maxLength: 0
            - type: string
              format: email
        phone:
          type: string
        fax:
          type: string
        website:
          type: string
        linkedin:
          type: string
        location:
          type: object
          properties:
            address:
              type: string
            city:
              type: string
            state:
              type: string
            country:
              type: string
            zip:
              type: string
        industries:
          type: array
          items:
            type: string
        company_type:
          type: string
          enum:
            - public
            - private
            - government
            - ""
        employee_range:
          type: object
          properties:
            min:
              type: number
            max:
              type: number
        revenue:
          type: number
          minimum: 0
        external_id:
          type: string
          nullable: true
        description:
          type: string
        notes:
          type: string
        assigned_to:
          type: string
    CompanyCreateRequest:
      allOf:
        - $ref: "#/components/schemas/CompanyFields"
        - type: object
          required:
            - name
    CompanyUpdateRequest:
      $ref: "#/components/schemas/CompanyFields"
    Company:
      allOf:
        - $ref: "#/components/schemas/CompanyFields"
        - type: object
          properties:
            id:
              type: string
            org_id:
              type: string
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    EventFields:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        event_type:
          type: string
          enum:
            - single-day
            - multi-day
            - recurring
            - ""
        date:
          type: object
          required:
            - start
          properties:
            start:
              type: string
              format: date
            end:
              type: string
              format: date
        recurrence:
          type: object
          properties:
            frequency:
              type: string
              enum:
                - daily
                - weekly
                - monthly
                - yearly
                - ""
            interval:
              type: integer
              minimum: 1
            days_of_week:
              type: array
              items:
                type: integer
                minimum: 0
                maximum: 6
            day_of_month:
              type: integer
              nullable: true
            ends_on:
              type: string
              nullable: true
            occurrences:
              type: integer
              nullable: true
        location:
          type: string
        cost:
          type: number
          minimum: 0
        assigned_to:
          type: string
    EventCreateRequest:
      allOf:
        - $ref: "#/components/schemas/EventFields"
        - type: object
          required:
            - name
            - date
    EventUpdateRequest:
      $ref: "#/components/schemas/EventFields"
    Event:
      allOf:
        - $ref: "#/components/schemas/EventFields"
        - type: object
          properties:
            id:
              type: string
            org_id:
              type: string
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    EventAttendance:
      type: object
      properties:
        id:
          type: string
        event_id:
          type: string
        user_id:
          type: string
        attended_date:
          type: string
          format: date
        notes:
          type: string
        marked_by:
          type: string
        created_at:
          type: string
          format: date-time
    MarkAttendanceRequest:
      type: object
      required:
        - attended_date
      properties:
        attended_date:
          type: string
          format: date
          description: Date in YYYY-MM-DD format
        notes:
          type: string
    UpdateAttendanceRequest:
      type: object
      properties:
        notes:
          type: string
    TaskCreateRequest:
      type: object
      required:
        - description
        - date
        - activity_type
      properties:
        company_id:
          type: string
        contact_id:
          type: string
        pipeline_item_id:
          type: string
        description:
          type: string
        activity_type:
          type: string
          enum: &ref_4
            - call
            - sms
            - email
            - marketing_email
            - social_engagement
            - meeting
            - visit
            - lunch
            - dinner
            - recreation
            - market_research
            - event_and_networking
            - brand_visibility
            - referral_expansion
            - partnership_ecosystem
            - webinar
            - group_video_calls
            - one_to_many_outreach
            - event_register
            - event_attendance
            - follow_up
            - calendar_event
            - note
            - contact_created
            - contact_updated
            - pipeline_item_created
            - pipeline_item_updated
            - event_created
            - company_created
            - task
          default: task
        date:
          type: string
          format: date-time
        assigned_to:
          type: string
        status:
          type: string
          enum: *ref_3
          default: active
    TaskUpdateRequest:
      type: object
      properties:
        company_id:
          type: string
        contact_id:
          type: string
        pipeline_item_id:
          type: string
        description:
          type: string
        activity_type:
          type: string
          enum: *ref_4
        date:
          oneOf:
            - type: string
              maxLength: 0
            - type: string
              format: date-time
        assigned_to:
          type: string
        status:
          type: string
          enum: *ref_3
        task_result_description:
          type: string
    Task:
      type: object
      properties:
        id:
          type: string
        org_id:
          type: string
        description:
          type: string
        activity_type:
          type: string
          enum: *ref_4
        date:
          type: string
          format: date-time
        status:
          type: string
          enum: *ref_3
        contact_id:
          type: string
        company_id:
          type: string
        pipeline_item_id:
          type: string
        assigned_to:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    BulkDeleteTasksRequest:
      type: object
      required:
        - task_ids
        - delete_reason
      properties:
        task_ids:
          type: array
          items:
            type: string
          minItems: 1
        delete_reason:
          type: string
          enum: *ref_5
        delete_other_reason:
          type: string
    BulkCompleteTasksRequest:
      type: object
      required:
        - task_ids
      properties:
        task_ids:
          type: array
          items:
            type: string
          minItems: 1
    PipelineCreateRequest:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        description:
          type: string
        settings:
          type: object
    PipelineUpdateRequest:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        settings:
          type: object
    Pipeline:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        order:
          type: integer
        settings:
          type: object
        org_id:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    PipelineStageCreateRequest:
      type: object
      required:
        - name
        - order
      properties:
        name:
          type: string
        order:
          type: number
        markAsClient:
          type: boolean
        generateActivityOnEntry:
          type: boolean
        activityFrequency:
          type: object
        automation:
          type: object
    PipelineStageUpdateRequest:
      $ref: "#/components/schemas/PipelineStageCreateRequest"
    PipelineStage:
      type: object
      properties:
        id:
          type: string
        pipeline_id:
          type: string
        name:
          type: string
        order:
          type: number
        markAsClient:
          type: boolean
        generateActivityOnEntry:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    PipelineItemCreateRequest:
      type: object
      required:
        - contact_id
        - pipeline_id
        - stage_id
      properties:
        contact_id:
          type: string
        pipeline_id:
          type: string
        stage_id:
          type: string
        status:
          type: string
        notes:
          type: string
        assigned_to:
          type: string
        value:
          type: number
          minimum: 0
        client_type_id:
          type: string
    PipelineItemUpdateRequest:
      $ref: "#/components/schemas/PipelineItemCreateRequest"
    PipelineItem:
      type: object
      properties:
        id:
          type: string
        contact_id:
          type: string
        pipeline_id:
          type: string
        stage_id:
          type: string
        status:
          type: string
        notes:
          type: string
        value:
          type: number
        assigned_to:
          type: string
        org_id:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    CampaignFields:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        campaign_type:
          type: string
          enum:
            - daily_activity
            - marketing_email
        date:
          type: string
          format: date-time
        email_template_id:
          type: string
        email_subject:
          type: string
        email_body:
          type: string
        selection_type:
          type: string
          enum:
            - contact_list
            - filter
            - ""
        contact_list:
          type: array
          items:
            oneOf:
              - type: string
              - type: object
                required:
                  - contact_id
                properties:
                  contact_id:
                    type: string
                  task_id:
                    type: string
        contact_filters:
          $ref: "#/components/schemas/ContactFilters"
        excluded_contact_ids:
          type: array
          items:
            type: string
    CampaignCreateRequest:
      allOf:
        - $ref: "#/components/schemas/CampaignFields"
        - type: object
          required:
            - name
    CampaignUpdateRequest:
      allOf:
        - $ref: "#/components/schemas/CampaignFields"
        - type: object
          properties:
            status:
              type: string
              enum:
                - pending
                - contact_filtering
                - contact_filtered
                - running
                - completed
                - error
            error:
              type: string
              nullable: true
    Campaign:
      allOf:
        - $ref: "#/components/schemas/CampaignUpdateRequest"
        - type: object
          properties:
            id:
              type: string
            org_id:
              type: string
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    EmailTemplateFields:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        subject:
          type: string
        body:
          type: string
        content_type:
          type: string
          enum:
            - visual
            - html
            - unlayer
        design_json:
          type: object
        attachments:
          type: array
          items:
            type: object
            properties:
              file_id:
                type: string
              filename:
                type: string
              cid:
                type: string
              is_inline:
                type: boolean
        assigned_to:
          type: string
    EmailTemplateCreateRequest:
      allOf:
        - $ref: "#/components/schemas/EmailTemplateFields"
        - type: object
          required:
            - name
            - subject
    EmailTemplateUpdateRequest:
      $ref: "#/components/schemas/EmailTemplateFields"
    EmailTemplate:
      allOf:
        - $ref: "#/components/schemas/EmailTemplateFields"
        - type: object
          properties:
            id:
              type: string
            org_id:
              type: string
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    ClientTypeCreateRequest:
      type: object
      required:
        - name
      properties:
        name:
          type: string
          minLength: 1
        description:
          type: string
    ClientTypeUpdateRequest:
      $ref: "#/components/schemas/ClientTypeCreateRequest"
    ClientType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        org_id:
          type: string
        created_at:
          type: string
          format: date-time
