Adaptive Security Groups API

BETAUser group management endpoints

OpenAPI Specification

adaptive-security-groups-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  description: "Adaptive API for external integrations.\n\n## \uD83D\uDCCA API Overview\n\nThe Adaptive API enables organizations to build comprehensive reporting and analytics around their security awareness training programs. This RESTful API provides programmatic access to track employee training progress, monitor compliance, and generate insights about your organization's security training effectiveness.\n\n### Purpose & Use Cases\n\nThis API is designed for:\n- **Compliance Reporting**: Track training completion rates and identify employees with overdue trainings\n- **Progress Monitoring**: Get real-time visibility into individual and team training progress\n- **Data Integration**: Sync training data with your HRIS, BI tools, or custom dashboards\n- **Automated Workflows**: Build alerts and notifications for training milestones or compliance deadlines\n\n### Technical Design\n\nThe API follows REST principles with:\n- Resource-oriented URLs that clearly represent your data\n- Standard HTTP methods (GET for reading data)\n- JSON responses for easy parsing and integration\n- Consistent error handling with detailed error messages\n- Token-based authentication for secure access\n\n### Available Resources\n\n| Resource | Purpose | Common Use Cases |\n|----------|---------|------------------|\n| **Users** | Access employee directory data | • Export user lists for reporting<br>• Track user status changes<br>• Map users to departments |\n| **Training** | Monitor training campaigns and progress | • Track campaign completion rates<br>• Identify at-risk employees<br>• Generate compliance reports |\n\n## \uD83D\uDE80 Quick Start Guide\n\nGet started with the Adaptive API in just 3 steps:\n\n### Step 1: Get Your API Token\nSee [Authentication](#section/Authentication) for more details on how to generate and use API tokens.\n\n### Step 2: Make Your First API Call\n```bash\ncurl -X GET https://api.adaptivesecurity.com/v2/users \\\n  -H \"Authorization: Bearer YOUR_API_TOKEN\"\n```\n\n### Step 3: Handle the Response\n```json\n{\n  \"users\": [\n    {\n      \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n      \"email\": \"john.smith@example.com\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Smith\",\n      \"status\": \"ACTIVE\"\n    }\n  ],\n  \"page_after\": \"123e4567-e89b-12d3-a456-426614174000\"\n}\n```\n\n## \uD83D\uDD10 Authentication\n\nAll API endpoints require authentication using an API token:\n\n```http\nAuthorization: Bearer YOUR_API_TOKEN\n```\n\n**Token Management:**\n- Tokens are generated in the Admin portal under **Settings → API**\n- Tokens have a user-set expiration but can be revoked at any time\n- Store tokens securely - treat them like passwords\n## \uD83C\uDF10 Base URL\n\nAll API endpoints are relative to:\n```\nhttps://api.adaptivesecurity.com\n```\n\n## \uD83D\uDEA8 Error Handling\n\nAll API errors follow a consistent JSON structure:\n\n### Standard Error Response\n```json\n{\n  \"error_code\": \"RESOURCE_NOT_FOUND\",\n  \"message\": \"The requested user was not found\",\n  \"status_code\": 404,\n  \"request_id\": \"3e502c09-4fd3-42d3-8b3a-4e2f08de0bbf\"\n}\n```\n\n### Validation Error Response\n```json\n{\n  \"error_code\": \"VALIDATION_ERROR\",\n  \"message\": \"Request validation failed\",\n  \"status_code\": 400,\n  \"request_id\": \"1d7c1712-2b8e-43f4-90c6-1185e249bdf0\",\n  \"details\": [\n    {\n      \"field\": \"page\",\n      \"message\": \"Page must be a non-negative integer\"\n    }\n  ]\n}\n```\n\n### Error Code Reference\n| Code | Status | Description | Action |\n|------|--------|-------------|--------|\n| `INVALID_TOKEN` | 401 | Token is invalid or expired | Check token validity |\n| `RESOURCE_NOT_FOUND` | 404 | Resource doesn't exist | Verify resource ID |\n| `VALIDATION_ERROR` | 400 | Request validation failed | Check field errors |\n| `INTERNAL_SERVER_ERROR` | 500 | Server error | Contact support |\n\n## \uD83D\uDCCB Request & Response Headers\n\n### Required Request Headers\n```http\nAuthorization: Bearer YOUR_API_TOKEN\n```\n\n### Optional Request Headers\n```http\nAccept: application/json\nContent-Type: application/json  # Required for POST/PUT\n```\n\n### Response Headers\n```http\nX-Request-ID: 6acb3ce1-672a-4a49-8fa1-f1a994eef9fd\nContent-Type: application/json\n```\n\n## \uD83D\uDCC4 Pagination\n\nList endpoints return paginated results for optimal performance:\n\n- **Page cursor**: `page_after` field in the response to get the next page\n- **Default sorting**: By creation date (newest first)\n\n### Pagination Example\n```bash\n# Get the next page of users\ncurl -X GET \"https://api.adaptivesecurity.com/v2/users?page_after=5a6dce1e-8d0f-46b1-b263-50b6adca62da\" \\\n  -H \"Authorization: Bearer YOUR_API_TOKEN\"\n```\n\n### Pagination Response\n```json\n{\n  \"users\": [...],\n  \"page_after\": \"123e4567-e89b-12d3-a456-426614174000\"\n}\n```\n\n## \uD83D\uDD50 Timestamps\n\nAll timestamps use ISO 8601 format in UTC:\n```\n2024-12-10T15:30:45.402Z\n```"
  title: Adaptive Audit Logs Groups API
  version: v2
