Thanks for catching this! It's capping at 50 because Sonauto's API only returns the first page for projects and we weren't grabbing the rest. I don’t have a 50+ song library to test it on, but you do. This snippet tells us exactly how their API pages its data so we get the fix right instead of guessing.

It only reads your song list. Changes nothing, sends nothing.

Run it

  1. Open a sonauto.ai tab (signed in). The address bar must say sonauto.ai — this won't work from any other site (well, Treblo lol). Open the console: Ctrl+Shift+J (Windows) / Cmd+Option+J (Mac) or Right Click → Inspect.
  2. Paste this, hit Enter, wait a few seconds:
(async () => {
  const base = location.origin + '/api';
  const out = {};
  const def = await (await fetch(base + '/projects', { credentials: 'include' })).json();
  out.projects_default_count = (def.data || []).length;
  out.projects_response_keys = Object.keys(def);
  out.pagination_tests = {};
  for (const q of ['?limit=200', '?limit=200&offset=50', '?offset=50', '?page=2']) {
    try {
      const r = await (await fetch(base + '/projects' + q, { credentials: 'include' })).json();
      out.pagination_tests[q] = { count: (r.data || []).length, firstId: (r.data || [])[0] && (r.data || [])[0].id };
    } catch (e) { out.pagination_tests[q] = 'ERROR: ' + e.message; }
  }
  let total = 0, maxInOne = 0;
  for (const p of (def.data || [])) {
    try {
      const t = await (await fetch(base + '/editor-tracks?projectId=' + encodeURIComponent(p.id), { credentials: 'include' })).json();
      total += (t.data || []).length;
      maxInOne = Math.max(maxInOne, (t.data || []).length);
    } catch (e) {}
  }
  out.total_tracks_across_projects = total;
  out.max_tracks_in_one_project = maxInOne;
  console.log(JSON.stringify(out, null, 2));
})();
  1. Copy the { ... } it prints (or any red error) and add it in a comment to this page (if you have a Notion account) or email it to me at sunoexplorer@gmail.com.