Sift · Arazzo Workflow

Sift Screen Account Creation

Version 1.0.0

Score a new account on signup and decision the user when risk is high.

1 workflow 3 source APIs 1 provider
View Spec View on GitHub Fraud PreventionTrust And SafetyRisk ScoringIdentity VerificationChargebacksAccount TakeoverContent AbuseArazzoWorkflows

Provider

sift-com

Workflows

screen-account-creation
Submit a create-account event, read the Sift Score, and decision risky users.
Records a $create_account event for synchronous scoring, retrieves the latest cached score for the user, and applies a decision to the user when the score exceeds the supplied risk threshold.
3 steps inputs: abuseTypes, accountId, apiKey, ip, riskyDecisionId, scoreThreshold, sessionId, userEmail, userId outputs: appliedDecision, scores
1
sendCreateAccount
sendEvent
Submit a $create_account event for the user with return_score=true so Sift computes a synchronous score for the requested abuse types.
2
getUserScore
getScore
Read back the latest cached Sift Score for the user across the requested abuse types so the workflow can branch on the numeric risk value.
3
decisionRiskyUser
applyUserDecision
Apply the configured risky-user decision to the user entity when the account abuse score crossed the threshold.

Source API Descriptions

Arazzo Workflow Specification

sift-com-screen-account-creation-workflow.yml Raw ↑
arazzo: 1.0.1
info:
  title: Sift Screen Account Creation
  summary: Score a new account on signup and decision the user when risk is high.
  description: >-
    The canonical Sift onboarding defense. A $create_account event is submitted
    synchronously with return_score=true so the freshest Sift Score is available
    the moment the account is created. The workflow then reads back the user's
    cached score across the requested abuse types and branches: when the account
    abuse score crosses the configured threshold it applies a block (or watch)
    decision to the user, otherwise it ends and lets the signup proceed. Every
    request is spelled out inline so the flow can be read and run without opening
    the underlying OpenAPI descriptions.
  version: 1.0.0
sourceDescriptions:
- name: eventsApi
  url: ../openapi/sift-events-api-openapi.yml
  type: openapi
- name: scoreApi
  url: ../openapi/sift-score-api-openapi.yml
  type: openapi
- name: decisionsApi
  url: ../openapi/sift-decisions-api-openapi.yml
  type: openapi
workflows:
- workflowId: screen-account-creation
  summary: Submit a create-account event, read the Sift Score, and decision risky users.
  description: >-
    Records a $create_account event for synchronous scoring, retrieves the
    latest cached score for the user, and applies a decision to the user when the
    score exceeds the supplied risk threshold.
  inputs:
    type: object
    required:
    - apiKey
    - accountId
    - userId
    properties:
      apiKey:
        type: string
        description: Sift account API key sent in the event body as $api_key.
      accountId:
        type: string
        description: The Sift account identifier for the Decisions API path.
      userId:
        type: string
        description: The end user's unique identifier ($user_id).
      sessionId:
        type: string
        description: Optional session identifier for the event.
      userEmail:
        type: string
        description: Optional email address for the new account.
      ip:
        type: string
        description: Optional originating IP address for the signup.
      abuseTypes:
        type: string
        description: Comma-separated abuse types to score and decision on.
        default: account_abuse
      scoreThreshold:
        type: number
        description: Risk score (0-100) at or above which the user is decisioned.
        default: 80
      riskyDecisionId:
        type: string
        description: Decision id to apply when the account looks risky (configured in the Sift Console).
  steps:
  - stepId: sendCreateAccount
    description: >-
      Submit a $create_account event for the user with return_score=true so Sift
      computes a synchronous score for the requested abuse types.
    operationId: sendEvent
    parameters:
    - name: return_score
      in: query
      value: true
    - name: abuse_types
      in: query
      value: $inputs.abuseTypes
    requestBody:
      contentType: application/json
      payload:
        $type: $create_account
        $api_key: $inputs.apiKey
        $user_id: $inputs.userId
        $session_id: $inputs.sessionId
        $user_email: $inputs.userEmail
        $ip: $inputs.ip
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      eventStatus: $response.body#/status
      scoreResponse: $response.body#/score_response
  - stepId: getUserScore
    description: >-
      Read back the latest cached Sift Score for the user across the requested
      abuse types so the workflow can branch on the numeric risk value.
    operationId: getScore
    parameters:
    - name: user_id
      in: path
      value: $inputs.userId
    - name: abuse_types
      in: query
      value: $inputs.abuseTypes
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      scores: $response.body#/scores
      latestDecisions: $response.body#/latest_decisions
    onSuccess:
    - name: highRisk
      type: goto
      stepId: decisionRiskyUser
      criteria:
      - context: $response.body
        condition: $.scores.account_abuse.score >= $inputs.scoreThreshold
        type: jsonpath
    - name: lowRisk
      type: end
  - stepId: decisionRiskyUser
    description: >-
      Apply the configured risky-user decision to the user entity when the
      account abuse score crossed the threshold.
    operationId: applyUserDecision
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    - name: user_id
      in: path
      value: $inputs.userId
    requestBody:
      contentType: application/json
      payload:
        decision_id: $inputs.riskyDecisionId
        source: AUTOMATED_RULE
        description: Auto-applied by the account-creation screening workflow on high Sift Score.
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      decision: $response.body#/decision
      decidedEntity: $response.body#/entity
  outputs:
    scores: $steps.getUserScore.outputs.scores
    appliedDecision: $steps.decisionRiskyUser.outputs.decision