> ## 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 Cornerstone with OAuth 2.0 – StackOne Hub

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

<Warning>Ensure that your Cornerstone account has Admin privileges.</Warning>

<Panel>
  <div className="not-prose guides-scope-selector" data-guides-scope-selector data-guide-actions-json="[{&#x22;id&#x22;:&#x22;cornerstone_search_catalog&#x22;,&#x22;label&#x22;:&#x22;Catalog Search&#x22;,&#x22;scopes&#x22;:[&#x22;training:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_create_express_class&#x22;,&#x22;label&#x22;:&#x22;Create Express Class&#x22;,&#x22;scopes&#x22;:[&#x22;expressclass:create&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_learning_object&#x22;,&#x22;label&#x22;:&#x22;Get Learning Object Details&#x22;,&#x22;scopes&#x22;:[&#x22;training:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_create_learning_object&#x22;,&#x22;label&#x22;:&#x22;Create Learning Object&#x22;,&#x22;scopes&#x22;:[&#x22;training:create&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_search_transcripts&#x22;,&#x22;label&#x22;:&#x22;Search Transcripts&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_assign_transcript&#x22;,&#x22;label&#x22;:&#x22;Assign Training&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:create&#x22;,&#x22;transcript:create:assign&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_complete_transcript&#x22;,&#x22;label&#x22;:&#x22;Complete Training&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:update&#x22;,&#x22;transcript:update:complete&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_transcript_enhanced_details&#x22;,&#x22;label&#x22;:&#x22;Get Transcript Enhanced Details&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_transcript_curricula_childs&#x22;,&#x22;label&#x22;:&#x22;Get Transcript Curricula Child Details&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_update_transcript_progress&#x22;,&#x22;label&#x22;:&#x22;Update Transcript Progress&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:update&#x22;,&#x22;transcript:update:progress&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_search_learning_assignments&#x22;,&#x22;label&#x22;:&#x22;Search Learning Assignments&#x22;,&#x22;scopes&#x22;:[&#x22;learningassignment:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_learning_assignment&#x22;,&#x22;label&#x22;:&#x22;Get Learning Assignment&#x22;,&#x22;scopes&#x22;:[&#x22;learningassignment:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_remaining_assignment_count&#x22;,&#x22;label&#x22;:&#x22;Get Remaining Assignment Count&#x22;,&#x22;scopes&#x22;:[&#x22;learningassignment:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_list_users&#x22;,&#x22;label&#x22;:&#x22;List Users&#x22;,&#x22;scopes&#x22;:[&#x22;obj_users_core:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_approvals&#x22;,&#x22;label&#x22;:&#x22;Get Approvals&#x22;,&#x22;scopes&#x22;:[&#x22;approval:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_assigned_trainings&#x22;,&#x22;label&#x22;:&#x22;Get Assigned Trainings&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_inbox_items&#x22;,&#x22;label&#x22;:&#x22;Get Inbox Items&#x22;,&#x22;scopes&#x22;:[&#x22;inbox:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_sessions&#x22;,&#x22;label&#x22;:&#x22;Get Sessions&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_suggested_trainings&#x22;,&#x22;label&#x22;:&#x22;Get Suggested Trainings&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_tasks&#x22;,&#x22;label&#x22;:&#x22;Get Tasks&#x22;,&#x22;scopes&#x22;:[&#x22;task:read&#x22;]},{&#x22;id&#x22;:&#x22;cornerstone_get_transcripts_legacy&#x22;,&#x22;label&#x22;:&#x22;Get Transcripts (Legacy)&#x22;,&#x22;scopes&#x22;:[&#x22;transcript:read&#x22;]}]">
    <div className="guides-scope-selector__title">Select Actions to adjust the guide</div>
    <div className="guides-scope-selector__muted guides-scope-selector__subtitle">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 className="guides-scope-selector__toolbar">
      <input type="text" placeholder="Search actions..." className="guides-scope-selector__input guides-scope-selector__search" data-guide-action-search />

      <button type="button" className="guides-scope-selector__quick-btn" data-guide-select-all>Select all</button>
      <button type="button" className="guides-scope-selector__quick-btn" data-guide-clear>Clear</button>
    </div>

    <div className="guides-scope-selector__list">
      <div className="guides-scope-selector__list-header">
        <div className="guides-scope-selector__list-header-spacer" />

        <div className="guides-scope-selector__list-header-action">Action</div>
        <div className="guides-scope-selector__list-header-scopes">Scope(s)</div>
      </div>

      <div className="guides-scope-selector__muted guides-scope-selector__status" data-guide-loading>Loading actions...</div>
      <div className="guides-scope-selector__muted guides-scope-selector__status" data-guide-no-results hidden>No actions match your search.</div>
    </div>

    <div className="guides-scope-selector__url-section">
      <div className="guides-scope-selector__muted guides-scope-selector__label">Dynamic Guide URL</div>

      <div className="guides-scope-selector__url-row">
        <input type="text" readOnly className="guides-scope-selector__input guides-scope-selector__url-input" data-guide-url />

        <button type="button" className="guides-scope-selector__copy-btn guides-scope-selector__copy-btn--end" data-guide-copy-url>Copy URL</button>
      </div>

      <div className="guides-scope-selector__scopes-section">
        <div className="guides-scope-selector__muted guides-scope-selector__label">Scopes Selected</div>

        <div className="guides-scope-selector__scopes-row">
          <pre className="guides-scope-selector__input guides-scope-selector__scopes-output" role="textbox" aria-readonly="true" tabIndex={0} data-guide-scopes-output />

          <div className="guides-scope-selector__muted guides-scope-selector__side-controls">
            <div className="guides-scope-selector__side-label">Separator</div>

            <select className="guides-scope-selector__input guides-scope-selector__delimiter" data-guide-scope-delimiter>
              <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>Copy scopes</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</Panel>

