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

# List time entries

> PSA time entries logged on service tickets across every ticket (ConnectWise, Halo and Autotask), newest first, with hour totals across every matching entry. Filter by technician name, date range (up to 92 days, default the last 30), work type, billing status, PSA or company. Entries on tickets MSPortal has not synced or that belong to no client are left out; project time is under /projects/{id}/time-entries. `entryKind` adds Autotask internal time and time off (permission read_staff_time); they belong to no company, so `companyId` narrows ticket time only. Staff only; requires `analytics.read`, read_technician_performance, read_tickets and the psa_time_entries feature.



## OpenAPI

````yaml /openapi.json get /api/public/v1/analytics/time-entries
openapi: 3.0.3
info:
  title: MSPortal Public API
  version: 1.0.0
  description: >-
    Public API for MSPortal - provides programmatic access to tenant data.


    ## Authentication


    All endpoints require authentication via API key passed as a Bearer token:


    ```

    Authorization: Bearer <your-api-key>

    ```


    API keys can be created in the MSPortal dashboard under Settings →
    Integrations → API Access.


    **Important:** Do not include cookies in API requests. The public API uses
    stateless authentication only.


    ## Scopes


    API keys are granted specific scopes that determine what operations they can
    perform. Each endpoint documents its required scope(s).


    ## Rate Limiting


    API calls are rate limited per API key. Rate limit information is returned
    in response headers:


    - `X-RateLimit-Limit`: Maximum requests per minute

    - `X-RateLimit-Remaining`: Remaining requests in current window

    - `X-RateLimit-Reset`: When the rate limit resets (ISO 8601)


    ## Request ID


    All responses include an `X-Request-Id` header for debugging and support.
    You can also pass your own `X-Request-Id` header to correlate requests.
  contact:
    name: MSPortal Support
    email: support@msportal.ai
  license:
    name: Proprietary
servers:
  - url: https://app.msportal.ai
    description: Production (US)
  - url: https://eu.msportal.ai
    description: Production (EU)
security:
  - BearerAuth: []
tags:
  - name: Budgets
    description: >-
      Budget management - create, track, and forecast budgets with line items,
      categories, and products
  - name: Calendar
    description: Calendar and meeting management - events, participants, and meeting types
  - name: Companies
    description: Company management endpoints
  - name: Company Users
    description: Company user management - client portal contacts (read-only, paginated)
  - name: Compliance
    description: Compliance check management - runs, assigned checks, and status updates
  - name: Dashboards
    description: Dashboard management - external iframe resources and internal dashboards
  - name: Devices
    description: Device management - inventory, types, and locations
  - name: Goals
    description: Goal management - create, track, and manage goals with tasks and updates
  - name: NPS Surveys
    description: >-
      NPS survey management - Net Promoter Score surveys, responses, and
      analytics
  - name: Reports
    description: >-
      Report management - create, manage, and schedule reports with templates
      and types
  - name: Planner
    description: >-
      Planner item management - tasks, roadmap items, and project planning with
      linked goals, compliance, and projects
  - name: Surveys
    description: >-
      General survey management - multi-question surveys, responses, and
      statistics
  - name: Tickets
    description: Ticket management - view and filter tickets from PSA integrations
  - name: Training
    description: >-
      Training management - courses, enrollments, certificates, and progress
      tracking
  - name: Users
    description: Tenant user management - internal staff and team members (read-only)
  - name: Voice
    description: >-
      Voice analytics - phone accounts, users and call history from the tenant's
      voice integrations (read-only)
  - name: Automation Rules
    description: >-
      Automation rule management - create, configure, and monitor automation
      rules with triggers, conditions, and actions
  - name: Analytics
    description: >-
      Analytics and reporting - company audit data, training analytics, user
      activity, and portfolio metrics
  - name: Client Onboarding
    description: >-
      Client onboarding - portals (phases, tasks, contacts, activation),
      templates, checklist templates, forms and documentation pages
  - name: Backup
    description: >-
      Backup - summaries, protected devices, alerts and SaaS protection (Datto,
      Axcient, Slide, Kaseya)
  - name: Microsoft 365
    description: Microsoft 365 - licenses, users, domains and Secure Score
  - name: Security
    description: >-
      Security - posture summary, EDR incidents, vulnerabilities, email threats,
      firewalls, DNS filtering and security awareness
  - name: Financial
    description: Financial - quotes, invoices and revenue summaries
  - name: Integrations
    description: Integrations - status, sync health, pause and resume (never credentials)
  - name: Documentation
    description: >-
      Documentation - pages, folders and articles synced from Hudu or IT Glue,
      plus built-in pages
  - name: Broadcasts
    description: Broadcasts - emergency broadcasts, recipients and groups
  - name: Notifications
    description: Notifications - the linked user's in-app notifications
  - name: Standards
    description: >-
      Standards - technology standards catalog, service plans, applicability,
      deployment statuses, compliance rollups, white space and costs
  - name: Customer Success
    description: >-
      Customer success - client health scores, trends, benchmarks and Traffic
      Light Reviews
  - name: Tasks
    description: Tasks - the linked user's personal task list
  - name: Tenant Setup
    description: Tenant setup - profile, branding and portal settings (never secrets)
  - name: Roles
    description: Roles - staff and client roles and their permission grants
  - name: Ticket Templates
    description: Ticket templates - reusable ticket definitions
  - name: Readiness
    description: Client readiness - account readiness assessments
  - name: Projects
    description: >-
      Projects - PSA projects with health overlays (deliverables, milestones,
      client actions, weekly updates), phases, tickets, time entries, PSA
      status/owner/priority write-through, ticket notes, task controls, display
      settings and the document library
