🔑 Delegate Access

Account Management src
240 lines by @nichxbt

Delegate Access — by nichxbt

How to Use

  1. Go to https://x.com
  2. Open Developer Console (F12)
  3. Edit CONFIG below if needed
  4. Paste this script and press Enter

Configuration Options

OptionDefaultDescription
autoNavigatetrueNavigate to delegate settings automatically
scanDelegatestrueList current delegates
showPermissionsInfotrueDisplay permissions reference
delayBetweenActions2000ms between UI actions
scrollDelay1500ms between scroll actions

Default Configuration

const CONFIG = {
    autoNavigate: true,              // Navigate to delegate settings automatically
    scanDelegates: true,             // List current delegates
    showPermissionsInfo: true,       // Display permissions reference
    delayBetweenActions: 2000,       // ms between UI actions
    scrollDelay: 1500,               // ms between scroll actions
  };

Full Script

Copy and paste this entire script into your browser DevTools console on x.com.

// Delegate Access — by nichxbt
// https://github.com/nirholas/XActions
// Manage delegate access for your account: add/remove delegates and configure permissions.
//
// HOW TO USE:
// 1. Go to https://x.com
// 2. Open Developer Console (F12)
// 3. Edit CONFIG below if needed
// 4. Paste this script and press Enter
//
// Last Updated: 30 March 2026

