Worker URL that proxies the upstream X data API with CORS headers. Required for browser use — the upstream doesn't send CORS headers, so direct browser calls always fail with "Failed to fetch". The worker holds the upstream key server-side. Deploy in 5 min — paste pulse-proxy.worker.js into a new Worker and set TAPI_KEY as a secret.
Only needed if you skip the worker proxy and call the upstream directly (which only works server-side or same-origin — browsers will hit CORS). Stored locally at kc_pulse_apikey.
How long each module reuses its last result before re-fetching. Longer = cheaper. Per-module ↻ always re-fetches regardless. Keyword-mode and KOL-mode caches are independent — toggling Source preserves both result sets.
The upstream's free tier is 1 request per 5 seconds; paid tiers scale up to 200 QPS. Pulse funnels every API call through a single rate-limited queue so a parallel-looking scan stays under the limit. The rate limit interacts with Scan depth (in keyword mode) or Batches per scan (in KOL-list mode) — at depth or batch count N, every Refresh All makes 2N calls (narrative + voices). On free tier with Deep depth that's ~2 minutes per scan; on a paid 5ms tier the same scan completes in well under a second.
Pulse splits the active window into N equal-width sub-slices and concatenates the results, deduped by tweet ID. Quick is the fastest 1-call behavior; Standard doubles the floor for sentiment stability; Deep (recommended) gives near-complete coverage of a 1h or 4h window; Full targets 24h windows where chatter is heavily concentrated in spikes. Trends always stays a single call regardless of depth. In KOL-list mode this setting is ignored — depth slicing is replaced by handle batching (configured in the KOL list tab).
Depth is independent of the operator cap. Each slice is its own request and gets its own ~23-operator budget — splitting the window into more slices doesn't magnify the cap concern, only the number of requests. The cap only tightens around the per-call query (your keyword/preset block + window/lang/tier filters), which is governed by the keyword input below.
Moved to the Filters popover in the top control bar. Click the filter trigger (e.g. Verified+ · 24h · EN ▼), and the Keywords row at the bottom holds the preset chips and custom-query input. They show only when Source = Keywords.
⚠ Operator-count cap. Twitter's web search engine silently truncates queries past ~22-23 operator-units — every cashtag, plain word, quoted phrase, OR/AND, filter:, lang:, since_time:, until_time:, min_followers:, and negative term counts as one unit. Past the cap, requests come back 200 OK with zero tweets and no error, which is the single most confusing failure mode of this module. Each preset solo is sized at ~5 high-signal terms (~12 ops with the standard window/lang/tier tail, the noise tail, and -filter:replies) — so 1-2 presets is comfortably under cap, 3 is the practical limit, and 4+ presets active will start hitting the cap and silently return zero results. If a scan returns 0 tweets across all slices and the empty-state hint says "query too complex," that's this cap.
Curated KOL list
Used when Source = KOL list in the control bar. Pulse weighted-samples a rotating subset each scan; recently active accounts surface more often.
★ Hub mode active — Pulse is scanning 0 handles from your KOL Hub watchlist · live re-read each scan, no manual import. Switch back to All / T1 / T2 / T3 on the Tier control to use the curated list managed below.
Auto-detects handle column · optional weight column · 5MB max
CSV format details
Column auto-detect priority: handle, username, screen_name, account, twitter, or first column. Handles can include @ or not. Optional second column weight (0.1–5.0) pre-ranks the rotation. Plain TXT files (one handle per line) are also accepted. Duplicates are silently skipped (case-insensitive). Existing list is extended, not replaced — use Clear all first if you want a fresh import.
Sampling
Coverage preset
~300 handles / scan · full cycle ~62 scans
Weighted rotation
Active accounts surface ~5× more often. Off = uniform random. Disabled in Full mode (every handle is scanned anyway).
Top 8 handles by weight
No handles yet — import a CSV or paste a list above
Diagnostic fires one batch end-to-end with verbose console logging — use when modules show 0 tweets and you need to see whether the proxy, query, or response shape is at fault. Clear buttons drop stored data without losing your settings; each is non-destructive to settings, watchlist, KOL list, and API key.
Show cost diagnostics
Surfaces a compact est · today · wk spend pill in the page header for tuning rate limits and scan depth. Tracking runs regardless — this only controls visibility.
$—
—
No data yet — click a ticker on Pulse
Pulse watchlist
Watched terms are pinned in every scan even if they fall below the volume cutoff — they\'ll surface on Heatmap, Velocity, Sentiment, and the per-ticker drill-down. Right-click any cashtag on the Heatmap or Emerging module to add it here.
Custom date range
Times are interpreted in your local timezone. Range must be at least 5 minutes wide and start no more than 30 days in the past — Twitter's archive thins past 7 days on most plans.