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

# Domains

> A Domain is “a hostname that points at a Thing”: find your real rivals, measure yourself beside them, and check you are indexed.

A [Domain](https://startupbuilder.dev/business/nouns/domain) is “a hostname that points at a [Thing](https://startupbuilder.dev/business/nouns/thing)”: find your real rivals, measure yourself beside them, and check you are indexed.

- **Noun:** [Domain](https://startupbuilder.dev/business/nouns/domain)
- **Calls:** 4
- **Emits:** `Domain.benchmarked`, `Domain.competitorsFound`, `Domain.linksFound`, `Domain.verified`

A Data Verb reads the market and returns a reading. A Software Verb changes your records and emits an Event. Every call here is a Data Verb: it reads, and it changes a record only where its Effects say so.

## Properties
| Field | Type | What `null` means |
| --- | --- | --- |
| `rows` | `Domain[]` | Never null: one row per hostname, `hostname` first. |
| `rows[].hostname` | [`Hostname`](/code/data/types#hostname) | Never null. |
| `rows[].authority` | `number \| null`, in 0 to 100, one scale across sources | Unknown: too new or too small to score. |
| `rows[].pageAuthority` | `number \| null`, in 0 to 100, the home page | Unknown. |
| `rows[].spamScore` | `number \| null`, in 0 to 100 | Unknown. |
| `rows[].traffic` | `number \| null`, in organic visits a month, estimated | Too little search traffic to estimate. Never zero visits. |
| `rows[].keywords` | `number \| null`, in terms ranking in the top 100 | Unknown. |
| `rows[].referringDomains` | `number \| null`, in domains linking to it | Unknown. |
| `rows[].backlinks` | `number \| null`, in links | Unknown. |
| `rows[].adBudget` | `number \| null`, in USD a month on search ads, estimated | Unknown. `0` means no search ads were seen. |
| `rows[]` | [`Observed`](/code/data/types#observed) | Each row also carries `observedAt`, `method` and `locale`. |
| `cost` | [`Cost`](/code/data/types#cost), in USD | Never null. In try mode `usd` is 0 and `maxUsd` is what the call would have cost. |
| `competitors` | `Domain[]` | Never null: empty when no domain shares a term, at $0. |
| `competitors[].hostname` | [`Hostname`](/code/data/types#hostname) | Never null. |
| `competitors[].sharedKeywords` | `number`, in terms | Never null: terms you both rank for, or both target. |
| `competitors[].theirKeywords` | `number \| null`, in terms in the top 100 | Unknown. |
| `competitors[].missingForYou` | `number \| null`, in terms | Unknown: terms they rank for and you do not. |
| `competitors[].visibility` | `number \| null`, in 0 to 1, share of clicks on the shared terms | Unknown. |
| `competitors[]` | [`Observed`](/code/data/types#observed) | Each row also carries `observedAt`, `method` and `locale`. |
| `basis` | `'ranked' \| 'targets'` | Never null. `targets` means your domain ranks for too few terms, so rivals were read from the results of your target Keywords instead. |
| `links` | `{ from: string; to: string; anchor: string \| null; follow: boolean; firstSeen: string \| null; lastSeen: string \| null; live?: boolean }[]` | Present with `group: links` or `check`; `anchor: null` is an image link. |
| `sites` | `{ hostname: Hostname; authority: number \| null; spamScore: number \| null; links: number; follow: boolean \| null; linksTo: Hostname[] }[]` | Present with `group: sites`. `linksTo` names the rivals each site links to with `gap`; `follow: null` means mixed. |
| `anchors` | `{ text: string; links: number }[]` | Present with `group: anchors`. |
| `changes` | `{ month: string; gained: number; lost: number }[]`, in referring domains a month | Present with `group: changes`; a month with no reading is left out. |
| `after` | [`Cursor`](/code/data/types#cursor) | The last page: there are no more rows. |
| `(report)` | [`Observed`](/code/data/types#observed) | The report carries `observedAt` and `method`. |
| `domain` | `Domain` | Never null: with its `state` after the checks. |
| `dns` | `{ ok: boolean; fix: string \| null }` | Never null. `fix` is null when `ok`. |
| `certificate` | `{ ok: boolean; fix: string \| null }` | Never null. `fix` is null when `ok`. |
| `searchEngines` | `{ venue: 'google-search' \| 'bing'; verified: boolean; sitemap: { submitted: number; indexed: number; lastRead: string \| null; errors: number } \| null }[]` | Never null. `sitemap: null` means no sitemap was read yet. |
| `pages` | `{ url: string; state: IndexState; reason: string \| null; lastCrawl: string \| null; canonical: string \| null; robots: 'allowed' \| 'blocked' \| null }[]` | Never null: one row per page inspected. |
| `pages[].state` | `'indexed' \| 'discovered-not-indexed' \| 'crawled-not-indexed' \| 'duplicate' \| 'not-seen' \| 'excluded'` | Never null. |
| `pages[].reason` | `string \| null` | Null when indexed; otherwise the engine’s own wording. |
| `pages[].lastCrawl` | `string \| null`, in ISO 8601 | Never crawled. |
| `pages[].canonical` | `string \| null` | The engine has not chosen one yet. |
| `lagDays` | `number`, in days | Never null: how far behind the engine’s own report runs, about 2 days. |
| `observedAt` | `string`, in ISO 8601 | Never null. |
| `method` | `'reported' \| 'sampled'` | Never null. Google reads `reported`; Bing has no reporting API, so its fields are read by a browser agent and read `sampled`. |

## Object
```json
{
  "rows": [
    {
      "hostname": "leaseline.app",
      "authority": 4,
      "pageAuthority": 11,
      "spamScore": 1,
      "traffic": null,
      "keywords": 3,
      "referringDomains": 6,
      "backlinks": 14,
      "adBudget": 0,
      "locale": "en-US",
      "observedAt": "2026-10-27T14:02:11Z",
      "method": "estimated"
    },
    {
      "hostname": "rentrival.example",
      "authority": 41,
      "pageAuthority": 38,
      "spamScore": 2,
      "traffic": 18400,
      "keywords": 2210,
      "referringDomains": 612,
      "backlinks": 9830,
      "adBudget": 4200,
      "locale": "en-US",
      "observedAt": "2026-10-27T14:02:11Z",
      "method": "estimated"
    }
  ],
  "cost": {
    "usd": 0,
    "maxUsd": 0.015,
    "units": 2,
    "misses": 0
  }
}
```

## Verbs
| Verb | The question it answers | Price | Success rate |
| --- | --- | --- | --- |
| [`Domain.benchmark`](/code/data/domains/benchmark) | How strong is my domain next to my rivals’? | 0.75¢ a domain | 100% of 12,396 calls |
| [`Domain.findCompetitors`](/code/data/domains/find-competitors) | Who am I actually up against in search? | 5¢ per 100 rows | 100% of 2,639 calls |
| [`Domain.findLinks`](/code/data/domains/find-links) | Who links to my rivals and not to me? | 2¢ per 100 links | 100% of 3,967 calls |
| [`Domain.verify`](/code/data/domains/verify) | Do search engines know my site, and is each key page indexed? | Free | 99.8% of 45,746 calls |

## The order you call them in
1. [`Domain.verify`](/code/data/domains/verify): Do search engines know my site, and is each key page indexed?
2. [`Domain.findCompetitors`](/code/data/domains/find-competitors): Who am I actually up against in search?
3. [`Domain.benchmark`](/code/data/domains/benchmark): How strong is my domain next to my rivals’?
4. [`Domain.findLinks`](/code/data/domains/find-links): Who links to my rivals and not to me?

## Monitors on this Noun
| Verb | What it watches |
| --- | --- |
| [`Domain.verify`](/code/data/domains/verify) | Each key page’s index state, daily, inside the 2,000-a-day inspection quota. |
| [`Domain.benchmark`](/code/data/domains/benchmark) | Your referring domains, weekly, against the 10, 25 and 50 targets. |
| [`Domain.findLinks`](/code/data/domains/find-links) | Links you earned that disappear, weekly. |

## Works with
- **Workflows:** [Competitor gap](/capabilities/size-up-competitors/competitor-gap) · [Directory submissions](/capabilities/earn-first-links/directory-submissions) · [Keyword opportunity map](/capabilities/research-demand/keyword-opportunity-map) · [AI answer audit](/capabilities/check-ai-answers/ai-answer-audit) · [Index the site](/capabilities/get-indexed/index-the-site)
- **Agent tasks:** [Monthly search content](/capabilities/make-content/monthly-search-content) · [Answer page per question](/capabilities/make-content/answer-pages)