Docs menu
Guides
API reference
Sending outcome feedback
When you learn what a player really was, after a chargeback, a failed or passed KYC check, or bonus abuse, report it with POST /api/v1/feedback. Detection learns from your outcomes.
Last updated
What to send
Tell InlineShield what a screened player turned out to be (fraud or legit), by the requestId the API returned or by the /check token. Accepted for screenings up to 180 days old by requestId; a /check token is kept for about a day after the screening, so later feedback must use the requestId. Sending the same feedback again changes nothing (changed: false).
Feedback on a test screening is accepted but never recorded (changed: false). Limited per key to your plan's per-minute limit; never counted against the quota and accepted while the account is over it.
A token is kept for about a day after the screening (10 minutes to redeem it with /siteverify, then pruned a day after it expires); for later feedback send the requestId, which /siteverify returns.
| Field | Type | Required | Description |
|---|---|---|---|
requestId | string | no | The requestId the API returned. |
token | string | no | The /check token. A token is kept for about a day after the screening; for later feedback send the requestId (/siteverify returns it). |
outcome | string | yes | Values: fraud, legit |
category | string or null | no | Values: bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other, null |
note | string or null | no | At most 200 characters after trimming. Never shown to other operators.at most 200 characters |
Code
# Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
curl -X POST https://api.inlineshield.io/api/v1/feedback \
-H "X-Api-Key: $INLINESHIELD_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"requestId\": \"$REQUEST_ID\", \"outcome\": \"fraud\", \"category\": \"chargeback\"}"// Node 18+. Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
const r = await fetch('https://api.inlineshield.io/api/v1/feedback', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-Api-Key': process.env.INLINESHIELD_API_KEY },
body: JSON.stringify({ requestId, outcome: 'fraud', category: 'chargeback' }),
signal: AbortSignal.timeout(3000)
});
if (!r.ok) console.warn('InlineShield feedback not recorded:', r.status, await r.text());# Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
import os, requests
r = requests.post(
"https://api.inlineshield.io/api/v1/feedback",
headers={"X-Api-Key": os.environ["INLINESHIELD_API_KEY"]},
json={"requestId": request_id, "outcome": "fraud", "category": "chargeback"},
timeout=3,
)
if r.status_code != 200:
print("InlineShield feedback not recorded:", r.status_code, r.text)<?php
// Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
require __DIR__ . '/InlineShield.php';
$inlineshield = new InlineShield\Client(getenv('INLINESHIELD_API_KEY'));
// $requestId: the requestId you stored when the player signed up
$result = $inlineshield->feedback($requestId, 'fraud', ['category' => 'chargeback']);
if (!$result['success']) {
error_log('InlineShield feedback not recorded: ' . $result['error']); // NOT_FOUND, SCREENING_TOO_OLD, ...
}// Java 11+. Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
String json = "{\"requestId\":\"" + requestId + "\",\"outcome\":\"fraud\",\"category\":\"chargeback\"}";
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.inlineshield.io/api/v1/feedback"))
.timeout(Duration.ofSeconds(3))
.header("Content-Type", "application/json")
.header("X-Api-Key", System.getenv("INLINESHIELD_API_KEY"))
.POST(HttpRequest.BodyPublishers.ofString(json)).build();
HttpResponse<String> resp = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
if (resp.statusCode() != 200) {
System.err.println("InlineShield feedback not recorded: " + resp.statusCode() + " " + resp.body());
}// Tell InlineShield how a signup really turned out (fraud or legit), for example after a chargeback, a failed or passed KYC, or bonus abuse, so detection learns from your outcomes. Identify the signup by the requestId InlineShield returned (or send token: the /check token instead). Optional: category (bonus_abuse, multi_account, chargeback, kyc_failed, bot, good_customer, other) and note (up to 200 characters, never shown outside your account). Response 200 { success, outcome, category, changed }; sending the same feedback again changes nothing. 404 = unknown requestId, 422 = the signup is older than 180 days. Not counted toward your monthly limit; limited per key like /verify.
using var req = new HttpRequestMessage(HttpMethod.Post, "https://api.inlineshield.io/api/v1/feedback")
{
Content = JsonContent.Create(new { requestId, outcome = "fraud", category = "chargeback" })
};
req.Headers.Add("X-Api-Key", Environment.GetEnvironmentVariable("INLINESHIELD_API_KEY"));
var resp = await http.SendAsync(req); // reuse one HttpClient with a 3 s timeout
if (!resp.IsSuccessStatusCode)
{
Console.Error.WriteLine($"InlineShield feedback not recorded: {(int)resp.StatusCode}");
}Answers
200{ success, outcome, category, changed }. Sending the same feedback again changes nothing (changed: false); a different outcome replaces the earlier one.404 NOT_FOUND: no screening of your account has that requestId or token.422 SCREENING_TOO_OLD: the screening is more than 180 days old.400 BAD_REQUEST: a malformed body; send exactly one ofrequestIdandtoken.
Test screenings
Feedback on a test screening is accepted but never recorded: the answer is 200 with changed: false. See POST /api/v1/feedback for every field.