Reveal a domain
Buy one name, and return the row with it. THE ONLY CALL ON THIS API THAT SPENDS: a page of listings never charges for the rows it matched, so on a plan with a monthly ceiling this is how a masked `domain` becomes a real one. It also records the reveal, which a hold requires on a plan with a ceiling — `POST /domains/{id}/hold` refuses with `REVEAL_REQUIRED` until this has run for the same listing and the same account. A plan with no reveal ceiling never needs this call: it receives every name already, and its holds need no reveal on record. FREE in two cases, both of which still write the ledger entry: the listing is on the `open` tier, whose name is published anyway, or the plan has no reveal ceiling. Idempotent — a repeat call returns the original `revealed_at`, costs nothing and is the safe way to re-read a name you have already bought. The allowance is counted in CREDITS: an ordinary reveal costs 1, a featured listing costs the plan's featured weight (1 credit), and `credits_charged` says what this call took. If the availability re-check finds the name registered right after you paid for it, the credit is refunded: `refunded: true`, `credits_charged: 0`, and the name stays yours to see. The Free plan has NO reveals: every masked listing is refused with `QUOTA_EXHAUSTED` and a message pointing at Starter ($29/month, every name shown); open listings and listings already revealed still return. Refused with `reveal_code` `QUOTA_EXHAUSTED` (402, carries `resets_at`, `credits_needed` and `credits_remaining`) when what is left does not cover this reveal, `FEATURED_REQUIRES_PRO` on the Free plan against a featured listing, `HELD_BY_OTHER` while another account holds it, and `NOT_FOUND` once it has left the directory.
/api/v1/domains/{id}/revealBuy one name, and return the row with it. THE ONLY CALL ON THIS API THAT SPENDS: a page of listings never charges for the rows it matched, so on a plan with a monthly ceiling this is how a masked `domain` becomes a real one. It also records the reveal, which a hold requires on a plan with a ceiling — `POST /domains/{id}/hold` refuses with `REVEAL_REQUIRED` until this has run for the same listing and the same account. A plan with no reveal ceiling never needs this call: it receives every name already, and its holds need no reveal on record. FREE in two cases, both of which still write the ledger entry: the listing is on the `open` tier, whose name is published anyway, or the plan has no reveal ceiling. Idempotent — a repeat call returns the original `revealed_at`, costs nothing and is the safe way to re-read a name you have already bought. The allowance is counted in CREDITS: an ordinary reveal costs 1, a featured listing costs the plan's featured weight (1 credit), and `credits_charged` says what this call took. If the availability re-check finds the name registered right after you paid for it, the credit is refunded: `refunded: true`, `credits_charged: 0`, and the name stays yours to see. The Free plan has NO reveals: every masked listing is refused with `QUOTA_EXHAUSTED` and a message pointing at Starter ($29/month, every name shown); open listings and listings already revealed still return. Refused with `reveal_code` `QUOTA_EXHAUSTED` (402, carries `resets_at`, `credits_needed` and `credits_remaining`) when what is left does not cover this reveal, `FEATURED_REQUIRES_PRO` on the Free plan against a featured listing, `HELD_BY_OTHER` while another account holds it, and `NOT_FOUND` once it has left the directory.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path parameters
idstringrequiredA listing id, exactly as the feed issued it: eight characters, CASE-SENSITIVE — `00aLaXEG`, not `00alaxeg`.
Example: 00aLaXEG
Responses
The listing, in the same shape `GET /domains/{id}` returns, plus when this account first revealed it.
age_yearsanyWhole years from the earliest archive capture we hold for the name to now. It is a FLOOR on the name's history, not its registration age and not the age of its last registration: we hold a sample of captures, so a name archived since earlier can read younger, most of all where only one capture is held. Null when we hold no capture.
agent_citabilityanyAgent Citability (preview) score and the AI-cited sources that link to the domain. Null when the domain has no row in the current index — not a score of zero. Listing scores refresh between releases as new link data arrives, and can rise or fall. `basis` says what the score rests on: `seed_links` means AI-cited sources link to the domain and are listed in `sources`; `link_graph` means none do, `sources` is genuinely empty, and the score reflects the domain's position in the link graph alone (it cannot exceed 70).
availability_checked_atstring (date-time)When we last checked that the name is unregistered. Revealing a name in the directory re-checks it on the spot; exports and this API carry the last-checked stamp rather than triggering a check of their own, so read this timestamp before acting on the row.
backlinksanyBanded total backlinks.
categoryanydiscovered_atstring (date-time)requiredWhen this listing entered the directory. Written once and never rewritten, which is what `sort=latest` orders by and what makes that ordering safe to page. It is a fact about this directory, not about the domain: it is neither the registration date nor the date the name expired.
domainanyrequiredThe registrable name, or NULL where it is withheld. TWO INDEPENDENT REASONS it can be null, and you cannot tell them apart from this field alone. (1) Another account holds the listing (`hold_state: "other"`) — a hold masks the name for every reader, and an unlimited reveal allowance is not an exemption from one; it comes back when their hold ends, and `hold_expires_at` says when. (2) Your plan has a monthly reveal ceiling and you have not revealed this listing: you receive names on the open tier (`tier: "open"`, published on the site anyway) and on anything you have already revealed, and a mask on the rest. `POST /domains/{id}/reveal` buys one. On a plan with no ceiling, only reason (1) applies. `mask_hint` is populated either way and is what to render. Read `tier` before republishing: only an `open` name is public.
enriched_atanyWhen our pipeline last found something new about this listing — site history, category, linking sites, or the referring-domain or age band — or null if nothing has changed since `discovered_at`. Not moved by a status change, a Revised Score shift, a tier change or an availability re-check. Freshness, newly listed or newly enriched, is the later of this and `discovered_at`. NOT a sync watermark: use `updated_at` and `since` for that, and do not page on this — it moves.
estimated_value_bandstringrequiredA coarse estimated-value range, e.g. `$250 to $999`, on EVERY row for EVERY plan, masked rows included. The same buckets the `priceRange` filter uses, so a filter and the band it returns agree. Nothing here is for sale.
estimated_value_centsanyrequiredThe exact estimated value in cents: the valuation model's low bound, falling back to the reference figure on a row the model has not valued. PAID PLANS ONLY (Starter, Business), and only where the name is disclosed to you (`name_disclosed: true`). NULL on the Free plan for every row, open listings included, and null on any row whose name is withheld. `estimated_value_band` is the coarse range for everyone. An exact figure beside a TLD and length bucket would let a valuation tool unmask a withheld name. Nothing here is for sale.
featuredbooleanhold_expires_atanyWhen the active hold on this listing ends. Null when nothing is holding it.
hold_state"none" | "mine" | "other"required`none`, `mine` (held by this key's account) or `other`. A held listing stays in the directory and stays listed here; what a hold reserves is the right to take it, inside Revised. Who holds it is never disclosed. NOTE: taking, extending or ending a hold does not move `updated_at`, so an incremental `since` poll will not re-deliver a row whose hold state changed — read the listing directly, or `GET /holds` for your own.
Available options: none, mine, other
idstringrequiredEight characters, CASE-SENSITIVE and mixed case in practice (`00aLaXEG`, `X00w46xl`). Store it verbatim: lower-casing one will not match on the way back.
length_bucketstringlinked_fromstring[]The sites we track that link to this domain (the Linked from list on the listing page), strongest first, by display name (`Wikipedia`, `Hacker News`). Every known site, not a sample. Empty when none are known. `linked_from_count` is the headline figure.
linked_from_countanyHow many sites we track link to this domain, or null when none are known. Absent data, never a zero. Filter with `linkedFromMin`.
mask_hintanyrequiredThe public partial mask, e.g. `g▓▓▓▓▓▓farms` — true length, first letter, last word, hyphens. Always present, and the thing to render when `domain` is null. Null only for rows predating the mask backfill; `length_bucket` is the fallback shape.
metrics_missingstring[]requiredWhich of this row's optional metrics are NULL, by the key they are published under: `age_years`, `agent_citability`, `backlinks`, `category`. A null among those is ABSENT DATA, never a zero — an unscored domain is not a score-0 domain — and the distinction is otherwise invisible in JSON. Empty when the row is complete. Note that the `min_*` filters exclude null rows rather than ranking them low, so a mild-looking floor can drop most of a page.
name_disclosedbooleanrequiredWhether `domain` holds a real registrable name. The same predicate `domain` itself is built from, so the two cannot disagree — false means `domain` is null and `mask_hint` is what to render. This is the discriminator; `mask_hint` is NOT, because it is populated on every row whether or not anything is masked. It is also not a reveal: on a plan with no reveal ceiling every name is disclosed without one having been bought.
referring_domainsanyBanded referring-domain count.
revised_scoreobjectThe Revised Score band, low to high. Kept for existing clients; `revised_score_exact` carries the score itself.
revised_score_exactintegerThe Revised Score, 0 to 100: a percentile blend of link-graph centrality, referring domains and site history, relative to the whole directory, plus up to 15 points for real visitor traffic (see `visitor_traffic`). It moves as the directory and its inputs update.
snapshotsstringBanded archive snapshot count, e.g. `40+`.
statusstringrequiredAlways `active` on a full row. Branch on this to tell a listing from a tombstone.
tier"featured" | "regular" | "open"requiredWhich shelf this listing sits on, and the only field that says whether its `domain` is PUBLIC. `open` means the name is already published on the site, in the listing page's title and in the sitemap, so you may republish it. `regular` and `featured` names are masked everywhere on the site and are disclosed to you under the API terms only — do not republish them. `featured` additionally means the curated shelf; it is not the same thing as the `featured` boolean, which reads the shelf rank and can disagree.
Available options: featured, regular, open
tldstringrequiredupdated_atstring (date-time)requiredFeed watermark. What `since` filters on, and the version of this row: with `id` it is what makes a repeated row safe to ignore.
visitor_trafficanyHow popular the site was with real visitors while it was live, from the monthly global top-1M list of the sites browser users visit (monthly since 2021-02). `best_rank_bucket` is the best bucket it ever held (1000 = a top-1k site; 1000, 10000, 100000 or 1000000), `months_present` how many months it was on the list, and `first_seen` / `last_seen` the first and last month (`YYYY-MM`). Released under exactly the rule that releases `domain`: null whenever `name_disclosed` is false, because on a masked row these figures would identify the name. Where `name_disclosed` is true, null means the site was never on the list — not zero traffic.
visitor_traffic_bandanyA coarse visitor-traffic band, on EVERY row whatever `name_disclosed` says: `rank_bucket` is 100000 when the site's best month was inside the top 100k (a top-1k site included) and 1000000 when it only reached the top 1M; `sustained` is true when it spent 12 or more months on the list. Deliberately no finer than that, so it can sit on a masked row. Null means the site was never on the list, not zero traffic.
word_countintegercredits_chargedintegerrequiredCredits this call took after any refund. 0 for an open listing, a repeat call, an unlimited plan or a refund.
credits_remaininganyrequiredCredits left this period after this call. null = unlimited.
notestringPresent with `refunded`: the sentence to show a person.
refundedbooleanPresent and true when the re-check found the name registered and the credit was given back.
revealed_atstring (date-time)requiredcurl --request POST \
--url "https://getrevised.com/api/v1/domains/00aLaXEG/reveal" \
--header "Authorization: Bearer YOUR_API_KEY"{}