RealSiteWorth

Docs

What you can value

Every valuation surface RealSiteWorth runs today, what each one takes as input, what it returns, and where it is gated or degraded.

RealSiteWorth runs ten valuation surfaces and four buyer-facing tools. Each one takes a different input and returns a range plus a confidence band. This page lists what exists, what it needs from you, and where it stops.

Everything below was checked against the shipped code. If a capability is not on this page, assume it does not exist yet.

How every surface behaves

Every valuation endpoint is POST only, accepts JSON, and returns JSON. There is no GET handler on any of them.

Every response carries an x-request-id header. Quota-bearing responses also carry x-quota-limit, x-quota-remaining, and x-quota-reset.

Every result is a range (low, mid, high) with a confidence label of LOW, MEDIUM, or HIGH. There is no single-number output anywhere in the product. That is deliberate.

The AI Firewall

Deterministic code computes the number. AI only explains it after the number exists.

The rule is stated to the model on every narration call:

Every dollar figure, percentage, score, and multiple in the data below was computed by RealSiteWorth's deterministic valuation engine. You must NOT invent, change, recompute, or contradict any number.

Two consequences you can rely on:

  1. No input, no estimate. The crypto and e-commerce surfaces are input-driven by design. If you do not supply comparable sales or revenue, they return a 422 and tell you what is missing. They do not guess.
  2. Unmeasured is not zero. A signal the adapters could not measure comes back as null, and the UI renders it as "Not measured". Rendering it as 0 would assert a fact nobody checked.

Every page that shows a valuation figure also carries the on-report banner: "This value range is an automated estimate. The Memo and Roadmap explain the estimate after it exists; they do not generate the number or invent facts."

The shared quota bucket

All surfaces draw from one bucket. There is no per-surface loophole.

Who you areCap
Anonymous3 valuations per day, per IP, across every surface combined
Signed-in free, website surfaces15 per calendar month (UTC), configurable
Signed-in free, social surfaces5 per day
Basic250 standard plus 10 advanced per month
Pro1,250 standard plus 50 advanced per month

Website surfaces for quota purposes are /api/value, /api/value-ecommerce, and /api/value-crypto. Everything else counts as social.

A burst limiter sits in front of all of it at 8 requests per IP per minute.

Two refunds are wired in. A run that fails before producing a usable response releases its reservation. A fully degraded run, where every provider missed and the report is an all-null stub, also releases its reservation and skips the billing commit. A dead result costs you nothing.


Website and domain

Page: / (also reachable from /domain-appraisal) API: POST /api/value

Input: a public URL. The scheme is optional and https:// is prepended if missing. Localhost, bare hostnames with no dot, and private IP ranges are rejected. Optional kind of "basic" or "deep". Advanced (deep) runs need a paid plan with an advanced allowance — Basic and Pro both have one — and they meter against that separate advanced counter. Anonymous and free callers are refused with deep_requires_upgrade.

curl -sS https://realsiteworth.com/api/value \
  -H 'content-type: application/json' \
  -d '{"url":"example.com"}'

Returns: the range and confidence band, an asset-mode classification, a category, an RSW Auth score and an RSW Trust score with their components, weakness and flag lists, and a domain-name asset value. Paid tiers also get the AI Memo, the Value-Gap Roadmap, and the name-value breakdown. Free responses have those fields stripped and are marked summaryOnly: true.

Modes. The classifier sorts the asset into Mode A (operating website), Mode B (aged domain with a minimal site), or Mode C (bare or parked domain). The mode picks the valuation stack.

Honest limits.

  • If the site blocks the request, you get 502 with reason blocked. If it cannot be reached, 502 with reason unreachable.
  • If there is no measurable traffic and you are on a paid tier, you get 502 with reason too-thin. Free-tier runs fall back to a Mode C domain-only valuation instead of erroring.
  • Signing in for free is a real data-depth change, not just a quota change. Anonymous runs use the shallow adapter profile; signed-in free runs pull the deeper one.
  • If the AI narration provider is down, the range still returns. You get 504 only when narration was required and failed on a paid run; otherwise the memo and roadmap come back empty and the number stands.

YouTube

Page: /youtube, then /youtube/<handle> API: POST /api/value-youtube

Input: handle or channelUrl. Optional niche from finance, tech, business, education, health, gaming, lifestyle, entertainment, other.

curl -sS https://realsiteworth.com/api/value-youtube \
  -H 'content-type: application/json' \
  -d '{"handle":"mkbhd","niche":"tech"}'

Returns: range, confidence, multiple, estimated monthly revenue and annual SDE, the normalized signal set, weaknesses and flags. Free callers get a teaser: no Memo, no Roadmap.

Honest limits. The channel page falls back to a "needs verified signals" screen when the midpoint computes to zero, rather than showing a $0 to $0 band. That happens when no provider in the chain resolved public signals for the handle. The result is honest, but it is not a valuation.

