> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lendflow.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Sentilink Fraud

## Sentilink Fraud

Sentilink Fraud evaluates an individual applicant for synthetic identity fraud, identity abuse, and identity theft. Lendflow sends the primary owner's identity to SentiLink and requests four fraud scores in one provider call.

This service uses provider ID `sentilink`. It is separate from the SentiLink SSN and DOB completion services documented in [SentiLink Match](/api-docs/docs/sentilink-1).

<Warning>
  Sentilink Fraud is a bring-your-own-credentials service. Your organization must connect a SentiLink account and token before the service can run.
</Warning>

## Requirements

Lendflow uses the current primary-owner record. Callers do not send these fields directly in the enrichment request.

| Application field | Requirement | Notes |
| - | - | - |
| Owner first name | Required | Uses the primary owner's identity record. |
| Owner last name | Required | Uses the primary owner's identity record. |
| Owner date of birth | Required | Must use `YYYY-MM-DD`. |
| Owner SSN or ITIN | Required | Uses the stored SSN, or the stored ITIN when present; the selected identifier must be valid. |
| Owner email | Required | Must be a valid email address. |
| Owner phone | Required | Must be a valid US phone number. |
| Personal address line 1 | Required | Uses the primary owner's personal address. |
| Personal address city | Required | Uses the primary owner's personal address. |
| Personal address state | Required | Must be a valid US state. |
| Personal address ZIP code | Required | Must be five digits or ZIP+4 in `12345-6789` form. |
| Owner IP address | Optional | Must be a valid IPv4 or IPv6 address when present. |

A country field is not used for the current Sentilink Fraud request.

## API flow

1. Call `PUT /api/applications/{application_id}/enrich` through [Enrich Business Credit Application](/api-reference/workflow-management/enrich-business-credit-application).
2. Set `provider` to `sentilink`.
3. Omit `options`; Sentilink Fraud has no service-specific options.
4. Include `stage_id` only when targeting a specific underwriting stage. When supplied, it must be a valid underwriting stage in the application's workflow.
5. Confirm that the response contains `data.onqueue: true`.
6. Poll [Get Commercial Data](/api-reference/workflow-management/get-commercial-data) with `services[]=sentilink`.

```json theme={"system"}
{
  "provider": "sentilink",
  "stage_id": "00000000-0000-4000-8000-000000000000"
}
```

The enrichment request is asynchronous. `data.onqueue: true` confirms only that Lendflow queued the job.

Call `GET /api/applications/{application_id}/commercial_data?services[]=sentilink` and use these paths:

| Information | Commercial-data path |
| - | - |
| Provider response | `data.commercial_data.sentilink` |
| Latest status message | `data.statuses.sentilink` |
| Latest service date | `data.dates.sentilink` |
| Stored provider request | `data.request_data.sentilink` |

<Warning>
  The stored request and consumer-history response can contain sensitive personal information. Restrict access, avoid logging these objects, and mask identifiers in your interface.
</Warning>

## Data Orchestration availability and flow

Sentilink Fraud is available in Data Orchestration under **Fraud > Sentilink**. This is separate from placing the **Sentilink Fraud** service block in an underwriting Workflow Builder stage.

1. In the Lendflow Dashboard, open **Builders > Data Orchestration**.
2. Create or edit a template and add a condition that uses a Sentilink fraud result.
3. Configure the comparison and connect each outcome, then save and publish the template.
4. Execute the published template through [Execute Data Orchestration](/api-reference/data-orchestration/execute-data-orchestration) with `template_id`, `application_id`, and `stage_id` when applicable.
5. Confirm that the response contains `data.executed: true`.
6. Monitor the run with [List Data Orchestration Logs](/api-reference/data-orchestration/list-data-orchestration-logs).
7. Retrieve the finished provider response through the commercial-data paths above.

The score conditions require Sentilink Fraud data, but they do not require another data-service block. If no Sentilink Fraud record exists when a score condition is evaluated, Data Orchestration fetches the `sentilink` prerequisite synchronously before evaluating the condition. If a record already exists, the score conditions use its latest stored response by default. A missing named score resolves to `null`, not `0`.

## What the service returns

| Response area | Meaning |
| - | - |
| `scores` | The four requested fraud scores, model versions, and ranked reason codes. |
| `extra_data.consumer_history.data.attributes` | Provider signals about identity sharing, SSN issuance, history length, and suspicious associations. Available attributes can vary by response. |
| `extra_data.consumer_history.data.identities` | Identity records associated with the submitted information, including names, dates of birth, identifiers, contact data, addresses, and origination dates when available. |
| `match_info` | Fields and record positions that matched an identity. |
| Execution metadata | SentiLink application, transaction, customer, environment, timestamp, notes, and latency values. |

### Representative response

This abbreviated response is based on Lendflow's current SentiLink fixture. All identifiers and personal data are sanitized.

