songdata

Method

Cheapest true number first.

Catalogs and per-user dashboards are not in one API. Public charts are estimated. A count is artist-verified only after the artist attests the dashboard on dots.id and a signed-in capture lands.

  1. 01 · Free

    Direct HTML

    Static public charts (kworb Spotify totals, public YouTube views).

    No Firecrawl credit. No vision model. Regex over HTML is enough.

  2. 02 · 1 credit / page

    Firecrawl markdown

    A public page needs JavaScript to render.

    Markdown scrape only. JSON extract (+4 credits) is skipped when a parser can read the page.

  3. 03 · Free HTML first, then a snapshot of the public page

    Public profile screenshots

    Someone opens /artist and that catalog is not indexed yet.

    Songdata goes to Spotify, Apple Music, YouTube, SoundCloud, and kworb — public pages only — and screenshots what is visible. No login. Dashboard vaults stay for attested owners.

  4. 04 · Vercel Sandbox, attested sessions only

    Sandbox Chrome vault

    The artist attested a dashboard and signed into it in Songdata’s remote Chrome.

    Spotify for Artists and Apple Music for Artists do not publish catalog totals. The session is the data. No laptop extension.

  5. 05 · ~$0.06 / 1k images

    Moondream OCR

    A dashboard screenshot exists.

    Ask only for the integer. Do not send analytics UI to a frontier VLM.

Why not a browser extension?

An extension on the artist’s laptop means every artist installs Songdata, keeps it updated, and we scrape from machines we do not control. Loading that same extension into the sandbox Chrome does not log anyone in, and headless Chromium is a weak MV3 host.

The session is the Chromium profile. The artist signs in (including 2FA) in a live view of the sandbox browser. We snapshot that disk. Cron bursts the snapshot and runs a skill per service — clicks we own, then a screenshot, then Moondream.

YouTube is the exception: prefer Google OAuth (YouTube Analytics) when the channel owner connects. Browser vault is fallback.

Skills

Example cron (Spotify)

agent-browser --profile songdata-russ-spotify open https://artists.spotify.com
# skill: if login wall, abort — vault session expired; artist must reconnect
# skill: open Music → Songs
# skill: search the track title
# skill: open the song
# skill: screenshot the streams figure
agent-browser --profile songdata-russ-spotify screenshot captures/songdata-russ-spotify.png
agent-browser --profile songdata-russ-spotify close
# moondream: What is the integer lifetime stream count for this track? Reply with digits only.

Connect a dashboard · Attest · Search russ