---
title: "Get AI Actions config"
method: GET
path: "/api/{projectId}/ai-actions/{actionId}"
tags: ["Projects"]
---

# Get AI Actions config

`GET /api/{projectId}/ai-actions/{actionId}`

## Request

- Base URL: `https://studio.edgeimpulse.com/v1`
- URL: `https://studio.edgeimpulse.com/v1/api/{projectId}/ai-actions/{actionId}`
- Auth: one of:
  - API key in header `x-api-key`
  - API key in cookie `jwt`
  - API key in header `x-jwt-token`
  - OAuth 2
    - Authorization code: `/v1/oauth/authorize`
    - Client credentials
    - Implicit: `/v1/oauth/authorize`
    - Password
    - Token URL: `/v1/oauth/token`
- TypeScript: <https://skmtc.dev/edgeimpulse/apis/edge-impulse-api/docs/api/:projectId/ai-actions/:actionId/get.ts> (a function with typed inputs; its response is checked against the schema)

Get an AI Actions config

## Path parameters

- `projectId` integer, required
- `actionId` integer, required

## Response `200`

OK

- GetAIActionResponse
  - `success` boolean, required: Whether the operation succeeded
  - `error` string: Optional error description (set if 'success' was false)
  - `action` AIAction, required
    - `id` integer, required
    - `name` string: Manually set name (optional)
    - `displayName` string, required: Name to show to the user when interacting with this action (e.g. in a table, or when running the action). Will return either "name" (if present), or a name derived from the transformation block.
    - `config` AIActionsConfig, required
      - `dataCategory` 'allData' | 'unlabeledData' | 'enabledData' | 'dataWithoutMetadataKey' | 'dataWithMetadata', required
      - `dataMetadataKey` string: Metadata key to filter on. Required if dataCategory is equal to "dataWithoutMetadataKey" or "dataWithMetadata".
      - `dataMetadataValue` string: Metadata value to filter on. Required if dataCategory is equal to "dataWithMetadata".
      - `steps` AIActionsConfigStep[], required
        - `transformationBlockId` integer, required: The selected transformation block ID.
        - `parameters` object, required: Parameters for the transformation block. These map back to the parameters in OrganizationTransformationBlock 'parameters' property.
    - `previewConfig` AIActionsConfig, required
      - `dataCategory` 'allData' | 'unlabeledData' | 'enabledData' | 'dataWithoutMetadataKey' | 'dataWithMetadata', required
      - `dataMetadataKey` string: Metadata key to filter on. Required if dataCategory is equal to "dataWithoutMetadataKey" or "dataWithMetadata".
      - `dataMetadataValue` string: Metadata value to filter on. Required if dataCategory is equal to "dataWithMetadata".
      - `steps` AIActionsConfigStep[], required
        - `transformationBlockId` integer, required: The selected transformation block ID.
        - `parameters` object, required: Parameters for the transformation block. These map back to the parameters in OrganizationTransformationBlock 'parameters' property.
    - `maxDataPreviewCount` integer, required: When rendering preview items, the max amount of items to show (pass this into the previewAIActionsSamples)
    - `gridColumnCount` integer, required: Number of grid columns to use during preview.
    - `lastPreviewState` object: Contains the last preview state, this is filled with whatever was ran last, so when you refresh an AI Action it'll always have the exact same state as before refresh.
      - `samples` Sample[], required
        - `id` integer, required
        - `filename` string, required
        - `signatureValidate` boolean, required: Whether signature validation passed
        - `signatureMethod` string
        - `signatureKey` string: Either the shared key or the public key that was used to validate the sample
        - `created` string, date-time, required: Timestamp when the sample was created on device, or if no accurate time was known on device, the time that the file was processed by the ingestion service.
        - `lastModified` string, date-time, required: Timestamp when the sample was last modified.
        - `category` 'training' | 'testing' | 'validation' | 'post-processing', required
        - `coldstorageFilename` string, required
        - `label` string, required
        - `intervalMs` number, required: Interval between two windows (1000 / frequency). NOTE: Previously this value could change depending on whether the sample was resampled. This behavior has been removed.
        - `frequency` number, required: Frequency of the sample. NOTE: Previously this value could change depending on whether the sample was resampled. This behavior has been removed.
        - `originalIntervalMs` number, required: DEPRECATED. See "intervalMs".
        - `originalFrequency` number, required: DEPRECATED. See "frequency".
        - `deviceName` string
        - `deviceType` string, required
        - `sensors` Sensor[], required
          - `index` integer, required: Index of the sensor (globally, so you can refer back to it in e.g. getSampleAsAudio)
          - `name` string, required: Name of the axis
          - `units` string, required: Type of data on this axis. Needs to comply to SenML units (see https://www.iana.org/assignments/senml/senml.xhtml).
        - `valuesCount` integer, required: Number of readings in this file. If you have multiple datastreams, this is the value count from the datastream with the highest frequency.
        - `totalLengthMs` number: Total length (in ms.) of this file
        - `added` string, date-time, required: Timestamp when the sample was added to the current acquisition bucket.
        - `boundingBoxes` BoundingBox[], required
          - `label` string, required
          - `x` integer, required
          - `y` integer, required
          - `width` integer, required
          - `height` integer, required
        - `boundingBoxesType` 'object_detection' | 'constrained_object_detection', required
        - `chartType` 'chart' | 'image' | 'video' | 'table', required
        - `thumbnailVideo` string
        - `thumbnailVideoFull` string
        - `isDisabled` boolean, required: True if the current sample is excluded from use
        - `isProcessing` boolean, required: True if the current sample is still processing (e.g. for video)
        - `processingJobId` integer: Set when sample is processing and a job has picked up the request
        - `processingError` boolean, required: Set when processing this sample failed
        - `processingErrorString` string: Error (only set when processing this sample failed)
        - `isCropped` boolean, required: Whether the sample is cropped from another sample (and has crop start / end info)
        - `metadata` object: Sample free form associated metadata
        - `projectId` integer, required: Unique identifier of the project this sample belongs to
        - `projectOwnerName` string: Name of the owner of the project this sample belongs to
        - `projectName` string: Name of the project this sample belongs to
        - `projectLabelingMethod` 'single_label' | 'object_detection' | 'label_map'
        - `sha256Hash` string, required: Data sample SHA 256 hash (including CBOR envelope if applicable)
        - `structuredLabels` StructuredLabel[]
          - `startIndex` integer, required: Start index of the label (e.g. 0)
          - `endIndex` integer, required: End index of the label (e.g. 3). This value is inclusive, so { startIndex: 0, endIndex: 3 } covers 0, 1, 2, 3.
          - `label` string, required: The label for this section.
          - `labelMap` SampleLabelMapLabels
            - `type` 'key-values', required
            - `labels` object, required
        - `structuredLabelsList` string[]
        - `createdBySyntheticDataJobId` integer: If this sample was created by a synthetic data job, it's referenced here.
        - `imageDimensions` object
          - `width` integer, required
          - `height` integer, required
        - `videoUrl` string: Video link, cropped and in original resolution.
        - `videoUrlFull` string: Video link in original resolution.
        - `labelMap` SampleLabelMapLabels
          - `type` 'key-values', required
          - `labels` object, required
        - `lastUpdatedBy` union: Information about the entity that last updated a sample. This can be a user, a project API key, an OAuth client, or a dataset version restore operation.
          - LastUpdatedByUser: The user who last updated a sample.
            - `type` 'user', required
            - `id` integer, required: The ID of the user that last updated the sample.
          - LastUpdatedByProjectApiKey: The project API key that last updated a sample.
            - `type` 'projectApiKey', required
            - `id` integer, required: The ID of the project API key that last updated the sample.
          - LastUpdatedByOAuthClient: The OAuth client that last updated a sample, and the user it is acting on behalf of.
            - `type` 'oauthClient', required
            - `oauthClientId` string, required: The ID of the OAuth client that last updated the sample.
            - `userId` integer: The user ID the OAuth client is acting on behalf of.
          - LastUpdatedByDatasetVersionRestore: The dataset restore that last updated a sample.
            - `type` 'datasetVersionRestore', required
            - `datasetVersionId` integer, required: The ID of the dataset version that last updated the sample.
            - `groupKey` string, required: A random grouping ID to keep restore snapshots isolated.
            - `actor` union: The actor that started the dataset restore operation.
              - …
        - `datastreams` SampleDatastream[], required
          - `index` integer, required
          - `chartType` 'chart' | 'image' | 'video' | 'table', required
          - `intervalMs` number, required: Interval between two windows (1000 / frequency).
          - `frequencyHz` number, required: Frequency of the datastream
          - `sensors` Sensor[], required
            - `index` integer, required: Index of the sensor (globally, so you can refer back to it in e.g. getSampleAsAudio)
            - `name` string, required: Name of the axis
            - `units` string, required: Type of data on this axis. Needs to comply to SenML units (see https://www.iana.org/assignments/senml/senml.xhtml).
          - `valuesCount` integer, required: Number of readings in this datastream.
          - `imageDimensions` object
            - `width` integer, required
            - `height` integer, required
          - `totalLengthMs` number, required: Total length (in ms.) of the datastream
      - `proposedChanges` object[], required
        - `sampleId` integer, required
        - `step` integer, required
        - `proposedChanges` SampleProposedChanges, required
          - `label` string: New label (single-label)
          - `isDisabled` boolean: True if the current sample should be disabled; or false if it should not be disabled.
          - `boundingBoxes` BoundingBox[]: List of bounding boxes. The existing bounding boxes on the sample will be replaced (so if you want to add new bounding boxes, use the existing list as a basis).
            - `label` string, required
            - `x` integer, required
            - `y` integer, required
            - `width` integer, required
            - `height` integer, required
          - `metadata` object: Free form associated metadata. The existing metadata on the sample will be replaced (so if you want to add new metadata, use the existing list as a basis).
          - `structuredLabels` StructuredLabel[]: New label (multi-label)
            - `startIndex` integer, required: Start index of the label (e.g. 0)
            - `endIndex` integer, required: End index of the label (e.g. 3). This value is inclusive, so { startIndex: 0, endIndex: 3 } covers 0, 1, 2, 3.
            - `label` string, required: The label for this section.
            - `labelMap` SampleLabelMapLabels
              - …
    - `setMetadataAfterRunning` object[], required: After the action runs, add this key/value pair as metadata on the affected samples.
      - `key` string, required
      - `value` string, required
    - `cacheUnchangedSteps` boolean, required: If enabled, will load cached results from the previous preview job for unchanged jobs. Disable this if you're developing your own custom AI Labeling job, and want to always re-run all steps.

---

[API](https://skmtc.dev/edgeimpulse/apis/edge-impulse-api.md) - [All operations](https://skmtc.dev/edgeimpulse/apis/edge-impulse-api/llms.txt) - [OpenAPI document](https://skmtc.dev/edgeimpulse/apis/edge-impulse-api/revisions/e2a976d38427?raw)
