Two ways to work with us.
Both start free.
The managed program is scoped to your spend — we run the playbook with you, end to end. The self-serve tier below is the taste: the same data and tools, in your own AI agent, priced per result.
We run the playbook with you.
Sourcing, vetting, outreach, negotiation, IOs, payments, draft QA, view guarantees, renewal decisions — our team and our AI, on your program. Pricing is scoped to your spend and what we run for you, so it starts with a conversation, not a rate card.
Work with us →Prove the data to yourself first.
Install free, query the same data we use, place real deals into the pipeline at no charge — credits only when you read data. No subscription, no seats, no minimum. Everything below this line prices this tier.
Install free →The credit, the dollar, and the curve.
$0.0001
One credit is a hundredth of a cent — 100 credits to a cent, 10,000 credits to the dollar. Every result the API returns burns some number of credits, computed server-side and reported in the response envelope.
$10
= 100,000 credits. Top up at app.thoughtleaders.io/billing/cli. No auto-renew unless you explicitly opt in.
100 free
Granted on first login. Enough to run dozens of realistic queries before deciding whether to deposit.
The four ways a command is priced.
Every CLI endpoint falls into one of four models. The full per-command breakdown is in the table further down — this is the shape of it.
Balance, status, auth, schemas — and placing matched deals into the pipeline.
A set cost regardless of rows — running a report, inspecting a recommendation.
Linear in the rows returned — single creator or brand detail lookups.
Lists and raw DB queries. Larger result sets cost progressively more per row.
The volume curve.
List endpoints (tl db pg|es|fb, tl sponsorships, tl uploads, tl snapshots, tl reports, tl comments, tl brands) bill on a curve. The exponent is greater than 1, so cost grows faster than the row count — a 500-row pull costs far more than 50× a 10-row one. That's deliberate: it pushes you toward small, targeted queries.
credits = setup + multiplier × scale × rowsexp
Defaults: setup = 1 · scale = 0.126 · exp = 1.2. multiplier is a per-resource complexity factor — 1.0 for structured lists, 1.4 for raw database access (see the table below).
| Rows returned | Standard ×1.0 | Raw DB ×1.4 |
|---|---|---|
| 1 | 1.13 | 1.18 |
| 10 | 3.00 | 3.80 |
| 100 | 32.61 | 45.31 |
| 500 (LIMIT cap) | 218.74 | 306.68 |
Credits per query. At 10,000 credits to the dollar, a 500-row raw query (218.74 credits) costs about 2¢.
Every command. Every multiplier.
Live values come from cli/utils/metering.py:CREDIT_RATES. Run tl describe --json locally to dump the table the running server is using.
| Command | List | Detail | Other modes |
|---|---|---|---|
| RAW DATABASE — write your own SELECT | |||
| tl db pg | curve · ×1.4 | — | SELECT-only, LIMIT ≤ 500 |
| tl db es | curve · ×1.4 | — | query-type allowlist, one agg |
| tl db fb | curve · ×1.4 | — | single-table, indexed WHERE |
| STRUCTURED LISTS — typed filters, curve-billed | |||
| tl sponsorships | curve · ×1.0 | 2 credits | create: FREE |
| tl uploads | curve · ×1.0 | 2 credits | — |
| tl comments | curve · ×1.0 | FREE | edit: FREE |
| tl snapshots | curve · ×1.2 | 2 credits | Firebolt-backed |
| tl reports | curve · ×1.3 | FREE | run: 3 credits |
| tl brands | curve · ×1.0 | 1 credit | history / similar: see below |
| tl channels | — | 2 credits | history / similar: see below |
| FLAT-RATE LOOKUPS — credits per result, not curve | |||
| tl channels history | — | 5 credits/row | time-series points |
| tl brands history / history-stats | — | 5 credits/row | — |
| tl channels similar / tl brands similar | — | 25 credits/row | vector lookalikes |
| tl recommender top / inspect / similar | — | 25 credits/row | tags: FREE |
| tl edit write | — | 2 credits | per write |
| PIPELINE WRITES — always free | |||
| tl sponsorships create | FREE — places a real matched deal into the TL pipeline | ||
| tl matches / proposals create | FREE | ||
| SYSTEM & DISCOVERY — always free | |||
| tl describe | FREE — live schema, filters, credit rates | ||
| tl schema pg / es / fb | FREE — every table, every column | ||
| tl balance / auth / doctor / whoami | FREE | ||
| tl changelog | FREE — LLM cost amortised by per-version caching | ||
| NL FALLBACK — surcharge on top of the underlying query | |||
| tl ask | +2 credits/row | +2 credits/row | waived with --llm-key |
Every response includes a usage block with the exact credits charged and your balance after. Aggregation queries against ES bill on min(hits.total, 200) rather than the (zero-row) hit list — to keep aggs from being free. Raw tl db pg queries that touch sensitive tables or columns carry extra charges on top of the curve — see below.
Sensitive data costs more.
Raw Postgres queries (tl db pg) pick up two extra charges when they touch the most valuable data — so a casual metadata pull stays cheap, while bulk-extracting outreach emails or demographics is priced like the asset it is. The query plan is analysed before the query runs.
Touching a sensitive table raises the complexity multiplier that scales the whole curve — like paying a higher base rate.
- —
thoughtleaders_channel: +3.0 → multiplier 4.4
Each sensitive column adds a flat charge to every row returned — on top of the curve, once per column.
- — Outreach email: +30 / row
- — Demographic age, device, gender, or location: +20 / row, per column
volume curve: setup + (base + table_extras) × scale × rowsexp flat per row: (Σ column_extras) × rows
| Query focus | Mult. | Per row | 10 rows | 100 rows | 500 rows |
|---|---|---|---|---|---|
| Standard tables (no channel / demographics) | 1.4 | 0 | 3.80 | 45.31 | 306.68 |
| Channel table only (IDs & names) | 4.4 | 0 | 9.79 | 140.26 | 961.70 |
| Channel + 1 demographic column | 4.4 | 20 | 209.79 | 2,140.26 | 10,961.70 |
| Channel + outreach email | 4.4 | 30 | 309.79 | 3,140.26 | 15,961.70 |
| Channel + email + all demographics (worst case) | 4.4 | 110 | 1,109.79 | 11,140.26 | 55,961.70 |
For scale: ~50,000 credits — about $5 — is roughly a day's work on non-sensitive data. Notice how the per-row column charge dominates the moment a sensitive column is included — a 500-row pull of outreach emails is ~16k credits, almost entirely the 30 × 500 flat charge. That's intentional: bulk extraction of sensitive columns scales linearly with the rows you take.
Preview the cost before you run it.
Add --pricing to any tl db pg, tl db fb, or tl db es call. The server runs EXPLAIN only — no SELECT — and returns an upper-bound estimate computed at the query's row ceiling. A dry run is a flat 1 credit, no matter how expensive the real query would be.
$ tl db pg "SELECT * FROM thoughtleaders_channel LIMIT 100" --pricing # EXPLAIN only — no rows read multiplier: 4.4 (channel table +3.0) per-row: 0 upper bound: ~140 credits at LIMIT 100 ✓ dry run · 1 credit
The raw numbers come back with --pricing --json under the pricing_estimate key. Firebolt and Elasticsearch have no per-table or per-column extras, so their estimate is just the volume curve at the row ceiling — LIMIT for Firebolt, size (or the aggregation doc cap) for Elasticsearch. A Firebolt query with no LIMIT reports an unbounded estimate.
A second limit on sensitive pulls.
Credits cap what a single query costs. A separate, optional time-window quota caps how many sensitive rows your organization can pull over a rolling window — independent of how many credits you hold. It applies only to tl db pg queries that read a priced column (outreach email or demographics); anything that touches no expensive column is never counted, and Firebolt and Elasticsearch are never gated.
Set per organization as a window length plus a cap on expensive queries and rows. Leave it blank — as every existing account is — and there's no limit at all.
Hit the query cap and the next expensive query is refused before it runs — billed only the ~1-credit base fee. Nothing is wasted.
Hit the row cap mid-query and the result is trimmed to your remaining allowance — and you're billed only for the rows you actually receive.
The window slides: as old calls age out their allowance frees back up, and the response tells you exactly when to retry. It's orthogonal to credits — hitting either limit stops you, independently of the other. In practice ~96% of expensive queries return 100 rows or fewer, so a typical cap only bites on bulk extraction. A --pricing dry run reads zero rows, so it never consumes quota.
Three habits that cut the bill.
Use LIMIT
Smaller result sets cost dramatically less. The curve is super-linear and the per-row column charge is strictly linear, so halving the rows at least halves the expensive-column part of the bill.
Select only what you need
Don't fetch email or demographic columns unless you must. Dropping one demographic column off a 500-row query saves 20 × 500 = 10,000 credits.
Avoid needless channel joins
Don't join or query thoughtleaders_channel if you only need basic metadata from other tables — that touch alone lifts the multiplier from 1.4 to 4.4.
Plan gates.
Plans aren't paywalls. They're data-scoping rules that determine which fields you see on your deals and which resources you can query. Nobody is blocked from installing the CLI — the CLI just tells you what your plan unlocks.
Media Buying
For brands & advertisers
- — See deal price (your own deals)
- — Never see cost
- — tl deals, tl channels, tl uploads
- — tl deals create
Media Selling
For publishers & creators
- — See deal cost (your own deals)
- — Never see price
- — tl deals, tl channels (your own)
- — tl comments
Intelligence
For agencies & analysts
- — Full tl brands access
- — Full tl channels search
- — Full tl uploads search
- — Competitive data
Research tier
For HBS / MIT academics
- — Firebolt snapshot access
- — Elasticsearch + Postgres
- — Password login (no Google SSO)
- — Approval-gated
FAQ.
Why did one query cost thousands of credits?
Almost certainly a sensitive column. Outreach email adds 30 credits per row and each demographic column adds 20 — so 500 rows of emails is ~15,000 credits before the curve. Drop the column, add a tighter LIMIT, or run --pricing first to see the upper bound for 1 credit.
How much does an exploratory session cost?
A typical "vet one channel" session is under 30 credits. Install + login is zero. The first 100 credits are on us when you sign up, which is enough to run dozens of real queries before deciding whether to deposit.
What if I run out mid-session?
The CLI warns you before your balance drops below 500 credits. If you hit zero, the next query returns a 402 and the post-exec hook surfaces a deposit link. Nothing fails silently.
Why pay-per-result instead of subscription?
Subscription pricing punishes people who don't know how much they'll use. Pay-per-query punishes exploration. Pay-per-result only charges when you got something worth paying for. It's the only model that aligns with how agents actually work.
Is there a free tier?
Install is free. tl describe, tl auth, tl balance, tl doctor, tl comments, and tl deals create are all free forever. You can navigate the whole system, book real deals, and never spend a credit.
Are there volume discounts?
Yes — for data partners and agencies querying at scale. Email partnerships@thoughtleaders.io.