Skip to main content

Events

POST /v1/events scores one event. Required: event_id and event_type. Everything else is optional, but rules can only use what you send.

FieldNotes
event_idUUID you generate. The idempotency key.
event_typepayment, payout, login, registration, deposit or withdrawal.
asynctrue to ingest and score in the background. Default false.
external_account_idYour id for the user (string, up to 64 chars; a number is accepted). Links events into one account. To use it in /v1/accounts/{id} URLs it may contain only letters, digits and . _ : @ -; otherwise use the acc_... id.
brand_idYour brand tag, up to 64 chars.
contextip, user_agent, fp_id, session_id, country, affiliate_id, session_anon.
useremail, phone (E.164 or national with user.country; an unparseable number is accepted and reported in enrichment_status.phone), name, country, registered_at, plus email_hash / phone_hash for callers that cannot send raw values, and the declared marks trusted, vip, is_known_fraud, chargeback_flag, name_blocked, sanctions_match.
paymentamount_cents (integer), currency, method, bin, last4, billing_country, card_token (used for velocity counts only; card links and reputation use bin + last4).
extrasFree-form object for project-specific signals.

Unknown top-level properties are rejected with 400; the context, user and payment objects accept extra fields. The full schema, with limits, is in the API reference.

caution

user.trusted, user.vip and the declared marks (is_known_fraud, chargeback_flag, name_blocked, sanctions_match) act through the rules of the project's preset: in the shipped presets trusted and vip allow with score 0 and the others hard-block, but an archived or shadow rule stops that. Set them only from data you trust.

Idempotency​

event_id is the idempotency key. Resending the same sync request does not score twice and returns the stored result (without degraded, latency_ms and account_public_id when it is rebuilt from storage). Sending the same event_id with a different body returns 409 EVENT_ID_CONFLICT; the async flag is not part of the compared body. A repeated async request returns a new 202 receipt. After a 500 or 503, retry the same event_id and body.

Sync and async​

Sync is the default and returns 200 with the decision. With "async": true you get 202 and an accepted_at receipt; read the result with GET /v1/scores/{event_id} (pending until scored) or through the decision webhook. See How it works.

Reading the result​

FieldMeaning
decisionallow, review or block.
risk_score, max_possibleThe score (floored at 0; equal to max_possible on a hard block) and the sum of all positive deltas of active scoring rules. It is a scale for display, not always an attainable score.
breakdownPer active rule: rule_id, rule_version, score_delta, band, matched, reason (the rule id), and action when matched. Shadow rules are omitted; on a trust or hard-block verdict only the winning rule is listed.
flagsrule_ids of matched monitoring rules.
actionsPresent only when non-empty: actions requested by matched active rules. The only supported form is require_kyc:<phone|document|liveness|sanctions|pep>.
trust_override, hard_block_hitEvaluation ended early on a trust or hard-block rule.
degradedPresent when an active rule could not read a signal as written. See fail-closed behaviour.
enrichment_statusPer-provider outcome: ok, unconfigured, error, unparseable.
account_public_idThe resolved account id (acc_...), usually present when you sent external_account_id. Not returned by GET /v1/scores.
latency_msRule evaluation time only. Not returned by GET /v1/scores.

Linked accounts and erasure​

  • GET /v1/accounts/{id}/links returns a flat links array of accounts sharing an email, phone, fp, ip_24h or card signal with this one; each entry has a signal_type. There is no time filter, so older IP links are included. {id} is the acc_... id or your own external_account_id. Signals are shown masked.
  • DELETE /v1/accounts/{id} erases an account (GDPR). It needs a live key and the accounts:erase scope.