---
title: "Trigger a dynamic pull request run"
method: POST
path: "/v1/projects/{projectId}/pull-request-runs"
tags: ["projects"]
---

# Trigger a dynamic pull request run

`POST /v1/projects/{projectId}/pull-request-runs`

Trigger the dynamic PR agent from CI using PR metadata. Callers do not send changed files; TesterArmy enriches with changed files and GitHub reporting only when the project has a supported GitHub connection.

## Path parameters

- `projectId` string, required

## Headers

- `Authorization` string, required

## Request body

- union
  - DynamicPrRunRequest0
    - `targetUrl` string, uri, required
    - `platform` 'web'
    - `pullRequest` DynamicPrRunRequestOneOf0PullRequest, required
      - `provider` 'github'
      - `number` integer, required
      - `title` string, required
      - `description` string
      - `baseBranch` string
      - `headBranch` string
      - `commitSha` string, required
  - DynamicPrRunRequest1
    - `platform` 'ios' | 'android', required
    - `pullRequest` DynamicPrRunRequestOneOf1PullRequest, required
      - `provider` 'github'
      - `number` integer, required
      - `title` string, required
      - `description` string
      - `baseBranch` string
      - `headBranch` string
      - `commitSha` string, required
    - `mobile` DynamicPrRunRequestOneOf1Mobile
      - `appId` string, uuid
      - `bundleId` string
      - `artifactUrl` string, uri
      - `artifactFilename` string
      - `buildId` string
    - `simulatorRegion` 'eu-north1' | 'us-west1'
    - `deeplink` string, uri — Deep link the test harness opens on the device after launching the app and before any test step runs (e.g. an Expo update-channel or backend-selection link). Applied deterministically; the QA agent is told the setup is already done.

## Response `202`

Dynamic PR run queued successfully

- ProjectsTriggerADynamicPullRequestRunResponse202
  - `status` 'queued', required
  - `runId` string, uuid, required
  - `projectId` string, uuid, required
  - `platform` 'web' | 'ios' | 'android', required
  - `metadata` V1ProjectsProjectIdPullRequestRunsPostResponsesContentApplicationJsonSchemaMetadata
    - `github` V1ProjectsProjectIdPullRequestRunsPostResponsesContentApplicationJsonSchemaMetadataGithub
      - `configured` boolean, required
      - `checkRunCreated` boolean, required
      - `commentTargetResolved` boolean, required
      - `status` 'not_configured' | 'check_create_failed' | 'pr_not_found'
    - `mobile` V1ProjectsProjectIdPullRequestRunsPostResponsesContentApplicationJsonSchemaMetadataMobile
      - `source` string, required
      - `buildId` string

## Other responses

- `400` — Bad Request - Invalid input parameters
- `401` — Unauthorized - Invalid or missing API key
- `404` — Project not found
- `413` — Request body too large
- `429` — Too Many Requests - Usage limit exceeded
- `500` — Internal Server Error
- `504` — Gateway Timeout - Test execution exceeded time limit

---

[API](https://skmtc.net/tester/apis/testerarmy-api.md) · [All operations](https://skmtc.net/tester/apis/testerarmy-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tester/testerarmy-api/versions/d0302b4c4e0e/schema)
