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

# List an end user's tickets (Teams Tickets tab)

> Serves the "Tickets" tab of a white-label Teams app: the signed-in end user's open tickets, and those closed in the last `closed_window_days` days, read live from the PSA. Not called with a Neo API key: the `Authorization: Bearer` token is the Teams tab SSO token that Microsoft Teams issues to the tab, and it identifies the user and their Microsoft 365 tenant. Returns 401 for an invalid token, 404 `channel_not_found` when the channel's app is not installed in that tenant or has the tab switched off, 409 `end_company_not_mapped` when the tenant is not linked to one of the MSP's companies, and 429 past 30 requests a minute per user. `state` is `NO_CONTACT` when no PSA contact at the user's company has their email address.



## OpenAPI

````yaml https://api.neoagent.io/public-api/openapi.json get /public-api/end-user/tickets
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/end-user/tickets:
    get:
      tags:
        - End users
      summary: List an end user's tickets (Teams Tickets tab)
      description: >-
        Serves the "Tickets" tab of a white-label Teams app: the signed-in end
        user's open tickets, and those closed in the last `closed_window_days`
        days, read live from the PSA. Not called with a Neo API key: the
        `Authorization: Bearer` token is the Teams tab SSO token that Microsoft
        Teams issues to the tab, and it identifies the user and their Microsoft
        365 tenant. Returns 401 for an invalid token, 404 `channel_not_found`
        when the channel's app is not installed in that tenant or has the tab
        switched off, 409 `end_company_not_mapped` when the tenant is not linked
        to one of the MSP's companies, and 429 past 30 requests a minute per
        user. `state` is `NO_CONTACT` when no PSA contact at the user's company
        has their email address.
      operationId: public_api.end_user_tickets_list_get
      parameters:
        - description: The white-label Teams channel whose app hosts the tab.
          in: query
          name: channel_id
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/EndUserTicketsResponse'
                  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: []
components:
  schemas:
    EndUserTicketsResponse:
      properties:
        closed_window_days:
          title: Closed Window Days
          type: integer
        open:
          items:
            $ref: '#/components/schemas/EndUserTicket'
          title: Open
          type: array
        recently_closed:
          items:
            $ref: '#/components/schemas/EndUserTicket'
          title: Recently Closed
          type: array
        state:
          enum:
            - OK
            - NO_CONTACT
          title: State
          type: string
      required:
        - state
        - open
        - recently_closed
        - closed_window_days
      title: EndUserTicketsResponse
      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
    EndUserTicket:
      properties:
        closed_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Closed At
        created_at:
          format: date-time
          title: Created At
          type: string
        reference:
          title: Reference
          type: string
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
        ticket_id:
          title: Ticket Id
          type: string
        title:
          title: Title
          type: string
        updated_at:
          format: date-time
          title: Updated At
          type: string
        url:
          anyOf:
            - type: string
            - type: 'null'
          title: Url
      required:
        - ticket_id
        - reference
        - title
        - status
        - created_at
        - updated_at
        - closed_at
        - url
      title: EndUserTicket
      type: object
    Pagination:
      properties:
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
      required:
        - next_cursor
        - has_more
      type: object

````