> ## 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.

# Typeform OAuth2 connector profile – StackOne setup guide

> Set up the OAuth2 connector profile for Typeform in StackOne. One-time admin setup required before your users can link Typeform accounts via Hub.

<Warning>You must have access to the Developer apps section in your Typeform Organization settings to register OAuth applications.</Warning>

<Panel>
  <div className="not-prose guides-scope-selector" data-guides-scope-selector data-guide-actions-json="[{&#x22;id&#x22;:&#x22;typeform_list_forms&#x22;,&#x22;label&#x22;:&#x22;List Forms&#x22;,&#x22;scopes&#x22;:[&#x22;forms:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_create_form&#x22;,&#x22;label&#x22;:&#x22;Create Form&#x22;,&#x22;scopes&#x22;:[&#x22;forms:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_form&#x22;,&#x22;label&#x22;:&#x22;Get Form&#x22;,&#x22;scopes&#x22;:[&#x22;forms:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_update_form&#x22;,&#x22;label&#x22;:&#x22;Update Form&#x22;,&#x22;scopes&#x22;:[&#x22;forms:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_delete_form&#x22;,&#x22;label&#x22;:&#x22;Delete Form&#x22;,&#x22;scopes&#x22;:[&#x22;forms:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_form_messages&#x22;,&#x22;label&#x22;:&#x22;Get Form Messages&#x22;,&#x22;scopes&#x22;:[&#x22;forms:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_list_responses&#x22;,&#x22;label&#x22;:&#x22;List Responses&#x22;,&#x22;scopes&#x22;:[&#x22;responses:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_delete_responses&#x22;,&#x22;label&#x22;:&#x22;Delete Responses&#x22;,&#x22;scopes&#x22;:[&#x22;responses:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_list_themes&#x22;,&#x22;label&#x22;:&#x22;List Themes&#x22;,&#x22;scopes&#x22;:[&#x22;themes:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_create_theme&#x22;,&#x22;label&#x22;:&#x22;Create Theme&#x22;,&#x22;scopes&#x22;:[&#x22;themes:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_theme&#x22;,&#x22;label&#x22;:&#x22;Get Theme&#x22;,&#x22;scopes&#x22;:[&#x22;themes:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_update_theme&#x22;,&#x22;label&#x22;:&#x22;Update Theme&#x22;,&#x22;scopes&#x22;:[&#x22;themes:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_patch_theme&#x22;,&#x22;label&#x22;:&#x22;Patch Theme&#x22;,&#x22;scopes&#x22;:[&#x22;themes:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_delete_theme&#x22;,&#x22;label&#x22;:&#x22;Delete Theme&#x22;,&#x22;scopes&#x22;:[&#x22;themes:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_list_images&#x22;,&#x22;label&#x22;:&#x22;List Images&#x22;,&#x22;scopes&#x22;:[&#x22;images:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_create_image&#x22;,&#x22;label&#x22;:&#x22;Create Image&#x22;,&#x22;scopes&#x22;:[&#x22;images:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_image&#x22;,&#x22;label&#x22;:&#x22;Get Image&#x22;,&#x22;scopes&#x22;:[&#x22;images:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_delete_image&#x22;,&#x22;label&#x22;:&#x22;Delete Image&#x22;,&#x22;scopes&#x22;:[&#x22;images:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_background_by_size&#x22;,&#x22;label&#x22;:&#x22;Get Background Image By Size&#x22;,&#x22;scopes&#x22;:[&#x22;images:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_choice_image_by_size&#x22;,&#x22;label&#x22;:&#x22;Get Choice Image By Size&#x22;,&#x22;scopes&#x22;:[&#x22;images:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_image_by_size&#x22;,&#x22;label&#x22;:&#x22;Get Image By Size&#x22;,&#x22;scopes&#x22;:[&#x22;images:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_list_workspaces&#x22;,&#x22;label&#x22;:&#x22;List Workspaces&#x22;,&#x22;scopes&#x22;:[&#x22;workspaces:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_create_workspace&#x22;,&#x22;label&#x22;:&#x22;Create Workspace&#x22;,&#x22;scopes&#x22;:[&#x22;workspaces:write&#x22;]},{&#x22;id&#x22;:&#x22;typeform_get_workspace&#x22;,&#x22;label&#x22;:&#x22;Get Workspace&#x22;,&#x22;scopes&#x22;:[&#x22;workspaces:read&#x22;]},{&#x22;id&#x22;:&#x22;typeform_delete_workspace&#x22;,&#x22;label&#x22;:&#x22;Delete Workspace&#x22;,&#x22;scopes&#x22;:[&#x22;workspaces:write&#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>Register Your Application in Typeform</h2>

  <p>To connect Typeform with StackOne, you need to register an OAuth application in Typeform to obtain OAuth 2.0 credentials.</p>

  <Steps>
    <Step title="Access Developer Apps">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Log in to your <a href="https://admin.typeform.com/login" target="_blank" rel="noopener noreferrer">Typeform account</a>. Click on your profile/organization name in the top left corner, then select <strong>Developer apps</strong> from the dropdown menu.</p>
      </div>
    </Step>

    <Step title="Register a New App">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>On the Developer apps page, click the <strong>Register a new app</strong> button.</p>
      </div>
    </Step>

    <Step title="Fill in Application Details">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>You'll need to provide the following information in the app registration form:</p>

        <ul>
          <li><strong>App name</strong>: Enter a descriptive name for your application (e.g., StackOne Integration)</li>
          <li><strong>App website</strong>: Enter your organization's website URL</li>
          <li><strong>Redirect URI(s)</strong>: Enter the StackOne OAuth callback URL: `https://api.stackone.com/connect/oauth2/typeform/callback`</li>
          <li><strong>Developer email</strong>: Enter a valid email address</li>
        </ul>
      </div>
    </Step>

    <Step title="Submit Registration">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Register app</strong> to create your OAuth application.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Save Your Credentials</h2>

  <p>After clicking <strong>Register app</strong>, Typeform will display your OAuth credentials in a specific sequence.</p>

  <Steps>
    <Step title="Copy the Client Secret (First)">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Immediately after registration, a modal will appear showing your Client Secret. Copy this value and store it securely as it will displayed only once.</p>
      </div>
    </Step>

    <Step title="Copy the Client ID (Second)">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>After clicking <strong>Got it</strong> to close the secret modal, you'll see your app card on the Developer apps page. The <strong>Client ID</strong> will be displayed on this card. Copy this value and store it securely.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>OAuth Scopes Reference</h2>

  <p>For information about available OAuth scopes and their descriptions, refer to the <a href="https://www.typeform.com/developers/get-started/scopes/" target="_blank" rel="noopener noreferrer">Typeform Scopes Documentation</a>. Note that if you specify custom scopes when connecting in StackOne, `forms:read` and `offline` are required.</p>

  <Steps>
    <Step title="Available Scopes">
      <div data-guide-step data-guide-scopes="accounts:read,forms:read,forms:write,responses:read,responses:write,images:read,images:write,themes:read,themes:write,webhooks:read,webhooks:write,workspaces:read,workspaces:write,offline" data-guide-display-scopes-list="accounts:read,forms:read,forms:write,responses:read,responses:write,images:read,images:write,themes:read,themes:write,webhooks:read,webhooks:write,workspaces:read,workspaces:write,offline">
        <div className="connector-guide-actions-badge" data-guide-actions-badge data-guide-actions-badge-scopes="accounts:read,forms:read,forms:write,responses:read,responses:write,images:read,images:write,themes:read,themes:write,webhooks:read,webhooks:write,workspaces:read,workspaces:write,offline" 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 Form, Create Image, Create Theme, Create Workspace, Delete Form, Delete Image, Delete Responses, Delete Theme, Delete Workspace, Get Background Image By Size, Get Choice Image By Size, Get Form, Get Form Messages, Get Image, Get Image By Size, Get Theme, Get Workspace, List Forms, List Images, List Responses, List Themes, List Workspaces, Patch Theme, Update Form, Update Theme</span>
        </div>

        <p>The following scopes can be configured when connecting your Typeform account in StackOne. Add the scopes required for your use case.</p>

        <div style={{ marginTop: '8px' }} data-guide-display-scopes>
          <div className="connector-guide-scopes-container connector-guide-scopes-container--scrollable">
            <ul className="not-prose" style={{ listStyleType: "'- '", paddingLeft: '1em', margin: 0 }}>
              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="accounts:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy accounts:read" title="Copy scope" data-copy="accounts:read">
                  <span className="connector-guide-scope-copy__label">accounts:read</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="forms:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy forms:read" title="Copy scope" data-copy="forms:read">
                  <span className="connector-guide-scope-copy__label">forms:read</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="forms:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy forms:write" title="Copy scope" data-copy="forms:write">
                  <span className="connector-guide-scope-copy__label">forms:write</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="responses:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy responses:read" title="Copy scope" data-copy="responses:read">
                  <span className="connector-guide-scope-copy__label">responses:read</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="responses:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy responses:write" title="Copy scope" data-copy="responses:write">
                  <span className="connector-guide-scope-copy__label">responses:write</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="images:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy images:read" title="Copy scope" data-copy="images:read">
                  <span className="connector-guide-scope-copy__label">images:read</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="images:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy images:write" title="Copy scope" data-copy="images:write">
                  <span className="connector-guide-scope-copy__label">images:write</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="themes:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy themes:read" title="Copy scope" data-copy="themes:read">
                  <span className="connector-guide-scope-copy__label">themes:read</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="themes:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy themes:write" title="Copy scope" data-copy="themes:write">
                  <span className="connector-guide-scope-copy__label">themes:write</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="webhooks:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy webhooks:read" title="Copy scope" data-copy="webhooks:read">
                  <span className="connector-guide-scope-copy__label">webhooks:read</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="webhooks:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy webhooks:write" title="Copy scope" data-copy="webhooks:write">
                  <span className="connector-guide-scope-copy__label">webhooks:write</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="workspaces:read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy workspaces:read" title="Copy scope" data-copy="workspaces:read">
                  <span className="connector-guide-scope-copy__label">workspaces:read</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="workspaces:write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy workspaces:write" title="Copy scope" data-copy="workspaces:write">
                  <span className="connector-guide-scope-copy__label">workspaces:write</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="offline">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy offline" title="Copy scope" data-copy="offline">
                  <span className="connector-guide-scope-copy__label">offline</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>
  </Steps>
</section>

## Creating the StackOne Connector Profile

To create the Connector Profile in StackOne for <strong>Typeform</strong>:

<Steps>
  <Step title="Navigate to Connector Profiles">
    Login to StackOne and navigate to [Connector Profiles](https://app.stackone.com/connector_profiles)
  </Step>

  <Step title="Create New Connector Profile">
    <ul>
      <li>Click <strong>+ Connector Profile</strong></li>
      <li>Search for and select <strong>Typeform</strong></li>
      <li>Select <strong>Type</strong> as <strong>OAuth2</strong></li>

      <li>
        Fill out the fields using details retrieved from your provider:

        <ul style={{ marginLeft: '20px' }}>
          <li><strong>Client ID</strong></li>
          <li><strong>Client Secret</strong></li>
          <li><strong>Application Scopes</strong> (Optional)</li>
        </ul>
      </li>

      <li>(Optional) Select <strong>Actions</strong> to be enabled for this Connector Profile</li>
      <li>Click <strong>Create profile</strong></li>
    </ul>
  </Step>
</Steps>

Congratulations! The new Connector Profile will now show up in your project ready to be used. You can now continue to <a href="/guides/accounts-section#linking-accounts">Link Accounts</a> for <strong>Typeform</strong>.
