> For the complete documentation index, see [llms.txt](https://developers.bloomcredit.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.bloomcredit.io/enablement-services/enablement-services-getting-started/plaid-processor-tokens.md).

# Plaid Processor Tokens

## Getting Plaid Sandbox Processor Token

In order to create a plaid processor token you will need to follow 6 steps.

1. Create a plaid sandbox text user.
2. Get your plaid credentials.
3. Create a public link token.
4. Exchange the public link token for an access token.
5. Retrieve account id's associated with the access token.
6. Exchange the access token and account id's for processor tokens (one per account id).

### Create a Plaid Sandbox Test User

Plaid provides a [custom user sandbox](https://plaid.com/docs/sandbox/user-custom/) for testing integrations with simulated account and transaction data. For more details, see the [Plaid sandbox docs](https://plaid.com/docs/api/sandbox/).

{% hint style="info" icon="lightbulb" %}
**These endpoints are also available in the Bloom Enablement Services Postman collection.**
{% endhint %}

In the Plaid dashboard, go to **Developers > Sandbox** and create a test user.

Save the username — you’ll need it later when creating a public token.

#### Build Recurring Payment Patterns Configuration

{% hint style="warning" icon="triangle-exclamation" %}
**This step is only for sandbox testing. In production, users will go through the real Plaid Link flow with live financial data.**
{% endhint %}

The JSON config below can be used to create recurring payment patterns (such as rent or utilities) that meet eligibility rules for Bloom Credit services.

You may need to shift the transaction dates to the present.

1. For a set of recurring payments to be eligible, the following requirements must be met:
   1. One payment within the last 90 days.
   2. At least 3 payments.
   3. For example: in the JSON provided below, the 'Commonwealth Edison' transaction group is eligible (at the time of writing). It has 3 payments, at least one of which occurred in the last 90 days.
2. You may need to adjust the dates. One easy way to adjust this payload is to prompt you favorite AI code editor with `give me this JSON data but shift all dates forward X months` , where X is a more recent set of months.

```
{
  "override_accounts": [
    {
      "type": "depository",
      "subtype": "checking",
      "meta": {
        "name": "Plaid Standard Checking",
        "mask": "1234"
      },
      "numbers": {
        "account": "9000091234"
      },
      "transactions": [
        {
          "date_transacted": "2026-02-03",
          "date_posted": "2026-02-03",
          "amount": 248,
          "description": "Commonwealth Edison",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-03-03",
          "date_posted": "2026-03-03",
          "amount": 212,
          "description": "Commonwealth Edison",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-04-03",
          "date_posted": "2026-04-03",
          "amount": 221,
          "description": "Commonwealth Edison",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-05-03",
          "date_posted": "2026-05-03",
          "amount": 221,
          "description": "Commonwealth Edison",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-02-02",
          "date_posted": "2026-02-02",
          "amount": 115,
          "description": "Verizon Wireless Bill Pay",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-03-02",
          "date_posted": "2026-03-02",
          "amount": 115,
          "description": "Verizon Wireless Bill Pay",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-04-02",
          "date_posted": "2026-04-02",
          "amount": 115,
          "description": "Verizon Wireless Bill Pay",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-05-02",
          "date_posted": "2026-04-02",
          "amount": 115,
          "description": "Verizon Wireless Bill Pay",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-02-02",
          "date_posted": "2026-02-02",
          "amount": 17.99,
          "description": "Netflix Subscription",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-03-02",
          "date_posted": "2026-03-02",
          "amount": 17.99,
          "description": "Netflix Subscription",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-04-02",
          "date_posted": "2026-04-02",
          "amount": 17.99,
          "description": "Netflix Subscription",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-05-02",
          "date_posted": "2026-05-02",
          "amount": 17.99,
          "description": "Netflix Subscription",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-02-01",
          "date_posted": "2026-02-01",
          "amount": 1350,
          "description": "Apartments.com",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-03-01",
          "date_posted": "2026-03-01",
          "amount": 1350,
          "description": "Apartments.com",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-04-01",
          "date_posted": "2026-04-01",
          "amount": 1350,
          "description": "Apartments.com",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-05-01",
          "date_posted": "2026-05-01",
          "amount": 1350,
          "description": "Apartments.com",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-02-01",
          "date_posted": "2026-02-01",
          "amount": 25,
          "description": "Water Company Water Bill",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-03-01",
          "date_posted": "2026-03-01",
          "amount": 23,
          "description": "Water Company Water Bill",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-04-01",
          "date_posted": "2026-04-01",
          "amount": 21,
          "description": "Water Company Water Bill",
          "currency": "USD"
        },
        {
          "date_transacted": "2026-05-01",
          "date_posted": "2026-05-01",
          "amount": 21,
          "description": "Water Company Water Bill",
          "currency": "USD"
        }
      ],
      "identity": {
        "names": [
          "John Doe"
        ],
        "phone_numbers": [
          {
            "primary": true,
            "type": "home",
            "data": "4673956022"
          }
        ],
        "emails": [
          {
            "primary": true,
            "type": "primary",
            "data": "accountholder0@example.com"
          }
        ],
        "addresses": [
          {
            "primary": true,
            "data": {
              "country": "US",
              "city": "Malakoff",
              "street": "2992 Cameron Road",
              "postal_code": "14236",
              "region": "NY"
            }
          }
        ]
      }
    }
  ]
}
```

### Fetch Credentials

In your Plaid dashboard, go to Developers > Keys [page](https://dashboard.plaid.com/developers/keys) to retrieve your client\_id and secret. You’ll use these credentials in all API requests throughout this setup process. These keys are required for both sandbox testing and production environments.

### Create a public token

The next step is to Simulate Plaid Link in Sandbox (Create a Public Token).

{% hint style="info" icon="book" %}
**In production, users connect their accounts through the Plaid Link interface. In the sandbox environment, you can simulate this flow by generating a public token directly using the Plaid API.**
{% endhint %}

This step sets up everything needed to simulate a user linking their account, which will later allow you to generate a processor token. To do this, you’ll need:

* Your **Plaid client\_id and secret**.
* The **sandbox institution ID**
* The test username you created in Step 1 You must also specify the required products for Bloom:

{% code title="json" %}

```
 "initial_products": ["identity", "transactions"]

```

{% endcode %}

These are required by Bloom in order for the processor token to contain the correct data.

Example cURL Request

{% code title="bash" %}

```bash
curl --location 'https://sandbox.plaid.com/sandbox/public_token/create' \
--header 'Content-Type: application/json' \
--data '{
  "client_id": "plaid_client_id",
  "secret": "plaid_client_secret",
  "institution_id": "ins_109508",
  "initial_products": ["identity", "transactions"],
  "options": {
    "override_username": "custom_username"
    "transactions": {
      // Set this value such that the range of today minus this number value includes  the desired transactions. For example, if set to 730 transactions from the past 2 years (end date today) will be included.
      "days_requested": 730
    }
  }
}'
```

{% endcode %}

The institution *id ins\_109508 simulates a typical non-OAuth U.S. bank. You can explore other sandbox institutions in* [Plaid's documentation](https://plaid.com/docs/sandbox/institutions/)*. This request will return a **public*** token, which you'll exchange for an access\_token in the next step.

### Exchange the Public Token for an Access Token

After generating a public token in the previous step, you’ll receive a **public\_token**. The next step is to exchange that token for a Plaid `access_token`. This token is required to retrieve account data and to generate processor tokens in the following steps.

Example Request:

{% code title="cURL" %}

```bash
curl --location 'https://sandbox.plaid.com/item/public_token/exchange' \
--header 'Content-Type: application/json' \
--data '{
  "client_id": "plaid_client_id",
  "secret": "plaid_client_secret",
  "public_token": "plaid_sandbox_token"
}'
```

{% endcode %}

> Save the access\_token returned in the response.
>
> Note: According to [Plaid’s documentation,](https://plaid.com/docs/quickstart/glossary/#access-token) access tokens do not expire.

### Retrieve Account IDs

Now that you have an access token, the next step is to retrieve the list of accounts associated with the user. Each account will have an account\_id, which you'll need to create a processor token in the next step.

Example Request

{% code title="cURL" %}

```bash
curl --location 'https://sandbox.plaid.com/accounts/get' \
--header 'Content-Type: application/json' \
--data '{
  "client_id": "plaid_client_id",
  "secret": "plaid_client_secret",
  "access_token": "plaid_access_token"
}'
```

{% endcode %}

In the response, locate the account\_id field(s). You'll need to pass each of these into the `/processor/token/create` endpoint individually in Step 6.

### Create a Processor Token (One per Account)

With your access token and account IDs in hand, you can now create a Plaid processor token for each account. This token allows Bloom Enablement Services to securely access the user's account data. An account can only be imported once (marked by a processor token being successfully imported).

{% hint style="warning" icon="triangle-exclamation" %}
**In production, Bloom Enablement Services only supports importing Plaid processor tokens.**
{% endhint %}

This step shows how to generate processor tokens in the sandbox using test users and test data. In production, you’ll follow the same steps using real user credentials and live Plaid environments.

You must generate one processor token per account

Example Request:

{% code title="cURL" %}

```bash
curl -X POST https://sandbox.plaid.com/processor/token/create \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "plaid_client_id",
    "secret": "plaid_client_secret",
    "access_token": "plaid_access_token",
    "account_id": "plaid_account_id",
    "processor": "bloom_credit"
  }'
```

{% endcode %}

Response

```
{
  "processor_token": "processor-sandbox-abc123...",
  "request_id": "abc123xyz"
}

```

{% hint style="warning" icon="triangle-exclamation" %}
**Reminder: The access token used here must have been created with both the `identity` and `transactions` products.**
{% endhint %}

Repeat this step for each account you want to import. You’ll pass all processor tokens into the [importConnections](/enablement-services/enablement_gql_ref.md#mutation-importconnections) mutation in a single request to Bloom.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developers.bloomcredit.io/enablement-services/enablement-services-getting-started/plaid-processor-tokens.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
