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

# Match technicians to Slack users again

> Reads the Slack workspace's members and links each technician to the one member with the same email, replacing the stored links. Guests, bots, deactivated members and members whose email Slack has not confirmed never link; a technician two members match, or a member two technicians match, gets no link. Answers the links and each unmatched technician with its reason. A technician whose PSA email could not be read keeps their link. 409 when the Neo Slack app is not installed, or while another match for the workspace is writing; 502 when Slack refuses the member list (the message names Slack's code) or Slack or the PSA takes too long to answer; the stored links stay. Neo also matches after each technician sync.



## OpenAPI

````yaml https://api.neoagent.io/public-api/openapi.json post /public-api/technicians/slack-links/refresh
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/technicians/slack-links/refresh:
    post:
      tags:
        - Technicians
      summary: Match technicians to Slack users again
      description: >-
        Reads the Slack workspace's members and links each technician to the one
        member with the same email, replacing the stored links. Guests, bots,
        deactivated members and members whose email Slack has not confirmed
        never link; a technician two members match, or a member two technicians
        match, gets no link. Answers the links and each unmatched technician
        with its reason. A technician whose PSA email could not be read keeps
        their link. 409 when the Neo Slack app is not installed, or while
        another match for the workspace is writing; 502 when Slack refuses the
        member list (the message names Slack's code) or Slack or the PSA takes
        too long to answer; the stored links stay. Neo also matches after each
        technician sync.
      operationId: public_api.technicians_slack_links_refresh_post
      parameters: []
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/TechnicianSlackLinksRefreshOut'
                  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:
    TechnicianSlackLinksRefreshOut:
      properties:
        links:
          items:
            $ref: '#/components/schemas/TechnicianSlackLinkOut'
          title: Links
          type: array
        unmatched:
          items:
            $ref: '#/components/schemas/UnmatchedSlackTechnicianOut'
          title: Unmatched
          type: array
        workspace:
          anyOf:
            - $ref: '#/components/schemas/SlackWorkspaceOut'
            - type: 'null'
      required:
        - workspace
        - links
        - unmatched
      title: TechnicianSlackLinksRefreshOut
      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
    TechnicianSlackLinkOut:
      description: >-
        A technician and the Slack user with the same email in the Neo Slack
        workspace.
      properties:
        email:
          title: Email
          type: string
        slack_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Slack Name
        slack_user_id:
          title: Slack User Id
          type: string
        technician_id:
          title: Technician Id
          type: integer
      required:
        - technician_id
        - slack_user_id
        - slack_name
        - email
      title: TechnicianSlackLinkOut
      type: object
    UnmatchedSlackTechnicianOut:
      properties:
        reason:
          enum:
            - NO_EMAIL
            - NO_SLACK_USER
            - SHARED_SLACK_USER
            - SEVERAL_SLACK_USERS
            - PSA_EMAIL_UNREAD
          title: Reason
          type: string
        technician_id:
          title: Technician Id
          type: integer
        technician_name:
          title: Technician Name
          type: string
      required:
        - technician_id
        - technician_name
        - reason
      title: UnmatchedSlackTechnicianOut
      type: object
    SlackWorkspaceOut:
      description: The MSP's own Slack workspace, where the Neo Slack app is installed.
      properties:
        team_id:
          title: Team Id
          type: string
        team_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Team Name
      required:
        - team_id
        - team_name
      title: SlackWorkspaceOut
      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.