---
title: "Get a test case"
method: GET
path: "/api/cases/{caseId}"
tags: ["Test Cases"]
---

# Get a test case

`GET /api/cases/{caseId}`

## Request

- Base URL: `https://aximo.autify.com`
- URL: `https://aximo.autify.com/api/cases/{caseId}`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/autify/apis/aximo-api/docs/api/cases/:caseId/get.ts> (a function with typed inputs; its response is checked against the schema)

Returns the full scenario text and metadata for a test case, including
its per-target default configuration (mobile, web hostname overrides,
desktop, multi-device). Device and upload identifiers in the configs
are encrypted tokens (the same currency as `/api/devices` and
`/api/uploads`). The configs are set at creation (`POST /api/cases`) or
set and cleared via `PATCH /api/cases/{caseId}`, and every token
round-trips into both. The `apiMobileConfig` tokens (top-level and `apps[].uploadArn`)
also round-trip into `POST /api/triggers/cases/{caseId}/run`, whose
per-run overrides supersede the stored mobile/web/desktop defaults for
a single run; the trigger has no multi-device override fields.

## Path parameters

- `caseId` string, uuid, required

## Response `200`

Test case.

- CaseDetail
  - `id` string, uuid, required
  - `projectId` string, uuid, required
  - `type` 'web' | 'mobile' | 'desktop' | 'multi_device', required
  - `title` string, nullable
  - `description` string, nullable
  - `scenario` string, required: Test case content (interpretation depends on `format`).
  - `format` 'gherkin' | 'markdown' | 'plain_text', required
  - `startUrl` string, nullable
  - `apiEnabled` boolean
  - `lastRunAt` string, date-time, nullable
  - `lastStatus` string, nullable
  - `archivedAt` string, date-time, nullable: Set when the case was archived (soft-deleted). Archived cases are excluded from lists but stay readable by id.
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `tags` string[], required: Caller-supplied labels, for example the commit and pull request a run was testing. At most 10, each 1-64 characters after trimming; duplicates are collapsed. A request exceeding a bound is refused with 400, never truncated. Tags are returned exactly as stored and are visible to everyone in your organization, so never put secrets in them.
  - `apiMobileConfig` CaseMobileConfig: Exactly one device binding: a Device Farm device (`deviceArn` + `deviceName`) or a registered local phone (`userDeviceId` from `GET /api/devices/user`). For a local phone, `platform` and `localDeviceName` are resolved from the device row server-side and `localDeviceName` is read-only; an app reference on a local phone must carry a `bundleId`.
    - `deviceArn` string: Encrypted device identifier token. Not set for a local phone.
    - `deviceName` string
    - `userDeviceId` string, uuid: Registered local phone to run on instead of Device Farm.
    - `localDeviceName` string: Display-name snapshot of the registered local phone.
    - `platform` 'ANDROID' | 'IOS'
    - `uploadArn` string: Encrypted upload identifier token.
    - `uploadType` 'own_app' | 'existing' | 'sample'
    - `appName` string
    - `bundleId` string
    - `apps` CaseAppInfo[]
      - `uploadArn` string, required: Encrypted upload identifier token.
      - `uploadType` 'own_app' | 'existing' | 'sample', required
      - `appName` string, nullable, required
      - `bundleId` string
  - `apiWebConfig` CaseWebConfig
    - `hostnameOverrideIds` string[]
  - `apiDesktopConfig` CaseDesktopConfig: `name`, `platform` and `os` are snapshotted from the registered device when the config is saved; only `userDeviceId` is accepted on input. `name` and `platform` are absent when the case was saved from a session whose desktop had already been deleted.
    - `userDeviceId` string, uuid, required: The registered BYOD desktop device this case runs on.
    - `name` string
    - `platform` 'windows' | 'macos' | 'linux'
    - `os` string, nullable, required
  - `apiMultiDeviceConfig` CaseMultiDeviceDevice[], nullable: Multi-device targeting (2-3 devices). Set or cleared via `PATCH /api/cases/{caseId}`; the trigger endpoint has no multi-device override fields, so runs always use this stored configuration.
    - union
      - CaseMultiDeviceWebDevice
        - `kind` 'web', required
        - `name` string, required
        - `startUrl` string, nullable
        - `userDeviceId` string, uuid: When set, this entry runs on the user's registered desktop device.
        - `localDeviceName` string: Display-name snapshot of the registered device, resolved when the config was saved.
      - CaseMultiDeviceMobileDevice: On input, exactly one of a Device Farm device (`deviceArn` + `deviceName`) or a registered local phone (`userDeviceId`) is required; they cannot be combined. A `userDeviceId` entry that carries `uploadArn`/`apps` must include a `bundleId` (top-level or on `apps[0]`), and a top-level `bundleId` must match `apps[0].bundleId`. The same `userDeviceId` may appear only once across entries.
        - `kind` 'mobile', required
        - `name` string, required
        - `mobilePlatform` 'android' | 'ios', required
        - `deviceArn` string: Encrypted device identifier token.
        - `deviceName` string
        - `userDeviceId` string, uuid: When set, this entry runs on the user's registered phone.
        - `localDeviceName` string: Display-name snapshot of the registered device, resolved when the config was saved.
        - `uploadArn` string: Encrypted upload identifier token.
        - `uploadType` 'own_app' | 'existing' | 'sample'
        - `appName` string
        - `bundleId` string
        - `apps` CaseAppInfo[]
          - `uploadArn` string, required: Encrypted upload identifier token.
          - `uploadType` 'own_app' | 'existing' | 'sample', required
          - `appName` string, nullable, required
          - `bundleId` string

## Other responses

- `401`: Missing or invalid API key.
- `404`: Test case not found.
- `429`: Rate limit exceeded — e.g. the daily session limit was reached for the organization, or too many API requests were sent in a short window (retry after the number of seconds in the `Retry-After` header).
- `500`: Unexpected server error.

---

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