> ## Documentation Index
> Fetch the complete documentation index at: https://docs.neoagent.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Turn the Neo panel in ConnectWise tickets on or off

> `{"enabled": true}` creates Neo's Manage Hosted API row in the tenant's ConnectWise (a pod 700 high on the Service Ticket screen, at every location), or sets its URL and origin right and switches it back on, keeping the MSP's description, type, height and locations. It is safe to repeat and also repairs the row. When Neo has no row yet and ConnectWise has one row of the older Neo pod at pod.neoagent.io on the Service Ticket screen, enabling moves that row to the new panel in place: it changes only the row's URL and origin and switches it on, and keeps its description, type, height and locations. An old pod row beside Neo's row stays as it is. `{"enabled": false}` switches the row off and keeps it. Neo never changes another row. Needs a tenant admin. Returns the new state. `400` on any other body; `403` without an admin; `404 integration_not_connected` when the tenant's connected PSA is not ConnectWise; `409 connectwise_neo_panel_refused` when ConnectWise refuses the change, with `details.reason` `PERMISSION` (the API member's security role lacks Table Setup Add and Edit; the message says what to fix), `NOT_SUPPORTED` (this ConnectWise has no Manage Hosted API endpoint; the message gives the steps to add the row by hand), `SEVERAL_OLD_POD_ROWS` (ConnectWise has several old pod rows; Neo writes none, and the message lists them and asks the admin to keep one) or `CONNECTWISE_REFUSED`.



## OpenAPI

````yaml https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/connectwise-neo-panel
openapi: 3.1.0
info:
  description: >-
    Neo's public contract for the dashboard ChatAgent, partner integrations, and
    MSP automation. Every response is wrapped in a `{data, meta}` envelope;
    errors use `{error: {code, message, details?}, meta: {request_id}}`.
    Authenticate with a `Bearer neo_sk_<env>_<secret>` API key (service account)
    or a Microsoft Entra ID JWT (dashboard user). Signed-URL endpoints (end-user
    feedback links) take a `signature` query parameter instead.
  title: Neo Public API
  version: 1.0.0
servers:
  - url: https://api.neoagent.io
security: []
tags:
  - description: Service metadata — health, OpenAPI.
    name: Meta
  - description: Agents and workflows — read, version history, delete, stats.
    name: Agents
  - description: Agent/workflow execution history, sub-resources, retry/cancel.
    name: Executions
  - description: >-
      Every tool call the tenant's agents made in the last 30 days, within the
      caller's workflow access.
    name: Audit Log
  - description: PSA webhook events and their workflow-match results.
    name: Callbacks
  - description: Technician-in-the-loop approval requests.
    name: TIL requests
  - description: RMM script executions triggered by agents.
    name: RMM scripts
  - description: Dispatch-agent field-update decisions.
    name: Dispatch
  - description: The authenticated tenant.
    name: Tenant
  - description: Agent-builder schema catalogs (raw JSON payloads).
    name: Schemas
  - description: Escalate to the Neo team (HubSpot ticket).
    name: Escalation
  - description: Tenant settings.
    name: Settings
  - description: Tenant API-key management (dashboard JWT only).
    name: API keys
  - description: End-user feedback links (signed-URL auth).
    name: Feedback
  - description: End-client companies (CRUD + bulk-update).
    name: End companies
  - description: Channels — bind a CONVERSATIONAL agent to a transport (Teams or Slack).
    name: Channels
  - description: PSA/RMM/M365 integration status and connection management.
    name: Integrations
  - description: Technician roster (controls TIL routing and paging).
    name: Technicians
  - description: Future runs queued for TRIGGERED agents.
    name: Scheduled work
  - description: Subscription state and customer-facing credit usage (no provider $).
    name: Billing
  - description: Inbox messages and announcements.
    name: Inbox & Comms
  - description: Tenant-authored agent skills (CRUD) and the built-in skill catalog.
    name: Skills
paths:
  /public-api/integrations/connectwise-neo-panel:
    put:
      tags:
        - Integrations
      summary: Turn the Neo panel in ConnectWise tickets on or off
      description: >-
        `{"enabled": true}` creates Neo's Manage Hosted API row in the tenant's
        ConnectWise (a pod 700 high on the Service Ticket screen, at every
        location), or sets its URL and origin right and switches it back on,
        keeping the MSP's description, type, height and locations. It is safe to
        repeat and also repairs the row. When Neo has no row yet and ConnectWise
        has one row of the older Neo pod at pod.neoagent.io on the Service
        Ticket screen, enabling moves that row to the new panel in place: it
        changes only the row's URL and origin and switches it on, and keeps its
        description, type, height and locations. An old pod row beside Neo's row
        stays as it is. `{"enabled": false}` switches the row off and keeps it.
        Neo never changes another row. Needs a tenant admin. Returns the new
        state. `400` on any other body; `403` without an admin; `404
        integration_not_connected` when the tenant's connected PSA is not
        ConnectWise; `409 connectwise_neo_panel_refused` when ConnectWise
        refuses the change, with `details.reason` `PERMISSION` (the API member's
        security role lacks Table Setup Add and Edit; the message says what to
        fix), `NOT_SUPPORTED` (this ConnectWise has no Manage Hosted API
        endpoint; the message gives the steps to add the row by hand),
        `SEVERAL_OLD_POD_ROWS` (ConnectWise has several old pod rows; Neo writes
        none, and the message lists them and asks the admin to keep one) or
        `CONNECTWISE_REFUSED`.
      operationId: public_api.connectwise_neo_panel_update_put
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicConnectWiseNeoPanelUpdate'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/PublicConnectWiseNeoPanel'
                  meta:
                    $ref: '#/components/schemas/SuccessMeta'
                required:
                  - data
                  - meta
                type: object
          description: Success.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Bad request — malformed input.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Unauthenticated — missing or invalid credentials.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Forbidden — authenticated but not allowed.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Not found.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Conflict — the resource is in a state that blocks this operation.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Request validation failed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Rate limited — see Retry-After.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Internal server error.
      security:
        - bearerAuth: []
components:
  schemas:
    PublicConnectWiseNeoPanelUpdate:
      properties:
        enabled:
          title: Enabled
          type: boolean
      required:
        - enabled
      title: PublicConnectWiseNeoPanelUpdate
      type: object
    PublicConnectWiseNeoPanel:
      properties:
        active:
          title: Active
          type: boolean
        connectwise_steps:
          items:
            type: string
          title: Connectwise Steps
          type: array
        description:
          title: Description
          type: string
        duplicate_rows:
          title: Duplicate Rows
          type: integer
        enabled:
          title: Enabled
          type: boolean
        installed:
          title: Installed
          type: boolean
        old_pod_row:
          title: Old Pod Row
          type: boolean
        old_pod_row_id:
          anyOf:
            - type: integer
            - type: 'null'
          title: Old Pod Row Id
        old_pod_row_ids:
          items:
            type: integer
          title: Old Pod Row Ids
          type: array
        state:
          enum:
            - 'OFF'
            - 'ON'
            - NEEDS_REPAIR
          title: State
          type: string
        turn_on_blocked_by_old_rows:
          title: Turn On Blocked By Old Rows
          type: boolean
        turn_on_moves_old_row:
          title: Turn On Moves Old Row
          type: boolean
        up_to_date:
          title: Up To Date
          type: boolean
        url:
          title: Url
          type: string
      required:
        - state
        - enabled
        - description
        - url
        - installed
        - active
        - up_to_date
        - duplicate_rows
        - old_pod_row
        - old_pod_row_ids
        - old_pod_row_id
        - turn_on_moves_old_row
        - turn_on_blocked_by_old_rows
        - connectwise_steps
      title: PublicConnectWiseNeoPanel
      type: object
    SuccessMeta:
      properties:
        pagination:
          $ref: '#/components/schemas/Pagination'
        request_id:
          format: uuid
          type: string
        timings_ms:
          additionalProperties:
            type: number
          type: object
        warnings:
          description: >-
            Non-fatal warnings about the created/updated resource (e.g. an
            unhealthy PSA callback).
          items:
            type: string
          type: array
      required:
        - request_id
        - timings_ms
      type: object
    ErrorEnvelope:
      properties:
        error:
          properties:
            code:
              description: Stable machine-readable error code.
              type: string
            details:
              additionalProperties: true
              type: object
            message:
              type: string
          required:
            - code
            - message
          type: object
        meta:
          properties:
            request_id:
              format: uuid
              type:
                - string
                - 'null'
          type: object
      required:
        - error
        - meta
      type: object
    Pagination:
      properties:
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
      required:
        - next_cursor
        - has_more
      type: object
  securitySchemes:
    bearerAuth:
      description: >-
        `Authorization: Bearer <token>` where `<token>` is either a
        `neo_sk_<env>_<secret>` API key (service account) or a Microsoft Entra
        ID access token (dashboard user).
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.