Skip to content

Developer documentation

AML screening API: start with one request.

Integrate sanctions and PEP screening into your customer review workflow. Read the public API contract, test request handling in the sandbox, then evaluate live source coverage and record review decisions.

Make your first request

  1. Create a free account, then open Settings → API Keys in the dashboard.
  2. Select Create API Key, name the key and choose Test (cc_test_*). Select screening:write and screening:read, then create the key.
  3. Copy the secret when it is shown and store it on your server. Replace the placeholder in the example below. Send it in Authorization: Bearer (or X-API-Key).

A cc_test_ key returns simulated sandbox results. Use it to check your integration with fictional data; it does not test live source coverage or consume live screening quota. Keep API keys out of browser code.

curl https://api.circlescheck.com/api/v1/screenings \
  -H 'Authorization: Bearer cc_test_your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"fullName":"Alex Sample","type":"individual","dateOfBirth":"1980-01-15","country":"GB","screeningType":"combined"}'

From sandbox to live evaluation

When you are ready to evaluate real results, create a separate key with the Live (cc_live_*) environment in Settings → API Keys. Inspect the source inventory, compare representative cases, and review the returned evidence. The screening endpoint returns potential sanctions and PEP matches; identity-document verification is a separate workflow.

The free evaluation includes 50 live screenings per month. Successful live API checks share that allowance with manual and CSV screening. Free evaluation does not include recurring monitoring. Creating an account does not start a paid subscription.

For ongoing production work, Starter is $79.99 USD/month, billed monthly, with 1,000 screenings per month and recurring customer monitoring. Successful recurring scans use the same screening allowance.

Review the selected plan, billing interval and current price before confirming payment in checkout.

Interpret the response

This fictional sandbox example illustrates the response envelope. Read matches from result.matches. A match is a candidate for human review; a similarity score is not the probability that the person is sanctioned. No matches is a point-in-time result for the queried scope, not a compliance guarantee.

{
  "id": "00000000-0000-4000-8000-000000000001",
  "status": "completed",
  "query": {
    "fullName": "Alex Example",
    "type": "individual",
    "screeningType": "combined"
  },
  "result": {
    "riskLevel": "low",
    "riskScore": 0,
    "matchCount": 0,
    "matches": []
  },
  "isTestMode": true,
  "processingTimeMs": 0
}

Live results include source evidence when available. Compare names, aliases, birth dates, identifiers, and jurisdictions; retain reviewer notes and source timestamps. Identity-field conflicts remain visible for review. An unavailable engine returns an error, never a clean screening result.

Screen, review, save evidence, monitor

Paths below are relative to https://api.circlescheck.com/api/v1.

POST /screenings

JSON: fullName, type (individual or business), optional dateOfBirth, country, nationality, screeningType, customerId. A linked customer must belong to your organization and match the queried identity. name is accepted as an alias for fullName. Returns a screening UUID and result.matches.

GET /screenings/{id}

Retrieve the saved query, result, engine/source evidence, status, and recorded reviews.

PATCH /screenings/{id}/matches/{matchId}

JSON: disposition (true_positive, false_positive, under_review, dismissed), required reviewNotes explaining the decision. Use the returned match UUID, not entityId.

GET /screenings/{id}/report

Download the saved screening and reviewer evidence as application/pdf. Failed screenings cannot be exported as clean reports.

POST /screenings/batch

multipart/form-data with a file field. CSV columns: customer_ref, name, type, date_of_birth, country. customer_ref is optional for screening and required to save a portfolio; keep it stable and unique in your organization. Maximum 1,000 rows; successful saved checks count toward your plan.

POST /screenings/batch/{id}/portfolio

JSON: saveToPortfolio: true, optional screeningIds and customerRefs. Explicitly save selected completed live rows as customers and link their checks. Return per-row outcomes; repeated saves do not re-screen or charge again. Conflicting identities must be resolved.

POST /screenings/batch/{id}/monitoring

