> ## 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.

# A completed problem map

> The full map as the dashboard shows it: the desk's volume and Neo's share, and each recurring problem ranked by technician hours, with its runbook, what stays human, readiness, Neo's share and example tickets. The map `analysis_id` names, else the latest whole-desk map. 404 when there is none, or it is not the tenant's or not complete.



## OpenAPI

````yaml https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/result
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/insights/problems/result:
    get:
      tags:
        - Insights
      summary: A completed problem map
      description: >-
        The full map as the dashboard shows it: the desk's volume and Neo's
        share, and each recurring problem ranked by technician hours, with its
        runbook, what stays human, readiness, Neo's share and example tickets.
        The map `analysis_id` names, else the latest whole-desk map. 404 when
        there is none, or it is not the tenant's or not complete.
      operationId: public_api.insights_problem_result_get
      parameters:
        - description: 'Optional: the map to read. Default: the latest whole-desk map.'
          in: query
          name: analysis_id
          required: false
          schema:
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/ProblemMapResult'
                  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:
    ProblemMapResult:
      properties:
        analysis_id:
          title: Analysis Id
          type: integer
        completed_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Completed At
        excluded_psa_company_ids:
          items:
            type: string
          title: Excluded Psa Company Ids
          type: array
        map:
          $ref: '#/components/schemas/ProblemMap'
        months:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Months
        period_days:
          title: Period Days
          type: integer
        psa_company_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Psa Company Id
      required:
        - analysis_id
        - period_days
        - psa_company_id
        - months
        - excluded_psa_company_ids
        - completed_at
        - map
      title: ProblemMapResult
      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
    ProblemMap:
      description: >-
        The whole map, as the dashboard shows it: the desk's volume and Neo's
        share over the window, and the

        recurring `problems` that hold `clustered_share_pct` of the tickets; the
        rest is the long tail.
      properties:
        analysis_company_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Analysis Company Id
        analysis_company_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Analysis Company Name
        analysis_months:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Analysis Months
        clustered_share_pct:
          title: Clustered Share Pct
          type: number
        excluded_company_ids:
          items:
            type: string
          title: Excluded Company Ids
          type: array
        excluded_company_names:
          items:
            type: string
          title: Excluded Company Names
          type: array
        hours_coverage_pct:
          title: Hours Coverage Pct
          type: number
        hours_logged_per_month:
          title: Hours Logged Per Month
          type: number
        long_tail_neo_share_pct:
          title: Long Tail Neo Share Pct
          type: number
        long_tail_neo_touched_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Long Tail Neo Touched Pct
        long_tail_share_pct:
          title: Long Tail Share Pct
          type: number
        median_hours_per_ticket:
          anyOf:
            - type: number
            - type: 'null'
          title: Median Hours Per Ticket
        msp_name:
          title: Msp Name
          type: string
        neo_share_before_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Share Before Pct
        neo_share_by_month:
          items:
            $ref: '#/components/schemas/ProblemMapMonth'
          title: Neo Share By Month
          type: array
        neo_share_pct:
          title: Neo Share Pct
          type: number
        neo_share_recent_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Share Recent Pct
        neo_touched_before_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Before Pct
        neo_touched_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Pct
        neo_touched_recent_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Recent Pct
        population_tickets:
          title: Population Tickets
          type: integer
        problems:
          items:
            $ref: '#/components/schemas/ProblemMapProblem'
          title: Problems
          type: array
        sample_size:
          title: Sample Size
          type: integer
        sample_strata:
          items:
            $ref: '#/components/schemas/ProblemMapStratum'
          title: Sample Strata
          type: array
        tickets_last_30_days:
          title: Tickets Last 30 Days
          type: integer
        tickets_per_month:
          title: Tickets Per Month
          type: number
        total_estimated_opportunity_hours_per_month:
          title: Total Estimated Opportunity Hours Per Month
          type: number
        total_opportunity_hours_per_month:
          title: Total Opportunity Hours Per Month
          type: number
        window_end:
          title: Window End
          type: string
        window_months:
          title: Window Months
          type: number
        window_start:
          title: Window Start
          type: string
      required:
        - msp_name
        - population_tickets
        - sample_size
        - sample_strata
        - window_months
        - window_start
        - window_end
        - tickets_per_month
        - tickets_last_30_days
        - neo_share_pct
        - neo_share_recent_pct
        - neo_share_before_pct
        - neo_touched_pct
        - neo_touched_recent_pct
        - neo_touched_before_pct
        - neo_share_by_month
        - hours_coverage_pct
        - median_hours_per_ticket
        - hours_logged_per_month
        - total_opportunity_hours_per_month
        - total_estimated_opportunity_hours_per_month
        - clustered_share_pct
        - long_tail_share_pct
        - long_tail_neo_share_pct
        - long_tail_neo_touched_pct
        - analysis_company_id
        - analysis_company_name
        - analysis_months
        - excluded_company_ids
        - excluded_company_names
        - problems
      title: ProblemMap
      type: object
    Pagination:
      properties:
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
      required:
        - next_cursor
        - has_more
      type: object
    ProblemMapMonth:
      description: >-
        Neo's share of one month's tickets: `resolved_pct` closed by Neo,
        `touched_pct` with a finished Neo run.
      properties:
        month:
          title: Month
          type: string
        resolved_pct:
          title: Resolved Pct
          type: number
        tickets:
          title: Tickets
          type: number
        touched_pct:
          title: Touched Pct
          type: number
      required:
        - month
        - tickets
        - resolved_pct
        - touched_pct
      title: ProblemMapMonth
      type: object
    ProblemMapProblem:
      description: >-
        One recurring problem, ranked by the technician hours it takes a month.
        Volume is extrapolated from the

        sample; hours come from tickets with PSA time entries
        (`hours_coverage_pct` says how many), so they are a

        floor when that is low. `opportunity_hours_per_month` is the hours
        technicians logged on it a month;

        `estimated_opportunity_hours_per_month` adds the median for tickets
        without time (`estimate_basis`).

        `neo_share_*` is the share Neo closed, `neo_touched_*` the share with a
        finished Neo run; `_recent` is the

        last 30 days of the window and `_before` the rest, null on too few
        tickets. `what_technicians_do_today` is the

        runbook; `missing_integrations` names systems no Neo integration reaches
        and `integrations_to_connect` the Neo

        integrations still to connect (`connect_integrations` the same with
        their ids), so the problem is ready for an

        agent when both are empty; null on maps stored before the check.
        `problem_id` is the

        id `GET /insights/problems/coverage` and
        `/insights/problems/{problem_id}/tickets` take.
      properties:
        category:
          $ref: '#/components/schemas/InsightsCategory'
        connect_integrations:
          anyOf:
            - items:
                $ref: '#/components/schemas/ProblemMapIntegration'
              type: array
            - type: 'null'
          title: Connect Integrations
        estimate_basis:
          $ref: '#/components/schemas/HoursEstimateBasis'
        estimated_opportunity_hours_per_month:
          title: Estimated Opportunity Hours Per Month
          type: number
        example_tickets:
          items:
            $ref: '#/components/schemas/ProblemMapExampleTicket'
          title: Example Tickets
          type: array
        hours_coverage_pct:
          title: Hours Coverage Pct
          type: number
        hours_logged_per_month:
          title: Hours Logged Per Month
          type: number
        integrations_to_connect:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Integrations To Connect
        machine_generated:
          title: Machine Generated
          type: boolean
        manual_tickets_per_month:
          title: Manual Tickets Per Month
          type: number
        median_hours_per_ticket:
          anyOf:
            - type: number
            - type: 'null'
          title: Median Hours Per Ticket
        missing_integrations:
          items:
            type: string
          title: Missing Integrations
          type: array
        name:
          title: Name
          type: string
        neo_share_before_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Share Before Pct
        neo_share_pct:
          title: Neo Share Pct
          type: number
        neo_share_recent_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Share Recent Pct
        neo_touched_before_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Before Pct
        neo_touched_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Pct
        neo_touched_recent_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Neo Touched Recent Pct
        opportunity_hours_per_month:
          title: Opportunity Hours Per Month
          type: number
        problem_id:
          anyOf:
            - type: integer
            - type: 'null'
          title: Problem Id
        psa_categories:
          items:
            type: string
          title: Psa Categories
          type: array
        rank:
          title: Rank
          type: integer
        sample_tickets:
          title: Sample Tickets
          type: integer
        tickets_last_30_days:
          title: Tickets Last 30 Days
          type: number
        tickets_per_month:
          title: Tickets Per Month
          type: number
        tools_needed:
          items:
            type: string
          title: Tools Needed
          type: array
        vendor_or_product:
          anyOf:
            - type: string
            - type: 'null'
          title: Vendor Or Product
        what_stays_human:
          title: What Stays Human
          type: string
        what_technicians_do_today:
          items:
            type: string
          title: What Technicians Do Today
          type: array
      required:
        - rank
        - problem_id
        - name
        - vendor_or_product
        - category
        - machine_generated
        - sample_tickets
        - tickets_per_month
        - tickets_last_30_days
        - neo_share_pct
        - neo_share_recent_pct
        - neo_share_before_pct
        - neo_touched_pct
        - neo_touched_recent_pct
        - neo_touched_before_pct
        - manual_tickets_per_month
        - hours_coverage_pct
        - median_hours_per_ticket
        - hours_logged_per_month
        - opportunity_hours_per_month
        - estimated_opportunity_hours_per_month
        - estimate_basis
        - what_technicians_do_today
        - what_stays_human
        - tools_needed
        - missing_integrations
        - integrations_to_connect
        - connect_integrations
        - example_tickets
        - psa_categories
      title: ProblemMapProblem
      type: object
    ProblemMapStratum:
      description: >-
        One part of the sample: tickets a tool raised (alerts) or tickets a
        person raised, with how many the window

        holds and how many were read.
      properties:
        kind:
          $ref: '#/components/schemas/SampleStratumKind'
        population:
          title: Population
          type: integer
        sample_size:
          title: Sample Size
          type: integer
      required:
        - kind
        - population
        - sample_size
      title: ProblemMapStratum
      type: object
    InsightsCategory:
      enum:
        - Password Resets
        - User Onboarding
        - User Offboarding
        - User Account Changes
        - M365 Licensing
        - Software Licences & Renewals
        - Shared Mailbox & Permissions
        - File & SharePoint Access
        - Email Delivery Issues
        - Ticket Triage
        - Ticket Dispatch
        - Customer Follow-up
        - Ticket Escalation
        - Duplicate Tickets
        - Software Installation
        - Connectivity / Network
        - Printer Issues
        - Backup / DR
        - Security Alerts
        - Security Policy Changes
        - General How-To / Training
        - Hardware Issues
        - Device Retirement
        - Monitoring / RMM Alerts
        - Other
      title: InsightsCategory
      type: string
    ProblemMapIntegration:
      description: >-
        A Neo integration the problem's steps use that the tenant has not
        connected.
      properties:
        id:
          title: Id
          type: string
        name:
          title: Name
          type: string
      required:
        - id
        - name
      title: ProblemMapIntegration
      type: object
    HoursEstimateBasis:
      description: >-
        Which median priced the tickets without a time entry in an estimated
        hours figure.
      enum:
        - PROBLEM_MEDIAN
        - DESK_MEDIAN
        - NONE
      title: HoursEstimateBasis
      type: string
    ProblemMapExampleTicket:
      description: A ticket of the problem, as the PSA names it.
      properties:
        psa_id:
          title: Psa Id
          type: string
        ticket_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Ticket Number
        title:
          title: Title
          type: string
        url:
          anyOf:
            - type: string
            - type: 'null'
          title: Url
      required:
        - psa_id
        - title
        - url
        - ticket_number
      title: ProblemMapExampleTicket
      type: object
    SampleStratumKind:
      description: >-
        The two halves the sample is drawn from separately: alert streams and
        tickets people raise.


        A PSA contact on the ticket is the discriminator. Alerts, reports and
        system mail carry none

        (95% of no-contact tickets on the reference tenant sit in alert queues);
        a person asking for

        help is the contact. The split is not perfect, and the LLM card still
        judges

        `machine_generated` per problem; the strata only decide how much of the
        sample each half gets.
      enum:
        - NO_CONTACT
        - CONTACT
      title: SampleStratumKind
      type: string
  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.