Docs

Score API

The main endpoint. Send what you know about a visitor; get back a risk verdict.

POST /api/v1/score

Request fields

FieldDescription
emailoptionalVisitor's email address.
ipoptionalVisitor's IP address.
user_agentoptionalVisitor's browser user agent string.
identifieroptionalAny stable identifier you use for this visitor/lead (your own ID, phone, etc.).
source / subsourceoptionalYour own traffic-source labels, for reporting only. Never affects the score.
customoptionalUp to 10 of your own key/value pairs for reporting. See Custom Fields. Never affects the score.
browser_telemetryoptionalOnly needed if you're collecting it yourself instead of the browser script — see Browser Telemetry.
revylta_tokenoptionalOnly used in Signup Page Mode, to attach telemetry staged earlier by the signup script.

Note: at least one of email, ip, or user_agent is required.

Optional header

X-Request-IDA UUID you generate. Echoed back so you can correlate logs. Auto-generated if omitted or invalid.

Example request

curl -X POST "https://revylta.com/api/v1/score" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: YOUR_SERVER_API_KEY" \
  -d '{
  "email": "jane.doe@example.com",
  "ip": "203.0.113.42",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "source": "paid_search",
  "subsource": "brand_campaign",
  "custom": {
    "offer_id": "8842"
  }
}'
const response = await fetch("https://revylta.com/api/v1/score", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-KEY": "YOUR_SERVER_API_KEY"
  },
  body: JSON.stringify({
  "email": "jane.doe@example.com",
  "ip": "203.0.113.42",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "source": "paid_search",
  "subsource": "brand_campaign",
  "custom": {
    "offer_id": "8842"
  }
})
});

const result = await response.json();
console.log(result);
import requests

response = requests.post(
    "https://revylta.com/api/v1/score",
    headers={
        "Content-Type": "application/json",
        "X-API-KEY": "YOUR_SERVER_API_KEY"
    },
    json={
  "email": "jane.doe@example.com",
  "ip": "203.0.113.42",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "source": "paid_search",
  "subsource": "brand_campaign",
  "custom": {
    "offer_id": "8842"
  }
}
)

print(response.status_code)
print(response.json())
require "net/http"
require "json"
require "uri"

uri = URI("https://revylta.com/api/v1/score")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["X-API-KEY"] = "YOUR_SERVER_API_KEY"
request.body = JSON.generate({
  "email": "jane.doe@example.com",
  "ip": "203.0.113.42",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
  "source": "paid_search",
  "subsource": "brand_campaign",
  "custom": {
    "offer_id": "8842"
  }
})

response = http.request(request)
puts response.code
puts response.body
<?php
$payload = [
    "email" => "jane.doe@example.com",
    "ip" => "203.0.113.42",
    "user_agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "source" => "paid_search",
    "subsource" => "brand_campaign",
    "custom" => [
        "offer_id" => "8842"
    ]
];

$ch = curl_init("https://revylta.com/api/v1/score");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Content-Type: application/json",
    "X-API-KEY: YOUR_SERVER_API_KEY"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response . PHP_EOL;

Example response

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "input": {
    "email": "jane.doe@example.com",
    "ip": "203.0.113.42"
  },
  "findings": [
    {
      "key": "chk_1",
      "score": 0,
      "status": "completed",
      "warnings": []
    },
    {
      "key": "chk_2",
      "score": 40,
      "status": "completed",
      "warnings": [
        "Elevated risk signal detected"
      ]
    }
  ],
  "missing_inputs": [],
  "skipped_modules": [],
  "pending_modules": [],
  "summary": {
    "score": 40,
    "risk_level": "medium",
    "block": false,
    "warnings": [
      "Elevated risk signal detected"
    ],
    "validation_passed": true,
    "degraded": false,
    "timeout_modules": [],
    "errored_modules": [],
    "skipped_modules": []
  }
}

Response fields

request_idEcho of the request ID (yours or auto-generated). Save this — you'll need it for telemetry and to fetch background results.
statuscompleted or pending (a slower check is still running in the background — see Fetch a Result).
findingsOne entry per check that ran, each with a short reference key, a score, a status, and any human-readable warnings. Build against score/status/warnings — the set of checks and their internal names aren't published and can change.
missing_inputsWhich of email/ip/user_agent you didn't send — some checks can't run without them.
skipped_modulesChecks that didn't run, and why.
summary.scoreOverall numeric risk score for this request.
summary.risk_levellow, medium, or high — the score bucketed against your account's configured bands.
summary.blockOur recommendation: true means block/reject this lead.
summary.degradedtrue if one or more checks timed out or errored — the score is still valid, just based on partial evidence.