Developer API

Adverse media screening API.

Add person screening to your business tools. Submit a name and optional identity details, then receive structured findings, source links, identity confidence and search coverage.

Start here

Your first screening

Use a bearer API key from your server. Create a screening, poll its resource, then read the findings and coverage.

  1. 1Create a request
  2. 2Poll until finished
  3. 3Review the evidence
POST/api/v1/screenings

Build your request

Edit the fields to update every code example.

Sign in to run a real check using your allowance. Opening the playground does not start a screening.

RequestPOST
{
  "subject": {
    "firstName": "Alex",
    "lastName": "Example",
    "country": "US"
  },
  "searchDepth": "standard"
}

A new request returns 202 and a Location header. A retry with the same workspace key and normalized request returns 200, the current result state and Idempotent-Replay: true.

Request fields

Send the details you know.

Only first and last name are required. Use only identifiers you are allowed to process. All subject fields below belong inside subject, except the two marked top-level.

Screening request fields
FieldRequiredFormat
firstName, lastNameRequiredRequired1 to 120 characters each. The combined name must fit the search limit.
middleNameOptionalOptionalUp to 120 characters.
dateOfBirthOptionalOptionalA real date in YYYY-MM-DD, not in the future.
countryOptionalOptionalISO 3166-1 alpha-2 code, such as US or BG. Case-insensitive.
state, cityOptionalOptionalUp to 120 characters each. Location helps distinguish people with the same name.
postalCode, genderOptionalOptionalUp to 32 and 50 characters respectively.
phone, emailOptionalOptionalPhone in E.164 format. Email must be valid and at most 298 characters.
referenceIdOptionalOptionalTop-level customer reference, up to 120 characters. Keep personal data out of it.
searchDepthOptionalOptionalTop-level enum: standard (default) or enhanced.

Search text is trimmed. Blank optional fields are omitted, country is normalized to uppercase, and email to lowercase. Unknown properties and control characters in search fields are rejected. Omit optional fields instead of sending null.

Read a result

Identity, role and coverage are separate.

isPerpetratorboolean | null

The person's reported role in this event. It is not proof of guilt or confirmation that this is the person you searched for.

true
The source describes an alleged or established adverse actor.
false
The source clearly assigns a different role.
null
The role is unclear or was not recorded in an older result.

Victim-only and witness-only events are excluded from adverse findings. Always read eventStage, identity.confidence and the quoted evidence.

Example response Fictional data

This fixed example is independent of the names entered above. It is not a live response.

Example response200
{
  "id": "00000000-0000-4000-8000-000000000001",
  "object": "screening",
  "status": "completed",
  "outcome": "potential_match",
  "failureCode": null,
  "referenceId": null,
  "searchDepth": "standard",
  "createdAt": "2026-09-01T10:00:00.000Z",
  "completedAt": "2026-09-01T10:02:00.000Z",
  "expiresAt": "2026-09-08T10:00:00.000Z",
  "subject": {
    "firstName": "Alex",
    "lastName": "Example",
    "country": "US",
    "city": "Boston"
  },
  "findings": [
    {
      "id": "00000000-0000-4000-8000-000000000002",
      "category": "fraud",
      "eventStage": "charge",
      "isPerpetrator": true,
      "severity": "high",
      "title": "Reported fraud charge",
      "summary": "A fictional report describes a charge against Alex Example.",
      "eventDate": "2026-08-20",
      "identity": {
        "confidence": "medium",
        "matchedAttributes": [
          "name",
          "location"
        ],
        "conflictingAttributes": []
      },
      "adverseRelevance": "high",
      "sources": [
        {
          "title": "Fictional report",
          "url": "https://example.com/report",
          "domain": "example.com",
          "publishedAt": "2026-08-21",
          "excerpt": "Alex Example of Boston was charged with fraud. The charge has not been proven."
        }
      ]
    }
  ],
  "coverage": {
    "complete": true,
    "searchesCompleted": 4,
    "sourcesReviewed": 3
  },
  "limitations": [
    "Illustrative data only. Review identity and evidence before use."
  ]
}
potential_match

