API reference · public beta

The Namedry API

Daily brandable .com drops, a brandability scorer, and live registry checks — as clean JSON over HTTP. Built for naming tools and AI agents that need an available-brandable feed rather than a spreadsheet.

Base URL

https://api.namedry.com

Live now — the drops, domain, check, score, tags and stats endpoints all respond today, keyless during the public beta.

Endpoints

GET/api/drops

Paginated feed of scored candidates — the same 'best' blend the site's daily table uses (name score + registry authority + brand read). This is the firehose most integrations pull.

Query parameters

nametypedescription
min_scoreintMinimum brandability score, 0–100. Default 90.
availablebooltrue or 1 to return only names confirmed available at the registry.
sortstringbest (default), rank, score, brand, age, archive, name, or available.
datestringFilter to a single drop day, YYYY-MM-DD (matched against list_date).
limitintPage size. Default 50. 0 = no limit.
pageint1-based page number. Default 1.

Example request

curl "https://api.namedry.com/api/drops?min_score=95&available=true&limit=2"

Example response

{
  "domains": [
    {
      "domain": "deskkeep.com",
      "readable": "DeskKeep",
      "variations": ["DeskKeep"],
      "score": 100,
      "open_rank": 2.7,
      "available": true,
      "brand_score": 88,
      "brand_tags": ["two-word", "saas"],
      "brand_note": "Clean two-word compound, spells itself on hearing.",
      "list_date": "2026-07-17T00:00:00Z"
    }
  ],
  "total": 317,
  "page": 1,
  "limit": 2
}

Enrichment fields are null until fetched: open_rank (registry authority), available (RDAP), and the brand_* LLM signals. Under the best sort, un-enriched names sink to the bottom.

GET/api/domains/{domain}

The full stored document for one domain — every signal we hold, including the Namecheap cross-check and the archived Wayback fields omitted from the list feed.

Path parameter

nametypedescription
domain*stringFull domain including the .com, e.g. deskkeep.com. Case-insensitive.

Example request

curl "https://api.namedry.com/api/domains/deskkeep.com"

Example response

{
  "_id": "deskkeep.com",
  "sld": "deskkeep",
  "readable": "DeskKeep",
  "variations": ["DeskKeep"],
  "score": 100,
  "source": "whoxy-2026-07-17",
  "list_date": "2026-07-17T00:00:00Z",
  "first_seen": "2026-07-17T07:02:11Z",
  "updated_at": "2026-07-17T07:40:03Z",
  "open_rank": 2.7,
  "available": true,
  "checked_at": "2026-07-17T07:31:55Z",
  "nc_available": true,
  "nc_premium": false,
  "nc_checked_at": "2026-07-17T07:33:10Z",
  "archive_first": "2012-04-02T00:00:00Z",
  "archive_last": "2019-11-18T00:00:00Z",
  "archive_months": 61,
  "archive_score": 48,
  "brand_score": 88,
  "brand_tags": ["two-word", "saas"],
  "brand_note": "Clean two-word compound, spells itself on hearing.",
  "judged_at": "2026-07-20T02:14:55Z"
}

Returns 404 {"error":"domain not found"}if we've never listed the name. Enrichment keys (open_rank, available, nc_*, archive_*, brand_*) are omitted entirely until their stage has run, rather than sent as null.

GET/api/check/{domain}

A LIVE RDAP availability lookup at the moment you ask — the truth check to run right before a user registers. Bare labels get .com appended automatically.

Path parameter

nametypedescription
domain*stringA .com domain or a bare label (deskkeep → deskkeep.com). Letters, digits, hyphen only.

Example request

curl "https://api.namedry.com/api/check/deskkeep"

Example response

{
  "domain": "deskkeep.com",
  "available": true,
  "checked_at": "2026-07-17T09:14:22.481Z"
}

Hits RDAP on every call (no cache), so it's the slowest endpoint — reach for /api/drops?available=true for bulk. A failed upstream lookup returns 502; an invalid label, 400.

GET/api/score/{name}

Run the brandability scorer on any name — no database, no registration state. This is the moat: the same scorer that ranks the daily drops, exposed for your own inputs.

Path parameter

nametypedescription
name*stringA second-level label or full domain; a trailing .com is stripped. e.g. deskkeep or deskkeep.com.

Example request

curl "https://api.namedry.com/api/score/deskkeep"

Example response

{
  "score": 100,
  "readable": "DeskKeep",
  "variations": ["DeskKeep"]
}

readable is the best CamelCase wording; variations lists every max-coverage segmentation, best first. Pure function — safe to call at high volume from an agent.

GET/api/stats

Funnel counts for the most recent drop day — how many names were ingested, how many scored a perfect 100, and how many are available, plus how many clear a brand score of 80.

No parameters.

Example request

curl "https://api.namedry.com/api/stats"

Example response

{
  "latest_list_date": "2026-07-17T00:00:00Z",
  "total_ingested": 4192,
  "scored_100": 128,
  "available": 3106,
  "available_with_history": 214,
  "available_strong_brand": 372
}

An empty store returns all-zero counts and "latest_list_date": null. total_ingested and scored_100 are scoped to the latest list_date; available counts span the whole store.

GET/api/tags

How many available domains carry each brand tag — the taxonomy behind the browse-by-type pages. Form tags (one-word, two-word, multi-word, coined) are exclusive; modifier and market tags are optional.

No parameters.

Example request

curl "https://api.namedry.com/api/tags"

Example response

{
  "tags": [
    { "tag": "two-word", "count": 4831 },
    { "tag": "multi-word", "count": 2604 },
    { "tag": "generic", "count": 1190 },
    { "tag": "coined", "count": 638 }
  ]
}

Counts cover domains that are currently available and have been judged. Sorted by count, then alphabetically. Pass any tag back as ?tag= on /api/drops to filter the feed; unknown tags are ignored rather than erroring.

POST/api/subscribe

Add an email to the drop-alert list. Idempotent per address. Included for completeness — most API consumers won't need it.

Body (JSON)

nametypedescription
email*stringA valid email address (JSON body field). Lower-cased and de-duplicated server-side.

Example request

curl -X POST "https://api.namedry.com/api/subscribe" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

Example response

{
  "subscribed": "[email protected]"
}

A malformed body returns 400 {"error":"invalid json body"}; a bad address, 400 {"error":"invalid email"}.

Auth & limits

Public beta: no key required yet, and no rate limits enforced — please be a good neighbour (/api/check hits RDAP live, so batch responsibly). Responses are JSON; errors come back as {"error":"..."} with a matching HTTP status. Authenticated keys and per-key rate limits arrive with the paid API tier from $49/mo — reserve one and we'll bring you online when it ships.