JSON: confirmRecurring: true, frequency (daily or weekly), optional customerIds. Requires a current paid subscription and previously saved batch customers. New entries use the completed batch check as their starting record; existing entries retain their cadence and paused state. Subsequent successful scans use allowance.

GET /customers/{id}/screenings

Retrieve completed checks linked to this customer, saved review decisions, and monitoring state. Paginate with limit and offset. Prior decisions provide context; they do not automatically resolve a new candidate.

POST /monitoring

JSON: fullName, entityType (individual or business), optional dateOfBirth, country, customerId, frequency (daily or weekly). Recurring screening requires a paid plan; free evaluation is limited.

GET /monitoring/hits

List changes flagged for review. Repeated unchanged results do not create new alerts.

POST /webhooks

JSON: url and events. Save the signing secret returned when creating the webhook; validate subsequent request signatures.

Download an illustrative screening report

Handle errors and usage limits

HTTP statusNext action
400Correct the payload or CSV rows before retrying.
401Check API key validity and environment.
402Your monthly allowance is exhausted or this action requires a current paid subscription. Review the upgradeUrl; saved customers remain available.
403Check your role or the plan required for the workflow.
404Confirm the record exists in your organization.
409Complete the screening before exporting evidence, or resolve the conflicting record state.
429Check the usage limit or Retry-After header. Upgrade or wait; do not retry in a tight loop.
503The screening service is unavailable. Treat the check as incomplete and retry with backoff.

Each successfully saved live entity screening counts once, including CSV rows and recurring monitoring checks. Failed checks release their quota reservation. Published plans cap included usage; an upgrade requires an explicit checkout. Review current plan limits.

Verify webhook signatures

Hash the exact raw request body with the webhook secret using HMAC-SHA256. Compare it with X-CirclesCheck-Signature, formatted as sha256=<hex digest>, using a constant-time comparison. Reject invalid signatures. Deduplicate deliveries using X-CirclesCheck-Delivery; return a successful HTTP status only after saving the event.

Event names include screening.completed and case.created. Avoid assuming a successful delivery means a candidate has been reviewed.

Public endpoint index

All paths require an API key or an authenticated organization session. Access varies by role and plan. The downloadable OpenAPI file contains detailed request contracts for the core workflow above and an index of the remaining public operations.

Adverse Media
  • GET/api/v1/adverse-media/{id}
  • PATCH/api/v1/adverse-media/{id}
  • GET/api/v1/adverse-media
  • POST/api/v1/adverse-media
Alerts
  • PATCH/api/v1/alerts/{id}
  • GET/api/v1/alerts
Analytics
  • GET/api/v1/analytics/audit-readiness
  • GET/api/v1/analytics/compliance-health
  • GET/api/v1/analytics/risk-heatmap
  • GET/api/v1/analytics/risk-portfolio
  • GET/api/v1/analytics/team
Audit Export
  • POST/api/v1/audit-export
Calendar
  • GET/api/v1/calendar
  • POST/api/v1/calendar
  • PATCH/api/v1/calendar
Case Templates
  • GET/api/v1/case-templates
Cases
  • GET/api/v1/cases/{id}/evidence/{evidenceId}/file
  • POST/api/v1/cases/{id}/evidence
  • POST/api/v1/cases/{id}/notes
  • GET/api/v1/cases/{id}
  • PATCH/api/v1/cases/{id}
  • GET/api/v1/cases/{id}/sar
  • POST/api/v1/cases/{id}/sar
  • POST/api/v1/cases/batch
  • GET/api/v1/cases
  • POST/api/v1/cases
Ctr
  • GET/api/v1/ctr/{id}
  • PATCH/api/v1/ctr/{id}
  • GET/api/v1/ctr
  • POST/api/v1/ctr
