Files
zeekayandHanzo Dev 404de134f3 Point the API spec and its route checker at the new base
The OpenAPI document keys every operation by its full path, so the spec
described endpoints that no longer exist the moment the server moved.

The openApiSync analyzer cross-checks each registered subrouter against
that document and reconstructs the prefix from a literal of its own, so
spec and analyzer have to move together or every route reports as
missing. Its special case for the v5 root goes away with the root
itself.

The api/v4 directory keeps its name: it is where the spec sources live,
not a URL anyone requests.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-14 10:58:08 -07:00

362 lines
14 KiB
YAML

/v1/team/reports/users:
get:
tags:
- reports
summary: Get a list of paged and sorted users for admin reporting purposes
description: >
Get a list of paged users for admin reporting purposes, based on provided parameters.
##### Permissions
Requires `sysconsole_read_user_management_users`.
operationId: GetUsersForReporting
parameters:
- name: sort_column
in: query
description: The column to sort the users by. Must be one of ("CreateAt", "Username", "FirstName", "LastName", "Nickname", "Email") or the API will return an error.
schema:
type: string
default: 'Username'
- name: direction
in: query
description: The direction to accept paging values from. Will return values ahead of the cursor if "prev", and below the cursor if "next". Default is "next".
schema:
type: string
default: 'next'
- name: sort_direction
in: query
description: The sorting direction. Must be one of ("asc", "desc"). Will default to 'asc' if not specified or the input is invalid.
schema:
type: string
default: 'asc'
- name: page_size
in: query
description: The maximum number of users to return.
schema:
type: integer
default: 50
minimum: 1
maximum: 100
- name: from_column_value
in: query
description: The value of the sorted column corresponding to the cursor to read from. Should be blank for the first page asked for.
schema:
type: string
- name: from_id
in: query
description: The value of the user id corresponding to the cursor to read from. Should be blank for the first page asked for.
schema:
type: string
- name: date_range
in: query
description: The date range of the post statistics to display. Must be one of ("last30days", "previousmonth", "last6months", "alltime"). Will default to 'alltime' if the input is not valid.
schema:
type: string
default: 'alltime'
- name: role_filter
in: query
description: Filter users by their role.
schema:
type: string
- name: team_filter
in: query
description: Filter users by a specified team ID.
schema:
type: string
- name: has_no_team
in: query
description: If true, show only users that have no team. Will ignore provided "team_filter" if true.
schema:
type: boolean
- name: hide_active
in: query
description: If true, show only users that are inactive. Cannot be used at the same time as "hide_inactive"
schema:
type: boolean
- name: hide_inactive
in: query
description: If true, show only users that are active. Cannot be used at the same time as "hide_active"
schema:
type: boolean
- name: search_term
in: query
description: A filtering search term that allows filtering by Username, FirstName, LastName, Nickname or Email
schema:
type: string
responses:
"200":
description: User page retrieval successful
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/UserReport"
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"
"500":
$ref: "#/components/responses/InternalServerError"
/v1/team/reports/users/count:
get:
tags:
- reports
summary: Gets the full count of users that match the filter.
description: >
Get the full count of users admin reporting purposes, based on provided parameters.
##### Permissions
Requires `sysconsole_read_user_management_users`.
operationId: GetUserCountForReporting
parameters:
- name: role_filter
in: query
description: Filter users by their role.
schema:
type: string
- name: team_filter
in: query
description: Filter users by a specified team ID.
schema:
type: string
- name: has_no_team
in: query
description: If true, show only users that have no team. Will ignore provided "team_filter" if true.
schema:
type: boolean
- name: hide_active
in: query
description: If true, show only users that are inactive. Cannot be used at the same time as "hide_inactive"
schema:
type: boolean
- name: hide_inactive
in: query
description: If true, show only users that are active. Cannot be used at the same time as "hide_active"
schema:
type: boolean
- name: search_term
in: query
description: A filtering search term that allows filtering by Username, FirstName, LastName, Nickname or Email
schema:
type: string
responses:
"200":
description: User count retrieval successful
content:
application/json:
schema:
type: number
/v1/team/reports/users/export:
post:
tags:
- reports
summary: Starts a job to export the users to a report file.
description: >
Starts a job to export the users to a report file.
##### Permissions
Requires `sysconsole_read_user_management_users`.
operationId: StartBatchUsersExport
parameters:
- name: date_range
in: query
description: The date range of the post statistics to display. Must be one of ("last30days", "previousmonth", "last6months", "alltime"). Will default to 'alltime' if the input is not valid.
schema:
type: string
default: 'alltime'
responses:
"200":
description: Job successfully started
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/UserReport"
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"
"500":
$ref: "#/components/responses/InternalServerError"
/v1/team/reports/posts:
post:
tags:
- reports
summary: Get posts for reporting and compliance purposes using cursor-based pagination
description: >
Get posts from a specific channel for reporting, compliance, and auditing purposes.
This endpoint uses cursor-based pagination to efficiently retrieve large datasets.
The cursor is an opaque, base64-encoded token that contains all pagination state.
Clients should treat the cursor as an opaque string and pass it back unchanged.
When a cursor is provided, query parameters from the initial request are embedded
in the cursor and take precedence over request body parameters.
##### Permissions
Requires `manage_system` permission (system admin only).
##### License
Requires an Enterprise license (or higher).
##### Features
- Cursor-based pagination for efficient large dataset retrieval
- Support for both create_at and update_at time fields
- Ascending or descending sort order
- Time range filtering with optional end_time
- Include/exclude deleted posts
- Exclude system posts (any type starting with "system_")
- Optional metadata enrichment (file info, reactions, emojis, priority, acknowledgements)
operationId: GetPostsForReporting
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- channel_id
properties:
channel_id:
type: string
description: The ID of the channel to retrieve posts from
cursor:
type: string
description: >
Opaque cursor string for pagination. Omit or use empty string for the first request.
For subsequent requests, use the exact cursor value from the previous response's next_cursor.
The cursor is base64-encoded and contains all pagination state including time, post ID,
and query parameters. Do not attempt to parse or modify the cursor value.
default: ""
start_time:
type: integer
format: int64
description: >
Optional start time for query range in Unix milliseconds. Only used for the first request (ignored when cursor is provided).
- For "asc" (ascending): starts retrieving from this time going forward
- For "desc" (descending): starts retrieving from this time going backward
If omitted, defaults to 0 for ascending or MaxInt64 for descending.
time_field:
type: string
enum: [create_at, update_at]
default: create_at
description: >
Which timestamp field to use for sorting and filtering.
Use "create_at" to retrieve posts by creation time, or "update_at" to
retrieve posts by last modification time.
sort_direction:
type: string
enum: [asc, desc]
default: asc
description: >
Sort direction for pagination. Use "asc" to retrieve posts from oldest
to newest, or "desc" to retrieve from newest to oldest.
per_page:
type: integer
minimum: 1
maximum: 1000
default: 100
description: Number of posts to return per page. Maximum 1000.
include_deleted:
type: boolean
default: false
description: >
If true, include posts that have been deleted (DeleteAt > 0).
By default, only non-deleted posts are returned.
exclude_system_posts:
type: boolean
default: false
description: >
If true, exclude all system posts.
include_metadata:
type: boolean
default: false
description: >
If true, enrich posts with additional metadata including file information,
reactions, custom emojis, priority, and acknowledgements. Note that this
may increase response time for large result sets.
examples:
first_page_ascending:
summary: First page, ascending order
value:
channel_id: "4xp9fdt77pncbef59f4k1qe83o"
cursor: ""
per_page: 100
subsequent_page:
summary: Subsequent page using cursor
value:
channel_id: "4xp9fdt77pncbef59f4k1qe83o"
cursor: "MTphYmMxMjM6Y3JlYXRlX2F0OmZhbHNlOmZhbHNlOmFzYzoxNjM1NzI0ODAwMDAwOnBvc3QxMjM"
per_page: 100
time_range_query:
summary: Query with time range starting from specific time
value:
channel_id: "4xp9fdt77pncbef59f4k1qe83o"
cursor: ""
start_time: 1635638400000
per_page: 100
descending_order:
summary: Descending order from recent
value:
channel_id: "4xp9fdt77pncbef59f4k1qe83o"
cursor: ""
sort_direction: "desc"
per_page: 100
responses:
"200":
description: Posts retrieved successfully
content:
application/json:
schema:
type: object
properties:
posts:
type: object
additionalProperties:
$ref: "#/components/schemas/Post"
description: Map of post IDs to post objects
next_cursor:
type: object
nullable: true
description: >
Opaque cursor for retrieving the next page. If null, there are no more pages.
Pass the cursor string from this object in the next request.
properties:
cursor:
type: string
description: Base64-encoded opaque cursor string containing pagination state
examples:
with_more_pages:
summary: Response with more pages available
value:
posts:
"post_id_1": { "id": "post_id_1", "message": "First post", "create_at": 1635638400000 }
"post_id_2": { "id": "post_id_2", "message": "Second post", "create_at": 1635638500000 }
next_cursor:
cursor: "MTphYmMxMjM6Y3JlYXRlX2F0OmZhbHNlOmZhbHNlOmFzYzoxNjM1NjM4NTAwMDAwOnBvc3RfaWRfMg"
last_page:
summary: Last page (no more results)
value:
posts:
"post_id_99": { "id": "post_id_99", "message": "Last post", "create_at": 1635724800000 }
next_cursor: null
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"
"500":
$ref: "#/components/responses/InternalServerError"