At least one possible match is supported. Other findings may still need identity review. Inspect each finding.

no_verified_matches

No supported match was found within the completed search scope. This is not proof that no adverse media exists.

inconclusive

A possible signal needs human review. Check identity confidence, reported role and source evidence.

search_incomplete

No supported result could be returned and coverage was incomplete.

coverage.complete is separate from outcome. A result with findings can still have partial coverage. Read limitations, and review every finding before use.

Category and event stage values

category: corruptioncybercrimefinancial_crimefraudlegalorganized_crimeregulatoryterrorismtraffickingviolenceother

eventStage: allegationinvestigationchargeconvictionenforcementacquittaldismissalother

Lifecycle

Poll a stable resource.

queued

The request and any credit reservation were accepted.

searching

The screening is still processing.

Terminal status

Stop polling and inspect the result.

Poll the Location URL only while status is queued or searching. Honor Retry-After, use increasing delays and stop on completed, incomplete, failed or cancelled. The Node.js and Python examples include bounded polling.

Completed describes processing.

A completed screening can have outcome search_incomplete. Check outcome and coverage separately.

expiresAt is the result's expiry time. After it, a read returns 410. Deletion or retention cleanup releases the idempotency key, so reusing it can create a new screening.

Credits and limits

Know the cost before you send.

Read GET /usage first. credits.standardCost and credits.enhancedCost are authoritative: paid plans normally use 1 and 2 credits; Unlimited returns 0 for both.

Compare prepaid credit packs and cost per screening. The browser playground and API use the same signed-in workspace allowance.

The request limit is shared by all API keys in the workspace. A workspace can have at most five queued, retrying, or active screenings. Read RateLimit-Policy and RateLimit when present. Protective network limits can also return 429, without workspace limit headers. Honor Retry-After.

Cancellation or deletion returns reserved credits only if processing has not begun. Inspect usage after a cancellation; do not assume that every cancelled screening is free.

API reference

Five operations. One workspace.

Base URL: https://adversesearch.com/api/v1. Every operation requires a valid bearer API key for an active workspace.

POST /screenings

Create a screening with Idempotency-Key.

GET /screenings/{id}

Read the current state or result.

POST /screenings/{id}/cancel

202 accepts the request to stop. Active work may still be stopping. Poll for a terminal status; already terminal records return 409.

DELETE /screenings/{id}

204 removes the result and stops processing. A later GET returns 410; repeated DELETE returns 404.

GET /usage

Read your plan, credit balance, costs, expiry and request limit.

Save the screening ID returned at creation. The public API does not have a list endpoint.

Errors and retries

Retry the same operation safely.

Use one opaque idempotency key per logical screening, shared across retries with the same body. A different normalized body under the same key returns 409. Keep personal data out of keys.

API error handling
StatusWhat to do
400Invalid fields or malformed JSON. Correct the request before retrying.
401 / 403Check your API key, its expiry and workspace access.
402Insufficient credits. No screening was created.
404 / 410The resource was not found, or its result was deleted or expired.
409IDEMPOTENCY_CONFLICT: use the original request for this key. SCREENING_NOT_CANCELLABLE: processing is already terminal.
413The request body is too large.
423BILLING_REVIEW_HOLD: this result is unavailable while a billing review is pending.
429A request or active-screening limit was reached. Honor Retry-After before retrying.
500 / 503The request could not be completed or the service is temporarily unavailable. Keep the request ID; retry creation with the same key and body.

Read error.code, error.message and error.requestId. Responses also include X-Request-ID. A terminal screening may have failureCode; this does not mean it should be recreated automatically.

Keep API keys on the server.

Never put a live key in browser code, mobile bundles, URLs or logs. The live playground uses your signed-in account.

Review screening data security and the privacy and retention policy before integrating personal data. For rollout questions, contact AdverseSearch.