```json theme={"system"}
{
  "application_id": "APP-example",
  "transaction_id": "txn_example_01",
  "environment": "SANDBOX",
  "timestamp": "2026-08-15T14:37:51Z",
  "latency_ms": 461,
  "scores": [
    {
      "name": "sentilink_abuse_score",
      "version": "1.7.1",
      "score": 140,
      "reason_codes": [
        {
          "code": "R000",
          "rank": 1,
          "direction": "more_fraudy",
          "explanation": "Whether the supplied information is nonsense"
        }
      ]
    },
    {
      "name": "sentilink_first_party_synthetic_score",
      "version": "1.7.1",
      "score": 51,
      "reason_codes": []
    },
    {
      "name": "sentilink_third_party_synthetic_score",
      "version": "1.7.1",
      "score": 177,
      "reason_codes": []
    },
    {
      "name": "sentilink_id_theft_score",
      "version": "1.7.1",
      "score": 699,
      "reason_codes": []
    }
  ],
  "extra_data": {
    "consumer_history": {
      "data": {
        "attributes": {
          "ssn_bogus": false,
          "ssn_shared_count": 1,
          "name_dob_shared_count": 0
        },
        "identities": [
          {
            "identity": {
              "names": [
                {
                  "first_name": "SAMPLE",
                  "last_name": "PERSON"
                }
              ],
              "addresses": []
            },
            "match_info": {
              "match_fields": [
                {
                  "field": "ssn",
                  "match_type": "exact",
                  "match_index": 0
                }
              ]
            }
          }
        ]
      }
    }
  }
}
```

## Response attributes

### Scores and reason codes

| Attribute | Type | Meaning | Possible values or units | When returned |
| - | - | - | - | - |
| `scores` | Array of objects | Requested fraud-score results. | Up to the four score names below. | On a successful provider response. |
| `scores[].name` | String | Identifies the score model. | One of the four requested score names. | For each returned score. |
| `scores[].score` | Integer | Fraud propensity produced by the named model. | `0`–`999`; higher values indicate greater risk for that score. | For each returned score. |
| `scores[].version` | String | Provider model version. | Version string. | For each returned score. |
| `scores[].reason_codes` | Array of objects | Ranked factors that influenced the score. | Provider-defined list; it can be empty. | For each returned score. |
| `scores[].reason_codes[].code` | String | Provider reason-code identifier. | Value such as `R000`. | For each returned reason. |
| `scores[].reason_codes[].rank` | Integer | Relative ordering of the reason. | `1` is the highest-ranked returned reason. | For each returned reason. |
| `scores[].reason_codes[].direction` | String | Whether the reason moved the result toward or away from fraud risk. | `more_fraudy` or `less_fraudy`. | For each returned reason. |
| `scores[].reason_codes[].explanation` | String | Human-readable description of the factor. | Provider text. | For each returned reason. |

### Consumer history

| Attribute | Type | Meaning | Possible values or units | When returned |
| - | - | - | - | - |
| `extra_data.consumer_history.data` | Object | Consumer-history result associated with the submitted identity. | Provider object. | When SentiLink returns consumer history. |
| `extra_data.consumer_history.data.attributes` | Object | Consumer-level risk and identity-history signals. | Keys and values vary by response. | When provider attributes are available. |
| `...attributes.ssn_bogus` | Boolean | Indicates whether the identifier appears invalid or bogus. | `true` or `false`. | When evaluated by SentiLink. |
| `...attributes.ssn_shared_count` | Integer | Count associated with identities sharing the SSN. | Count. | When available. |
| `...attributes.name_dob_shared_count` | Integer | Count associated with identities sharing the name and DOB. | Count. | When available. |
| `...attributes.ssn_issued_before_dob` | Boolean | Indicates whether the SSN appears to have been issued before the DOB. | `true` or `false`. | When available. |
| `...attributes.ssn_issued_last18years` | Boolean | Indicates whether the SSN appears to have been issued within the last 18 years. | `true` or `false`. | When available. |
| `...attributes.bestrecord_history_months` | Integer | Length of the best matching record's history. | Months. | When available. |
| `...attributes.ssn_better_history_months` | Integer | History length associated with a better SSN match. | Months. | When available. |
| `...attributes.ssn_history_longer_months` | Integer | Difference in history length for the same SSN. | Months. | When available. |
| `...attributes.ssn_issuance_dob_mismatch` | Boolean | Indicates an unusual mismatch between SSN issuance and DOB. | `true` or `false`. | When available. |
| `...attributes.name_ssn_synthetic_address` | Boolean | Indicates an association between the name/SSN and a suspicious address. | `true` or `false`. | When available. |
| `...attributes.application_blacklist_address_associates` | Integer | Count of suspect identities associated with a blacklisted application address. | Count. | When available. |
| `extra_data.consumer_history.data.identities` | Array of objects | Identity records related to the application. | Zero or more records. | When SentiLink finds related history. |
| `...identities[].identity` | Object | Names, DOBs, SSNs, phones, emails, addresses, fraud codes, bankruptcy data, and origination dates returned for a related identity. | Provider object with optional arrays. | Fields are included only when available. |
| `...identities[].match_info.match_fields` | Array of objects | Summary of submitted fields that matched the identity. | Provider-defined fields and match types. | When matching details are available. |
| `...identities[].match_info.match_details` | Array of objects | Detailed matching entries, which can contain multiple matches for one field. | Provider-defined fields and match types. | When detailed matching data is available. |
| `...match_fields[].field` | String | Field that matched. | Provider field such as `ssn`, `state`, `dob`, or `address`. | For each match. |
| `...match_fields[].match_type` | String | How the field matched. | Provider value such as `exact` or `fuzzy`. | For each match. |
| `...match_fields[].match_index` | Integer | Zero-based position of the matched value in the related identity's field array. | Index starting at `0`. | For each match. |