Twitch

Page: /twitch, then /twitch/<channel> API: POST /api/value-twitch

Input: login, or handle as an alias, or channelUrl. Optional niche from just_chatting, gaming, esports, irl, creative, music, other.

curl -sS https://realsiteworth.com/api/value-twitch \
  -H 'content-type: application/json' \
  -d '{"login":"shroud"}'

Returns: the same shape as YouTube. Free callers get the teaser.

Honest limits. Same degraded path as YouTube. When the provider chain misses, the report comes back marked servedBy: "degraded", the channel page shows the "needs verified signals" screen, and your quota is refunded.

TikTok

Page: /tiktok, then /tiktok/<handle> API: POST /api/value-tiktok

Input: handle or url. Optional niche from a 14-value list. Optional overrides where you supply signals yourself: followerCount, avgViewsPerPost, avgLikesPerPost, avgCommentsPerPost, engagementRate, postsLast30d, accountAgeYears, hasShopSignal, hasAffiliateSignal.

curl -sS https://realsiteworth.com/api/value-tiktok \
  -H 'content-type: application/json' \
  -d '{"handle":"nasa","niche":"education"}'

Returns: range, confidence, multiple, estimated monthly revenue split across sponsorship, creator fund, and commerce, annual SDE, mode classification (audience-monetized, commerce-monetized, or creator-fund-only), weaknesses and flags.

Honest limits. The in-code note on the handle page is blunt about it: TikTok stays a stub until a connected-account or provider-backed engine lands. If public signals do not resolve, you get the "needs verified signals" screen. The overrides field is the working path when you already have the numbers.

Instagram

Page: /instagram, then /instagram/<handle> API: POST /api/value-instagram

Input and returns: identical to TikTok. Same shared engine with the platform discriminator set to instagram, same overrides block, same niche list.

Honest limits. Instagram does not expose lifetime likes at account level, so totalLikes comes back null here where TikTok can populate it. Same degraded fallback when providers miss.

X (Twitter)

Page: /twitter, then /twitter/<handle> API: POST /api/value-twitter

Input and returns: identical to TikTok and Instagram, on the same shared social engine.

Facebook

Page: /facebook, then /facebook/<handle> API: POST /api/value-facebook

Input and returns: identical to the other social surfaces. The result copy uses "page" rather than "account".

Newsletter

Page: /newsletter, then /newsletter/<handle> API: POST /api/value-newsletter

Input: handle or substackUrl. A bare handle without a dot is expanded to <handle>.substack.com.

curl -sS https://realsiteworth.com/api/value-newsletter \
  -H 'content-type: application/json' \
  -d '{"handle":"lennysnewsletter"}'

Returns: range, confidence, the detected platform, an inferred niche, and the engine output. Free callers get the band without Memo or Roadmap.

Honest limits. Substack is the only first-class platform. A Substack with a readable subscriber count runs in full mode. Beehiiv and Ghost are detected from page markup but fall back to directional mode, which is a low-confidence result. Anything else is unknown. If the fetch fails outright you get an error with reason fetch_failed. The niche is guessed from keywords in the handle and URL, not classified by AI; a wrong guess only shifts the multiple band.

Crypto, ENS, and NFT

Page: /crypto API: POST /api/value-crypto

This surface is input-driven. There is no URL-only "guess my ENS worth" path, and that is intentional.

Input: all fields optional individually, but you must supply either at least 2 compSales or an annualRevenue. Fields: assetIdentifier, assetType (ens_domain, nft_collection, nft_item, token, other), nameType (dictionary, brandable, coined, numeric, random), ageYears, compSales (up to 20 positive numbers), annualRevenue. The schema is strict and rejects unknown keys.

curl -sS https://realsiteworth.com/api/value-crypto \
  -H 'content-type: application/json' \
  -d '{"assetIdentifier":"example.eth","assetType":"ens_domain","nameType":"dictionary","ageYears":4,"compSales":[12000,15500,9800]}'

Returns: range or null, confidence, the anchor type (comp, revenue, or none), a human-readable anchor label, the comp count, the applied adjustments (name-type multiplier, age adjustment, conservatism factor), a deterministic value-driver disclosure, and a crypto-specific disclaimer.

Honest limits.

  • Fewer than 2 comps and no revenue returns 422 with reason no_comps or no_revenue. The teaser says "No defensible estimate". It will not invent a price.
  • This surface makes no external provider call and no AI call. It is pure deterministic math over the comps you supply. Memo and roadmap come back empty on every tier today.
  • A conservatism factor of 0.85 is applied to the comp anchor.

E-commerce and business

Page: /ecommerce-store-valuation API: POST /api/value-ecommerce

Also input-driven. There is no path that infers your Shopify revenue from a URL.

