> ## 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 OpenVPN CloudConnexa with OAuth 2.0 (Client Credentials) – StackOne Hub

> Link a OpenVPN CloudConnexa account in the StackOne Hub using OAuth 2.0 (Client Credentials). End-user guide to authorize the integration and start using OpenVPN CloudConnexa actions.

<Warning>Owner privileges are required to create API credentials in CloudConnexa. The Client Secret is shown only once at creation time and cannot be retrieved later.</Warning>

<Panel>
  <div className="not-prose guides-scope-selector" data-guides-scope-selector data-guide-actions-json="[{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_networks&#x22;,&#x22;label&#x22;:&#x22;List Networks&#x22;,&#x22;scopes&#x22;:[&#x22;read:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_network&#x22;,&#x22;label&#x22;:&#x22;Get Network&#x22;,&#x22;scopes&#x22;:[&#x22;read:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_network&#x22;,&#x22;label&#x22;:&#x22;Create Network&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_network&#x22;,&#x22;label&#x22;:&#x22;Update Network&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_network&#x22;,&#x22;label&#x22;:&#x22;Delete Network&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_network_connectors&#x22;,&#x22;label&#x22;:&#x22;List Network Connectors&#x22;,&#x22;scopes&#x22;:[&#x22;read:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_network_connector&#x22;,&#x22;label&#x22;:&#x22;Get Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;read:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_network_connector&#x22;,&#x22;label&#x22;:&#x22;Create Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_network_connector&#x22;,&#x22;label&#x22;:&#x22;Update Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_network_connector&#x22;,&#x22;label&#x22;:&#x22;Delete Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_activate_network_connector&#x22;,&#x22;label&#x22;:&#x22;Activate Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_suspend_network_connector&#x22;,&#x22;label&#x22;:&#x22;Suspend Network Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_hosts&#x22;,&#x22;label&#x22;:&#x22;List Hosts&#x22;,&#x22;scopes&#x22;:[&#x22;read:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_host&#x22;,&#x22;label&#x22;:&#x22;Get Host&#x22;,&#x22;scopes&#x22;:[&#x22;read:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_host&#x22;,&#x22;label&#x22;:&#x22;Create Host&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_host&#x22;,&#x22;label&#x22;:&#x22;Update Host&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_host&#x22;,&#x22;label&#x22;:&#x22;Delete Host&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_host_connectors&#x22;,&#x22;label&#x22;:&#x22;List Host Connectors&#x22;,&#x22;scopes&#x22;:[&#x22;read:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_host_connector&#x22;,&#x22;label&#x22;:&#x22;Get Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;read:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_host_connector&#x22;,&#x22;label&#x22;:&#x22;Create Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_host_connector&#x22;,&#x22;label&#x22;:&#x22;Update Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_host_connector&#x22;,&#x22;label&#x22;:&#x22;Delete Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_activate_host_connector&#x22;,&#x22;label&#x22;:&#x22;Activate Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_suspend_host_connector&#x22;,&#x22;label&#x22;:&#x22;Suspend Host Connector&#x22;,&#x22;scopes&#x22;:[&#x22;write:host&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_users&#x22;,&#x22;label&#x22;:&#x22;List Users&#x22;,&#x22;scopes&#x22;:[&#x22;read:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_user&#x22;,&#x22;label&#x22;:&#x22;Get User&#x22;,&#x22;scopes&#x22;:[&#x22;read:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_user&#x22;,&#x22;label&#x22;:&#x22;Create User&#x22;,&#x22;scopes&#x22;:[&#x22;write:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_user&#x22;,&#x22;label&#x22;:&#x22;Update User&#x22;,&#x22;scopes&#x22;:[&#x22;write:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_user&#x22;,&#x22;label&#x22;:&#x22;Delete User&#x22;,&#x22;scopes&#x22;:[&#x22;write:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_activate_user&#x22;,&#x22;label&#x22;:&#x22;Activate User&#x22;,&#x22;scopes&#x22;:[&#x22;write:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_suspend_user&#x22;,&#x22;label&#x22;:&#x22;Suspend User&#x22;,&#x22;scopes&#x22;:[&#x22;write:user&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_user_groups&#x22;,&#x22;label&#x22;:&#x22;List User Groups&#x22;,&#x22;scopes&#x22;:[&#x22;read:user_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_user_group&#x22;,&#x22;label&#x22;:&#x22;Get User Group&#x22;,&#x22;scopes&#x22;:[&#x22;read:user_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_user_group&#x22;,&#x22;label&#x22;:&#x22;Create User Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:user_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_user_group&#x22;,&#x22;label&#x22;:&#x22;Update User Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:user_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_user_group&#x22;,&#x22;label&#x22;:&#x22;Delete User Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:user_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_devices&#x22;,&#x22;label&#x22;:&#x22;List Devices&#x22;,&#x22;scopes&#x22;:[&#x22;read:device&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_device&#x22;,&#x22;label&#x22;:&#x22;Get Device&#x22;,&#x22;scopes&#x22;:[&#x22;read:device&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_device&#x22;,&#x22;label&#x22;:&#x22;Create Device&#x22;,&#x22;scopes&#x22;:[&#x22;write:device&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_device&#x22;,&#x22;label&#x22;:&#x22;Update Device&#x22;,&#x22;scopes&#x22;:[&#x22;write:device&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_device&#x22;,&#x22;label&#x22;:&#x22;Delete Device&#x22;,&#x22;scopes&#x22;:[&#x22;write:device&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_sessions&#x22;,&#x22;label&#x22;:&#x22;List Sessions&#x22;,&#x22;scopes&#x22;:[&#x22;read:session&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_dns_records&#x22;,&#x22;label&#x22;:&#x22;List DNS Records&#x22;,&#x22;scopes&#x22;:[&#x22;read:dns_record&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_dns_record&#x22;,&#x22;label&#x22;:&#x22;Get DNS Record&#x22;,&#x22;scopes&#x22;:[&#x22;read:dns_record&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_dns_record&#x22;,&#x22;label&#x22;:&#x22;Create DNS Record&#x22;,&#x22;scopes&#x22;:[&#x22;write:dns_record&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_dns_record&#x22;,&#x22;label&#x22;:&#x22;Update DNS Record&#x22;,&#x22;scopes&#x22;:[&#x22;write:dns_record&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_dns_record&#x22;,&#x22;label&#x22;:&#x22;Delete DNS Record&#x22;,&#x22;scopes&#x22;:[&#x22;write:dns_record&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_routes&#x22;,&#x22;label&#x22;:&#x22;List Routes&#x22;,&#x22;scopes&#x22;:[&#x22;read:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_route&#x22;,&#x22;label&#x22;:&#x22;Create Route&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_route&#x22;,&#x22;label&#x22;:&#x22;Update Route&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_route&#x22;,&#x22;label&#x22;:&#x22;Delete Route&#x22;,&#x22;scopes&#x22;:[&#x22;write:network&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_access_groups&#x22;,&#x22;label&#x22;:&#x22;List Access Groups&#x22;,&#x22;scopes&#x22;:[&#x22;read:access_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_access_group&#x22;,&#x22;label&#x22;:&#x22;Get Access Group&#x22;,&#x22;scopes&#x22;:[&#x22;read:access_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_access_group&#x22;,&#x22;label&#x22;:&#x22;Create Access Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:access_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_access_group&#x22;,&#x22;label&#x22;:&#x22;Update Access Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:access_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_access_group&#x22;,&#x22;label&#x22;:&#x22;Delete Access Group&#x22;,&#x22;scopes&#x22;:[&#x22;write:access_group&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_location_contexts&#x22;,&#x22;label&#x22;:&#x22;List Location Contexts&#x22;,&#x22;scopes&#x22;:[&#x22;read:location_context&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_get_location_context&#x22;,&#x22;label&#x22;:&#x22;Get Location Context&#x22;,&#x22;scopes&#x22;:[&#x22;read:location_context&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_create_location_context&#x22;,&#x22;label&#x22;:&#x22;Create Location Context&#x22;,&#x22;scopes&#x22;:[&#x22;write:location_context&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_update_location_context&#x22;,&#x22;label&#x22;:&#x22;Update Location Context&#x22;,&#x22;scopes&#x22;:[&#x22;write:location_context&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_delete_location_context&#x22;,&#x22;label&#x22;:&#x22;Delete Location Context&#x22;,&#x22;scopes&#x22;:[&#x22;write:location_context&#x22;]},{&#x22;id&#x22;:&#x22;openvpncloudconnexa_list_vpn_regions&#x22;,&#x22;label&#x22;:&#x22;List VPN Regions&#x22;,&#x22;scopes&#x22;:[&#x22;read:vpn_region&#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>Find your Cloud ID</h2>

  <p>Your Cloud ID is the subdomain of your CloudConnexa tenant and is required to sign in and to fill in the Cloud ID field below.</p>

  <Steps>
    <Step title="Identify your Cloud ID">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Your CloudConnexa Administration Portal URL follows the pattern `https://{cloud-id}.api.openvpn.com/`. The Cloud ID is the subdomain before `.api.openvpn.com`.</p>

        <ul>
          <li>Example: if your URL is `https://acme.api.openvpn.com/`, your Cloud ID is `acme`.</li>
          <li>You can also find it by signing in to the OpenVPN account portal at `https://myaccount.openvpn.com` and copying the Cloud ID shown on your tenant dashboard.</li>
          <li>Do not include `.api.openvpn.com` in the Cloud ID field — enter only the subdomain (e.g., `acme`).</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Create API Credentials</h2>

  <p>CloudConnexa uses OAuth 2.0 with the client\_credentials grant. Create an API credential set in the Administration Portal to get a Client ID and Client Secret.</p>

  <Steps>
    <Step title="Open the Administration Portal">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your CloudConnexa tenant at `https://{your-cloud-id}.api.openvpn.com/` (replace `{your-cloud-id}` with your Cloud ID from the section above).</p>

        <ul>
          <li>Sign in with your OpenVPN account credentials.</li>
          <li>Confirm you have <strong>Owner</strong> role — only Owners can create API credentials.</li>
        </ul>
      </div>
    </Step>

    <Step title="Navigate to API Credentials">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Open <strong>API & Logs</strong> > <strong>API</strong> and click <strong>Create Credentials</strong>.</p>

        <ul>
          <li>In the left sidebar, click <strong>API & Logs</strong>.</li>
          <li>Select <strong>API</strong> from the submenu.</li>
          <li>Click <strong>Create Credentials</strong> to open the credential creation form.</li>
        </ul>
      </div>
    </Step>

    <Step title="Configure the credential set">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fill in the credential creation form with the following settings.</p>

        <ul>
          <li><strong>Name</strong>: A descriptive label for this credential set (e.g., StackOne Integration).</li>
          <li><strong>Lifetime</strong>: Choose how long the credentials remain valid — 2 weeks, 1 month, 6 months, or 1 year.</li>
          <li>(Optional) <strong>IP Subnet Restriction</strong>: Enter allowed source IP ranges to restrict which IPs can use these credentials.</li>
        </ul>
      </div>
    </Step>

    <Step title="Grant Permissions">
      <div data-guide-step data-guide-scopes="read:network,write:network,read:host,write:host,read:user,write:user,read:user_group,write:user_group,read:device,write:device,read:session,read:dns_record,write:dns_record,read:access_group,write:access_group,read:location_context,write:location_context,read:vpn_region" data-guide-display-scopes-list="read:network,write:network,read:host,write:host,read:user,write:user,read:user_group,write:user_group,read:device,write:device,read:session,read:dns_record,write:dns_record,read:access_group,write:access_group,read:location_context,write:location_context,read:vpn_region">
        <div className="connector-guide-actions-badge" data-guide-actions-badge data-guide-actions-badge-scopes="read:network,write:network,read:host,write:host,read:user,write:user,read:user_group,write:user_group,read:device,write:device,read:session,read:dns_record,write:dns_record,read:access_group,write:access_group,read:location_context,write:location_context,read:vpn_region" 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>Activate Host Connector, Activate Network Connector, Activate User, Create Access Group, Create DNS Record, Create Device, Create Host, Create Host Connector, Create Location Context, Create Network, Create Network Connector, Create Route, Create User, Create User Group, Delete Access Group, Delete DNS Record, Delete Device, Delete Host, Delete Host Connector, Delete Location Context, Delete Network, Delete Network Connector, Delete Route, Delete User, Delete User Group, Get Access Group, Get DNS Record, Get Device, Get Host, Get Host Connector, Get Location Context, Get Network, Get Network Connector, Get User, Get User Group, List Access Groups, List DNS Records, List Devices, List Host Connectors, List Hosts, List Location Contexts, List Network Connectors, List Networks, List Routes, List Sessions, List User Groups, List Users, List VPN Regions, Suspend Host Connector, Suspend Network Connector, Suspend User, Update Access Group, Update DNS Record, Update Device, Update Host, Update Host Connector, Update Location Context, Update Network, Update Network Connector, Update Route, Update User, Update User Group</span>
        </div>

        <p>Under the <strong>Permissions</strong> section of the form, each resource has a <strong>Read Only</strong> toggle and (where applicable) a <strong>Modify</strong> toggle. The toggle you enable determines which connector scopes are granted. Enable <strong>Read Only + Modify</strong> on the resources you need (or click <strong>All > Modify</strong> to grant everything in one step). Note: Granting Modify alone is not sufficient — Read Only must also be enabled on the same resource, otherwise GET endpoints return 403.</p>

        <ul>
          <li><strong>Access Group</strong> — Read Only grants `read:access_group`, Modify grants `write:access_group`</li>
          <li><strong>Device</strong> — Read Only grants `read:device`, Modify grants `write:device`</li>
          <li><strong>DNS Record</strong> — Read Only grants `read:dns_record`, Modify grants `write:dns_record`</li>
          <li><strong>Host</strong> — Read Only grants `read:host`, Modify grants `write:host` (covers Host Connectors too)</li>
          <li><strong>Location Context</strong> — Read Only grants `read:location_context`, Modify grants `write:location_context`</li>
          <li><strong>Network</strong> — Read Only grants `read:network`, Modify grants `write:network` (covers Network Connectors and Routes too)</li>
          <li><strong>User</strong> — Read Only grants `read:user`, Modify grants `write:user`</li>
          <li><strong>User Group</strong> — Read Only grants `read:user_group`, Modify grants `write:user_group`</li>
          <li><strong>Region</strong> — Read Only grants `read:vpn_region` (Modify toggle not available for this resource)</li>
          <li><strong>Sessions</strong> — Read Only grants `read:session` (Modify toggle not available for this resource)</li>
        </ul>

        <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="read:network">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:network" title="Copy scope" data-copy="read:network">
                  <span className="connector-guide-scope-copy__label">read:network</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="write:network">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:network" title="Copy scope" data-copy="write:network">
                  <span className="connector-guide-scope-copy__label">write:network</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="read:host">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:host" title="Copy scope" data-copy="read:host">
                  <span className="connector-guide-scope-copy__label">read:host</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="write:host">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:host" title="Copy scope" data-copy="write:host">
                  <span className="connector-guide-scope-copy__label">write:host</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="read:user">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:user" title="Copy scope" data-copy="read:user">
                  <span className="connector-guide-scope-copy__label">read:user</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="write:user">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:user" title="Copy scope" data-copy="write:user">
                  <span className="connector-guide-scope-copy__label">write:user</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="read:user_group">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:user_group" title="Copy scope" data-copy="read:user_group">
                  <span className="connector-guide-scope-copy__label">read:user\_group</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="write:user_group">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:user_group" title="Copy scope" data-copy="write:user_group">
                  <span className="connector-guide-scope-copy__label">write:user\_group</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="read:device">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:device" title="Copy scope" data-copy="read:device">
                  <span className="connector-guide-scope-copy__label">read:device</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="write:device">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:device" title="Copy scope" data-copy="write:device">
                  <span className="connector-guide-scope-copy__label">write:device</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="read:session">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:session" title="Copy scope" data-copy="read:session">
                  <span className="connector-guide-scope-copy__label">read:session</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="read:dns_record">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:dns_record" title="Copy scope" data-copy="read:dns_record">
                  <span className="connector-guide-scope-copy__label">read:dns\_record</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="write:dns_record">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:dns_record" title="Copy scope" data-copy="write:dns_record">
                  <span className="connector-guide-scope-copy__label">write:dns\_record</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="read:access_group">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:access_group" title="Copy scope" data-copy="read:access_group">
                  <span className="connector-guide-scope-copy__label">read:access\_group</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="write:access_group">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:access_group" title="Copy scope" data-copy="write:access_group">
                  <span className="connector-guide-scope-copy__label">write:access\_group</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="read:location_context">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:location_context" title="Copy scope" data-copy="read:location_context">
                  <span className="connector-guide-scope-copy__label">read:location\_context</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="write:location_context">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy write:location_context" title="Copy scope" data-copy="write:location_context">
                  <span className="connector-guide-scope-copy__label">write:location\_context</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="read:vpn_region">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy read:vpn_region" title="Copy scope" data-copy="read:vpn_region">
                  <span className="connector-guide-scope-copy__label">read:vpn\_region</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>

    <Step title="Save and copy the credentials">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Create</strong> to generate the credential set, then immediately copy both values.</p>

        <ul>
          <li>Copy the <strong>Client ID</strong> and paste it into the Client ID field below.</li>
          <li>Copy the <strong>Client Secret</strong> and paste it into the Client Secret field below.</li>
          <li>The Client Secret is shown only once — it cannot be retrieved after you leave this page. Store it securely.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable API access">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Credentials do not work until API access is explicitly turned on.</p>

        <ul>
          <li>Return to <strong>API & Logs</strong> > <strong>API</strong>.</li>
          <li>Locate the credential set you just created.</li>
          <li>Click the <strong>Enable API</strong> toggle to activate it — the toggle must show as enabled (green) before the OAuth token endpoint will accept requests.</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="/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>Cloud ID</strong></li>
        <li><strong>Client ID</strong></li>
        <li><strong>Client Secret</strong></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>
