Data: every reading names when, how and what it cost
Every reading your agents take of the market, with where it came from, when, and what it cost.
- Deepens
- Dataset, Dataset API, Market data, Enrichment
- Calls
- 25
- Events
- One per call
- First call
Organization.count
How many US property managers with 20 to 200 staff are there? Spend nothing.
curl -X POST "https: //api.sb/ leaseline.app/ organizations/ count? mode= try" \
-H "Authorization: Bearer $SB_TOKEN" \
-H "Content-Type: application/ json" \
-d '{"where": {"industries": ["property management"], "headcount": {"min": 20, "max": 200}, "countries": ["US"]}, "maxCost": 0}'
npx startup-builder do Organization.count --try --data '{"where": {"industries": ["property management"], "headcount": {"min": 20, "max": 200}, "countries": ["US"]}, "maxCost": 0}'
{
"name": "do",
"arguments": {
"mode": "try",
"code": "return await $.Organization.count({ where: { industries: ['property management'], headcount: { min: 20, max: 200 }, countries: ['US'] }, maxCost: 0 })"
}
}
import { $ } from 'startup-builder'
const result = await $.try.Organization.count({ where: { industries: ['property management'], headcount: { min: 20, max: 200 }, countries: ['US'] }, maxCost: 0 })
{
"count": 4180,
"ignored": [],
"observedAt": "2026-10-27T14: 02: 11Z",
"method": "estimated"
}
The reference for every call on this page is the Data API.
Every reading names when, how and what it cost
Data is what your agents read about the market: companies, people, search terms, AI answers, links, rivals' ads and posts. Every reading comes back in one envelope, whichever Source answered.
observedAt says when the market was read, not when the row was written. method says how: sampled is a live read, estimated is modeled from an index, and reported comes from your own account.
null means unknown, never zero. A long-tail term with no measured volume reads searches:. Every call emits one Event, so a Trigger can fire on it unchanged.
type Observed = {
observedAt: string // when the market was read
method: 'sampled' | 'estimated' | 'reported'
venue?: string // 'google-search', 'chatgpt', 'reddit'
locale?: string // 'en-US'
}
type Cost = { usd: number; maxUsd: number; units: number; misses: number }Types lists every shared field and what its null means.
Verified means two checks, both on the record. The address is at the right company: its domain is the account's own domain, after redirects, so an address at a former employer or a parent company never counts. And the mailbox checks deliverable. An address that fails the first check is found again from the person's current profile, never sent to.
Your agents read search, outreach, social and ads
Each row is a question a founder asks, and the calls that answer it. Every call is one abstract API under one name, whichever source sits behind it.
The readings cover the whole funnel. Rankings and AI answers feed search, people feed outreach, posts and creators feed social, and rivals' ads feed paid.
| What | Calls | What comes back | Reference |
|---|---|---|---|
| Companies that fit | Organization.count, Organization.find, Organization.enrich | A free count, then rows with fit and the quoted evidence, then headcount, funding, technology and hiring | Organizations |
| People and work emails | Prospect.find, ContactPoint.findEmail, ContactPoint.verifyEmail | Names and titles at the companies you approved, then a verified work email: at the account’s own domain, and checked deliverable | People |
| Search demand | Keyword.find, Keyword.measure, Keyword.forecast | Ideas, then volume, cost per click, difficulty from 0 to 100, intent and trend, then what ads on a term cost | Keywords |
| Rankings | Keyword.search | The top results on Google Search or Bing, your own position, and the questions people also ask | Keywords |
| AI answers | Keyword.ask | The answer on ChatGPT, Gemini, Perplexity, Claude or Google AI Overviews, the brands it names and the pages it cites | Keywords |
| Links and authority | Domain.benchmark, Domain.findLinks, Domain.findCompetitors | Authority beside your rivals, the sites that link to them and not to you, and who competes for your terms | Domains |
| Index state and page health | Domain.verify, Page.audit, Site.audit | Which key pages Google Search and Bing hold, and what a page or a whole site gets wrong | Pages and sites |
| Rivals’ ads | Ad.find | Ads running on Facebook, Instagram, Google Search, LinkedIn and TikTok, with first and last seen | Ads |
| Posts and creators | Keyword.search, Prospect.find | Problem posts on Reddit, X and Hacker News, creators by audience, and the people who engaged with a LinkedIn post | People |
| Buying triggers | Monitor.create, Monitor.check | A dated Event when a company raises, hires for a role or loses a buyer, and when a rank or an answer moves | Monitors |
Count free, then pay only for results
Counting is free. Organization.count and Prospect.count cost nothing, and every find takes the same filters, so you size a market before you buy one row.
You pay per unit returned, never per row requested. A lookup that finds nothing is free wherever the route allows, and a check that ends catch-all or unknown costs nothing.
maxCost caps every call. A call that would cross it is refused before anything is spent, or it stops early with complete:. Reads through your own Search Console or ad account cost $0 and say method:.
Market readings are shared; people readings are not
Pass maxAge, and a stored reading younger than it comes back at no charge. Volume, difficulty, results pages and authority are shared across every startup that reads the same subject and locale.
Readings about people are never shared. Each startup pays for its own prospect rows, and every Suppression is read before a lookup on a person.
When a source fails, the call does not
Each call has ranked Mappings, one per Source. On a 429, a 5xx or a timeout, the platform tries the next route and reports route:. No source name ever appears in a response.
A 4xx is never retried elsewhere, because it means the input is wrong. When every route is out of capacity, the call refuses with sources-busy and spends nothing.
A filter a route cannot apply is listed in ignored, never dropped. Pass strict: to be refused instead. Filter coverage gives the measured rate for each filter.
A first pass reads companies, people and search
Free counts come first, then the rows, the checks and the readings, each at its own price.
| Step | Call | Cost |
|---|---|---|
| How many property managers fit | Organization.count | Free |
| 100 that fit a sentence, with the evidence quoted | Organization.find | About 20¢ |
| The person to write to at each | Prospect.find | About 5¢ |
| 100 work emails found at the right company | ContactPoint.findEmail | About 45¢ |
| Each one checked deliverable | ContactPoint.verifyEmail | About 18¢ |
| 500 search terms measured | Keyword.measure | About 90¢ |
| 30 results pages read | Keyword.search | About 0.9¢ |
| 20 buying questions on 4 answer engines | Keyword.ask | About 32¢ |
| The 550 sites that link to 3 rivals, compared with yours | Domain.findLinks | About 11¢ |
| In all | About $2.22 |
Watch a reading, and act when it changes
A Monitor re-runs a Data call on a schedule and records an Event only on the change you name. The changes are a rank move, a new answer citation, a funding round, a hiring post, a lost link and a new rival ad.
A Workflow can start on that Event. Scheduling is free, and each run costs what its call costs.
await $.try.Monitor.create({ verb: 'Keyword.ask', input: { keyword: 'rent ledger template' }, change: 'answer-citation', every: '1w' })