Tier gate: Basic or Pro required. This is the only valuation surface that anonymous and free signed-in callers cannot run at all. The gate fires before the body is parsed and before any quota is reserved, so a denied call costs you nothing. You get 403 with reason ecommerce_requires_basic. If the account lookup itself fails, you get a retryable 503 instead, never a tier denial.

Input: monthlyRevenue is required and must be positive. Optional: monthlyCogs, monthlyEmployeeCost, platform (shopify, woocommerce, amazon_fba, bigcommerce, custom, dropshipping), businessModel (held_inventory, amazon_fba, dropship, print_on_demand, marketplace, digital_product), averageOrderValue, monthlyOrders, topTrafficSourcePct, monthlyChurnPct, ecommerceCategory, inventoryValue, ltvCacRatio, topSkuRevenuePct, ip, ageYears. Strict schema.

curl -sS https://realsiteworth.com/api/value-ecommerce \
  -H 'content-type: application/json' \
  -b 'your-session-cookie' \
  -d '{"monthlyRevenue":42000,"monthlyCogs":18000,"platform":"shopify","businessModel":"held_inventory","ageYears":3}'

Returns: range, confidence, a multiple band label, the effective multiple midpoint, and a disclaimer.

Honest limits. Missing revenue or a computed negative SDE returns 422 with reason no_revenue or negative_sde. Both are user-correctable. Memo and roadmap are empty today on every tier.


Buyer-facing tools

Is this listing overpriced

Page: /is-this-listing-overpriced API: POST /api/buyer-sanity-check

A pressure test on a listing you are considering, not a valuation of an asset you own.

Input: at least one of listingUrl or siteUrl, both of which must be valid URLs. Optional: assetType (content_affiliate, ecommerce, saas, lead_gen_local, marketplace), askingPrice, monthlyProfitClaim, monthlyRevenueClaim, monthlyTrafficClaim, topTrafficSourcePct, topCustomerRevenuePct, monthlyChurnPct, ownerHoursPerWeek, platformDependency, a set of has*Proof booleans, and up to 20 sellerClaims strings.

curl -sS https://realsiteworth.com/api/buyer-sanity-check \
  -H 'content-type: application/json' \
  -d '{"listingUrl":"https://flippa.com/12345","askingPrice":48000,"monthlyProfitClaim":1800,"hasProfitProof":false}'

Returns: a buyer range with an explicit valuationBasis of profit, revenue_proxy, traffic_proxy, or unavailable; a confidence score with reasons; a price-sanity label of looks_plausible, needs_caution, stretched, likely_overpriced, or too_many_unknowns; categorized risk flags with severity; a missing-proof checklist; and seller questions to ask next.

Tier gate: none, but it draws from the same 3-per-day anonymous IP bucket.

Honest limits. This is deterministic. It imports from the valuation model and makes no AI call. When the range cannot be computed it returns status: "range_unavailable" rather than a number. Its own disclaimer says it plainly: a directional sanity check based on public or user-provided signals that may be incomplete or unverified.

Domain appraisal

Page: /domain-appraisal

A long-form explainer with an inline form. The form is not a separate engine. It stashes your URL and hands you to the main website valuation flow, so you land on the same report screen and the run behaves exactly like /api/value.

Cached report pages

Page: /worth/<domain>

One public URL per cached valuation. It reads from the valuation cache, which has a 14-day TTL.

A cache miss returns 404 with noindex metadata. It does not run a fresh valuation on demand, because that would make every crawler a load generator.

It exposes the weighted ensemble range, the confidence band, the memo text when cached, a lastValuedAt timestamp, and a beyondCompRange flag. It never exposes per-vendor raw values. A live RDAP availability check runs alongside the page render and renders nothing if it fails.

Passing a social profile URL here redirects to the right surface. A youtube.com, tiktok.com, instagram.com, or twitch.tv URL sends you to /youtube/<handle> and so on.

Authority check

Page: /authority/<domain>

A free single-metric lookup, not a valuation. It returns the OpenPageRank score on a 0 to 10 scale plus a plain-English band comparison. Cached for 24 hours.

When the score is unavailable the page says so rather than showing a zero.


Programmatic access

Programmatic access today is the MCP/agent endpoint at /api/mcp, included with Pro. A REST v1 API is not offered yet — if you find references to REST v1 endpoints, they are not shipped and requests to them fail. It authenticates with a Pro-tier Bearer token, is rate limited to 5 requests per second, and exposes value_website, value_social, get_watchlist, and get_history. It meters against the same Pro monthly allowances as the web surfaces. A fully degraded social valuation over MCP is not charged, because the gate is evaluate-then-commit and the commit is skipped; website valuations over MCP have no degraded-run exemption.

What is not here

  • Telegram. Retired.
  • A bulk or CSV upload path for valuations. Pro includes a CSV export of results; there is no batch input.
  • A promise of automatic re-valuation. Watchlist slots exist at 5, 10, and 50 for free, Basic, and Pro. Basic's watchlist refresh is manual.