servers:
- url: https://api.adaptivesecurity.com
  description: Production API
security:
- bearer-token: []
tags:
- description: '<span style="background-color: #ff9500; color: white; padding: 2px 6px; border-radius: 3px; font-size: 10px; font-weight: bold; text-transform: uppercase; margin-right: 8px;">BETA</span>User group management endpoints'
  name: Groups
paths:
  /v2/groups:
    get:
      description: '<span style="background-color: #ff9500; color: white; padding: 2px 6px; border-radius: 3px; font-size: 10px; font-weight: bold; text-transform: uppercase; margin-right: 8px;">BETA</span>Retrieve a paginated list of user groups'
      operationId: listGroups
      parameters:
      - description: Page cursor
        example: 456e7890-f12b-34c5-d678-901234567890
        in: query
        name: page_after
        required: false
        schema:
          type: string
      - description: Page size
        example: 50
        in: query
        name: page_size
        required: false
        schema:
          type: integer
          default: 50
      responses:
        '200':
          content:
            application/json:
              examples:
                Success Response:
                  description: Success Response
                  value:
                    groups:
                    - id: 123e4567-e89b-12d3-a456-426614174000
                      display_name: Engineering Team
                      type: GENERAL
                      created_at: '2024-01-15T08:30:00Z'
                      last_refresh_at: '2024-12-01T10:15:00Z'
                    - id: 456e7890-f12b-34c5-d678-901234567890
                      display_name: Repeat Phish Failures
                      type: REMEDIATION
                      created_at: '2024-03-01T09:00:00Z'
                      last_refresh_at: '2024-11-15T14:30:00Z'
                    page_after: 456e7890-f12b-34c5-d678-901234567890
              schema:
                $ref: '#/components/schemas/GroupListResponseDto'
          description: Successfully retrieved groups
        '400':
          content:
            application/json:
              examples:
                Validation Error:
                  description: Validation Error
                  value:
                    error_code: VALIDATION_ERROR
                    message: Request validation failed
                    status_code: 400
                    request_id: 5f8e9a7b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
                    details:
                    - field: page_size
                      message: Page size must be greater than or equal to 1
              schema:
                $ref: '#/components/schemas/ValidationErrorResponseDto'
          description: Bad request - Invalid parameters
        '401':
          content:
            application/json:
              examples:
                Unauthorized Error:
                  description: Unauthorized Error
                  value:
                    error_code: INVALID_TOKEN
                    message: The provided authentication token is invalid or expired
                    status_code: 401
                    request_id: dcaf9f7e-6c47-4c93-bb41-0e2d8d9bb0de
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Unauthorized - Invalid or missing authentication token
        '429':
          content:
            application/json:
              examples:
                Rate Limit Error:
                  description: Rate Limit Error
                  value:
                    error_code: RATE_LIMIT_EXCEEDED
                    message: API rate limit exceeded. Please retry after some time
                    status_code: 429
                    request_id: b7c1196e-2c6e-4d17-8f3c-fcb62d6d27a2
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Too many requests - Rate limit exceeded
        '500':
          content:
            application/json:
              examples:
                Internal Server Error:
                  description: Internal Server Error
                  value:
                    error_code: INTERNAL_SERVER_ERROR
                    message: An unexpected error occurred. Please try again later
                    status_code: 500
                    request_id: f351ac3c-cd5e-4ec7-89dc-191fc40a83f2
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Internal server error
      summary: List groups
      tags:
      - Groups
  /v2/groups/{groupId}:
    get:
      description: '<span style="background-color: #ff9500; color: white; padding: 2px 6px; border-radius: 3px; font-size: 10px; font-weight: bold; text-transform: uppercase; margin-right: 8px;">BETA</span>Retrieve detailed information about a specific group'
      operationId: getGroup
      parameters:
      - description: Group ID
        example: 123e4567-e89b-12d3-a456-426614174000
        in: path
        name: groupId
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              examples:
                Success Response:
                  description: Success Response
                  value:
                    id: 9f3d18ac-654e-4a0d-b8e9-90dbe7548c1d
                    display_name: High Risk Users
                    type: GENERAL
                    created_at: '2025-04-02T15:02:38.000Z'
                    last_refresh_at: '2025-06-26T15:02:38.000Z'
              schema:
                $ref: '#/components/schemas/GroupDto'
          description: Successfully retrieved group details
        '401':
          content:
            application/json:
              examples:
                Unauthorized Error:
                  description: Unauthorized Error
                  value:
                    error_code: INVALID_TOKEN
                    message: The provided authentication token is invalid or expired
                    status_code: 401
                    request_id: dcaf9f7e-6c47-4c93-bb41-0e2d8d9bb0de
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Unauthorized - Invalid or missing authentication token
        '404':
          content:
            application/json:
              examples:
                Not Found Error:
                  description: Not Found Error
                  value:
                    error_code: RESOURCE_NOT_FOUND
                    message: The requested group was not found
                    status_code: 404
                    request_id: 2a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Group not found
        '500':
          content:
            application/json:
              examples:
                Internal Server Error:
                  description: Internal Server Error
                  value:
                    error_code: INTERNAL_SERVER_ERROR
                    message: An unexpected error occurred. Please try again later
                    status_code: 500
                    request_id: f351ac3c-cd5e-4ec7-89dc-191fc40a83f2
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Internal server error
      summary: Get group details
      tags:
      - Groups
  /v2/groups/{groupId}/users:
    get:
      description: '<span style="background-color: #ff9500; color: white; padding: 2px 6px; border-radius: 3px; font-size: 10px; font-weight: bold; text-transform: uppercase; margin-right: 8px;">BETA</span>Retrieve a paginated list of users in a specific group'
      operationId: getGroupMembers
      parameters:
      - description: Group ID
        example: 123e4567-e89b-12d3-a456-426614174000
        in: path
        name: groupId
        required: true
        schema:
          type: string
      - description: Page cursor
        example: 456e7890-f12b-34c5-d678-901234567890
        in: query
        name: page_after
        required: false
        schema:
          type: string
      - description: Page size
        example: 100
        in: query
        name: page_size
        required: false
        schema:
          type: integer
          default: 100
      responses:
        '200':
          content:
            application/json:
              examples:
                Success Response:
                  description: Success Response
                  value:
                    users:
                    - id: a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6
                      email: john@example.com
                      joined_at: '2025-04-02T15:02:38.000Z'
                    - id: b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7
                      email: jane@example.com
                      joined_at: '2025-04-15T09:30:12.000Z'
                    page_after: b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7
              schema:
                $ref: '#/components/schemas/GroupUsersResponseDto'
          description: Successfully retrieved group users
        '401':
          content:
            application/json:
              examples:
                Unauthorized Error:
                  description: Unauthorized Error
                  value:
                    error_code: INVALID_TOKEN
                    message: The provided authentication token is invalid or expired
                    status_code: 401
                    request_id: dcaf9f7e-6c47-4c93-bb41-0e2d8d9bb0de
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Unauthorized - Invalid or missing authentication token
        '404':
          content:
            application/json:
              examples:
                Not Found Error:
                  description: Not Found Error
                  value:
                    error_code: RESOURCE_NOT_FOUND
                    message: The requested group was not found
                    status_code: 404
                    request_id: 8a9b1c2d-3e4f-5a6b-7c8d-9e0f1a2b3c4d
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Group not found
        '500':
          content:
            application/json:
              examples:
                Internal Server Error:
                  description: Internal Server Error
                  value:
                    error_code: INTERNAL_SERVER_ERROR
                    message: An unexpected error occurred. Please try again later
                    status_code: 500
                    request_id: f351ac3c-cd5e-4ec7-89dc-191fc40a83f2
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
          description: Internal server error
      summary: Get group users
      tags:
      - Groups
