curl -X POST https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen \
-H "Authorization: Bearer lid_live_..."
const res = await fetch(
'https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen',
{
method: 'POST',
headers: { 'Authorization': 'Bearer lid_live_...' }
}
);
const { ok, data } = await res.json(); // data: { status, riskScore?, riskBand?, severity?, categories?, checkedAt, reason?, skipCause? }
{ "ok": true, "data": { "status": "unavailable", "checkedAt": "...", "reason": "Payer source address could not be determined for this network" } }
Payments
Run AML screening
Re-run AML compliance screening of the payer’s source address for a Liddie payment and get the stored risk result. Read-only; 10/min.
POST
/
api
/
v1
/
payments
/
{paymentId}
/
aml-screen
curl -X POST https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen \
-H "Authorization: Bearer lid_live_..."
const res = await fetch(
'https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen',
{
method: 'POST',
headers: { 'Authorization': 'Bearer lid_live_...' }
}
);
const { ok, data } = await res.json(); // data: { status, riskScore?, riskBand?, severity?, categories?, checkedAt, reason?, skipCause? }
{ "ok": true, "data": { "status": "unavailable", "checkedAt": "...", "reason": "Payer source address could not be determined for this network" } }
Re-run the compliance screen of the payer’s source address for a payment and get the stored result. Screening also runs automatically when a payment is credited — this endpoint is the on-demand re-run. It’s read-only: it never blocks or moves funds by itself.
This endpoint takes no request body — the payment is identified by the
paymentId path parameter, so an empty playground body is expected.
curl -X POST https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen \
-H "Authorization: Bearer lid_live_..."
const res = await fetch(
'https://api.liddie.io/api/v1/payments/6a0000000000000000000001/aml-screen',
{
method: 'POST',
headers: { 'Authorization': 'Bearer lid_live_...' }
}
);
const { ok, data } = await res.json(); // data: { status, riskScore?, riskBand?, severity?, categories?, checkedAt, reason?, skipCause? }
{ "ok": true, "data": { "status": "unavailable", "checkedAt": "...", "reason": "Payer source address could not be determined for this network" } }
Treat
status: "unavailable" as a normal outcome, not a failure: it simply means there’s no deposit to trace yet (or the source address can’t be determined on that network). Don’t retry it in a loop.Authorization
- API-key scope:
payments:read· JWT team permission:payments:view - Rate limit: 10/min.
string
required
24-hex payment id from create/list.
Response fields
string
Screening status.
unavailable is a normal outcome when there is no deposit to trace, not an error. skipped means the screen was deliberately not run — see skipCause.number
Risk score, when a screen result exists. (The wire field is
riskScore, not risk.)string
Coarse risk band derived from the score, when a screen result exists.
string
Severity classification of the result, when present.
string[]
Matched risk categories, when present.
string (ISO date)
When the screen ran.
string
Present only when
status is skipped; explains why screening was not performed. Treat a skip as “not screened”, not as “clean”.Errors
| Status | Body | Why |
|---|---|---|
| 404 | {"ok":false,"error":{"code":"PAYMENT_NOT_FOUND",...}} | unknown or foreign payment id |
See also
- Get a payment: the stored screen result also appears there as the
amlobject. - Payments overview: where screening fits in the payment lifecycle.
- Authentication: scopes and team permissions for this group.