Customers
  • GET/api/v1/customers/{id}/edd
  • POST/api/v1/customers/{id}/edd
  • PATCH/api/v1/customers/{id}/edd
  • GET/api/v1/customers/{id}/kyb
  • PATCH/api/v1/customers/{id}/kyb
  • GET/api/v1/customers/{id}/network
  • GET/api/v1/customers/{id}/risk-factors
  • GET/api/v1/customers/{id}
  • PATCH/api/v1/customers/{id}
  • GET/api/v1/customers/{id}/timeline
  • GET/api/v1/customers/{id}/ubo/{ownerId}
  • PATCH/api/v1/customers/{id}/ubo/{ownerId}
  • DELETE/api/v1/customers/{id}/ubo/{ownerId}
  • GET/api/v1/customers/{id}/ubo
  • POST/api/v1/customers/{id}/ubo
  • GET/api/v1/customers
  • POST/api/v1/customers
  • GET/api/v1/customers/{id}/screenings
Import
  • GET/api/v1/import/{jobId}
  • GET/api/v1/import
  • POST/api/v1/import
  • GET/api/v1/import/templates
Kyc
  • GET/api/v1/kyc/{id}/documents/{docId}/file
  • POST/api/v1/kyc/{id}/documents
  • GET/api/v1/kyc/{id}/documents
  • GET/api/v1/kyc/{id}
  • PATCH/api/v1/kyc/{id}
  • POST/api/v1/kyc/{id}/selfie
  • POST/api/v1/kyc
  • GET/api/v1/kyc
Monitoring
  • GET/api/v1/monitoring/{id}
  • PATCH/api/v1/monitoring/{id}
  • GET/api/v1/monitoring/hits
  • PATCH/api/v1/monitoring/hits
  • GET/api/v1/monitoring
  • POST/api/v1/monitoring
  • DELETE/api/v1/monitoring
Notification Preferences
  • GET/api/v1/notification-preferences
  • PATCH/api/v1/notification-preferences
Notifications
  • GET/api/v1/notifications
  • PATCH/api/v1/notifications
Questionnaires
  • GET/api/v1/questionnaires/{id}
  • PATCH/api/v1/questionnaires/{id}
  • GET/api/v1/questionnaires
  • POST/api/v1/questionnaires
  • GET/api/v1/questionnaires/templates
Reports
  • POST/api/v1/reports
Scheduled Reports
  • GET/api/v1/scheduled-reports
  • POST/api/v1/scheduled-reports
  • DELETE/api/v1/scheduled-reports
Screenings
  • PATCH/api/v1/screenings/{id}/matches/{matchId}
  • GET/api/v1/screenings/{id}/report
  • GET/api/v1/screenings/{id}
  • POST/api/v1/screenings/batch
  • GET/api/v1/screenings/batch
  • GET/api/v1/screenings/export
  • POST/api/v1/screenings
  • GET/api/v1/screenings
  • POST/api/v1/screenings/batch/{id}/portfolio
  • POST/api/v1/screenings/batch/{id}/monitoring
Transaction Rules
  • GET/api/v1/transaction-rules/settings
  • PUT/api/v1/transaction-rules/settings
Transactions
  • GET/api/v1/transactions/{id}
  • GET/api/v1/transactions
  • POST/api/v1/transactions
Webhooks
  • GET/api/v1/webhooks/{id}/deliveries
  • PATCH/api/v1/webhooks/{id}
  • DELETE/api/v1/webhooks/{id}
  • POST/api/v1/webhooks/{id}/test
  • GET/api/v1/webhooks/deliveries
  • GET/api/v1/webhooks
  • POST/api/v1/webhooks
Workflow Rules
  • GET/api/v1/workflow-rules/{id}
  • PATCH/api/v1/workflow-rules/{id}
  • DELETE/api/v1/workflow-rules/{id}
  • GET/api/v1/workflow-rules
  • POST/api/v1/workflow-rules

Technical examples reviewed against the application contract on October 1, 2026. Coverage and matching quality should be evaluated on your own representative cases.

Get help evaluating your integration