---
title: "Plan Ticket to PR"
method: GET
path: "/experimental/projects/{projectId}/factory/ticket-to-pr"
tags: ["Projects", "Schedules"]
---

# Plan Ticket to PR

`GET /experimental/projects/{projectId}/factory/ticket-to-pr`

## Request

- Base URL: `https://api.tessl.io`
- URL: `https://api.tessl.io/experimental/projects/{projectId}/factory/ticket-to-pr`
- Auth: none declared

Lists the factory Loops `POST /experimental/projects/{projectId}/factory/ticket-to-pr` would set up for the issue source, with the skill and triggers each one runs, so a client can show how they overlap the project's live Loops before setup. `existingLoopId` names the live Loop that already does a Loop's job, which setup leaves as it is. `issueSource` is the source setup would use, which is the source of the project's live ticket intake Loop when it has one: the oldest Loop whose triggers start on a GitHub issue label or a Linear issue delegated to Tessl. The GitHub label is the one setup would use before it checks the repository's spelling of it. `otherProjectLoops` lists the live event Loops of the other projects on the same repository that the caller can view, since one event from the repository can start one of them and a Loop setup plans.

## Path parameters

- `projectId` string, uuid, required

## Query parameters

- `issueSource` union
  - 'linear'
  - 'github'
- `label` string

## Headers

- `Authorization` string

## Response `200`

Default Response

- object
  - `links` object, required
    - `self` string, uri, required
  - `data` object, required
    - `id` string, uuid, required
    - `type` 'project', required
    - `attributes` object, required
      - `issueSource` object, required: The issue source setup would use: the one asked for, or the source of the live ticket intake Loop the project already has.
        - `type` union, required
          - 'linear'
          - 'github'
        - `label` string: GitHub source only: the issue label.
        - `fixed` boolean, required: Whether the project's live ticket intake Loop fixes the source. Setup then uses it whatever the request asks for.
      - `loops` object[], required
        - `stage` union, required
          - 'implement'
          - 'shepherd'
          - 'follow-ticket-changes'
        - `label` string, required
        - `skillRef` string, required
        - `triggers` object[], required
          - `name` string, required
          - `on` string[], required
          - `when` object
        - `existingLoopId` string, uuid, nullable, required
      - `otherProjectLoops` object[], required
        - `id` string, uuid, required
        - `projectId` string, uuid, required
        - `projectName` string, required
        - `label` string, nullable, required
        - `definitionSource` union, required
          - 'app'
          - 'repo'
        - `status` union, required
          - 'active'
          - 'paused'
        - `skillRef` string, required
        - `triggers` object[], required
          - `name` string, required
          - `on` string[], required
          - `when` object
          - `skillRef` string, required: The skill this trigger runs.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `409`: Default Response
- `500`: Internal Server Error

## Changes

- **2026-10-29** `06d2142ed144`: 1 info
  - api operation id `getProjectFactoryTicketToPr` was added
- **2026-10-22** `07c11b64968c`: 1 info
  - added the required property `data/attributes/otherProjectLoops` to the response with the `200` status
- **2026-10-22** `d97810390526`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tessl/apis/tessl-api/changes/experimental/projects/:projectId/factory/ticket-to-pr/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)
