Appmixer Audit Logs API

The audit log records who changed what in your Appmixer tenant, and when. Failed attempts are recorded too. Only users with the `admin` scope can read it. **Attribution to your own users.** If your application works through one Appmixer user for many people, send an opaque ID of the person who makes a change in the `X-Appmixer-Audit-External-User-Id` header of the request that makes it (available since Appmixer 6.5.6). The value must be 1 to 128 characters long and use only letters, digits, `.`, `_` and `-`; a value in any other format is ignored and the request still succeeds. It is stored as `externalUserId` on the audit log entry and can be filtered on. Requests that do not write an audit log entry ignore the header. Never send names, email addresses or other personal data: the value is stored exactly as sent, returned by the API and exported in the CSV until the entry expires, and entries cannot be deleted earlier. The header is attribution, not authentication: Appmixer does not verify it. From browser code, send the header only to Appmixer 6.5.6 or later: older versions refuse it in the CORS preflight, so the browser blocks the whole request. Server-side requests are not affected.

Operations 1

GET /system/audits Get audit log entries #

Documentation

Specifications

Schemas & Data

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/appmixer:appmixer-audit-logs-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

appmixer-audit-logs-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Appmixer REST Audit Logs API
  version: 6.5.5
  summary: REST API of the Appmixer workflow automation and embedded iPaaS platform.
  description: 'Appmixer offers a REST API that mirrors the functionality available in its UI. Use it for

    advanced customizations, additional automations and scripting.


    **Base URL.** The base URL depends on your Appmixer tenant, for example `https://api-acme.appmixer.ai`

    (newer hosted tenants), `https://api.acme.appmixer.cloud` (older hosted tenants), or the API URL of

    your Self-Managed installation.


    **Authentication.** Most endpoints require a user access token sent as `Authorization: Bearer `.

    Get a token by signing in with `POST /user/auth`. Some endpoints also require the user to have

    the `admin` scope; this is noted in their descriptions.


    **Errors.** Errors are returned as JSON objects with `statusCode`, `error` and `message` properties.'
  contact:
    name: Appmixer
    url: https://www.appmixer.com
servers:
- url: '{tenantApiUrl}'
  description: Your Appmixer tenant API
  variables:
    tenantApiUrl:
      default: https://api-acme.appmixer.ai
      description: API URL of your Appmixer tenant, e.g. https://api-acme.appmixer.ai or https://api.acme.appmixer.cloud.
security:
- bearerAuth: []
tags:
- name: Audit Logs
  description: 'The audit log records who changed what in your Appmixer tenant, and when. Failed attempts are

    recorded too. Only users with the `admin` scope can read it.


    **Attribution to your own users.** If your application works through one Appmixer user for many

    people, send an opaque ID of the person who makes a change in the `X-Appmixer-Audit-External-User-Id`

    header of the request that makes it (available since Appmixer 6.5.6). The value must be 1 to 128

    characters long and use only letters, digits, `.`, `_` and `-`; a value in any other format is

    ignored and the request still succeeds. It is stored as `externalUserId` on the audit log entry and

    can be filtered on. Requests that do not write an audit log entry ignore the header.


    Never send names, email addresses or other personal data: the value is stored exactly as sent,

    returned by the API and exported in the CSV until the entry expires, and entries cannot be deleted

    earlier. The header is attribution, not authentication: Appmixer does not verify it. From browser

    code, send the header only to Appmixer 6.5.6 or later: older versions refuse it in the CORS

    preflight, so the browser blocks the whole request. Server-side requests are not affected.'
