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

# Connect Plaid with OAuth 2.0 — Sandbox – StackOne Hub

> Link a Plaid account in the StackOne Hub using OAuth 2.0 — Sandbox. End-user guide to authorize the integration and start using Plaid actions.

<Panel>
  <div className="not-prose guides-scope-selector" data-guides-scope-selector data-guide-actions-json="[{&#x22;id&#x22;:&#x22;plaid_get_account_balance&#x22;,&#x22;label&#x22;:&#x22;Get Account Balance&#x22;,&#x22;scopes&#x22;:[&#x22;balance&#x22;]},{&#x22;id&#x22;:&#x22;plaid_create_asset_report&#x22;,&#x22;label&#x22;:&#x22;Create Asset Report&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_asset_report&#x22;,&#x22;label&#x22;:&#x22;Get Asset Report&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_asset_report_pdf&#x22;,&#x22;label&#x22;:&#x22;Get Asset Report PDF&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_refresh_asset_report&#x22;,&#x22;label&#x22;:&#x22;Refresh Asset Report&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_filter_asset_report&#x22;,&#x22;label&#x22;:&#x22;Filter Asset Report&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_remove_asset_report&#x22;,&#x22;label&#x22;:&#x22;Remove Asset Report&#x22;,&#x22;scopes&#x22;:[&#x22;assets&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_auth&#x22;,&#x22;label&#x22;:&#x22;Get Auth&#x22;,&#x22;scopes&#x22;:[&#x22;auth&#x22;]},{&#x22;id&#x22;:&#x22;plaid_create_check_report&#x22;,&#x22;label&#x22;:&#x22;Create Check Report&#x22;,&#x22;scopes&#x22;:[&#x22;cra_base_report&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_base_report&#x22;,&#x22;label&#x22;:&#x22;Get Check Base Report&#x22;,&#x22;scopes&#x22;:[&#x22;cra_base_report&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_income_insights&#x22;,&#x22;label&#x22;:&#x22;Get Check Income Insights&#x22;,&#x22;scopes&#x22;:[&#x22;cra_income_insights&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_cashflow_insights&#x22;,&#x22;label&#x22;:&#x22;Get Check Cashflow Insights&#x22;,&#x22;scopes&#x22;:[&#x22;cra_cashflow_insights&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_lend_score&#x22;,&#x22;label&#x22;:&#x22;Get Check LendScore&#x22;,&#x22;scopes&#x22;:[&#x22;cra_lend_score&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_partner_insights&#x22;,&#x22;label&#x22;:&#x22;Get Check Partner Insights&#x22;,&#x22;scopes&#x22;:[&#x22;cra_partner_insights&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_check_report_pdf&#x22;,&#x22;label&#x22;:&#x22;Get Check Report PDF&#x22;,&#x22;scopes&#x22;:[&#x22;cra_base_report&#x22;]},{&#x22;id&#x22;:&#x22;plaid_enrich_transactions&#x22;,&#x22;label&#x22;:&#x22;Enrich Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;enrich&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_identity&#x22;,&#x22;label&#x22;:&#x22;Get Identity&#x22;,&#x22;scopes&#x22;:[&#x22;identity&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_bank_income&#x22;,&#x22;label&#x22;:&#x22;Get Bank Income&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_bank_income_pdf&#x22;,&#x22;label&#x22;:&#x22;Get Bank Income PDF&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_payroll_income&#x22;,&#x22;label&#x22;:&#x22;Get Payroll Income&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_payroll_income_risk_signals&#x22;,&#x22;label&#x22;:&#x22;Get Payroll Income Risk Signals&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_employment&#x22;,&#x22;label&#x22;:&#x22;Get Employment&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_credit_sessions&#x22;,&#x22;label&#x22;:&#x22;Get Credit Sessions&#x22;,&#x22;scopes&#x22;:[&#x22;income&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_investment_holdings&#x22;,&#x22;label&#x22;:&#x22;Get Investment Holdings&#x22;,&#x22;scopes&#x22;:[&#x22;investments&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_investment_transactions&#x22;,&#x22;label&#x22;:&#x22;Get Investment Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;investments&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_liabilities&#x22;,&#x22;label&#x22;:&#x22;Get Liabilities&#x22;,&#x22;scopes&#x22;:[&#x22;liabilities&#x22;]},{&#x22;id&#x22;:&#x22;plaid_evaluate_signal&#x22;,&#x22;label&#x22;:&#x22;Evaluate Signal&#x22;,&#x22;scopes&#x22;:[&#x22;signal&#x22;]},{&#x22;id&#x22;:&#x22;plaid_prepare_signal&#x22;,&#x22;label&#x22;:&#x22;Prepare Signal&#x22;,&#x22;scopes&#x22;:[&#x22;signal&#x22;]},{&#x22;id&#x22;:&#x22;plaid_report_signal_decision&#x22;,&#x22;label&#x22;:&#x22;Report Signal Decision&#x22;,&#x22;scopes&#x22;:[&#x22;signal&#x22;]},{&#x22;id&#x22;:&#x22;plaid_report_signal_return&#x22;,&#x22;label&#x22;:&#x22;Report Signal Return&#x22;,&#x22;scopes&#x22;:[&#x22;signal&#x22;]},{&#x22;id&#x22;:&#x22;plaid_list_statements&#x22;,&#x22;label&#x22;:&#x22;List Statements&#x22;,&#x22;scopes&#x22;:[&#x22;statements&#x22;]},{&#x22;id&#x22;:&#x22;plaid_download_statement&#x22;,&#x22;label&#x22;:&#x22;Download Statement&#x22;,&#x22;scopes&#x22;:[&#x22;statements&#x22;]},{&#x22;id&#x22;:&#x22;plaid_refresh_statements&#x22;,&#x22;label&#x22;:&#x22;Refresh Statements&#x22;,&#x22;scopes&#x22;:[&#x22;statements&#x22;]},{&#x22;id&#x22;:&#x22;plaid_sync_transactions&#x22;,&#x22;label&#x22;:&#x22;Sync Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;transactions&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_transactions&#x22;,&#x22;label&#x22;:&#x22;Get Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;transactions&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_recurring_transactions&#x22;,&#x22;label&#x22;:&#x22;Get Recurring Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;transactions&#x22;]},{&#x22;id&#x22;:&#x22;plaid_refresh_transactions&#x22;,&#x22;label&#x22;:&#x22;Refresh Transactions&#x22;,&#x22;scopes&#x22;:[&#x22;transactions&#x22;]},{&#x22;id&#x22;:&#x22;plaid_create_transfer_authorization&#x22;,&#x22;label&#x22;:&#x22;Create Transfer Authorization&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_create_transfer&#x22;,&#x22;label&#x22;:&#x22;Create Transfer&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_transfer&#x22;,&#x22;label&#x22;:&#x22;Get Transfer&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_list_transfers&#x22;,&#x22;label&#x22;:&#x22;List Transfers&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_cancel_transfer&#x22;,&#x22;label&#x22;:&#x22;Cancel Transfer&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_cancel_transfer_authorization&#x22;,&#x22;label&#x22;:&#x22;Cancel Transfer Authorization&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_list_transfer_events&#x22;,&#x22;label&#x22;:&#x22;List Transfer Events&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_sync_transfer_events&#x22;,&#x22;label&#x22;:&#x22;Sync Transfer Events&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_create_transfer_refund&#x22;,&#x22;label&#x22;:&#x22;Create Transfer Refund&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_transfer_refund&#x22;,&#x22;label&#x22;:&#x22;Get Transfer Refund&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_cancel_transfer_refund&#x22;,&#x22;label&#x22;:&#x22;Cancel Transfer Refund&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]},{&#x22;id&#x22;:&#x22;plaid_get_transfer_capabilities&#x22;,&#x22;label&#x22;:&#x22;Get Transfer Capabilities&#x22;,&#x22;scopes&#x22;:[&#x22;transfer&#x22;]}]" style={{ borderRadius: '8px', padding: '16px', marginBottom: '24px' }}>
    <div className="guides-scope-selector__title" style={{ fontSize: '16px', fontWeight: '600', marginBottom: '12px' }}>Select Actions to adjust the guide</div>
    <div className="guides-scope-selector__muted" style={{ fontSize: '13px', marginBottom: '12px' }}>Some actions may require additional configuration in the provider to be accessible. Choose the actions you need and the guide will be updated.</div>

    <div style={{ display: 'flex', gap: '8px', marginBottom: '12px', flexWrap: 'wrap' }}>
      <input type="text" placeholder="Search actions..." className="guides-scope-selector__input" data-guide-action-search style={{ padding: '8px 12px', borderRadius: '6px', fontSize: '13px', flex: 1, minWidth: '160px' }} />

      <button type="button" className="guides-scope-selector__quick-btn" data-guide-select-all style={{ padding: '6px 10px', borderRadius: '6px', fontSize: '12px', cursor: 'pointer' }}>Select all</button>
      <button type="button" className="guides-scope-selector__quick-btn" data-guide-clear style={{ padding: '6px 10px', borderRadius: '6px', fontSize: '12px', cursor: 'pointer' }}>Clear</button>
    </div>

    <div className="guides-scope-selector__list" style={{ maxHeight: '240px', overflowY: 'auto', borderRadius: '6px', marginBottom: '12px' }}>
      <div className="guides-scope-selector__list-header" style={{ display: 'flex', alignItems: 'center', gap: '10px', padding: '8px 12px', fontSize: '12px', fontWeight: '600', position: 'sticky', top: 0, zIndex: 1 }}>
        <div style={{ width: '16px', flexShrink: 0 }} />

        <div style={{ flex: 1, textAlign: 'left' }}>Action</div>
        <div style={{ minWidth: '120px', marginLeft: 'auto', textAlign: 'right' }}>Scope(s)</div>
      </div>

      <div className="guides-scope-selector__muted" data-guide-loading style={{ padding: '16px', textAlign: 'center', fontSize: '13px' }}>Loading actions...</div>
      <div className="guides-scope-selector__muted" data-guide-no-results hidden style={{ padding: '16px', textAlign: 'center', fontSize: '13px' }}>No actions match your search.</div>
    </div>

    <div className="guides-scope-selector__url-section" style={{ marginTop: '12px', paddingTop: '12px' }}>
      <div className="guides-scope-selector__muted" style={{ fontSize: '12px', fontWeight: '500', marginBottom: '6px' }}>Dynamic Guide URL</div>

      <div style={{ display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>
        <input type="text" readOnly className="guides-scope-selector__input" data-guide-url style={{ flex: 1, minWidth: '200px', padding: '8px 10px', borderRadius: '6px', fontSize: '12px', fontFamily: 'monospace' }} />

        <button type="button" className="guides-scope-selector__copy-btn" data-guide-copy-url style={{ width: '120px', padding: '8px 14px', borderRadius: '6px', fontSize: '13px', fontWeight: '500', cursor: 'pointer', whiteSpace: 'nowrap', marginLeft: 'auto' }}>Copy URL</button>
      </div>

      <div style={{ marginTop: '12px' }}>
        <div className="guides-scope-selector__muted" style={{ fontSize: '12px', fontWeight: '500', marginBottom: '6px' }}>Scopes Selected</div>

        <div style={{ display: 'flex', alignItems: 'stretch', gap: '8px', flexWrap: 'wrap' }}>
          <pre className="guides-scope-selector__input" role="textbox" aria-readonly="true" tabIndex={0} data-guide-scopes-output style={{ flex: 1, minWidth: '200px', minHeight: '88px', maxHeight: '120px', overflowY: 'auto', margin: 0, padding: '8px 10px', borderRadius: '6px', fontSize: '12px', fontFamily: 'monospace', whiteSpace: 'pre-wrap' }} />

          <div className="guides-scope-selector__muted" style={{ display: 'flex', flexDirection: 'column', gap: '8px', fontSize: '12px', fontWeight: '500', flexShrink: 0, alignItems: 'flex-start' }}>
            <div style={{ whiteSpace: 'nowrap' }}>Separator</div>

            <select className="guides-scope-selector__input" data-guide-scope-delimiter style={{ width: '100%', padding: '6px 10px', borderRadius: '6px', fontSize: '12px' }}>
              <option value="space">Space</option>
              <option value="comma">Comma</option>
              <option value="semicolon">Semicolon</option>
              <option value="pipe">Pipe</option>
              <option value="newline">Newline</option>
            </select>

            <button type="button" className="guides-scope-selector__copy-btn" data-guide-copy-scopes style={{ width: '120px', padding: '8px 14px', borderRadius: '6px', fontSize: '13px', fontWeight: '500', cursor: 'pointer', whiteSpace: 'nowrap' }}>Copy scopes</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</Panel>

<section data-guide-section data-guide-scopes="">
  <h2>1. Pick a Sandbox Institution</h2>

  <p>Plaid Sandbox simulates real banks. Each simulated bank has an ID prefixed with `ins_`. The institution you pick here determines which kinds of accounts (checking, savings, credit, etc.) the resulting Item will contain.</p>

  <Steps>
    <Step title="Use a default Sandbox bank">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>For most use cases, pick one of these Sandbox institutions. Copy its institution ID (for example `ins_109508`) — you will paste it into the <strong>Institution ID</strong> field in StackOne Hub in a later step.</p>

        <ul>
          <li>**`ins_109508`** — First Platypus Bank</li>
          <li>**`ins_109509`** — First Gingham Credit Union</li>
          <li>**`ins_109510`** — Tattersall Federal Credit Union</li>
          <li>**`ins_109511`** — Tartan Bank</li>
          <li>**`ins_109512`** — Houndstooth Bank</li>
        </ul>
      </div>
    </Step>

    <Step title="Find more institutions">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The full list of Sandbox institutions — including which products each one supports — is in the <a href="https://plaid.com/docs/sandbox/institutions/" target="_blank" rel="noopener noreferrer">Plaid Sandbox institutions docs</a>. The institution you pick must support every product in your Products list, otherwise the mint call will fail.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>2. Enter the Sandbox bank account credentials</h2>

  <p>The Sandbox Username and Sandbox Password fields are the <strong>simulated bank account login</strong> used to authenticate against the Sandbox institution — NOT your Plaid Dashboard login. Plaid pre-populates a sample bank account for every project and exposes its credentials in the Dashboard.</p>

  <Steps>
    <Step title="Find your sample bank account credentials">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the Plaid Dashboard at <a href="https://dashboard.plaid.com" target="_blank" rel="noopener noreferrer">dashboard.plaid.com</a>, expand the <strong>Developers</strong> section in the left sidebar, then click <strong>Sandbox</strong> and open the <strong>Credentials</strong> tab. The page shows the username and password for your sample bank account. Copy both values into the Sandbox Username and Sandbox Password fields here.</p>
      </div>
    </Step>

    <Step title="Additional pre-populated test accounts">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>For other simulated bank accounts and credentials that exercise specific scenarios (locked accounts, MFA prompts, insufficient permissions, etc.), see the <a href="https://plaid.com/docs/sandbox/test-credentials/" target="_blank" rel="noopener noreferrer">Plaid Sandbox test credentials reference</a> and use those values if you want to test error paths.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>3. Pick the Products to enable (optional)</h2>

  <p>A Plaid <strong>product</strong> represents a group of API (e.g., transactions, identity, auth). The products you pick are enabled on the Sandbox Item StackOne mints, which determines which actions in this connector will work with the resulting access\_token.<br /><br />**If you leave this field blank default product list will use, the default product list includes `statements`** — and `statements` always requires the Statements Start Date and Statements End Date below. Either fill those date fields, OR explicitly type a product list that does not include `statements` (e.g., `transactions auth identity`).</p>

  <ul>
    <li>Enter one or several products, <strong>space-separated</strong>. Examples: `transactions`, `transactions auth`, `transactions auth identity`.</li>
    <li><strong>Leave the field blank</strong> to use the default set of 7 products: `transactions auth identity investments liabilities assets statements`. The other enabled products (`income`, `enrich`, `balance`) are NOT in the default — see the next step for why, and type them explicitly if you need them.</li>
    <li>The <strong>institution</strong> you select must support every product you list, otherwise Plaid will reject the mint call.</li>
    <li>If the list includes `statements` (or you leave the field blank, since the default contains `statements`), you must <strong>also</strong> fill the Statements Start Date and Statements End Date — both are required, you cannot provide only one. Without them Plaid returns: *"Statements product requires a Statements object to be passed in."*</li>
  </ul>

  <Steps>
    <Step title="Available products and the actions they enable">
      <div data-guide-step data-guide-scopes="transactions,auth,identity,investments,liabilities,assets,statements,income,enrich" data-guide-display-scopes-list="transactions,auth,identity,investments,liabilities,assets,statements,income,enrich">
        <div className="connector-guide-actions-badge" data-guide-actions-badge data-guide-actions-badge-scopes="transactions,auth,identity,investments,liabilities,assets,statements,income,enrich" style={{ display: 'block', width: 'fit-content', maxWidth: '100%', padding: '2px 8px', borderRadius: '8px', fontSize: '12px', marginBottom: '8px', marginTop: '-10px', whiteSpace: 'nowrap', overflowX: 'auto', overflowY: 'hidden', msOverflowStyle: 'none', scrollbarWidth: 'none' }}>
          <span>Enables actions: </span><span data-guide-actions-badge-labels>Create Asset Report, Download Statement, Enrich Transactions, Filter Asset Report, Get Asset Report, Get Asset Report PDF, Get Auth, Get Bank Income, Get Bank Income PDF, Get Credit Sessions, Get Employment, Get Identity, Get Investment Holdings, Get Investment Transactions, Get Liabilities, Get Payroll Income, Get Payroll Income Risk Signals, Get Recurring Transactions, Get Transactions, List Statements, Refresh Asset Report, Refresh Statements, Refresh Transactions, Remove Asset Report, Sync Transactions</span>
        </div>

        <p>Pick only the products that back the actions you intend to run.</p>

        <div style={{ marginTop: '8px' }} data-guide-display-scopes>
          <div className="connector-guide-scopes-container">
            <ul className="not-prose" style={{ listStyleType: "'- '", paddingLeft: '1em', margin: 0 }}>
              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="transactions">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transactions" title="Copy scope" data-copy="transactions">
                  <span className="connector-guide-scope-copy__label">transactions</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="auth">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy auth" title="Copy scope" data-copy="auth">
                  <span className="connector-guide-scope-copy__label">auth</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="identity">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy identity" title="Copy scope" data-copy="identity">
                  <span className="connector-guide-scope-copy__label">identity</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="investments">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy investments" title="Copy scope" data-copy="investments">
                  <span className="connector-guide-scope-copy__label">investments</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="liabilities">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy liabilities" title="Copy scope" data-copy="liabilities">
                  <span className="connector-guide-scope-copy__label">liabilities</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="assets">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy assets" title="Copy scope" data-copy="assets">
                  <span className="connector-guide-scope-copy__label">assets</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="statements">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy statements" title="Copy scope" data-copy="statements">
                  <span className="connector-guide-scope-copy__label">statements</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="income">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy income" title="Copy scope" data-copy="income">
                  <span className="connector-guide-scope-copy__label">income</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="enrich">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy enrich" title="Copy scope" data-copy="enrich">
                  <span className="connector-guide-scope-copy__label">enrich</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>

    <Step title="Products enabled on the sandbox account">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Only the following Plaid products are turned on for the sandbox account. Any product NOT in this list cannot be used as a value of `initial_products` (sandbox\_create\_public\_token) or `products` (create\_link\_token) until it is enabled in <strong>Plaid Dashboard → Account → Products</strong>. Actions that depend on a disabled product are marked `releaseStage: preview` and have not been live-tested. Per-action availability is enforced by each action's `requiredScopes`.<br /><br />The list below shows the products that must be passed in `initial_products` to mint an access\_token with that capability. Items without a tag are included by default when you leave the Products field blank; items tagged <strong>(opt-in)</strong> are enabled but must be typed explicitly.</p>

        <ul>
          <li><strong>Assets</strong></li>
          <li><strong>Auth</strong></li>
          <li><strong>Identity</strong> + <strong>Identity Match</strong> (Identity Match is a sub-product available on any Item with `identity` enabled)</li>
          <li><strong>Income</strong> (bank + payroll)</li>
          <li><strong>Investments</strong> + <strong>Investments Refresh</strong> + <strong>Investments Move</strong> + <strong>Investments Auth</strong> (refresh/move/auth are endpoints on top of an Item with `investments` enabled)</li>
          <li><strong>Liabilities</strong></li>
          <li><strong>Statements</strong> (requires Statements Start Date and End Date below)</li>
          <li><strong>Transactions</strong> + <strong>Recurring Transactions</strong> + <strong>Transactions Refresh</strong> (recurring/refresh are endpoints on top of an Item with `transactions` enabled)</li>
        </ul>
      </div>
    </Step>

    <Step title="Products that do NOT belong in the Products field">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>These products are also enabled on the sandbox account but must NOT be typed in the Products field — they are not valid `initial_products` values.</p>

        <ul>
          <li><strong>Balance</strong> — auto-included on any Item. Call `/accounts/balance/get` on any existing Item to get fresh balances. Plaid will reject the mint call if you type `balance` in the Products field.</li>
          <li><strong>Enrich</strong> — stateless. Call `/transactions/enrich` directly with your own transaction data — no Link flow, Item, or access\_token required.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>4. Statements dates (only if Products includes `statements`)</h2>

  <p>These two date fields apply only when your Products list includes `statements` — either explicitly typed (e.g., `transactions statements`) or by default (the Products field, when left blank, defaults to all seven products and that default list contains `statements`).</p>

  <ul>
    <li>Format both dates as `YYYY-MM-DD`. <strong>Do not use future dates</strong> — a future-dated range causes the mint to fail, so the account may not connect. Use a historical range, e.g., Start Date `2025-01-01`, End Date `2025-12-31`.</li>
    <li>End Date must be on or after Start Date.</li>
    <li><strong>Both dates must be provided together — providing only one will cause Plaid to reject the mint call.</strong> StackOne sends `options.statements` to Plaid as soon as either field is filled (and `statements` is in your Products list), and Plaid requires both `start_date` and `end_date` to be valid.</li>
    <li>If your Products list does not contain `statements` (e.g., you typed `transactions auth`), the date fields are ignored — StackOne does not send `options.statements` to Plaid in that case, regardless of what you put here.</li>
    <li>If you leave Products blank (default = all seven products, which includes `statements`) you <strong>must</strong> fill both dates here, otherwise the connect will fail with a Plaid error about missing `options.statements`.</li>
  </ul>
</section>

<div data-whitelabel-hide>
  <h2>Linking the Account from the Hub</h2>

  <Steps>
    <Step title="Navigate to the Hub">
      Use one of the three <a href="/guides/accounts-section#linking-accounts">Linking Account Methods</a> to access the Hub.
    </Step>

    <Step title="Fill out the fields">
      Fill out the following fields using details from your provider:

      <ul>
        <li><strong>Institution ID</strong></li>
        <li><strong>Sandbox Username</strong></li>
        <li><strong>Sandbox Password</strong></li>
        <li><strong>Products</strong> (Optional)</li>
        <li><strong>Statements Start Date</strong> (Optional)</li>
        <li><strong>Statements End Date</strong> (Optional)</li>
      </ul>
    </Step>

    <Step title="Connect">
      <ul>
        <li>Click <strong>Connect</strong></li>
        <li>If applicable, the provider will redirect you to a sign-in or authorization page. Complete the provider's authorization flow.</li>
        <li>Once authorization is successful, you will see a confirmation popup</li>
      </ul>
    </Step>
  </Steps>

  <p>If the account linking is successful, you will see the newly linked account in your <a href="/guides/accounts-section">Accounts</a> page.</p>
</div>
