PlatformXeDocs
Get API Key

Tenant Lists

Manage your own allowlists and blocklists for the screening engine.

Tenant-managed screening lists let you push your own allowlist or blocklist entries into the same fuzzy-match engine that backs sanctions / PEP screening. Hits against tenant lists surface in /api/v1/fraud/screen responses alongside global hits, with a listKind of tenant_blocklist or tenant_allowlist.

When to use which kind

KindEffect on screenTypical use
tenant_blocklistCounts toward the default kinds filter — every screen hits this list automatically.Internal denylists: known fraudsters, charged-back customers, banned merchant counterparties.
tenant_allowlistOff by default — caller must opt in via kinds: [..., 'tenant_allowlist'].Trusted-counterparty lists used by rules to suppress false positives or relax verdict bands.

Allowlist hits never block on their own — they're informational. Use them inside rule conditions to express "treat this counterparty as safe".

Endpoints

MethodPathDescription
GET/api/v1/fraud/listsList the org's tenant lists
POST/api/v1/fraud/listsCreate a tenant list
GET/api/v1/fraud/lists/:idFetch one list
PATCH/api/v1/fraud/lists/:idRename (only name is mutable)
DELETE/api/v1/fraud/lists/:idHard delete (cascades to entries)
GET/api/v1/fraud/lists/:id/entriesList entries (paginated)
POST/api/v1/fraud/lists/:id/entriesBulk add entries (≤ 1,000 per request)
DELETE/api/v1/fraud/lists/:id/entries/:entryIdRemove one entry
PropertyValue
Scopefraud:manage
Plan gateDetection Pack addon (Pro or Enterprise)
Rate limit500 requests / hour per API key

The global sanctions / PEP / adverse-media lists are admin-managed and refreshed via the daily ingest cron — they cannot be created, updated, or deleted from this surface.

Create a list

curl -X POST https://api.platformxe.com/api/v1/fraud/lists \
  -H "Content-Type: application/json" \
  -H "x-api-key: pxk_live_your_api_key_here" \
  -d '{
    "source": "internal-blocklist-v1",
    "name": "Internal blocklist",
    "kind": "tenant_blocklist"
  }'
FieldTypeRequiredDescription
sourcestringYesStable identifier, unique within your organisation. Allowed: alphanumerics + -, _, ., :. ≤ 200 chars.
namestringYesDisplay name. ≤ 200 chars.
kind"tenant_blocklist" | "tenant_allowlist"YesDetermines screening behaviour (see When to use which kind).

Returns 201 with the created list summary. A duplicate source returns 409 CONFLICT.

Add entries (bulk)

curl -X POST https://api.platformxe.com/api/v1/fraud/lists/slst_xxx/entries \
  -H "Content-Type: application/json" \
  -H "x-api-key: pxk_live_..." \
  -d '{
    "entries": [
      { "name": "Jane Doe", "country": "NG" },
      { "name": "John O'Brien", "dob": "1980-04-15", "identifiers": { "bvn": "12345678901" } },
      { "name": "Acme Bad Co.", "raw": { "case_id": "CASE-9281", "notes": "chargeback ring" } }
    ]
  }'
FieldTypeRequiredDescription
entries[].namestringYesPrimary identifier. Will be canonicalised (lowercase, diacritics stripped, honorifics dropped, punctuation collapsed) before storage.
entries[].dobstringNoISO date. Used as a soft filter at screen time.
entries[].countrystringNoISO 3166-1 alpha-2. Auto-uppercased.
entries[].identifiersRecord<string,string>NoTenant-specific ids (BVN, NIN, internal case ids). Not used for fuzzy match — preserved for case reconstruction.
entries[].rawobjectNoRaw payload retained alongside the entry for audit. Falls back to { name, dob, country, identifiers } when omitted.

Limits: ≤ 1,000 entries per request. Larger uploads should be split client-side. The endpoint is idempotent — pass an Idempotency-Key header to deduplicate retries.

Search behaviour

Entries are normalised at write-time using the same pipeline as the screen query, so:

"Dr. Jane O'Brien-Smith Jr"   →   "jane o brien smith"
"São Paulo"                    →   "sao paulo"
"Côte d'Ivoire"                →   "cote d ivoire"

This keeps the GIN trigram index from migration 0018_screening_pg_trgm.sql consistent across all access paths.

Deletion semantics

DELETE /api/v1/fraud/lists/:id is a hard delete. The list and all its entries are removed via the cascading FK constraint. There is no soft-delete or tombstone — past fraud_screen_results rows still reference deleted entries, but the source list is gone.

If you want to retire a list without losing the audit trail, prefer renaming it (PATCH) and removing entries one-by-one, or stop pointing rules at it.

Errors

HTTPCodeCause
400BAD_REQUESTValidation failure: missing or invalid field, source format, kind not in tenant_*, oversized batch.
401UNAUTHORIZEDMissing or invalid API key.
402DETECTION_PACK_REQUIREDDetection Pack addon not enabled.
403FORBIDDENAPI key has no organisation context, or wrong scope.
404NOT_FOUNDList or entry unknown, or belongs to a different org.
409CONFLICTDuplicate source for an existing list.
429RATE_LIMITED500/hr ceiling exceeded.
500INTERNAL_ERRORUnexpected service failure.