components:
  schemas:
    GroupUserDto:
      type: object
      description: User information within a group
      properties:
        email:
          type: string
          description: User email address
          example: john@example.com
        id:
          type: string
          description: Unique identifier for the user
          example: 615d6dd4-0045-48f8-90a9-6aba093b7676
        joined_at:
          type: string
          format: date-time
          description: Date when the user joined the group
          example: '2025-04-02T15:02:38.000Z'
    GroupUsersResponseDto:
      type: object
      description: Paginated list of users in a group
      properties:
        page_after:
          type: string
          description: Cursor for the next page
          example: 615d6dd4-0045-48f8-90a9-6aba093b7676
        users:
          type: array
          description: List of users in the group
          items:
            $ref: '#/components/schemas/GroupUserDto'
    GroupDto:
      type: object
      description: User group information
      properties:
        created_at:
          type: string
          format: date-time
          description: Group creation date
          example: '2024-01-15T08:30:00Z'
        display_name:
          type: string
          description: Group name
          example: Engineering Team
        id:
          type: string
          description: Unique identifier for the group
          example: 123e4567-e89b-12d3-a456-426614174000
        last_refresh_at:
          type: string
          format: date-time
          description: Group membership last updated date (can be null if initial membership calculation is still in progress)
          example: '2024-12-01T10:15:00Z'
        status:
          type: string
          description: Group status
          enum:
          - ACTIVE
          - ARCHIVED
          example: ACTIVE
        type:
          type: string
          description: Group type
          enum:
          - GENERAL
          - NEW_HIRE
          - REMEDIATION
          example: GENERAL
    ValidationErrorResponseDto:
      type: object
      description: Error response for validation failures with field-level details
      properties:
        details:
          type: array
          description: List of field-level validation error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
        error_code:
          type: string
          description: Machine-readable error code
          example: VALIDATION_ERROR
        message:
          type: string
          description: Human-readable error message
          example: Request validation failed
        request_id:
          type: string
          description: Unique request ID for debugging
          example: 8f03bdf9-ac45-4279-8dbe-f28839c2fed3
        status_code:
          type: integer
          format: int32
          description: HTTP status code
          example: 400
      required:
      - details
      - error_code
      - message
      - request_id
      - status_code
    GroupListResponseDto:
      type: object
      description: Paginated list of groups
      properties:
        groups:
          type: array
          description: List of groups
          items:
            $ref: '#/components/schemas/GroupDto'
        page_after:
          type: string
          description: Cursor for the next page
          example: 456e7890-f12b-34c5-d678-901234567890
    ErrorDetail:
      type: object
      description: Field-level validation error details
      properties:
        field:
          type: string
          description: Field name that failed validation
          example: email
        message:
          type: string
          description: Validation error message for this field
          example: Email address is not valid
      required:
      - field
      - message
    ErrorResponseDto:
      type: object
      description: Standard error response format for all API errors
      properties:
        error_code:
          type: string
          description: Machine-readable error code
          example: RESOURCE_NOT_FOUND
        message:
          type: string
          description: Human-readable error message
          example: The requested user was not found
        request_id:
          type: string
          description: Unique request ID for debugging
          example: 8f03bdf9-ac45-4279-8dbe-f28839c2fed3
        status_code:
          type: integer
          format: int32
          description: HTTP status code
          example: 404
      required:
      - error_code
      - message
      - request_id
      - status_code
  securitySchemes:
    bearer-token:
      description: 'API authentication token obtained from the Adaptive Admin portal (Settings → API Tokens). Include the token in the Authorization header as: Bearer YOUR_TOKEN'
      scheme: bearer
      type: http