paths:
  /system/audits:
    get:
      tags:
      - Audit Logs
      summary: Get audit log entries
      operationId: getAuditLogs
      description: 'Return the audit log entries that match the filters, newest first, one page at a time. Requires

        the `admin` scope. An entry must match all the filters you send.


        **Check that your filters were applied.** A version that does not know a filter ignores it and

        returns the entries as if it had not been sent. `appliedFilters` lists the filter parameters the

        server recognized and applied (`sort`, `page`, `size` and `format` are not filters). If your code

        relies on a filter, fail closed: do not treat the entries as filtered when the response has no

        `appliedFilters` (a version that predates it) or when your filter is missing from it.


        **Paging.** Send `ts` with the time of your first request in every page request, so that entries

        recorded in the meantime do not shift the pages. `page=0` returns all matching entries in one

        response and ignores `size`; the Backoffice CSV export uses it.


        **CSV export.** With `format=csv`, the entries are returned as a CSV file (`data.csv`) with the

        columns `id`, `flowId`, `flowName`, `action`, `created`, `eventType`, `user` (the username),

        `status`, `flatDiff`, `source`, `threadId` and `externalUserId`, in this order. Filters, `sort`,

        `page` and `size` apply as for JSON. The CSV has no `appliedFilters`.


        **Retention.** By default, entries are deleted 100 days after they were recorded

        (`GARBAGE_COLLECTOR_AUDIT_LOGS_TTL` on Appmixer Self-Managed).


        `userId`, `externalUserId` and `appliedFilters` are available since Appmixer 6.5.6; `source` and

        `threadId` since Appmixer 6.5.5.'
      parameters:
      - name: eventType
        in: query
        description: Type of the event.
        schema:
          type: string
          enum:
          - create
          - update
          - delete
      - name: status
        in: query
        description: Result of the recorded action.
        schema:
          type: string
          enum:
          - success
          - failure
      - name: username
        in: query
        description: Username of the Appmixer user who made the change. Exact match, not case-sensitive.
        schema:
          type: string
      - name: userId
        in: query
        description: ID of the Appmixer user who made the change.
        schema:
          type: string
          pattern: ^[0-9a-fA-F]{24}$
      - name: externalUserId
        in: query
        description: ID sent in the `X-Appmixer-Audit-External-User-Id` request header. Exact match, case-sensitive.
        schema:
          type: string
          pattern: ^[A-Za-z0-9._-]{1,128}$
      - name: flowId
        in: query
        description: ID of the flow the change concerns.
        schema:
          type: string
      - name: source
        in: query
        description: '`copilot` returns the changes made by the AI Copilot.'
        schema:
          type: string
          enum:
          - copilot
      - name: threadId
        in: query
        description: ID of the AI Copilot conversation that made the change.
        schema:
          type: string
      - name: dateFrom
        in: query
        description: 'Entries recorded at or after this date or time, in ISO 8601. A date without a time means midnight UTC.

          A value that cannot be read as a date, such as a Unix timestamp, is refused with `400`.

          '
        schema:
          type: string
        example: '2026-09-01'
      - name: dateTo
        in: query
        description: 'Entries recorded on or before this day. Send a date without a time; the whole day (UTC) is

          included. A value that cannot be read as a date, such as a Unix timestamp, is refused with `400`.

          '
        schema:
          type: string
        example: '2026-09-30'
      - name: ts
        in: query
        description: 'Entries recorded at or before this time, as a Unix timestamp in milliseconds. A value that is not

          a whole number, or is too large for a date, is refused with `400`.

          '
        schema:
          type: integer
          format: int64
        example: 1790240400000
      - name: search
        in: query
        description: Full-text search in `action`, `flatDiff`, `status` and the username. Matches whole words; with several words, entries that contain any of them.
        schema:
          type: string
      - name: sort
        in: query
        description: 'Property to sort by, for example `created`, `eventType`, `action`, `status`, `flowId` or

          `flowName`. Prefix it with `-` for descending order. `source`, `threadId` and `externalUserId`

          cannot be sorted by.

          '
        schema:
          type: string
          default: -created
      - name: page
        in: query
        description: Page number, starting at `1`. `0` returns all matching entries, without paging.
        schema:
          type: integer
          minimum: 0
          default: 1
      - name: size
        in: query
        description: Number of entries per page. With `page=0`, `size` has no upper limit.
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 10
      - name: format
        in: query
        description: '`csv` returns the entries as a CSV file instead of JSON.'
        schema:
          type: string
          enum:
          - csv
      responses:
        '200':
          description: The matching entries.
          headers:
            Content-Range:
              description: Same as `contentRange`. Sent with JSON responses only; a browser cannot read it in a cross-origin request.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuditLogList'
              example:
                data:
                - id: 66f28a1c9b3e4d0012a7c5e1
                  eventType: update
                  user:
                    id: 66d9c1f47a2b3c0011e4f8a2
                    username: acme@example.com
                    lowername: acme@example.com
                  flowId: 9089f275-f5a5-4796-ba23-365412c5666e
                  flowName: Sync new bookings
                  action: 'Update flow: Sync new bookings [9089f275-f5a5-4796-ba23-365412c5666e]'
                  diff:
                  - path: flow.name
                    type: CHANGE
                    changes:
                      before: Sync bookings
                      after: Sync new bookings
                  flatDiff: '[{"path":"flow.name","type":"CHANGE","changes":{"before":"Sync bookings","after":"Sync new bookings"}}]'
                  status: success
                  created: 2026-09-24 09:12:44.102000+00:00
                  externalUserId: staff-42
                contentRange: 0-0/1
                appliedFilters:
                - dateFrom
                - externalUserId
            text/csv:
              schema:
                type: string
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
components:
  schemas:
    AuditLogList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/AuditLogEntry'
        contentRange:
          type: string
          description: The part of the whole result this page holds, as `<first>-<last>/<total>` counted from zero.
          example: 0-49/120
        appliedFilters:
          type: array
          description: 'Names of the filter parameters the server recognized and applied, in no particular order.

            Versions that predate it do not return it; treat such a response as unfiltered.

            '
          items:
            type: string
      required:
      - data
      - contentRange
    AuditLogEntry:
      type: object
      properties:
        id:
          type: string
          description: ID of the entry.
        created:
          type: string
          format: date-time
          description: When the entry was recorded.
        eventType:
          type: string
          enum:
          - create
          - update
          - delete
        status:
          type: string
          enum:
          - success
          - failure
        action:
          type: string
          description: Description of the event.
          example: 'Update flow: Sync new bookings [9089f275-f5a5-4796-ba23-365412c5666e]'
        user:
          type:
          - object
          - 'null'
          description: 'The Appmixer user who made the change. In a user group context, `id` and `username` are those

            of the group user, and `originalUserId`, `contextType` and `groupId` identify the person and the group.

            '
          properties:
            id:
              type: string
            username:
              type: string
            lowername:
              type: string
              description: The username in lowercase.
            originalUserId:
              type: string
            contextType:
              type: string
            groupId:
              type: string
        flowId:
          type:
          - string
          - 'null'
          description: ID of the flow the change concerns.
        flowName:
          type:
          - string
          - 'null'
        diff:
          type: array
          description: The changed properties.
          items:
            type: object
            properties:
              path:
                type: string
                example: flow.name
              type:
                type: string
                enum:
                - CREATE
                - CHANGE
                - REMOVE
              changes:
                type: object
                properties:
                  before: {}
                  after: {}
        flatDiff:
          type: string
          description: '`diff` as a JSON string.'
        source:
          type: string
          enum:
          - copilot
          description: Present only on changes made by the AI Copilot.
        threadId:
          type: string
          description: ID of the AI Copilot conversation that made the change. Present only together with `source`.
        externalUserId:
          type: string
          description: ID sent in the `X-Appmixer-Audit-External-User-Id` request header. Present only when the request carried a valid one.
    Error:
      type: object
      description: Error response.
      properties:
        statusCode:
          type: integer
          example: 404
        error:
          type: string
          example: Not Found
        message:
          type: string
          example: Flow not found.
      required:
      - statusCode
      - error
  responses:
    Unauthorized:
      description: The access token is missing, invalid or expired.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The user does not have the permission (or scope) required for this operation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: The request is invalid, for example it failed payload or query validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: User access token obtained from `POST /user/auth`.
externalDocs:
  description: Appmixer documentation
  url: https://docs.appmixer.com
x-provenance:
  method: harvested
  publisher: Appmixer
  source: https://4113719406-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzU8KYStPfR8N1iZXsgad%2Fuploads%2Fgit-blob-6433572bd8011e652aa91642ad387d4ab08bc48b%2Fappmixer-openapi.yaml?alt=media
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)