Introduction

The EnemoVerify API is a REST API for identity verification (KYC), business verification (KYB), background checks, and AML screening. All requests are made to https://api.enemoverify.com over HTTPS.

All responses are JSON. Successful responses return HTTP 200 (or 202 for async operations). Errors follow a consistent envelope format documented below.

Authentication

Authenticate every request with a Bearer token. Keys are prefixed with ev_live_ for production and ev_test_ for sandbox.

Authorization: Bearer ev_live_XXXXXXXXXXXXXXXXXXXXXXXXXX

Generate keys in the API Keys section of your dashboard. Keys are shown once at creation — store them securely. Rotate by creating a new key and revoking the old one.

Errors

All errors follow this envelope:

{
  "error": {
    "code": "invalid_parameter",
    "param": "redirect_url",
    "message": "redirect_url must be a valid HTTPS URL",
    "doc_url": "https://docs.enemoverify.com/errors#invalid_parameter"
  }
}
CodeHTTPMeaning
unauthorized401Missing or invalid API key
forbidden403Key lacks scope for this operation
not_found404Resource does not exist
invalid_parameter400Request body validation failed
duplicate_reference409A verification with this reference_id exists
kyc_required422Background check requires approved KYC first
rate_limit_exceeded429Plan limit or API rate limit reached
internal_error500Unexpected server error

KYC — Identity verification

POST/v1/kyc/create

Initiates an identity verification for an individual.

Request body

ParamTypeDescription
reference_idstringYour identifier for this person. Must be unique per environment.
flowenumstandard | enhanced | lite
checksstring[]Optional override. Defaults depend on flow.
redirect_urlstringHTTPS URL to return the user to after verification.
webhook_urlstringOptional. Overrides org default.
countrystringISO 3166-1 alpha-2. Used for provider routing.
localestringBCP 47. Defaults to en-US.
expires_innumberSeconds (300–86400). Default 3600.
metadataobjectKey-value pairs attached to the session.
curl https://api.enemoverify.com/v1/kyc/create \
  -H "Authorization: Bearer ev_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "reference_id": "user_38291",
    "flow": "enhanced",
    "redirect_url": "https://yoursite.com/verification-done",
    "country": "US"
  }'
GET/v1/kyc/:id

Retrieves a KYC session. Append ?expand=checks to include events.

KYB — Business verification

POST/v1/kyb/create

Verifies a business against the appropriate corporate registry.

ParamTypeDescription
reference_idstringYour identifier. Unique per environment.
legal_namestringLegal registered name.
countrystringISO 3166-1 alpha-2. Determines registry.
registration_numberstringOptional. Speeds up lookup.
entity_typestringOptional. LLC, Corporation, etc.
beneficial_ownersarrayOptional UBO list: [{name, ownership_percentage, role}]
ownership_thresholdnumberDefault 25.
GET/v1/kyb/:id
GET/v1/kyb/:id/owners

Returns the full beneficial ownership structure.

Background checks

POST/v1/background/create

Requires an approved KYC verification first. Pass the KYCverification_id in kyc_verification_id.

ParamTypeDescription
reference_idstringYour identifier.
kyc_verification_idstringMust reference a verification with status APPROVED.
packageenumbasic | standard | enhanced | driver | custom
custom_checksstring[]Required if package=custom.
GET/v1/background/:id

AML screening

POST/v1/aml/screen

Synchronous sanctions, PEP, and adverse media screen. Returns results immediately.

ParamTypeDescription
reference_idstringYour identifier.
namestringFull name to screen.
dobstringYYYY-MM-DD. Improves accuracy.
countrystringISO 3166-1 alpha-2.
kyc_verification_idstringOptional. Links this screen to a KYC record.
continuous_monitoringbooleanRe-screens this subject on list updates.
POST/v1/aml/monitor

Toggles continuous monitoring on an existing AML verification.

Verifications

GET/v1/verifications

Lists all verifications with cursor pagination. Supports filtering:

ParamTypeDescription
typeenumkyc | kyb | background | aml
statusenumpending | processing | approved | declined | review | expired | cancelled
limitnumberMax 100. Default 25.
starting_afterstringCursor (previous last verification_id).
DELETE/v1/verifications/:id

GDPR right-to-erasure. Permanently deletes the verification and all associated events. Cannot be undone.

Webhooks

POST/v1/webhooks

Registers a new webhook endpoint. The signing secret is returned once.

ParamTypeDescription
urlstringHTTPS endpoint that will receive events.
eventsstring[]Array of event types, or ["*"] for all.
environmentenumLIVE | SANDBOX. Defaults to the key's env.

Verifying signatures

Every delivery includes a signature header:

EnemoVerify-Signature: t=1744660800,v1=7e8a...

Compute HMAC-SHA256 over ${timestamp}.${payload} with your signing secret:

import { createHmac, timingSafeEqual } from "crypto";

function verify(payload: string, header: string, secret: string) {
  const [t, v1] = header.split(",").map(p => p.split("=")[1]);
  const expected = createHmac("sha256", secret)
    .update(`${t}.${payload}`)
    .digest("hex");
  return timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}
GET/v1/webhooks/:id
DELETE/v1/webhooks/:id

Event types

  • kyc.verification.approved
  • kyc.verification.declined
  • kyc.verification.review
  • kyc.session.expired
  • kyb.verification.approved
  • kyb.verification.declined
  • kyb.verification.review
  • background.check.completed
  • background.check.declined
  • aml.screen.clear
  • aml.screen.flagged

Sandbox magic reference IDs

In sandbox (ev_test_ keys), pass one of these reference IDs to get deterministic results without completing any flows.

Reference IDTypeResult
ev_test_approve_kycKYCAPPROVED
ev_test_decline_docKYCDECLINED (document tamper)
ev_test_decline_livenessKYCDECLINED (liveness fail)
ev_test_review_low_confKYCREVIEW (low confidence)
ev_test_watchlist_hitKYCREVIEW (watchlist hit)
ev_test_approve_kybKYBAPPROVED
ev_test_decline_kybKYBDECLINED
ev_test_kyb_not_foundKYBDECLINED (not in registry)
ev_test_approve_bgcBackgroundAPPROVED
ev_test_decline_bgcBackgroundDECLINED
ev_test_aml_clearAMLClear
ev_test_aml_ofac_hitAMLFlagged (OFAC)

Rate limits

Every API key is rate-limited to 100 requests per minute. Plan-based monthly verification limits apply in addition.

Every response includes:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1744660860