---
title: "List audit events"
method: GET
path: "/v2/audit-events/"
tags: ["Audit Events"]
---

# List audit events

`GET /v2/audit-events/`

## Request

- Base URL: `https://api.skilljar.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.skilljar.com/v2/audit-events/`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/skilljar/apis/skilljar-api-v2/docs/v2/audit-events/get.ts> (a function with typed inputs; its response is checked against the schema)

List the organization's audit events, newest first, within a range of at most 90 days.

No 404 gate here: ``JWTAuth._finish_auth`` already rejects (401) any token whose
organization_id doesn't resolve via the same ``TenantInfoCache`` lookup, so by the time
this view runs the org is guaranteed to exist.

**Required OAuth scope:** `audit:read`

## Query parameters

- `filter[channel]` string, nullable: Source channel, e.g. "mcp".
- `filter[user.id]` string, nullable: Opaque dashboard user id.
- `filter[action]` string, nullable: Action type, e.g. "update".
- `filter[target_type]` string, nullable: Target object type.
- `filter[request_id]` string, nullable: API request id.
- `filter[created_gte]` string, date-time, nullable: Created on or after this timestamp. Defaults to 90 days before created_lte.
- `filter[created_lte]` string, date-time, nullable: Created on or before this timestamp. Defaults to now. The range may span at most 90 days.
- `page[size]` integer: Maximum number of records to return.
- `page[cursor]` string, nullable: Opaque cursor from the previous page's links.next.

## Response `200`

OK

- PaginatedListResponseAuditEventResource
  - `data` AuditEventResource[], required: The resources on this page, in cursor order.
    - `type` string: Always "audit-events".
    - `id` string, required: Opaque audit-event ID.
    - `attributes` AuditEventAttributes, required: Attributes of an audit-event resource.
      - `channel` string, nullable, required
      - `user` AuditEventUser, required: The dashboard user who made the change.
        - `id` string, nullable, required
        - `username` string, nullable, required
      - `client` AuditEventClient, required: The API client that made the change.
        - `id` string, nullable: Opaque identifier, not resolvable to other /v2/ resources.
        - `name` string, nullable, required
      - `action` string, required
      - `target` AuditEventTarget, required: The object that was changed.
        - `type` string, required
        - `id` string, required: Opaque identifier, not resolvable to other /v2/ resources.
        - `display_name` string, required
      - `field` string, nullable, required
      - `old_value` string, nullable, required
      - `new_value` string, nullable, required
      - `request_id` string, nullable: API v2 request id (API v2 writes only); client-supplied X-Request-Id values are stored as sent.
      - `endpoint` string, nullable, required
      - `created_at` string, date-time, required
  - `meta` object, nullable: Pagination metadata, e.g. {"page_size": 25}.
  - `links` PaginationLinks: JSON:API §Links object for a paginated collection. Typed rather than a free-form ``dict`` so ``next`` reaches the generated OpenAPI/SDK/MCP contract. Since GE-256227 removed the top-level ``next_cursor``, ``links.next`` is the only pagination affordance a machine consumer has — an untyped ``dict`` would leave it undiscoverable.
    - `self` string, nullable: Path of the current request, relative and without its query string (so every page of a filtered collection reports the same value).
    - `next` string, nullable: Relative path of the next page, ready to request as-is. Carries ``page[cursor]`` plus every non-cursor query param from the current request (``page[size]``, ``filter[*]``, ``include``). Null on the last page.
    - `prev` string, nullable: Relative path of the previous page. Not implemented — currently always null.
  - `included` object[], nullable: Related resources requested via ?include=. Absent when no include was requested.

## Other responses

- `400`: Bad Request: page[cursor] is not a valid cursor.
- `401`: Unauthorized
- `403`: Forbidden
- `406`: Not Acceptable: Accept rules out application/vnd.api+json.
- `422`: Unprocessable Entity

## Changes

- **2026-10-16** `bed169429eb2`: 1 breaking, 1 warning, 5 info
  - removed the required property `has_more` from the response with the `200` status
  - removed the optional property `next_cursor` from the response with the `200` status
  - added the non-success response with the status `400`
  - added the non-success response with the status `406`
  - …3 more
- **2026-10-01** `95982c89abfd`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/skilljar/apis/skilljar-api-v2/changes/v2/audit-events/get.md)

---

[API](https://skmtc.dev/skilljar/apis/skilljar-api-v2.md) - [All operations](https://skmtc.dev/skilljar/apis/skilljar-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/skilljar/apis/skilljar-api-v2/revisions/fbda30ce1742?raw)
