---
title: "Verify a flow"
method: POST
path: "/flows/{flowId}/verify"
tags: ["Flows"]
---

# Verify a flow

`POST /flows/{flowId}/verify`

## Request

- Base URL: `https://api.mobilerun.ai`
- URL: `https://api.mobilerun.ai/flows/{flowId}/verify`
- Auth: HTTP bearer

Run a bound, deduplicated **verification** of this flow on exactly one device as a real run.

Unlike a normal trigger firing, verification:
- runs a flow that is `enabled` OR `disabled` (an archived flow returns 404);
- targets one device (`deviceId`, or the single bound device);
- is idempotent per `invocationId`: a repeat returns the existing run (`deduplicated: true`, HTTP 200) instead of enqueuing another (HTTP 202);
- never mutates flow health, `lastTriggeredAt`, or the repair loop.

Per-activation payload gate:
- `custom`: validates the payload against the custom payload schema (422 on failure).
- `event`: validates the payload against the event catalog schema and evaluates the trigger conditions; a failing gate returns 409 `conditions_not_met` with the dry-run report.
- `schedule`: the payload is ignored.

## Path parameters

- `flowId` string, uuid, required

## Request body

- VerifyFlowBody
  - `invocationId` string, uuid, required: Client-supplied idempotency key. A repeat request for the same (flow, invocationId) returns the existing verification run (`deduplicated: true`, HTTP 200) instead of enqueuing another.
  - `deviceId` string, uuid: Device to run the verification on. Must be one the flow is bound to. Optional only when the flow is bound to exactly one device (that device is used); otherwise required.
  - `payload` object

## Response `200`

Verification run already existed (deduplicated)

- object
  - `data` VerifyFlowResult, required
    - `executionId` string, uuid, required
    - `invocationId` string, uuid, required
    - `flowId` string, uuid, required
    - `triggerId` string, uuid, required
    - `deviceId` string, uuid, nullable, required: Device the verification runs on; null for a device-free verification (a 0-device flow whose actions are all device-free allowlisted).
    - `kind` 'verification', required
    - `status` 'pending' | 'running' | 'success' | 'failed' | 'cancelled' | 'skipped' | 'invalid', required
    - `deduplicated` boolean, required: True when this run already existed for the (flow, invocationId) key (HTTP 200); false for a newly enqueued run (HTTP 202).

## Other responses

- `202`: Verification run enqueued
- `404`: Flow not found
- `409`: Event trigger conditions (or payload) not met — the run was not enqueued
- `422`: Device not selectable (`device_required` / `device_not_bound`) or payload validation failed
- `429`: Too Many Requests

## Changes

- **2026-10-16** `4ad548c528a8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/droidrun/apis/droidrun-cloud/changes/flows/:flowId/verify/post.md)

---

[API](https://skmtc.dev/droidrun/apis/droidrun-cloud.md) - [All operations](https://skmtc.dev/droidrun/apis/droidrun-cloud/llms.txt) - [OpenAPI document](https://skmtc.dev/droidrun/apis/droidrun-cloud/revisions/1cc95586c933?raw)
