URL: /code/data · Id: `page:/code/data`

# Data API

> Every market reading your agents take (companies, people, search terms, rankings, links, AI answers, ads) as 25 calls on one key, priced per result.

Every market reading your agents take (companies, people, search terms, rankings, links, AI answers, ads) as 25 calls on one key, priced per result.

- **Calls:** 25
- **Noun groups:** 7
- **Shared types:** [9](/code/data/types)

```text title="Run it · Ask"
How many US property managers with 20 to 200 staff are there? Spend nothing.
```

```ts title="Run it · SDK"
import { $ } from 'startup-builder'

const result = await $.try.Organization.count({ where: { industries: ['property management'], headcount: { min: 20, max: 200 }, countries: ['US'] }, maxCost: 0 })
```

```json title="Run it · Response"
{
  "count": 4180,
  "ignored": [],
  "observedAt": "2026-10-27T14:02:11Z",
  "method": "estimated"
}
```

A Data Verb reads the market and returns a reading. A Software Verb changes your records and emits an Event.

The overview, in a founder's words: [Data: every reading names when, how and what it cost](/capabilities/data).

## A first pass costs about $3
Size the market, list the companies that fit with the quote that shows why, find the person at each and check their address, measure 500 search terms, read 30 results pages, ask four answer engines 20 buying questions, and diff three rivals’ links. Each line is priced from its call’s own record, so the total moves when a price does. One live run found and checked 50 heads of operations at US property managers for 29¢.

| Step | Call | Cost |
| --- | --- | --- |
| How many property managers fit | [`Organization.count`](/code/data/organizations/count) | Free |
| 100 that fit, each with the quote that shows why | [`Organization.find`](/code/data/organizations/find) | About 20¢ |
| What happened lately at each of them | [`Organization.enrich`](/code/data/organizations/enrich) | About $1.00 |
| The person to write to at each | [`Prospect.find`](/code/data/people/find) | About 5¢ |
| 100 work emails, found and checked | [`Prospect.verify`](/code/data/people/verify) | About 60¢ |
| 500 search terms measured | [`Keyword.measure`](/code/data/keywords/measure) | About 90¢ |
| 30 results pages read | [`Keyword.search`](/code/data/keywords/search) | About 0.9¢ |
| 20 buying questions on 4 answer engines | [`Keyword.ask`](/code/data/keywords/ask) | About 32¢ |
| The sites linking to 3 rivals and not to you | [`Domain.findLinks`](/code/data/domains/find-links) | About 12¢ |
| **In all** | None. | **About $3.20** |

## Each call answers one question a founder asks
One call returns one shape, so each has one price unit, one schema and one MCP tool an agent can call without reading the docs twice. The success rate is the measured share of calls that returned an answer, with its sample; a documented Workflow’s is the product of its steps’.