(() => {
  'use strict';

  const CONFIG = {
    autoNavigate: true,              // Navigate to delegate settings automatically
    scanDelegates: true,             // List current delegates
    showPermissionsInfo: true,       // Display permissions reference
    delayBetweenActions: 2000,       // ms between UI actions
    scrollDelay: 1500,               // ms between scroll actions
  };

  const sleep = (ms) => new Promise(r => setTimeout(r, ms));
  const STORAGE_KEY = 'xactions_delegates';

  const SELECTORS = {
    delegateSettings: 'a[href="/settings/delegate"]',
    addDelegate: '[data-testid="addDelegate"]',
    delegatePermissions: '[data-testid="delegatePermissions"]',
    primaryColumn: '[data-testid="primaryColumn"]',
    userCell: '[data-testid="UserCell"]',
    confirmButton: '[data-testid="confirmationSheetConfirm"]',
    searchInput: '[data-testid="SearchBox_Search_Input"]',
  };

  const PERMISSION_TYPES = {
    post: {
      name: 'Post',
      icon: '✍️',
      description: 'Create, edit, and delete posts on your behalf',
    },
    directMessages: {
      name: 'Direct Messages',
      icon: '✉️',
      description: 'Read and send DMs on your behalf',
    },
    likes: {
      name: 'Likes',
      icon: '❤️',
      description: 'Like and unlike posts on your behalf',
    },
    follows: {
      name: 'Follows',
      icon: '👥',
      description: 'Follow and unfollow accounts on your behalf',
    },
    lists: {
      name: 'Lists',
      icon: '📋',
      description: 'Create and manage lists on your behalf',
    },
    spaces: {
      name: 'Spaces',
      icon: '🎙️',
      description: 'Create and manage Spaces on your behalf',
    },
    analytics: {
      name: 'Analytics',
      icon: '📊',
      description: 'View account analytics',
    },
    profile: {
      name: 'Profile',
      icon: '👤',
      description: 'Edit profile information',
    },
  };

  const showPermissionsInfo = () => {
    console.log('\n══════════════════════════════════════════════════');
    console.log('🔑 DELEGATE PERMISSIONS REFERENCE');
    console.log('══════════════════════════════════════════════════\n');

    for (const [key, perm] of Object.entries(PERMISSION_TYPES)) {
      console.log(`   ${perm.icon} ${perm.name}`);
      console.log(`      ${perm.description}`);
    }

    console.log('\n💡 Tips:');
    console.log('   • Delegates can act on your behalf without your password');
    console.log('   • You can revoke access at any time');
    console.log('   • Grant minimum necessary permissions (principle of least privilege)');
    console.log('   • Delegate feature requires X Premium');
    console.log('   • Delegates cannot change account settings or password');
    console.log('══════════════════════════════════════════════════\n');
  };

  const navigateToDelegateSettings = async () => {
    console.log('🚀 Navigating to delegate settings...');

    const delegateLink = document.querySelector(SELECTORS.delegateSettings);

    if (delegateLink) {
      delegateLink.click();
      console.log('✅ Clicked delegate settings link.');
      await sleep(CONFIG.delayBetweenActions);
    } else {
      console.log('⚠️ Delegate settings link not found. Navigating directly...');
      window.location.href = 'https://x.com/settings/delegate';
      await sleep(CONFIG.delayBetweenActions * 2);
    }

    await sleep(CONFIG.delayBetweenActions);

    const primaryColumn = document.querySelector(SELECTORS.primaryColumn);
    if (primaryColumn) {
      const text = primaryColumn.textContent;
      if (text.includes('Delegate') || text.includes('delegate')) {
        console.log('✅ Delegate settings page loaded.');
      } else {
        console.log('ℹ️ Page loaded, checking content...');
      }
    }
  };

  const scanCurrentDelegates = async () => {
    console.log('👥 Scanning current delegates...');

    const delegates = [];
    const userCells = document.querySelectorAll(SELECTORS.userCell);

    userCells.forEach(cell => {
      const usernameEl = cell.querySelector('a[href^="/"]');
      const displayNameEl = cell.querySelector('[dir="ltr"] span');
      const permissionsEl = cell.querySelector(SELECTORS.delegatePermissions)
        || cell.querySelector('[class*="permission"]');

      if (usernameEl) {
        const href = usernameEl.getAttribute('href');
        const username = href.replace('/', '').split('/')[0];
        const displayName = displayNameEl?.textContent?.trim() || username;
        const permissions = permissionsEl?.textContent?.trim() || 'Unknown permissions';

        if (username && !username.includes('/') && !username.includes('settings')) {
          delegates.push({ username, displayName, permissions });
        }
      }
    });

    // Also look for delegate entries in non-UserCell layouts
    const delegateEntries = document.querySelectorAll('[data-testid*="delegate"], [class*="delegate-item"]');
    delegateEntries.forEach(entry => {
      const text = entry.textContent.trim();
      if (text && !delegates.find(d => text.includes(d.username))) {
        delegates.push({ username: 'Unknown', displayName: text.substring(0, 50), permissions: 'See settings' });
      }
    });

    if (delegates.length > 0) {
      console.log(`\n📋 Current Delegates (${delegates.length}):`);
      console.log('─'.repeat(50));
      delegates.forEach((d, i) => {
        console.log(`   ${i + 1}. @${d.username} (${d.displayName})`);
        console.log(`      Permissions: ${d.permissions}`);
      });

      try {
        sessionStorage.setItem(STORAGE_KEY, JSON.stringify({
          scannedAt: new Date().toISOString(),
          delegates,
        }));
        console.log('\n💾 Delegate list saved to sessionStorage.');
      } catch (e) {
        // Silent fail
      }
    } else {
      console.log('ℹ️ No delegates found. Your account has no delegates configured.');
      console.log('💡 Click "Add delegate" to invite someone to manage your account.');
    }

    return delegates;
  };

  const showAddDelegateInstructions = () => {
    console.log('\n══════════════════════════════════════════════════');
    console.log('➕ HOW TO ADD A DELEGATE');
    console.log('══════════════════════════════════════════════════\n');
    console.log('   1. Click "Add delegate" or "Invite" button');
    console.log('   2. Search for the user by username');
    console.log('   3. Select the permissions you want to grant');
    console.log('   4. Confirm the invitation');
    console.log('   5. The invited user must accept the delegation');
    console.log('');
    console.log('   ⚠️ Security reminders:');
    console.log('   • Only delegate to people you trust');
    console.log('   • Review delegate activity regularly');
    console.log('   • Revoke access immediately if compromised');
    console.log('══════════════════════════════════════════════════\n');

    const addBtn = document.querySelector(SELECTORS.addDelegate)
      || document.querySelector('button[aria-label*="Add"]')
      || document.querySelector('a[href*="delegate/add"]');

    if (addBtn) {
      console.log('✅ "Add delegate" button found on page.');
    } else {
      console.log('ℹ️ "Add delegate" button not found — make sure you are on the delegate settings page.');
    }
  };

  const run = async () => {
    console.log('═══════════════════════════════════════════');
    console.log('🔑 XActions — Delegate Access');
    console.log('═══════════════════════════════════════════\n');

    if (CONFIG.showPermissionsInfo) {
      showPermissionsInfo();
      await sleep(1000);
    }

    if (CONFIG.autoNavigate) {
      await navigateToDelegateSettings();
      await sleep(1000);
    }

    if (CONFIG.scanDelegates) {
      await scanCurrentDelegates();
      await sleep(1000);
    }

    showAddDelegateInstructions();

    console.log('\n✅ Delegate Access script complete.');
    console.log('💡 Manage delegates: https://x.com/settings/delegate');
  };

  run();
})();

⚡ More XActions Scripts

Browse 300+ free browser scripts for X/Twitter automation. No API keys, no fees.

Browse All Scripts