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

# dataSource

> Catalogued vendor call. The bridge between a workflow node and the Data Sources registry.

A `dataSource` node calls one of the catalogued providers (Sumsub, LSEG, BigDataCorp, Crystal Intelligence, ThreatMetrix, Socure, …). The provider is referenced by `providerId`, not by URL.

## Configuration

```jsonc theme={null}
{
  "id": "ds-sumsub-aml",
  "type": "dataSource",
  "data": {
    "label": "Sumsub — AML Screening",
    "providerId": "7",
    "providerName": "SumSub",
    "category": "Identity Suite",
    "timeout": 12000,
    "retryCount": 1,
    "outputVariable": "sumsub_aml",
    "sumsubConfig": {
      "activeClassId": "cls-aml"
    }
  }
}
```

| Field              | Notes                                                                |
| ------------------ | -------------------------------------------------------------------- |
| `providerId`       | Foreign key into `datasources.json`.                                 |
| `providerName`     | Denormalised label, for editor display.                              |
| `category`         | Denormalised category, for editor display.                           |
| `timeout`          | Milliseconds.                                                        |
| `retryCount`       | On timeout / 5xx.                                                    |
| `outputVariable`   | Name under which the response is written to the run context.         |
| `<provider>Config` | Provider-specific config block (`sumsubConfig`, `crystalConfig`, …). |

## Provider-specific config

<Tabs>
  <Tab title="sumsubConfig">
    ```jsonc theme={null}
    {
      "activeClassId": "cls-kyc" | "cls-aml" | "cls-fraud",
      "classes": [
        { "id": "cls-kyc", "key": "kyc", "label": "KYC",   "settings": {...}, "variables": [...] },
        { "id": "cls-aml", "key": "aml", "label": "AML",   "settings": {...}, "variables": [...] },
        { "id": "cls-fraud","key":"fraud","label":"FRAUD", "settings": {...}, "variables": [...] }
      ],
      "nodeSettings": {
        "verificationLevel": "basic-kyc",
        "applicantType": "individual",
        "externalUserId": "{{user_id}}",
        "sdkDelivery": "websdk",
        "mode": "async"
      }
    }
    ```

    See [Sumsub](/data-sources/kyc/sumsub) for the full class settings + variables.
  </Tab>

  <Tab title="crystalConfig">
    ```jsonc theme={null}
    {
      "engine": "risk_check" | "monitor",
      "riskCheck":  { ...synchronous check config },
      "monitor":    { ...async monitor config + alertRules + signalThresholds + webhook },
      "fiat": "usd",
      "externalUserId": "{{input.customer_id}}"
    }
    ```

    See [Crystal Intelligence](/data-sources/blockchain/crystal-intelligence) for the full config surface.
  </Tab>
</Tabs>

## Outputs

The vendor's response is written to `outputVariable` and is then available as `{{outputVariable.<field>}}` downstream. The exact field shape is documented per-provider in the Data Sources section.

## Resold vs BYO behaviour

The node is identical whether the provider is resold or BYO — Frayme resolves credentials based on `providerId`. The editor shows a reselling notice when the targeted provider has `resold: true`, but the node config doesn't change.

## When the provider is disabled

If the provider's `enabled: false` in the registry, the workflow engine **skips the node** and writes a stub output (`null` or a configured default). Downstream nodes can guard against this — e.g. treating missing device data as a soft signal rather than a hard fail.
