Skip to content

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.

Organization.count
You, to your agent

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 })
Response
{
  "count": 4180,
  "ignored": [],
  "observedAt": "2026-10-27T14:02:11Z",
  "method": "estimated"
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

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: null. Every call emits one Event, so a Trigger can fire on it unchanged.

TypeScript
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.

WhatCallsWhat comes backReference
Companies that fitOrganization.count, Organization.find, Organization.enrichA free count, then rows with fit and the quoted evidence, then headcount, funding, technology and hiringOrganizations
People and work emailsProspect.find, ContactPoint.findEmail, ContactPoint.verifyEmailNames and titles at the companies you approved, then a verified work email: at the account’s own domain, and checked deliverablePeople
Search demandKeyword.find, Keyword.measure, Keyword.forecastIdeas, then volume, cost per click, difficulty from 0 to 100, intent and trend, then what ads on a term costKeywords
RankingsKeyword.searchThe top results on Google Search or Bing, your own position, and the questions people also askKeywords
AI answersKeyword.askThe answer on ChatGPT, Gemini, Perplexity, Claude or Google AI Overviews, the brands it names and the pages it citesKeywords
Links and authorityDomain.benchmark, Domain.findLinks, Domain.findCompetitorsAuthority beside your rivals, the sites that link to them and not to you, and who competes for your termsDomains
Index state and page healthDomain.verify, Page.audit, Site.auditWhich key pages Google Search and Bing hold, and what a page or a whole site gets wrongPages and sites
Rivals’ adsAd.findAds running on Facebook, Instagram, Google Search, LinkedIn and TikTok, with first and last seenAds
Posts and creatorsKeyword.search, Prospect.findProblem posts on Reddit, X and Hacker News, creators by audience, and the people who engaged with a LinkedIn postPeople
Buying triggersMonitor.create, Monitor.checkA dated Event when a company raises, hires for a role or loses a buyer, and when a rank or an answer movesMonitors

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: false. Reads through your own Search Console or ad account cost $0 and say method: 'reported'.

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: { tried: 2 }. 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: true 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.

StepCallCost
How many property managers fitOrganization.countFree
100 that fit a sentence, with the evidence quotedOrganization.findAbout 20¢
The person to write to at eachProspect.findAbout 5¢
100 work emails found at the right companyContactPoint.findEmailAbout 45¢
Each one checked deliverableContactPoint.verifyEmailAbout 18¢
500 search terms measuredKeyword.measureAbout 90¢
30 results pages readKeyword.searchAbout 0.9¢
20 buying questions on 4 answer enginesKeyword.askAbout 32¢
The 550 sites that link to 3 rivals, compared with yoursDomain.findLinksAbout 11¢
In allAbout $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.

TypeScript
await $.try.Monitor.create({ verb: 'Keyword.ask', input: { keyword: 'rent ledger template' }, change: 'answer-citation', every: '1w' })

    Contents