curl --request POST \
--url https://api.revring.ai/v1/test-suites/{id}/runs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"testCaseIds": [
"<string>"
],
"variables": {}
}
'import requests
url = "https://api.revring.ai/v1/test-suites/{id}/runs"
payload = {
"name": "<string>",
"testCaseIds": ["<string>"],
"variables": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', testCaseIds: ['<string>'], variables: {}})
};
fetch('https://api.revring.ai/v1/test-suites/{id}/runs', 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.revring.ai/v1/test-suites/{id}/runs",
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([
'name' => '<string>',
'testCaseIds' => [
'<string>'
],
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.revring.ai/v1/test-suites/{id}/runs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.revring.ai/v1/test-suites/{id}/runs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revring.ai/v1/test-suites/{id}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testSuiteId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "queued",
"totalTests": 123,
"passedTests": 123,
"failedTests": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"mode": "chat",
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"attempts": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testCaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testCaseName": "<string>",
"attemptNumber": 123,
"createdAt": "2023-11-07T05:31:56Z",
"callId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"inboundCallId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": "pass",
"reasoning": "<string>",
"transcript": [
{}
],
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"variables": {}
}
],
"variables": {}
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "unauthorized"
}{
"error": "billing_inactive"
}{
"error": "not_found"
}Start Test Run
Start a new test run. This initiates real phone calls between a tester and the target agent for each test case. The suite must have at least one test case.
curl --request POST \
--url https://api.revring.ai/v1/test-suites/{id}/runs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"testCaseIds": [
"<string>"
],
"variables": {}
}
'import requests
url = "https://api.revring.ai/v1/test-suites/{id}/runs"
payload = {
"name": "<string>",
"testCaseIds": ["<string>"],
"variables": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', testCaseIds: ['<string>'], variables: {}})
};
fetch('https://api.revring.ai/v1/test-suites/{id}/runs', 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.revring.ai/v1/test-suites/{id}/runs",
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([
'name' => '<string>',
'testCaseIds' => [
'<string>'
],
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.revring.ai/v1/test-suites/{id}/runs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.revring.ai/v1/test-suites/{id}/runs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revring.ai/v1/test-suites/{id}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testSuiteId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "queued",
"totalTests": 123,
"passedTests": 123,
"failedTests": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"mode": "chat",
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"attempts": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testCaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"testCaseName": "<string>",
"attemptNumber": 123,
"createdAt": "2023-11-07T05:31:56Z",
"callId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"inboundCallId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": "pass",
"reasoning": "<string>",
"transcript": [
{}
],
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"variables": {}
}
],
"variables": {}
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "unauthorized"
}{
"error": "billing_inactive"
}{
"error": "not_found"
}Authorizations
API key for authentication. Generate API keys from the RevRing dashboard.
Path Parameters
Test suite ID
Body
Test run name (optional, auto-generated if omitted)
128Override the suite's test type for this run only. Omit to use the suite's configured type.
chat, voice, sms, web_chat Run only these test cases instead of the entire suite (for example, to re-run just the tests that failed). Omit to run the whole suite. IDs that do not belong to the suite are ignored; if none match, the request is rejected.
Variable overrides for this run only. Merged over the suite's defaultVariables and each test case's variables (run values win) for every attempt, then rendered into the agent's prompt exactly as on a real call. Use this to supply values at the moment you start a run without editing the suite or its tests.
Response
Test run started
A test run execution
Show child attributes
Show child attributes