Tests
Visual Tests
Manage and run cross-device visual regression tests.
POST
/
test
/
visual
Visual Tests
curl --request POST \
--url https://api.example.com/test/visual \
--header 'Content-Type: application/json' \
--data '
{
"action": "<string>",
"data": {
"url": "<string>",
"name": "<string>",
"routeId": "<string>",
"when": "<string>",
"time": "<string>",
"engine": "<string>"
}
}
'import requests
url = "https://api.example.com/test/visual"
payload = {
"action": "<string>",
"data": {
"url": "<string>",
"name": "<string>",
"routeId": "<string>",
"when": "<string>",
"time": "<string>",
"engine": "<string>"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
action: '<string>',
data: {
url: '<string>',
name: '<string>',
routeId: '<string>',
when: '<string>',
time: '<string>',
engine: '<string>'
}
})
};
fetch('https://api.example.com/test/visual', 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.example.com/test/visual",
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([
'action' => '<string>',
'data' => [
'url' => '<string>',
'name' => '<string>',
'routeId' => '<string>',
'when' => '<string>',
'time' => '<string>',
'engine' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"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.example.com/test/visual"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/test/visual")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/test/visual")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"routes": [
{}
],
"route": {},
"transaction_id": "<string>"
}Manage and run visual tests across desktop, laptop, iPad, and mobile viewports. Dispatch the desired operation with the
action field in the request body.
Actions
| Action | Description |
|---|---|
list | List visual routes with their latest result. |
add | Register a new URL for visual monitoring. |
delete | Remove a visual route. |
results | Retrieve stored visual results. |
run | Trigger a visual test immediately. |
schedule | Schedule a visual run. |
Headers
string
Optional caller-provided transaction identifier for tracing.
Request body
string
required
One of
list, add, delete, results, run, or schedule.object
Payload for the selected action.
Show data fields
Show data fields
string
Fully qualified URL to capture. Required for
add.string
Human-readable name (1–80 characters). Required for
add.string
Identifier of the visual route. Required for
delete, run, and schedule.string
Schedule mode:
at, every, or now. Required for schedule.string
Time expression paired with
when. Required for schedule.string
Rendering engine for
run and schedule: self or api.Response
array
Returned by
list. Each entry includes id, url, name, createdAt, running, and latest (a VisualLatestResult with status, takenAt, workflowId, and per-device imageUrl/analysis).object
Returned by
add.string
Returned by
run and schedule — the async job identifier.Every successful response includes the
X-Credits-Remaining header.⌘I
Visual Tests
curl --request POST \
--url https://api.example.com/test/visual \
--header 'Content-Type: application/json' \
--data '
{
"action": "<string>",
"data": {
"url": "<string>",
"name": "<string>",
"routeId": "<string>",
"when": "<string>",
"time": "<string>",
"engine": "<string>"
}
}
'import requests
url = "https://api.example.com/test/visual"
payload = {
"action": "<string>",
"data": {
"url": "<string>",
"name": "<string>",
"routeId": "<string>",
"when": "<string>",
"time": "<string>",
"engine": "<string>"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
action: '<string>',
data: {
url: '<string>',
name: '<string>',
routeId: '<string>',
when: '<string>',
time: '<string>',
engine: '<string>'
}
})
};
fetch('https://api.example.com/test/visual', 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.example.com/test/visual",
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([
'action' => '<string>',
'data' => [
'url' => '<string>',
'name' => '<string>',
'routeId' => '<string>',
'when' => '<string>',
'time' => '<string>',
'engine' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"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.example.com/test/visual"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/test/visual")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/test/visual")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"data\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"routeId\": \"<string>\",\n \"when\": \"<string>\",\n \"time\": \"<string>\",\n \"engine\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"routes": [
{}
],
"route": {},
"transaction_id": "<string>"
}