Verify a flow
curl --request POST \
--url https://api.mobilerun.ai/v1/flows/{flowId}/verify \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {}
}
'import requests
url = "https://api.mobilerun.ai/v1/flows/{flowId}/verify"
payload = {
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
invocationId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
deviceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
payload: {}
})
};
fetch('https://api.mobilerun.ai/v1/flows/{flowId}/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mobilerun.ai/v1/flows/{flowId}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'invocationId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'deviceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'payload' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mobilerun.ai/v1/flows/{flowId}/verify"
payload := strings.NewReader("{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mobilerun.ai/v1/flows/{flowId}/verify")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mobilerun.ai/v1/flows/{flowId}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"deduplicated": true,
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "verification",
"status": "pending",
"triggerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"data": {
"deduplicated": true,
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "verification",
"status": "pending",
"triggerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>"
}{
"error": "conditions_not_met",
"report": {
"actions": [
{
"continueOnError": true,
"flowActionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"method": "<string>",
"name": "<string>",
"recordingEnabled": true,
"service": "tasks_api",
"children": [
"<unknown>"
],
"params": {}
}
],
"activation": "event",
"conditionsPassed": true,
"gates": {
"blocked": true,
"cooldownActive": true,
"deviceAttached": true,
"deviceIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"enabled": true
},
"nextFireTime": "<string>",
"rateLimited": true,
"validation": {
"valid": true,
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
},
"wouldFire": true
}
}{
"error": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>"
}Flows
Verify a flow
Run a bound, deduplicated verification of this flow on exactly one device through the real worker.
Unlike a normal trigger firing, verification:
- runs a flow that is
enabledORdisabled(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 409conditions_not_metwith the dry-run report.schedule: the payload is ignored.
POST
/
flows
/
{flowId}
/
verify
Verify a flow
curl --request POST \
--url https://api.mobilerun.ai/v1/flows/{flowId}/verify \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {}
}
'import requests
url = "https://api.mobilerun.ai/v1/flows/{flowId}/verify"
payload = {
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payload": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
invocationId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
deviceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
payload: {}
})
};
fetch('https://api.mobilerun.ai/v1/flows/{flowId}/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mobilerun.ai/v1/flows/{flowId}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'invocationId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'deviceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'payload' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mobilerun.ai/v1/flows/{flowId}/verify"
payload := strings.NewReader("{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mobilerun.ai/v1/flows/{flowId}/verify")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mobilerun.ai/v1/flows/{flowId}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"invocationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"deviceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"payload\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"deduplicated": true,
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "verification",
"status": "pending",
"triggerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"data": {
"deduplicated": true,
"deviceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invocationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "verification",
"status": "pending",
"triggerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>"
}{
"error": "conditions_not_met",
"report": {
"actions": [
{
"continueOnError": true,
"flowActionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"method": "<string>",
"name": "<string>",
"recordingEnabled": true,
"service": "tasks_api",
"children": [
"<unknown>"
],
"params": {}
}
],
"activation": "event",
"conditionsPassed": true,
"gates": {
"blocked": true,
"cooldownActive": true,
"deviceAttached": true,
"deviceIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"enabled": true
},
"nextFireTime": "<string>",
"rateLimited": true,
"validation": {
"valid": true,
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
},
"wouldFire": true
}
}{
"error": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>"
}Authorizations
Bearer token via Authorization header
Path Parameters
Body
application/json
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.
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.
Show child attributes
Show child attributes
Response
Verification run already existed (deduplicated)
Show child attributes
Show child attributes
Was this page helpful?
⌘I