paths:
  /api/public/v1/analytics/time-entries:
    get:
      tags:
        - Analytics
      summary: List time entries
      description: >-
        PSA time entries logged on service tickets across every ticket
        (ConnectWise, Halo and Autotask), newest first, with hour totals across
        every matching entry. Filter by technician name, date range (up to 92
        days, default the last 30), work type, billing status, PSA or company.
        Entries on tickets MSPortal has not synced or that belong to no client
        are left out; project time is under /projects/{id}/time-entries.
        `entryKind` adds Autotask internal time and time off (permission
        read_staff_time); they belong to no company, so `companyId` narrows
        ticket time only. Staff only; requires `analytics.read`,
        read_technician_performance, read_tickets and the psa_time_entries
        feature.
      parameters:
        - schema:
            type: string
            description: >-
              Earliest date worked, inclusive (YYYY-MM-DD). Defaults to 30 days
              before dateTo
          required: false
          description: >-
            Earliest date worked, inclusive (YYYY-MM-DD). Defaults to 30 days
            before dateTo
          name: dateFrom
          in: query
        - schema:
            type: string
            description: Latest date worked, inclusive (YYYY-MM-DD). Defaults to today
          required: false
          description: Latest date worked, inclusive (YYYY-MM-DD). Defaults to today
          name: dateTo
          in: query
        - schema:
            type: string
            description: Technician name contains (case-insensitive)
          required: false
          description: Technician name contains (case-insensitive)
          name: technician
          in: query
        - schema:
            type: string
            description: Work type contains (case-insensitive)
          required: false
          description: Work type contains (case-insensitive)
          name: workType
          in: query
        - schema:
            type: string
            enum:
              - billable
              - non_billable
              - unknown
          required: false
          name: billing
          in: query
        - schema:
            type: string
            enum:
              - connectwise
              - halo
              - autotask
          required: false
          name: psa
          in: query
        - schema:
            type: array
            items:
              type: string
              enum:
                - ticket
                - internal
                - time_off
            description: >-
              Entry kinds, repeated or comma-separated (default ticket).
              internal and time_off are Autotask only and need the
              read_staff_time permission
          required: false
          description: >-
            Entry kinds, repeated or comma-separated (default ticket). internal
            and time_off are Autotask only and need the read_staff_time
            permission
          name: entryKind
          in: query
        - schema:
            type: array
            items:
              type: string
              format: uuid
            maxItems: 100
            description: Limit to one or more companies (repeat the key or comma-separate)
          required: false
          description: Limit to one or more companies (repeat the key or comma-separate)
          name: companyId
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 100001
            description: >-
              Page number (default 1). Only the first 100,000 matching entries
              can be paged
          required: false
          description: >-
            Page number (default 1). Only the first 100,000 matching entries can
            be paged
          name: page
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 200
            description: Entries per page (default 50)
          required: false
          description: Entries per page (default 50)
          name: limit
          in: query
      responses:
        '200':
          description: Time entries
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/TimeEntries'
                required:
                  - data
        '400':
          description: Invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Forbidden - missing scope (analytics.read),
            read_technician_performance or read_tickets, the endpoint is
            staff-only, the psa_time_entries feature is off, or entryKind asks
            for internal or time_off without the read_staff_time permission
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    TimeEntries:
      type: object
      properties:
        dateFrom:
          type: string
          description: First date read (YYYY-MM-DD)
        dateTo:
          type: string
          description: Last date read (YYYY-MM-DD)
        summary:
          type: object
          properties:
            entries:
              type: integer
            technicians:
              type: integer
            hoursWorked:
              type: number
            billableHoursWorked:
              type: number
            nonBillableHoursWorked:
              type: number
            unknownBillingHoursWorked:
              type: number
            hoursBillable:
              type: number
              description: 'Hours the PSA bills: billed or to-bill hours on billable entries'
            ticketHoursWorked:
              type: number
            internalHoursWorked:
              type: number
            timeOffHoursWorked:
              type: number
          required:
            - entries
            - technicians
            - hoursWorked
            - billableHoursWorked
            - nonBillableHoursWorked
            - unknownBillingHoursWorked
            - hoursBillable
            - ticketHoursWorked
            - internalHoursWorked
            - timeOffHoursWorked
          description: Totals across every matching entry
        entries:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: <psa>:<PSA entry id>
              kind:
                type: string
                enum:
                  - ticket
                  - internal
                  - time_off
                description: >-
                  ticket: time on a client ticket. internal: the MSP's own work
                  (Autotask internal codes and its own tickets). time_off:
                  vacation, sick, personal and paid time off
              psa:
                type: string
                enum:
                  - connectwise
                  - halo
                  - autotask
              dateWorked:
                type: string
              startTime:
                type: string
                nullable: true
              endTime:
                type: string
                nullable: true
              hoursWorked:
                type: number
              hoursBillable:
                type: number
                nullable: true
                description: 0 when non-billable, null when billing is unknown
              billing:
                type: string
                enum:
                  - billable
                  - non_billable
                  - unknown
                description: >-
                  Halo entries are billable or unknown: its time feed carries no
                  non-billable flag
              technician:
                type: string
                nullable: true
              technicianExternalId:
                type: string
                nullable: true
              workType:
                type: string
                nullable: true
                description: >-
                  ConnectWise work type, Halo charge type or Autotask work type;
                  the internal time or time off category for those kinds
              workRole:
                type: string
                nullable: true
                description: ConnectWise only
              notes:
                type: string
                nullable: true
                description: Public note, first 500 characters. Always null for time off
              ticket:
                type: object
                nullable: true
                properties:
                  id:
                    type: integer
                    nullable: true
                    description: >-
                      Null on the MSP's own Autotask tickets, which are not
                      synced
                  number:
                    type: string
                    nullable: true
                  title:
                    type: string
                    nullable: true
                  status:
                    type: string
                    nullable: true
                  integrationId:
                    type: string
                    format: uuid
                required:
                  - id
                  - number
                  - title
                  - status
                  - integrationId
                description: Null for general internal time and time off
              company:
                type: object
                nullable: true
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
                    nullable: true
                required:
                  - id
                  - name
                description: Null for internal time and time off
            required:
              - id
              - kind
              - psa
              - dateWorked
              - startTime
              - endTime
              - hoursWorked
              - hoursBillable
              - billing
              - technician
              - technicianExternalId
              - workType
              - workRole
              - notes
              - ticket
              - company
        pagination:
          type: object
          properties:
            page:
              type: integer
            limit:
              type: integer
            totalCount:
              type: integer
            totalPages:
              type: integer
            hasNextPage:
              type: boolean
            hasPrevPage:
              type: boolean
          required:
            - page
            - limit
            - totalCount
            - totalPages
            - hasNextPage
            - hasPrevPage
      required:
        - dateFrom
        - dateTo
        - summary
        - entries
        - pagination
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error message
        requestId:
          type: string
          description: Request correlation ID
        details:
          nullable: true
          description: Additional error details
        code:
          type: string
          description: Error code
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Use your API key as a Bearer token. API keys can be generated in
        Settings → Integrations → API Access.

````

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