Consumer-history objects, arrays, and individual attributes can be absent when SentiLink has no value to return. Treat absent values and `null` as unknown; do not convert them to `false`, an empty string, or zero.

### Execution metadata

| Attribute | Type | Meaning | Possible values or units | When returned |
| - | - | - | - | - |
| `application_id` | String | Provider-facing application identifier generated by Lendflow. | Identifier prefixed with `APP-`. | On a provider response. |
| `transaction_id` | String | SentiLink transaction identifier. | Provider identifier. | On a provider response. |
| `customer_id` | String or absent | SentiLink customer identifier. | Provider identifier. | When supplied by SentiLink. |
| `environment` | String | Provider environment. | Provider value such as `SANDBOX` or `PROD`. | On a provider response. |
| `timestamp` | String | Time SentiLink processed the request. | Timestamp string. | On a provider response. |
| `latency_ms` | Integer | Provider request latency. | Milliseconds. | On a provider response. |
| `notes` | String or absent | Provider notes. | Text, including an empty string. | When supplied by SentiLink. |

## Score interpretation

All four scores use a verified `0`–`999` range. A higher score means a greater likelihood of the risk represented by that model. Lendflow does not impose a universal decision threshold; use thresholds approved for your risk policy and SentiLink configuration.

| Score name | Meaning |
| - | - |
| `sentilink_abuse_score` | Measures the likelihood that the application identity is synthetic or has been associated with identity abuse or fraudulent behavior. |
| `sentilink_first_party_synthetic_score` | Measures the likelihood of identity manipulation: a person uses their real name and DOB with an SSN that does not belong to them. |
| `sentilink_third_party_synthetic_score` | Measures the likelihood of identity fabrication: the submitted name, DOB, and SSN combination does not belong to a real person. |
| `sentilink_id_theft_score` | Measures the likelihood that the applicant is using another person's identity. It does not mean the applicant is the victim. |

Use `reason_codes` to understand the factors behind each score. The same code can have a different direction or rank across score models, so evaluate it in the context of its parent score.

## Errors and statuses

| Status or error | Meaning |
| - | - |
| `data.onqueue: true` | Lendflow accepted the enrichment request and queued the job. It is not a completed score response. |
| `Not yet started` | The commercial-data status path has no service log for Sentilink Fraud. |
| `Started` | The external-service job started and has not completed. |
| `Success` | Lendflow stored a SentiLink response. A successful request can still omit consumer-history fields or an individual score. |
| `Business owner ... is required` or field validation message | A required identity field is missing or invalid. Correct the primary owner's current application data before retrying. |
| `Sentilink - Invalid data sent` | SentiLink rejected the provider request. Verify the required values and formats. |
| Service unavailable or credential error | The service is disabled, the client cannot use it, credentials are absent or invalid, or the provider cannot be reached. |

## FAQ

<AccordionGroup>
  <Accordion title="Is Sentilink Fraud an identity-completion service?">
    No. `sentilink` requests fraud scores. Use `sentilink_ssn_completion` or `sentilink_dob_completion` when you need SentiLink Match to complete a missing identity field.
  </Accordion>

  <Accordion title="Which applicant does Lendflow score?">
    Lendflow sends the primary business owner's identity from an individual application. The Workflow Builder block is not available for a business entity.
  </Accordion>

  <Accordion title="Can I run Sentilink Fraud without an SSN?">
    No. The current request requires a valid stored SSN or ITIN. It also requires the owner's name, DOB, email, US phone number, and complete personal address.
  </Accordion>

  <Accordion title="Should I send user_id or IP address?">
    Do not send `user_id` in the enrichment request; Lendflow generates it as a string from the owner's internal record. The IP address is optional application data and is omitted from the provider request when it is null.
  </Accordion>

  <Accordion title="Does data.onqueue true mean scores are ready?">
    No. It only confirms that Lendflow queued the asynchronous enrichment job. Poll `data.statuses.sentilink` until it is `Success` or contains an error.
  </Accordion>

  <Accordion title="What happens when consumer history or a score is missing?">
    Treat missing or null values as unknown. In Data Orchestration, a missing named score resolves to `null`, not `0`. Do not infer a low-risk result from absent data.
  </Accordion>

  <Accordion title="Does Data Orchestration require another service first?">
    No. If Sentilink Fraud data is missing when a score condition runs, Data Orchestration fetches the `sentilink` prerequisite synchronously. The application fields, client enablement, and SentiLink credentials must still be valid.
  </Accordion>
</AccordionGroup>
