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
Optional caller-provided transaction identifier for tracing.
Request body
One of
list, add, delete, results, run, or schedule.Payload for the selected action.
Show data fields
Show data fields
Fully qualified URL to capture. Required for
add.Human-readable name (1–80 characters). Required for
add.Identifier of the visual route. Required for
delete, run, and schedule.Schedule mode:
at, every, or now. Required for schedule.Time expression paired with
when. Required for schedule.Rendering engine for
run and schedule: self or api.Response
Returned by
list. Each entry includes id, url, name, createdAt, running, and latest (a VisualLatestResult with status, takenAt, workflowId, and per-device imageUrl/analysis).Returned by
add.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>"
}