---
schema_version: "1"
id: 7ffd76b715aa710875d8fe396e611da4efed530c823fda0a6daccf851a56f48b
title: TwoFactorMethodsInfo
collection: legacydeveloper
version: current
locale: en-us
portal_url: https://docs.salesforce.com/legacydeveloper/current/en-us/object_reference/sforce_api_objects_twofactormethodsinfo.md
canonical_url: https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_twofactormethodsinfo.htm
source_site: developer.salesforce.com
content_type: documentation
content_hash: 9fe9834803e6aa2d4a48102b22d86791718d1fab2ae89fcde6fb3ca586984119
description: Stores information about which identity verification methods a user has registered. This object is available in API version 37.0 and later.
---
# TwoFactorMethodsInfo

Stores information about which identity verification methods a user has registered. This object is available in API version 37.0 and later.

## Supported Calls

describeSObjects(), query()

## Special Access Rules

You need the Manage MFA in API user permission to access this object. Note that multi-factor authentication (MFA) was formerly called two-factor authentication.

If you try to use [Apex DML operations](https://developer.salesforce.com/docs/atlas.en-us.264.0.apexref.meta/apexref/apex_dml_section.htm) and then query this object in the same call, you get an UncommittedWork error with this description.

A callout was unsuccessful because of pending uncommitted work related to a process, flow, or Apex operation.
Commit or roll back the work, and then try again.

To avoid this error, execute DML operations and queries in separate, asynchronous calls.

## Fields

<table class="featureTable sort_table" summary="">


          <thead class="thead sorted" align="left">
            <tr>
              <th class="featureTableHeader  " id="d2035316e96">Field Name</th>

              <th class="featureTableHeader  " id="d2035316e99">Details</th>

            </tr>

          </thead>

          <tbody class="tbody">
            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">ExternalId</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">string</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Filter, Group, Nillable, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">A unique system-generated numerical identifier for the
                    user.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasBuiltInAuthenticator</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has registered a
                    built-in authenticator on their device, such as Touch ID
                    or Windows Hello. The user can verify their identity by
                    using the built-in authenticator.</dd>

                  <dd class="dd">This field is available in API version 53.0 and
                    later.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasSalesforceAuthenticator</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has connected the
                    Salesforce Authenticator mobile app. The user can verify
                    identity by approving a notification sent to the app. If
                    the user sets a trusted location in the app, Salesforce
                    Authenticator verifies automatically when the user is in
                    the trusted location.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasSecurityKey</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has registered a WebAuthn-compatible security
                    key. This field includes all security keys registered or
                    used after Summer ’22. The user can verify their
                    identity by inserting the security key into a USB port
                    to generate credentials.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasTempCode</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has a temporary
                    verification code generated by a Salesforce admin or
                    user with Manage Multi-Factor Authentication in User
                    Interface permission.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasTotp</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has connected an
                    authenticator app that generates verification codes,
                    also known as time-based one-time passwords (TOTP). The
                    user can verify identity by entering a code generated by
                    the app.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasU2F</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has registered a
                    U2F security key. The user can verify identity by
                    inserting the security key into a USB port to generate
                    credentials.</dd>


                </dl>

                <div class="box message info">
                  <div class="inner">
                    <div class="bd">
                      <div class="media">
                        <img class="img mtm" src="https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/images/icon_note.png" alt="Note">
                        <div class="mediaBd">
                          <h4 class="mbs">Note</h4>
                          <p>For U2F security keys registered or used after Summer ’22, use HasSecurityKey
                            instead.</p>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasUserVerifiedEmailAddress</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user's email address is verified.<p class="p">This parameter
                      is available in API version 43.0 and later.</p>
                  </dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasUserVerifiedMobileNumber</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has self-registered and verified a mobile phone
                    number. Salesforce can text a verification code to the
                    user at that number.<p class="p">This parameter is available in
                      API version 43.0 and later.</p>
                  </dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">HasVerifiedMobileNumber</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">boolean</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Defaulted on create, Filter, Group, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">If <span class="keyword parmname">true</span>, the user has a mobile
                    phone number that was added by an administrator or
                    self-registered by the user. Salesforce can text a
                    verification code to the user at that number.</dd>


                </dl>

              </td>

            </tr>

            <tr>
              <td class="entry" headers="d2035316e96" data-title="Field Name"><span class="keyword parmname">UserId</span></td>

              <td class="entry" headers="d2035316e99" data-title="Details">
                <dl class="dl detailList">

                  <dt class="dt dlterm">Type</dt>

                  <dd class="dd">reference</dd>



                  <dt class="dt dlterm">Properties</dt>

                  <dd class="dd">Filter, Group, Nillable, Sort</dd>



                  <dt class="dt dlterm">Description</dt>

                  <dd class="dd">ID of the user who’s associated with the identity
                    verification methods.</dd>


                </dl>

              </td>

            </tr>

          </tbody>

        </table>

## Usage

In API version 34.0 and later, this object was enhanced to help manage high instance counts. A [query()](https://developer.salesforce.com/docs/atlas.en-us.264.0.api.meta/api/sforce_api_calls_query.htm) call returns up to 500 rows. A [queryMore()](https://developer.salesforce.com/docs/atlas.en-us.264.0.api.meta/api/sforce_api_calls_querymore.htm)call returns 500 more, up to 2,500 total. No more records are returned after 2,500.

To make sure that you don’t miss any records, issue a COUNT() query in a SELECT clause for TwoFactorMethodInfo. This query gives you the total number of records. If there are more than 2,500 records, use these options to manage your results.

- Divide queries by filtering on fields like UserId to return subsets of less than 2,500 records.
- Use [OFFSET](https://developer.salesforce.com/docs/atlas.en-us.264.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_offset.htm) to get batches of 2,000 records. Start with an OFFSET of 0 and then increment by 2,000. If you use this option, we recommend that you also use [LIMIT](https://developer.salesforce.com/docs/atlas.en-us.264.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_limit.htm) to limit each query to 2,000.
    
    ![Note](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/images/icon_note.png)
    
    #### Note
    
    The OFFSET clause is limited to 2,000 rows. Requesting an offset greater than 2,000 results in a NUMBER\_OUTSIDE\_VALID\_RANGE error.
    
    For example, use an initial query with this structure.
    
    SELECT <desired fields> FROM TwoFactorMethodsInfo LIMIT 2000 OFFSET 0
    
    Then, run another query with an offset of 2,000.
    
    SELECT <desired fields> FROM TwoFactorMethodsInfo LIMIT 2000 OFFSET 2000
    
    Continue to increase the offset by 2,000 until you have results for all records.