Docs

Outcomes API

Tell us what happened after a lead was scored: whether you reached them, they engaged, they converted, or you confirmed fraud. These observations help us measure and improve accuracy for your traffic.

Send each event against the original request_id. A lead can have several events over time, such as call_answered, accepted_for_payout, and a later refunded. Keep the events separate.

Available outcomes

Business value

Event nameWhen to send it
accepted_for_payoutThe client accepted the lead for payout.
chargebackThe client reported a chargeback; fraud is not established.
convertedThe client reported a conversion.
qualifiedThe client qualified the lead using its business criteria.
refundedThe client reported a refund; fraud is not established.

Contactability

Event nameWhen to send it
call_answeredThe lead answered a call.
email_bouncedAn email to the lead bounced.
number_disconnectedThe lead phone number was disconnected.

Engagement

Event nameWhen to send it
appointment_bookedThe lead booked an appointment.
chat_repliedThe lead sent a reply after receiving a message.
chat_startedThe lead initiated a chat.
photo_uploadedThe lead uploaded a photo; authenticity is not established.

Integrity

Event nameWhen to send it
fraud_confirmedThe client explicitly confirmed fraud.
genuineThe client explicitly verified the lead as genuine.
identity_verifiedIdentity was verified; this does not establish absence of fraud.

Report what you observed. A chat reply or photo upload does not prove a lead is genuine; a refund or chargeback does not by itself prove fraud. No reported event means unknown.

Need another outcome?

If your workflow has an outcome we haven't covered, let your Revylta account manager know. Send the event name, what exactly happened, and when you would report it. We can map your name to an existing outcome or add a new one. Unknown event names are accepted and saved as unmapped until their meaning is agreed.

POST /api/v1/outcomes

Request fields

FieldDescription
request_idrequiredThe request_id from the original score response.
outcomeoptionalSupported alias for event_name. Existing integrations can keep using this field.
occurred_atoptionalISO 8601 timestamp of when it happened. Defaults to now.
event_nameoptionalClient event or shared name, e.g. chat_replied. Supply event_name or outcome. Lowercase letters, numbers and underscores, starting with a letter, maximum 100 characters. Use an event from the list above or a name agreed with your account manager. If both fields are supplied, event_name takes precedence.
metadataoptionalAny extra JSON you want stored alongside the outcome.
curl -X POST "https://revylta.com/api/v1/outcomes" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: YOUR_SERVER_API_KEY" \
  -d '{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "chat_replied",
  "occurred_at": "2026-08-20T14:32:00Z"
}'
const response = await fetch("https://revylta.com/api/v1/outcomes", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-KEY": "YOUR_SERVER_API_KEY"
  },
  body: JSON.stringify({
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "chat_replied",
  "occurred_at": "2026-08-20T14:32:00Z"
})
});

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

response = requests.post(
    "https://revylta.com/api/v1/outcomes",
    headers={
        "Content-Type": "application/json",
        "X-API-KEY": "YOUR_SERVER_API_KEY"
    },
    json={
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "chat_replied",
  "occurred_at": "2026-08-20T14:32:00Z"
}
)

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

uri = URI("https://revylta.com/api/v1/outcomes")
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({
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "chat_replied",
  "occurred_at": "2026-08-20T14:32:00Z"
})

response = http.request(request)
puts response.code
puts response.body
<?php
$payload = [
    "request_id" => "550e8400-e29b-41d4-a716-446655440000",
    "event_name" => "chat_replied",
    "occurred_at" => "2026-08-20T14:32:00Z"
];

$ch = curl_init("https://revylta.com/api/v1/outcomes");
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;

Response

Example response (additional event timestamps and identifiers are also returned). An unmapped event returns outcome: "other" and event.mapped: false; its original event name is preserved.

{
  "status": "recorded",
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "outcome": "chat_replied",
  "event": {
    "event_name": "chat_replied",
    "meaning": "chat_replied",
    "category": "engagement",
    "mapping_version": 1,
    "mapped": true
  },
  "occurred_at": "2026-08-20T14:32:00Z"
}

Errors

404No request with that request_id exists on your account.
422Event name is missing or malformed.