curl --request POST \
--url https://api.getdialed.ai/v1/credentials/{credential_id}/test \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/credentials/{credential_id}/test"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/credentials/{credential_id}/test', 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.getdialed.ai/v1/credentials/{credential_id}/test",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.getdialed.ai/v1/credentials/{credential_id}/test"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/credentials/{credential_id}/test")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/credentials/{credential_id}/test")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"details": "Authenticated successfully; 3 lists visible",
"latency_ms": 412,
"success": true,
"tested_at": "2026-07-09T18:00:00Z"
}{
"detail": "Authentication required"
}{
"detail": "Admin role required"
}{
"detail": "Credential not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Test a saved credential
Check a saved credential’s stored secret against its platform. Admin only.
This is a liveness check. It proves the stored credentials are still real and that the platform is reachable with them — which is what you want to know after a rotation, or when a flow starts failing. It does NOT prove what the credentials are permitted to do: verifying permissions would mean performing the operations themselves against your live vendor account, which this API will not do.
For permissions, read the credential instead. Every dispatch records what this credential was used for and whether it worked, per service, and GET /credentials/{credential_id} returns that record — so you can see what a credential can actually do without running a flow to find out.
Always returns 200 with a result; only an unknown credential id returns 404. On success the credential’s last verification time is refreshed. A failure never changes the credential’s status, and never records a verification that did not happen. This call spends a little of the provider account’s call budget, and is refused rather than made when that budget cannot be checked.
curl --request POST \
--url https://api.getdialed.ai/v1/credentials/{credential_id}/test \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/credentials/{credential_id}/test"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/credentials/{credential_id}/test', 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.getdialed.ai/v1/credentials/{credential_id}/test",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.getdialed.ai/v1/credentials/{credential_id}/test"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/credentials/{credential_id}/test")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/credentials/{credential_id}/test")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"details": "Authenticated successfully; 3 lists visible",
"latency_ms": 412,
"success": true,
"tested_at": "2026-07-09T18:00:00Z"
}{
"detail": "Authentication required"
}{
"detail": "Admin role required"
}{
"detail": "Credential not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Path Parameters
Response
Successful Response
Result of a credential test. Returned with HTTP 200 for every test
outcome, including failures and timeouts — inspect success and error
rather than the status code. When success is false, error is one of:
AUTH_FAILED, NETWORK, TIMEOUT, RATE_LIMITED, PERMISSION_DENIED,
INVALID_CREDENTIALS_SHAPE, UNKNOWN. latency_ms measures the platform
round-trip only.