jackwener/OpenCLI · info · EmptyResultError

No owned or subscribed lists found

Error message

No owned or subscribed lists found

What it means

EmptyResultError thrown when the Twitter lists payload was valid (shape check passed) but parseListsManagement extracted zero owned or subscribed lists. This is a semantic 'no data' signal rather than a malfunction: the account genuinely has no lists, or lists exist but were filtered out (e.g. the seen-set dedupe or pagination captured nothing).

Source

Thrown at clis/twitter/lists.js:174

            'X-Csrf-Token': ct0,
            'X-Twitter-Auth-Type': 'OAuth2Session',
            'X-Twitter-Active-User': 'yes',
        });
        const apiUrl = buildUrl(queryId);
        const data = await page.evaluate(`async () => {
            const r = await fetch(${JSON.stringify(apiUrl)}, { headers: ${headers}, credentials: 'include' });
            return r.ok ? await r.json() : { error: r.status };
        }`);
        if (data?.error) {
            throw new CommandExecutionError(describeTwitterApiError('ListsManagementPageTimeline', data.error));
        }
        const seen = new Set();
        if (!getListsManagementInstructions(data)) {
            throw new CommandExecutionError('Twitter lists returned an unexpected payload shape');
        }
        const lists = parseListsManagement(data, seen);
        if (lists.length === 0) {
            throw new EmptyResultError('twitter lists', 'No owned or subscribed lists found');
        }
        return lists.slice(0, limit);
    },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Verify the account actually has lists by visiting https://x.com/<username>/lists in the same browser session.
  2. Create at least one list or subscribe to one, then re-run the command.
  3. Confirm the session is authenticated as the intended account (a different profile may be loaded in the automation browser).
  4. If lists exist but the command still returns empty, capture the raw payload and report a parsing regression to the CLI maintainers.
Defensive patterns

Strategy: try-catch

Validate before calling

const lists = await twitterLists({ limit: 20 }).catch(err =>
  err instanceof EmptyResultError ? [] : Promise.reject(err));
if (lists.length === 0) console.log('Account has no owned/subscribed lists');

Try / catch

try {
  const lists = await twitterLists({ limit });
} catch (err) {
  if (err.name === 'EmptyResultError') {
    console.info('No lists on this account — nothing to do');
    return [];
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling the 'twitter lists' command with an account that owns no lists and subscribes to none, or where the captured payload's list entries are all duplicates/filtered so the parsed array is empty before list.slice(0, limit).

Common situations: New or cleaned-up X accounts with no lists; accounts whose lists are private/hidden in the current session; rate-limited or partially loaded pages where pagination never surfaced list entries.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/8252ab509ab10461. Report an issue: GitHub.