---
title: "GET /experimental/loops/{loopId}"
method: GET
path: "/experimental/loops/{loopId}"
tags: ["Loops"]
---

# GET /experimental/loops/{loopId}

`GET /experimental/loops/{loopId}`

## Request

- Base URL: `https://api.tessl.io`
- URL: `https://api.tessl.io/experimental/loops/{loopId}`
- Auth: none declared

Gets a Loop by ID: its action, its triggers, and where it is defined. Archived Loops are returned too.

## Path parameters

- `loopId` string, uuid, required

## Headers

- `Authorization` string

## Response `200`

Default Response

- object
  - `links` object, required
    - `self` string, uri, required
  - `data` object, required
    - `id` string, uuid, required
    - `type` 'loop', required
    - `attributes` object, required
      - `key` string, required: The Loop's identifier, unique within its project and source. It never changes.
      - `source` union, required
        - object
          - `kind` 'app', required
        - object
          - `kind` 'repo', required
          - `declaredIn` union, required
            - 'actions'
            - 'triggers'
            - 'schedules'
          - `commit` object, nullable, required: The recorded `tessl.json` commit, or null.
            - `sha` string, required
            - `repoFullName` string, required
      - `label` string, nullable, required
      - `description` string, nullable, required
      - `action` object, required
        - `type` 'skill', required
        - `name` string, required: The action's name in `actions`; for an inline action, the trigger or schedule entry it is written in; for an app Loop, the Loop's key. Always the Loop's key.
        - `description` string
        - `tags` string[]: The Loop's tags, its action's.
        - `concurrency` object
          - `keys` object[]: The keys as stored. Present only when declared.
            - `key` string, required
            - `limit` integer, required
          - `debounce` string: Present only when declared.
          - `mode` union, required: `join` when the author wrote none.
            - 'join'
            - 'queue'
            - 'skip'
        - `skill` string, required
        - `resolvedSkill` object, required
          - `kind` union, required
            - 'registry'
            - 'local'
            - 'bundled'
          - `name` string, nullable, required
          - `registry` object, nullable, required
            - `workspace` string, required
            - `tile` string, required
            - `version` string, nullable, required
          - `path` string, nullable, required
          - `description` string, nullable, required
          - `skillBranch` string: The branch a local skill's repository link points at: the branch a run of the Loop's action checks out (its `baseBranch`, else the project's `defaultLoopBranch`, else the repository's default branch). Set only by the detail endpoint, for a local skill whose branch is known to this caller; omitted otherwise, and always omitted on the list.
        - `environment` object, nullable, required
          - `id` string, uuid, required
          - `name` string, required
        - `agent` string
        - `model` string
        - `effort` union
          - 'minimal'
          - 'low'
          - 'medium'
          - 'high'
          - 'xhigh'
          - 'max'
        - `instructions` string
        - `inputs` object
        - `baseBranch` string
        - `workdir` string
        - `timeout` string: A duration, such as `15m`.
        - `snapshotFamily` string
        - `sandboxSnapshot` string
      - `triggers` union[], required
        - union
          - object
            - `kind` 'cron', required
            - `name` string, required
            - `action` string, required: The name of the action it runs.
            - `description` string
            - `overrides` object, required
              - …
            - `lastRefusal` object, nullable, required: The refusal this trigger's latest verdict is, or null when its latest verdict started a run, was not an error, or it has none. Null on lists.
              - …
            - `cron` string, required
            - `timezone` string, required
            - `lastRunAt` string, date-time, nullable, required: When the latest request naming this trigger that started a run was accepted. Null on lists.
          - object
            - `kind` 'event', required
            - `name` string, required
            - `action` string, required: The name of the action it runs.
            - `description` string
            - `overrides` object, required
              - …
            - `lastRefusal` object, nullable, required: The refusal this trigger's latest verdict is, or null when its latest verdict started a run, was not an error, or it has none. Null on lists.
              - …
            - `on` string[], required
            - `when` object
            - `concurrency` object
              - …
      - `project` object, required
        - `id` string, uuid, required
        - `name` string, required
        - `repoUrl` string, required
      - `workspace` object, required
        - `id` string, uuid, required
        - `name` string, required
      - `status` union, required
        - 'active'
        - 'paused'
      - `pausedReason` object, nullable, required: Why Tessl paused the Loop, or null when it did not.
        - `code` string, required
        - `message` string, required
        - `pausedAt` string, date-time, required
      - `archivedAt` string, date-time, nullable, required
      - `readyMadeLoop` string, nullable, required: The ready-made Loop a Tessl setting created this one from, such as `conformance` or `implement`.
      - `pendingMove` object, nullable, required: The open pull request moving this Loop into `tessl.json`, or null.
        - `pullRequestUrl` string, required
      - `runNow` boolean, required: Whether the Loop's definition allows Run now. Running it still needs `edit` on the workspace.
      - `runCount` integer, required
      - `nextRunAt` string, date-time, nullable, required
      - `openFindingsCount` integer: Open findings this Loop observed. Absent when findings storage is unavailable.
      - `createdBy` object, nullable, required: Who created the Loop: the user, or for a Loop its `tessl.json` declares, the project whose automation did. A deleted project's name is its id. Null for an API key.
        - `kind` union, required
          - 'user'
          - 'api-key'
          - 'project'
        - `id` string, uuid, required
        - `name` string, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `500`: Internal Server Error

## Changes

- **2026-10-30** `4fa2a17154e4`: 1 info
  - added `subschema #3` to the `data/attributes/createdBy/anyOf[subschema #1]/kind` response property `anyOf` list for the response status `200`
- **2026-10-29** `06d2142ed144`: 1 info
  - api operation id `getLoop` was added
- **2026-10-23** `293e4f58620b`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tessl/apis/tessl-api/changes/experimental/loops/:loopId/get.md)

---

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