curl --request GET \
--url https://api.rial.io/v1/verifications \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.rial.io/v1/verifications"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.rial.io/v1/verifications', 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.rial.io/v1/verifications",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.rial.io/v1/verifications"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.rial.io/v1/verifications")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rial.io/v1/verifications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"status": "completed",
"capture_url": "https://verify.rial.io/v/vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"created_at": "2026-09-16T19:06:57.718Z",
"expires_at": "2026-09-16T20:06:57.718Z",
"captures_count": 1,
"verdict": {
"rial": false,
"signals": [
"screen_detected"
]
},
"object_match": {
"status": "match",
"expected_object": "car"
},
"location_match": {
"status": "verified",
"expected_location": "Av. Córdoba 5635, Buenos Aires",
"distance_m": 23
},
"condition": {
"score": 8,
"label": "good",
"aspects": [
{
"name": "paint",
"score": 8,
"reasoning": "Even, no visible damage."
}
]
}
},
{
"id": "vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"status": "pending",
"capture_url": "https://verify.rial.io/v/vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"created_at": "2026-09-16T19:06:57.718Z",
"expires_at": "2026-09-16T20:06:57.718Z",
"captures_count": 0
}
],
"next_cursor": "eyJwayI6ICJWRlkjdmZ5XzAxLi4uIiwic2siOiAiTUVUQSJ9"
}{
"error": {
"code": "invalid_request",
"message": "Request body failed validation",
"fields": [
{
"path": "config.max_captures",
"message": "must be ≤ 20"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key"
}
}List verifications
Newest first. Pass next_cursor back as cursor for the next page.
curl --request GET \
--url https://api.rial.io/v1/verifications \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.rial.io/v1/verifications"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.rial.io/v1/verifications', 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.rial.io/v1/verifications",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.rial.io/v1/verifications"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.rial.io/v1/verifications")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rial.io/v1/verifications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"status": "completed",
"capture_url": "https://verify.rial.io/v/vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"created_at": "2026-09-16T19:06:57.718Z",
"expires_at": "2026-09-16T20:06:57.718Z",
"captures_count": 1,
"verdict": {
"rial": false,
"signals": [
"screen_detected"
]
},
"object_match": {
"status": "match",
"expected_object": "car"
},
"location_match": {
"status": "verified",
"expected_location": "Av. Córdoba 5635, Buenos Aires",
"distance_m": 23
},
"condition": {
"score": 8,
"label": "good",
"aspects": [
{
"name": "paint",
"score": 8,
"reasoning": "Even, no visible damage."
}
]
}
},
{
"id": "vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"status": "pending",
"capture_url": "https://verify.rial.io/v/vfy_01HXYZABCDEFGHJKMNPQRSTVWX",
"created_at": "2026-09-16T19:06:57.718Z",
"expires_at": "2026-09-16T20:06:57.718Z",
"captures_count": 0
}
],
"next_cursor": "eyJwayI6ICJWRlkjdmZ5XzAxLi4uIiwic2siOiAiTUVUQSJ9"
}{
"error": {
"code": "invalid_request",
"message": "Request body failed validation",
"fields": [
{
"path": "config.max_captures",
"message": "must be ≤ 20"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key"
}
}Authorizations
Secret API key, created in the dashboard under Settings → API. Send it as Authorization: Bearer rk_secret_… from your server only. Publishable keys (pk_live_…) are for the native SDKs and reach the capture endpoints alone. An unknown key returns 401.
Query Parameters
Soft cap; adapters may return fewer.
1 <= x <= 10020
Opaque cursor from a previous response. Treat as a black box.
Exact match on verification status.
pending, partially_captured, completed, expired, failed, abandoned Exact match on verdict.label. Pending verifications never match.
verified, suspicious, failed Exact match on verdict.reason_code. Verifications with no verdict, or a verified verdict, never match.
screen_detected, ai_generated, context_mismatch, reverse_search_match Inclusive lower bound on created_at. ISO 8601 date or date-time.
"2026-07-01T00:00:00.000Z"
Inclusive upper bound on created_at. ISO 8601 date or date-time.
"2026-07-31T23:59:59.999Z"
Exact match against config.metadata[<key>]. Repeatable with different keys (ANDed). Literal param name is metadata. followed by the metadata key, e.g. metadata.client_label=estancia-la-julia.
"estancia-la-julia"
Exact match against ocr.primary of any capture on the verification.
"AB123CD"
Provenance split. audit matches config.mode = audit or an upload-only step spec (link-template audits that never stamp mode). verification is everything else — live capture, including rows that omit mode.
verification, audit Matches the template and all its historical URL slugs after renames. An unknown or deleted template falls back to an exact stored slug match. Verifications minted without a template never match.
2 - 40^[a-z0-9]+(?:-[a-z0-9]+)*$"warehouse-intake"