Identity verification monitors and alerts

Subscribe a subject to ongoing OFAC, PEP, and adverse-media screening, then review and disposition the alerts in the Wingspan V3 API.

An identity verification monitor re-screens a subject on a schedule. When a screening finds a possible match, the monitor raises an alert. You review each alert and either clear it or confirm it.

This page describes how the API behaves. It isn't legal advice, and an alert disposition isn't a legal determination.

Prerequisites

  • A Person credential. All eleven calls on this page are Person-scoped; sending X-Wingspan-Account returns 400 AccountScopeNotApplicable.
  • The subject's id. For Payee, Payer, and Stakeholder subjects, use the relationship record id, not a linked Account or Person id.

Endpoints

Method and pathOperation
POST /v3/onboarding/identity-verification-monitorscreateIdentityVerificationMonitor
GET /v3/onboarding/identity-verification-monitorslistIdentityVerificationMonitors
GET /v3/onboarding/identity-verification-monitors/{monitorId}getIdentityVerificationMonitor
POST .../{monitorId}/pausepauseIdentityVerificationMonitor
POST .../{monitorId}/resumeresumeIdentityVerificationMonitor
POST .../{monitorId}/cancelcancelIdentityVerificationMonitor
GET .../{monitorId}/alertslistIdentityVerificationMonitorAlerts
GET /v3/onboarding/identity-verification-alertslistIdentityVerificationAlerts
GET /v3/onboarding/identity-verification-alerts/{alertId}getIdentityVerificationAlert
POST .../{alertId}/confirmconfirmIdentityVerificationAlert
POST .../{alertId}/clearclearIdentityVerificationAlert

.../{monitorId} and .../{alertId} abbreviate the full paths above.

1. Create a monitor

FieldRequiredNotes
subjectYes{ "type": "Account" | "Person" | "Payee" | "Payer" | "Stakeholder", "id": "..." }.
tierYesTax, BankingGrade, or Enhanced.
cadenceNoDaily, Weekly, or Monthly. Default Monthly.
monitoredCheckTypesNoScreening checks only: OfacScreening, PepScreening, AdverseMedia.
identityVerificationIdNoThe verification that led to this monitor. Omit to create a standalone monitor.
externalIdNoYour own id, up to 200 characters.
metadataNoKey-value strings.
curl -X POST https://api.wingspan.app/v3/onboarding/identity-verification-monitors \
  -H "Authorization: Bearer $WINGSPAN_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": { "type": "Payee", "id": "Pq3rTn8LwX5sYb2kMc7dVa" },
    "tier": "BankingGrade",
    "cadence": "Weekly",
    "monitoredCheckTypes": ["OfacScreening", "PepScreening"]
  }'

The 201 response is the monitor with status: "Active", events.nextRunAt, and an ETag header.

StatusWhen
409 VerificationMonitorAlreadyExistsAn active monitor already exists for the same subject.type, subject.id, and tier.
409 ResourceConflictexternalId is already used by another monitor of yours. Create isn't an upsert; find the existing one with filter[externalId][eq].
422 UnsupportedValueAn entry in monitoredCheckTypes isn't a screening check.

2. Pause, resume, or cancel

CallAllowed fromResult
pauseActivePaused. No new alerts are produced.
resumePausedActive. Alerts resume on the next cadence tick.
cancelThe spec doesn't list the allowed statesCancelled. Terminal. You can create a new monitor for the same subject and tier afterwards.

Each takes no body, accepts Idempotency-Key and If-Match, and returns the updated monitor. A call from a state that doesn't allow it returns 409, and a stale If-Match returns 412. Monitor statuses are Active, Paused, and Cancelled.

3. List monitors

GET /v3/onboarding/identity-verification-monitors sorts by -createdAt by default and supports sort and page[size]/page[token]. Filters, each with [eq]: externalId, status, subjectType, subjectId, tier. Example: ?filter[status][eq]=Active&filter[subjectType][eq]=Payee.

4. Review alerts

List alerts for one monitor with GET .../{monitorId}/alerts, or across all monitors with GET /v3/onboarding/identity-verification-alerts. Alert filters, each with [eq]: status, severity, externalId, and on the cross-monitor list also monitorId and category.

An alert has monitorId, severity (Low, Medium, High, Critical), category (for example OfacSanctions, Pep, AdverseMedia), checkType, status, and a match object with name, score (0 to 100, higher is more concerning), source, and details. Critical means an exact OFAC or PEP match.

Alert status starts as Open. A reviewer moves it to one of two terminal states, and they exclude each other:

CallNew statusUse when
POST .../{alertId}/clearClearedThe match is a false positive or is otherwise resolved.
POST .../{alertId}/confirmConfirmedThe match is valid and needs action.

Both take no body and accept Idempotency-Key and If-Match. They set events.clearedAt or events.confirmedAt and actors.clearedBy or actors.confirmedBy. An alert that's no longer Open returns 409; a stale If-Match returns 412; an unknown id returns 404.

Webhooks

The catalog lists IdentityVerificationMonitor.* and IdentityVerificationMonitorAlert.* events. Subscribe with POST /v3/platform/webhooks. See Webhooks and events.

Related pages


Did this page help you?