http://localhost/api/v1/screen/{shield_id}/feedback
scope: screen.feedback
Reports the real outcome of a previously screened order back to WHA Shield. block_ip adds the screened IP to your blacklist (the same list POST /api/v1/lists and every future check consult). mark_fraud/mark_legitimate record the outcome (confirmed_fraud/false_positive) against a Case Management case for the IP — real ground-truth data the trainable risk scorer learns from over time, not just a label. mark_fraud/mark_legitimate return 503 if Case Management isn't installed on this instance; block_ip always works.
| Field | Type | Optional | Description |
|---|---|---|---|
action |
string | Required | One of mark_fraud, mark_legitimate, block_ip. |
reason |
string | Optional | Optional free text. |
curl -X POST http://localhost/api/v1/screen/20260805-36B0F1/feedback \
-H "Authorization: Bearer wsk_xxx_xxx" \
-d "action=mark_fraud&reason=Chargeback+confirmed+by+processor"
<?php
$ch = curl_init('http://localhost/api/v1/screen/20260805-36B0F1/feedback');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer wsk_xxx_xxx']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['action' => 'mark_fraud', 'reason' => 'Chargeback confirmed by processor']));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
import requests
response = requests.post("http://localhost/api/v1/screen/20260805-36B0F1/feedback",
headers={"Authorization": "Bearer wsk_xxx_xxx"},
data={"action": "mark_fraud", "reason": "Chargeback confirmed by processor"},
)
data = response.json()
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
body := strings.NewReader("action=mark_fraud&reason=Chargeback+confirmed+by+processor")
req, _ := http.NewRequest("POST", "http://localhost/api/v1/screen/20260805-36B0F1/feedback", body)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Authorization", "Bearer wsk_xxx_xxx")
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
{
"data": {
"action": "mark_fraud", "ip": "103.148.154.174",
"case_id": 7, "outcome": "confirmed_fraud"
}
}