| Verb | The question it answers | Unit price | Works | Jobs |
| --- | --- | --- | --- | --- |
| [`Ad.find`](/code/data/ads/find) | Which ads are my rivals paying to keep running? | About 0.2¢ a search | 99.9% of 309,000 | [A rival’s ads on Facebook and Instagram](/code/data/ads/find#meta), [Every ad on a phrase](/code/data/ads/find#keyword), [A rival’s Google ads](/code/data/ads/find#google), [A rival’s LinkedIn ads](/code/data/ads/find#linkedin), [TikTok ads on a phrase](/code/data/ads/find#tiktok), [How many ads, with no rows](/code/data/ads/find#count), [A rival’s past search ad copy](/code/data/ads/find#history) |
| [`Domain.benchmark`](/code/data/domains/benchmark) | How strong is my domain next to my rivals’? | About 0.75¢ a domain | 100% of 12,396 | [Authority, page authority and spam score](/code/data/domains/benchmark#authority), [Estimated traffic and ranking terms](/code/data/domains/benchmark#traffic), [Referring domains and backlink totals](/code/data/domains/benchmark#links), [Monthly search ad budget](/code/data/domains/benchmark#ad-budget) |
| [`Domain.findCompetitors`](/code/data/domains/find-competitors) | Who am I actually up against in search? | About 5¢ per 100 rows | 100% of 2,639 | [Who ranks for your terms](/code/data/domains/find-competitors#organic), [Who buys ads on your terms](/code/data/domains/find-competitors#paid) |
| [`Domain.findLinks`](/code/data/domains/find-links) | Who links to my rivals and not to me? | About 2¢ per 100 links | 100% of 3,967 | [Every link, with its anchor and follow status](/code/data/domains/find-links#links), [The sites that link](/code/data/domains/find-links#sites), [Sites linking to your rivals and not to you](/code/data/domains/find-links#gap), [Anchor text, counted](/code/data/domains/find-links#anchors), [Links gained and lost by month](/code/data/domains/find-links#changes), [Is a link you earned still live](/code/data/domains/find-links#live) |
| [`Domain.verify`](/code/data/domains/verify) | Do search engines know my site, and is each key page indexed? | Free | 99.8% of 45,746 | None. |
| [`Keyword.ask`](/code/data/keywords/ask) | Do AI answers name me, and which pages do they cite? | About 0.4¢ an answer | 99.96% of 131,093 | [An answer from ChatGPT](/code/data/keywords/ask#chatgpt), [An answer from Gemini](/code/data/keywords/ask#gemini), [An answer from Perplexity](/code/data/keywords/ask#perplexity), [An answer from Copilot](/code/data/keywords/ask#copilot), [An answer from Claude](/code/data/keywords/ask#claude), [An answer from Google AI Mode](/code/data/keywords/ask#google-ai-mode) |
| [`Keyword.find`](/code/data/keywords/find) | Which search terms should my pages target? | About 5¢ per 100 ideas | 100% of 16,219 | [Ideas around your seed words](/code/data/keywords/find#ideas), [How people finish your words in the search box](/code/data/keywords/find#suggestions), [The questions buyers type](/code/data/keywords/find#questions), [The terms a rival ranks for](/code/data/keywords/find#rival), [The terms a rival pays for](/code/data/keywords/find#rival-paid), [What is rising on a site now](/code/data/keywords/find#trending) |
| [`Keyword.forecast`](/code/data/keywords/forecast) | What would a month of ads on these terms cost, and how many clicks would it buy? | About 9¢ a forecast | 100% of 97 | None. |
| [`Keyword.measure`](/code/data/keywords/measure) | How many people search this term, what does a click cost, and how hard is page one? | About 18¢ per 100 terms | 99.94% of 7,106 | [All five measures in one row](/code/data/keywords/measure#all), [Monthly searches and cost per click](/code/data/keywords/measure#volume), [Difficulty, for up to 1,000 terms at once](/code/data/keywords/measure#difficulty), [Intent, for up to 1,000 terms at once](/code/data/keywords/measure#intent), [The 12-month trend](/code/data/keywords/measure#trend), [How often the term is asked of AI tools](/code/data/keywords/measure#ai-searches), [The same measures on Bing](/code/data/keywords/measure#bing) |
| [`Keyword.search`](/code/data/keywords/search) | Who shows up when my buyer searches this, and where am I? | About 3¢ per 100 searches | 99.1% of 1,710,120 | [Google results and your rank](/code/data/keywords/search#results), [Bing results](/code/data/keywords/search#bing), [Local results around a place](/code/data/keywords/search#local), [News results](/code/data/keywords/search#news), [Posts on Reddit](/code/data/keywords/search#reddit), [Posts on X](/code/data/keywords/search#x), [Posts on Hacker News](/code/data/keywords/search#hacker-news), [Posts on LinkedIn](/code/data/keywords/search#linkedin), [Posts on YouTube](/code/data/keywords/search#youtube), [Posts on TikTok](/code/data/keywords/search#tiktok), [Posts on Stack Overflow](/code/data/keywords/search#stack-overflow), [Issues on one GitHub repository that use the term](/code/data/keywords/search#github) |
| [`Monitor.check`](/code/data/monitors/check) | Has it changed since the last run? | Free | 99.6% of 2,079,088 | None. |
| [`Monitor.create`](/code/data/monitors/create) | Can my agents tell me when something I care about changes? | Free | 99.2% of 2,079,088 | [Rank tracking, daily](/code/data/monitors/create#rank), [AI answer watch, weekly, 3 runs on 4 engines](/code/data/monitors/create#answers), [Buying triggers on an account, weekly](/code/data/monitors/create#triggers), [A page changes, daily](/code/data/monitors/create#page-change), [Problem posts on a site, daily](/code/data/monitors/create#posts), [Lost links, weekly](/code/data/monitors/create#links), [Index state of key pages, daily](/code/data/monitors/create#index) |
| [`Organization.count`](/code/data/organizations/count) | How many companies match my customer? | Free | 100% of 171,792 | None. |
| [`Organization.enrich`](/code/data/organizations/enrich) | What is this company, what does it run, and what happened there lately? | About 20¢ per 100 companies | 99.98% of 569,418 | [Company profile](/code/data/organizations/enrich#profile), [The products a company runs](/code/data/organizations/enrich#technologies), [Headcount and its trend](/code/data/organizations/enrich#headcount), [Open roles](/code/data/organizations/enrich#hiring), [What happened there lately](/code/data/organizations/enrich#events) |
| [`Organization.find`](/code/data/organizations/find) | Which companies fit my customer, best first? | About 3.8¢ per 100 rows | 100% of 185,187 | [Companies that fit your filters](/code/data/organizations/find#fit), [Companies that fit a sentence](/code/data/organizations/find#question), [Companies like ones you already have](/code/data/organizations/find#lookalikes), [Companies that run a product](/code/data/organizations/find#technologies), [Companies that raised this month](/code/data/organizations/find#raised), [Companies hiring for a role](/code/data/organizations/find#hiring), [Local businesses near a place](/code/data/organizations/find#local) |
| [`Organization.resolve`](/code/data/organizations/resolve) | Which company is behind this visit, address or name? | Free | 99.97% of 419,320 | [The company behind a visit](/code/data/organizations/resolve#visitor), [The company behind an email address](/code/data/organizations/resolve#email), [The company behind a name](/code/data/organizations/resolve#name) |
| [`Page.audit`](/code/data/pages-and-sites/audit-page) | Will search engines and AI crawlers read this page the way I meant? | About 2¢ per 100 pages | 100% of 14,847 | [The page as served](/code/data/pages-and-sites/audit-page#plain), [The page after its scripts run](/code/data/pages-and-sites/audit-page#scripts), [Fully rendered, with Core Web Vitals](/code/data/pages-and-sites/audit-page#vitals) |
| [`Site.audit`](/code/data/pages-and-sites/audit-site) | What is wrong across my whole site, and which fix helps the most pages? | About 1.5¢ per 100 pages | 100% of 90 | [Start a crawl](/code/data/pages-and-sites/audit-site#crawl), [Each page crawled and checked](/code/data/pages-and-sites/audit-site#pages), [Every URL on a site, without checks](/code/data/pages-and-sites/audit-site#map) |
| [`Prospect.count`](/code/data/people/count) | How many people hold the role I sell to? | Free | 100% of 2,861,763 | None. |
| [`Contact.enrich`](/code/data/people/enrich) | Who is this person now: title, employer, seniority and where they are? | About 20¢ per 100 contacts | 99.99% of 136,987 | [Title, employer, seniority and location](/code/data/people/enrich#profile), [The full profile with past roles](/code/data/people/enrich#history) |
| [`ContactPoint.findEmail`](/code/data/people/find-email) | What is this person’s work email? | About 0.45¢ an address found | 95% of 3,296,127 | None. |
| [`ContactPoint.findPhone`](/code/data/people/find-phone) | What is this person’s direct phone number? | About 1.7¢ a number found | 92.9% of 1,002,342 | None. |
| [`Prospect.find`](/code/data/people/find) | Who at these companies do I talk to? | About 3.8¢ per 100 rows | 99.99% of 636,024 | [People by title, or at a company domain](/code/data/people/find#people), [People at companies that match an industry, keywords or size](/code/data/people/find#company-filters), [The person to write to at each company](/code/data/people/find#decision-makers), [People who fit a sentence](/code/data/people/find#question), [Creators by audience](/code/data/people/find#creators), [People who engaged with a post](/code/data/people/find#engagers) |
| [`ContactPoint.verifyEmail`](/code/data/people/verify-email) | Is this address real, and is it safe to send to? | About 18¢ per 100 addresses | 99.99% of 2,098,997 | [Check the mailbox](/code/data/people/verify-email#standard), [A second opinion on a catch-all](/code/data/people/verify-email#deep) |
| [`Prospect.verify`](/code/data/people/verify) | Can I reach this person, and is the address safe to send to? | About 0.6¢ a verified address | 94.9% of 2,098,997 | [Find the work email](/code/data/people/verify#find), [Check the mailbox](/code/data/people/verify#check), [Find a direct phone](/code/data/people/verify#phone) |

## The word you searched for is one of these calls
| You searched for | The call |
| --- | --- |
| Company search, account list | [`Organization.find`](/code/data/organizations/find) |
| Total addressable market, market size | [`Organization.count`](/code/data/organizations/count) |
| Lookalike companies | [`Organization.find`](/code/data/organizations/find#lookalikes) |
| Company enrichment, firmographics | [`Organization.enrich`](/code/data/organizations/enrich) |
| Technographics, what software a company uses | [`Organization.enrich`](/code/data/organizations/enrich#technologies) |
| Buying triggers, funding news, hiring news | [`Organization.enrich`](/code/data/organizations/enrich#events) |
| Website visitor identification, reverse IP | [`Organization.resolve`](/code/data/organizations/resolve#visitor) |
| People search, contact search | [`Prospect.find`](/code/data/people/find) |
| Email finder | [`ContactPoint.findEmail`](/code/data/people/find-email) |
| Email verification | [`ContactPoint.verifyEmail`](/code/data/people/verify-email) |
| Catch-all verification | [`ContactPoint.verifyEmail`](/code/data/people/verify-email#deep) |
| Phone finder, direct dials | [`ContactPoint.findPhone`](/code/data/people/find-phone) |
| Contact enrichment | [`Contact.enrich`](/code/data/people/enrich) |
| Keyword research, keyword ideas | [`Keyword.find`](/code/data/keywords/find#ideas) |
| Competitor keywords | [`Keyword.find`](/code/data/keywords/find#rival) |
| Competitor PPC keywords | [`Keyword.find`](/code/data/keywords/find#rival-paid) |
| Search volume, CPC | [`Keyword.measure`](/code/data/keywords/measure#volume) |
| Keyword difficulty | [`Keyword.measure`](/code/data/keywords/measure#difficulty) |
| PPC forecast, Keyword Planner forecast | [`Keyword.forecast`](/code/data/keywords/forecast) |
| SERP, search results | [`Keyword.search`](/code/data/keywords/search#results) |
| Social listening, brand mentions | [`Keyword.search`](/code/data/keywords/search#reddit) |
| AEO rankings, AI visibility, GEO | [`Keyword.ask`](/code/data/keywords/ask) |
| Domain authority | [`Domain.benchmark`](/code/data/domains/benchmark#authority) |
| Competitor analysis | [`Domain.findCompetitors`](/code/data/domains/find-competitors) |
| Backlinks | [`Domain.findLinks`](/code/data/domains/find-links#links) |
| Link gap, link intersect | [`Domain.findLinks`](/code/data/domains/find-links#gap) |
| Index status, indexing check | [`Domain.verify`](/code/data/domains/verify) |
| SEO audit of one page | [`Page.audit`](/code/data/pages-and-sites/audit-page) |
| Site audit, site crawl | [`Site.audit`](/code/data/pages-and-sites/audit-site) |
| Ad library, competitor ads | [`Ad.find`](/code/data/ads/find) |
| Rank tracking | [`Monitor.create`](/code/data/monitors/create#rank) |

## Every data call keeps the same contract
**Every row says where it came from.** Each row carries `observedAt`, `method` (`sampled`, `estimated` or `reported`) and, where it has them, `venue` and `locale`. The [Observed](/code/data/types#observed) type is the same on every call.

**A blank is unknown, never zero.** Long-tail terms often have no volume reading; that reads `searches: null`. A `0` means the source measured zero.

**You pay per result returned.** Never per row asked for, and never a one-row minimum on an empty answer. Counting is free. A miss is free wherever a route allows it: an email or phone find that finds nothing, and a check that ends catch-all or unknown.

**Every call has a cap.** `maxCost` defaults per call. A call that would pass it is refused before it spends, or stops early and returns what it has. Every response carries [`cost`](/code/data/types#cost): what it spent, the most it could have, the units billed and the misses.

**Falling back is the platform’s job.** On a 429, a 5xx or a timeout the next route answers, and you pay for one. A 4xx is never retried elsewhere: the input is wrong, so the call says so.

**A filter is applied or listed.** A filter no route can apply comes back in `ignored`, never silently dropped. Send `strict: true` to be refused instead, at $0. [Filter coverage](/code/data/types#filter-coverage) shows how often each one applies.

**Readings are reused.** A reading younger than `maxAge` returns at $0. Market readings (volume, results pages, authority, links) are shared across startups for the same subject and locale; readings about people never are.

**Every call emits one Event.** Its `data` holds the rows, so a Trigger can fire on it and `Metric.query` can read it back. In try mode the read runs and returns real rows, and nothing is saved or billed.

```json title="Every response"
{
  "mode": "try",
  "stored": false,
  "api": "https://api.sb/leaseline.app",
  "action": { "$id": "https://api.sb/leaseline.app/actions/action_KO1jlJbtig", "operation": "Organization.find", "status": "done" },
  "organizations": [ "…the call's own value, documented on its page" ],
  "links": { "next": "https://api.sb/leaseline.app/organizations/find?after=org_9Qe2" }
}
```

## Ten calls a second per key, and an array counts as one
| Behavior | Rule |
| --- | --- |
| Rate | 10 calls a second and 600 a minute, per key, per call. Over it, a 429 with `Retry-After`. |
| Batch | An array input (`keywords`, `hostnames`, `addresses`) counts as one call, up to the call’s stated maximum, under one `maxCost` and one `cost`. |
| Pages | A list returns `after` and `total` when the source knows it. `limit` defaults to 25 and tops out at 100 a page unless the call says otherwise. |
| Async | A call whose median run is over 10 seconds, such as an AI answer or a site crawl, returns a pending Action in `send` mode; its Event delivers the result. |
| Idempotency | The same `Idempotency-Key` with the same input replays the first answer at $0; with other input it returns 409. |

## When a call says no, it names the fix and the next call
Every refusal is the hub’s RFC 9457 problem, served as `application/problem+json`: `type`, `title`, `status`, `detail`, `fix`, `next` (the call that clears it, with its input) and `instance`. Nothing is spent on a refusal. A miss is not a refusal: it returns 200 with the field `null`.

```json title="A max-cost refusal"
{
  "type": "https://startupbuilder.dev/errors/max-cost",
  "title": "The call would spend more than its cap",
  "status": 422,
  "detail": "100 rows from a sentence cost about $0.20; maxCost is $0.05.",
  "fix": "Lower limit, or raise maxCost to the price the detail quotes.",
  "next": { "verb": "Organization.find", "input": { "question": "US property managers with 20 to 400 units who still track rent in spreadsheets", "limit": 25, "maxCost": 0.05 } },
  "instance": "https://api.sb/leaseline.app/actions/action_Pq7wD2"
}
```

| Code | Status | Refuses when | Fix | Then call |
| --- | --- | --- | --- | --- |
| [`filter-unsupported`](/code/refusals#filter-unsupported) | 422 | a call sent with `strict: true` and a filter no route can apply | Drop that filter, or send without `strict` and read what comes back in `ignored`. | [`Organization.count`](/code/data/organizations/count) |
| [`input-missing`](/code/refusals#input-missing) | 422 | a data call given none of the input sets that name its subject, such as a person’s name without their company’s domain | Send one of the input sets the call’s Inputs table lists; nothing was spent. | [`Organization.resolve`](/code/data/organizations/resolve) |
| [`limit-exceeded`](/code/refusals#limit-exceeded) | 422 | any data call once the startup’s monthly usage Limit for data is spent | Raise the Limit once an Approval allows it, or wait for the month to reset. | `Limit.raise` |
| [`max-cost`](/code/refusals#max-cost) | 422 | a data call whose price for what you asked is above its `maxCost`, checked before anything is spent | Lower `limit`, or raise `maxCost` to the price the refusal’s detail quotes. | [`Organization.find`](/code/data/organizations/find) |
| [`rate-limited`](/code/refusals#rate-limited) | 429 | more than 10 calls a second, or 600 a minute, to one call on one key | Wait the `Retry-After` seconds and retry; an array input counts as one call. | `Action.retry` |
| [`sources-busy`](/code/refusals#sources-busy) | 503 | a call whose every route failed or is out of capacity; nothing is spent | Retry after `retryAfter` with the same Idempotency-Key, or send it and watch for the Event. | `Action.retry` |
| [`venue-unsupported`](/code/refusals#venue-unsupported) | 422 | a search engine, answer engine or network the call does not read, such as ChatGPT sent to `Keyword.measure` | Pick one the call’s `venue` input lists; AI answers are `Keyword.ask`, posts are `Keyword.search`. | [`Keyword.ask`](/code/data/keywords/ask) |

## Test values answer the same way every time, for free
A `sk_test_` key answers these subjects the same way on every call, at $0, so an agent’s branches can be tested before a live key spends anything. Each call’s page repeats its own rows under Example.

| Test value | Call | Always returns | What it is for |
| --- | --- | --- | --- |
| `headline: 'test: disapprove'` | [`Ad.create`](/code/apps/ads/create-ad) | Refuses: [`venue-rejected`](/code/refusals#venue-rejected) | The test ad account rejects it at review with the reason `Misleading claims`, passed through in `detail`, so your agent’s rewrite path runs. |
| `query: 'test = suppressed-member'` | [`Audience.create`](/code/apps/ads/create-audience) | Refuses: [`audience-guard`](/code/refusals#check-audience-guard) | One of its three test members sits on a Suppression, so nothing uploads until that member leaves the query. |
| `venue: 'linkedin' under sk_test_` | [`Campaign.create`](/code/apps/ads/create-campaign) | `{"state":"draft","outside":{"linkedin":"test-campaign-1"}}` | Opens a Campaign on a test ad account that never serves or spends, and returns the same campaign id every time. |
| `budget: { amount: 999999, currency: 'USD' }` | [`Campaign.create`](/code/apps/ads/create-campaign) | Refuses: [`over-mandate`](/code/refusals#over-mandate) | A $999,999 budget is over the Limit of every test standing approval, so the call refuses before a Campaign or a Bill exists. |
| `campaign_test_linkedin` | [`Campaign.update`](/code/apps/ads/update-campaign) | Refuses: [`over-mandate`](/code/refusals#over-mandate) | A raise to $999,999 is over the Limit of every test standing approval, so it refuses and the test Campaign keeps its budget. |
| `metric: 'test-flat'` | [`Metric.query`](/code/apps/analytics-and-experiments/query) | `{"rows":[{"value":7,"series":[1,1,1,1,1,1,1],"readable":true}]}` | One a day for seven days, every time, so a readout or a stop rule can be tested against a known line. |
| `lead_test_strong` | [`Lead.qualify`](/code/apps/crm/qualify) | `{"fit":"strong","deal":{"status":"Open","value":{"amount":1788,"currency":"USD"}}}` | A strong-fit test lead opens the same $1,788 deal every time, so your pipeline steps run against a known value. |
| `limit: { amount: { amount: 1000000, currency: 'USD' } }` | [`Mandate.authorize`](/code/integrations/calls/authorize) | `{"status":"active","limit":{"amount":{"amount":5000,"currency":"USD"}}}` | A test authorizer holds a $5,000 spend Permission, so a wider Limit comes back narrowed to it: a standing approval never widens a Permission. |
| `int_test_needs_reauth` | [`Integration.call`](/code/integrations/calls/call) | Refuses: [`needs-reauth`](/code/refusals#needs-reauth) | Every call through it answers as if the account had ended the sign-in, so your reconnect path runs. |
| `int_test_x` | [`Integration.call`](/code/integrations/calls/call) | Refuses: [`grant-missing`](/code/refusals#grant-missing) | It holds only the post-and-reply grant, so a call to change follows refuses before it leaves the platform. |
| `int_test_revoked` | [`Handle.connect`](/code/integrations/calls/connect-handle) | Refuses: [`account-not-connected`](/code/refusals#account-not-connected) | The Integration reads `revoked`, so the bind refuses before any call leaves the platform. |
| `venue: 'gmail' under sk_test_` | [`Integration.connect`](/code/integrations/calls/connect) | `{"state":"connected","environment":"test","account":"inbox@leaseline.test"}` | Skips the approval page and returns a connected test Integration that reaches no real mailbox, so the calls after it run end to end. |
| `audience_test_waitlist` | [`Message.broadcast`](/code/apps/mailboxes/broadcast) | `{"counts":{"audience":4,"sending":3,"skippedNoConsent":0,"skippedSuppressed":1}}` | Four test Contacts, one of them on a Suppression, so your agent sees the skip without sending to anyone. |
| `audience_test_spam_rate` | [`Message.broadcast`](/code/apps/mailboxes/broadcast) | Refuses: [`spam-brake`](/code/refusals#check-spam-brake) | Sends as if the Domain’s complaint rate were over the brake, so the broadcast refuses and nothing goes out. |
| `msg_test_unwarmed` | [`Message.schedule`](/code/apps/mailboxes/schedule) | Refuses: [`mailbox-warm`](/code/refusals#check-mailbox-warm) | Its Mailbox is on day 6 of a 14-day warm-up, so the first cold email holds until the warm-up ends. |
| `contact_test_busy` | [`Meeting.book`](/code/apps/scheduling/book) | Refuses: [`availability`](/code/refusals#check-availability) | Its test calendar is busy every weekday from 2:00 to 3:00 p.m. Central, so a booking then refuses and names the next free slot. |
| `contact_test_active` | [`Contact.enroll`](/code/apps/sequences/enroll) | `{"status":"active","step":"email-1","exitReason":null}` | Enrolls and renders the first step without sending, so your agent can read the run it starts. |
| `contact_test_suppressed` | [`Contact.enroll`](/code/apps/sequences/enroll) | Refuses: [`suppressed-contact`](/code/refusals#check-suppressed-contact) | The address sits on a Suppression, so the enroll refuses before any step is planned. |
| `contact_test_no_consent` | [`Contact.enroll`](/code/apps/sequences/enroll) | Refuses: [`no-consent`](/code/refusals#check-no-consent) | The Contact gave no Consent for the Sequence’s purpose, so the enroll refuses. |
| `post_test_published` | [`Post.publish`](/code/apps/social/publish) | `{"status":"published","outside":{"linkedin":"urn:li:share:7000000000000000001"}}` | Publishes to a test account and returns the same network id every time, so your agent’s follow-up steps run. |
| `post_test_unresolved` | [`Post.publish`](/code/apps/social/publish) | Refuses: [`claims-resolve`](/code/refusals#check-claims-resolve) | Its one claim names no live record, so the publish refuses before anything reaches the network. |
| `post_test_removed` | [`Post.publish`](/code/apps/social/publish) | Refuses: [`venue-rejected`](/code/refusals#venue-rejected) | The network takes the Post down as it goes live, and its reason comes back in `detail`, so your removal path runs. |
| `post_test_launch` | [`Post.schedule`](/code/apps/social/schedule) | `{"status":"scheduled","publishAt":"2026-11-04T08:01:00Z"}` | Queues on a test account and never publishes, so a launch-day Workflow runs end to end before the real one. |
| `US property managers with 20 to 200 staff` | [`Organization.count`](/code/data/organizations/count) | `{"count":4180,"ignored":[]}` | The market Leaseline sells to counts 4,180 companies, every time, for free. |
| `harborview-pm.com` | [`Organization.enrich`](/code/data/organizations/enrich) | `{"name":"Harborview Property Management","hostname":"harborview-pm.com","industry":"Real estate","headcount":34,"founded":2009,"country":"US","region":"US-WA"}` | Enriches to the same Harborview profile every time: 34 staff, founded 2009, in Washington. |
| `dana@harborview-pm.com` | [`ContactPoint.verifyEmail`](/code/data/people/verify-email) | `{"result":"deliverable","catchAll":false,"role":false}` | Always deliverable: a person’s own mailbox that accepts mail. |
| `leasing@crestline-residential.com` | [`ContactPoint.verifyEmail`](/code/data/people/verify-email) | `{"result":"catch-all","catchAll":true,"role":true}` | Always catch-all: the domain accepts every address, so the check cannot confirm this one, and it costs nothing. |
| `former.manager@harborview-pm.com` | [`ContactPoint.verifyEmail`](/code/data/people/verify-email) | `{"result":"invalid","catchAll":false,"role":false}` | Always invalid: the mailbox does not exist, as when someone has left the company. |
| `office@quietpine-rentals.test` | [`ContactPoint.verifyEmail`](/code/data/people/verify-email) | `{"result":"unknown","catchAll":null,"role":true}` | Always unknown: the mail server never answered, so check again with depth deep; it costs nothing. |
| `rent ledger template` | [`Keyword.measure`](/code/data/keywords/measure) | `{"term":"rent ledger template","searches":1900,"cpc":2.4,"difficulty":18,"intent":"learn","trend":"rising"}` | 1,900 searches a month, $2.40 a click and difficulty 18, every time. |
| `maxCost: 0.0001` | Any priced call | Refuses: [`max-cost`](/code/refusals#max-cost) | Any priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap. |
| `rate-limited.test` | Any priced call | Refuses: [`rate-limited`](/code/refusals#rate-limited) | Any call naming this hostname answers 429 with Retry-After, so your retry logic runs. |
| `sources-busy.test` | Any priced call | Refuses: [`sources-busy`](/code/refusals#sources-busy) | Any call naming this hostname answers 503 as if every route were busy, and nothing is spent. |

## Read what you measured with one query
Answer share and rank curves are not calls of their own. They are `Metric.query` over the Events these calls emit: a week of `Keyword.asked` split by site is your answer share on each engine, and a month of `Keyword.searched` for one term is its rank curve.

```ts title="Answer share by engine, week by week"
import { $ } from 'startup-builder'

const share = await $.Metric.query({ event: 'Keyword.asked', shape: 'trend', breakdown: 'venue', window: '8w' })
```

## The calls compose into Workflows, agent tasks and Services
Each [Workflow, agent task and Service](/capabilities/how-calls-compose#catalog) names its steps as these calls, so its price is the sum of the prices printed here. The accounts your agents act through are [Integrations](/code/integrations), and the shared [Types](/code/data/types) say what every field means.