<section data-guide-section data-guide-scopes="">
  <h2>Generate Client ID and Secret key</h2>

  <p>To connect Cornerstone with StackOne, you'll need to register an OAuth 2.0 application in your Cornerstone portal.</p>

  <Steps>
    <Step title="Login to your Cornerstone portal">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your <a href="https://www.cornerstoneondemand.com" target="_blank" rel="noopener noreferrer">Cornerstone account</a>.</p>
      </div>
    </Step>

    <Step title="Navigate to API Management">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Navigate to <strong>Admin > Tools > Edge > API Management</strong>.</p>
      </div>
    </Step>

    <Step title="Register New Application">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>On the <strong>Manage Applications</strong> tab, click <strong>Register New Application</strong>.</p>
      </div>
    </Step>

    <Step title="Enter Application Details">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Provide the required application information.</p>

        <ul>
          <li><strong>Application Name</strong>: Enter a descriptive name (e.g., StackOne Integration)</li>
          <li><strong>User ID</strong>: Enter the User ID of an active user in your portal</li>
        </ul>
      </div>
    </Step>

    <Step title="Select Application Scopes">
      <div data-guide-step data-guide-scopes="training:read,training:create,obj_users_core:read,learningassignment:read,transcript:read,transcript:create,transcript:create:assign,transcript:update,transcript:update:complete,transcript:update:progress,approval:read,inbox:read,task:read,expressclass:create" data-guide-display-scopes-list="training:read,training:create,obj_users_core:read,learningassignment:read,transcript:read,transcript:create,transcript:create:assign,transcript:update,transcript:update:complete,transcript:update:progress,approval:read,inbox:read,task:read,expressclass:create">
        <div className="connector-guide-actions-badge" data-guide-actions-badge data-guide-actions-badge-scopes="training:read,training:create,obj_users_core:read,learningassignment:read,transcript:read,transcript:create,transcript:create:assign,transcript:update,transcript:update:complete,transcript:update:progress,approval:read,inbox:read,task:read,expressclass:create">
          <span>Enables actions: </span><span data-guide-actions-badge-labels>Assign Training, Catalog Search, Complete Training, Create Express Class, Create Learning Object, Get Approvals, Get Assigned Trainings, Get Inbox Items, Get Learning Assignment, Get Learning Object Details, Get Remaining Assignment Count, Get Sessions, Get Suggested Trainings, Get Tasks, Get Transcript Curricula Child Details, Get Transcript Enhanced Details, Get Transcripts (Legacy), List Users, Search Learning Assignments, Search Transcripts, Update Transcript Progress</span>
        </div>

        <p>In the <strong>Scopes</strong> section, select the scopes you want to associate with your application. The scopes below are the ones this connector uses — select every scope for the actions you intend to call.</p>

        <div className="connector-guide-display-scopes" data-guide-display-scopes>
          <div className="connector-guide-scopes-container connector-guide-scopes-container--scrollable">
            <ul className="not-prose connector-guide-scopes-list">
              <li data-guide-display-scope="training:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy training:read" title="Copy scope" data-copy="training:read">
                  <span className="connector-guide-scope-copy__label">training:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="training:create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy training:create" title="Copy scope" data-copy="training:create">
                  <span className="connector-guide-scope-copy__label">training:create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="obj_users_core:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy obj_users_core:read" title="Copy scope" data-copy="obj_users_core:read">
                  <span className="connector-guide-scope-copy__label">obj\_users\_core:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="learningassignment:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy learningassignment:read" title="Copy scope" data-copy="learningassignment:read">
                  <span className="connector-guide-scope-copy__label">learningassignment:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:read" title="Copy scope" data-copy="transcript:read">
                  <span className="connector-guide-scope-copy__label">transcript:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:create" title="Copy scope" data-copy="transcript:create">
                  <span className="connector-guide-scope-copy__label">transcript:create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:create:assign">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:create:assign" title="Copy scope" data-copy="transcript:create:assign">
                  <span className="connector-guide-scope-copy__label">transcript:create:assign</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:update">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:update" title="Copy scope" data-copy="transcript:update">
                  <span className="connector-guide-scope-copy__label">transcript:update</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:update:complete">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:update:complete" title="Copy scope" data-copy="transcript:update:complete">
                  <span className="connector-guide-scope-copy__label">transcript:update:complete</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="transcript:update:progress">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy transcript:update:progress" title="Copy scope" data-copy="transcript:update:progress">
                  <span className="connector-guide-scope-copy__label">transcript:update:progress</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="approval:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy approval:read" title="Copy scope" data-copy="approval:read">
                  <span className="connector-guide-scope-copy__label">approval:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="inbox:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy inbox:read" title="Copy scope" data-copy="inbox:read">
                  <span className="connector-guide-scope-copy__label">inbox:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="task:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy task:read" title="Copy scope" data-copy="task:read">
                  <span className="connector-guide-scope-copy__label">task:read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li data-guide-display-scope="expressclass:create">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy expressclass:create" title="Copy scope" data-copy="expressclass:create">
                  <span className="connector-guide-scope-copy__label">expressclass:create</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>

    <Step title="Complete Registration">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Register Application</strong> to complete the registration process.</p>
      </div>
    </Step>

    <Step title="Save your credentials securely">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>If the User ID is valid, you'll receive your Client ID and Client Secret. Store these credentials securely for use later.</p>

        <ul>
          <li>⚠️ The Client Secret will only be shown once and cannot be retrieved later. If lost, you'll need to regenerate it.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Configure User Permissions</h2>

  <p>Ensure the user associated with your OAuth application has the necessary permissions.</p>

  <Steps>
    <Step title="Navigate to User Management">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Navigate to <strong>Admin > Tools > Core Functions > Users</strong> and search for the user which is associated with the Application you created in the previous step.</p>
      </div>
    </Step>

    <Step title="Configure Permissions">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click on <strong>Options > Permissions</strong>. Ensure the following permissions are configured to either `There are no constraints available for this permission.` or `Restrict to User's Corporation.`</p>

        <ul>
          <li>Reporting API - Read only</li>
          <li>Transcript API - Request</li>
          <li>Transcript API - View</li>
          <li>Employee API - View</li>
          <li>Learning Assignment API - View</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Find Your Company Domain</h2>

  <p>Your Company Domain is the subdomain part of your Cornerstone URL.</p>

  <Steps>
    <Step title="Locate Domain in URL">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>When logged in to your Cornerstone account, look at the URL in your browser.</p>

        <ul>
          <li>Example: If your URL is `my-company.csod.com`, your domain is `my-company`</li>
          <li>Enter only the subdomain part (without `.csod.com`)</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Troubleshooting</h2>

  <p>Common issues and how to resolve them.</p>

  <Steps>
    <Step title="Error: 'Provided user does not have Rest services permissions and/or constraints to perform this operation'">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>This error message indicates that the API you are trying to access is not enabled in your Cornerstone portal. To resolve this error, follow these steps.</p>

        <ul>
          <li>Navigate to <strong>Admin > Tools > Edge > Integrations > Manage APIs</strong> within your Cornerstone portal.</li>
          <li>Ensure the toggles for <strong>Cornerstone API</strong> and <strong>Reporting API</strong> are turned on.</li>
          <li>If the toggles are already turned on, try turning them off and then back on again. This action resets the backend settings that control access to Cornerstone's APIs.</li>
          <li>After performing the above steps, if you still see the same error response, please log a case with Cornerstone Global Customer Support (GCS).</li>
        </ul>
      </div>
    </Step>

    <Step title="Error: 401 Unauthorized response when accessing the Reporting API">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>There are a few things you should check when you receive this response.</p>

        <ul>
          <li>Verify that the Reporting API is enabled for the environment that you are trying to pull data from. Navigate to <strong>Admin > Tools > Edge > API Management > Manage APIs</strong>. You should see the Reporting API enabled on this page.</li>
          <li><strong>If using OAuth 2.0</strong>: Ensure that the user account associated with your registered OAuth 2.0 application has the <strong>Reporting API - Read only</strong> permission.</li>
          <li><strong>If using OAuth 2.0</strong>: Ensure that your OAuth 2.0 application has the required scope to access the endpoint that you are trying to retrieve data from.</li>
          <li><strong>If using OAuth 2.0</strong>: Ensure that the OAuth 2.0 access token is still valid. Remember that OAuth 2.0 access tokens are valid for an hour by default, unless you set a different validity period for your application in the API Management page in Edge.</li>
          <li>After performing the above steps, if you still see an 'unauthorized access' error, please log a case with Cornerstone Global Customer Support (GCS).</li>
        </ul>
      </div>
    </Step>
  </Steps>
</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="/connect/managing-connectors/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>Client ID</strong></li>
        <li><strong>Client Secret</strong></li>
        <li><strong>Company Domain</strong></li>
        <li><strong>Application Scopes</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="/gateway/concepts/linked-accounts">Accounts</a> page.</p>
</div>

## Next Steps

<Columns cols={2}>
  <Card title="Webhooks setup" href="/connectors/cornerstone/guides/webhook-setup">
    <p className="connector-page-auth-description connector-page-card-text">
      Configure receiving Events for Cornerstone into StackOne.
    </p>
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.