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.comLive now — the drops, domain, check, score, tags and stats endpoints all respond today, keyless during the public beta.
Endpoints
/api/dropsPaginated 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
| name | type | description |
|---|---|---|
| min_score | int | Minimum brandability score, 0–100. Default 90. |
| available | bool | true or 1 to return only names confirmed available at the registry. |
| sort | string | best (default), rank, score, brand, age, archive, name, or available. |
| date | string | Filter to a single drop day, YYYY-MM-DD (matched against list_date). |
| limit | int | Page size. Default 50. 0 = no limit. |
| page | int | 1-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.
/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
| name | type | description |
|---|---|---|
| domain* | string | Full 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.
/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
| name | type | description |
|---|---|---|
| domain* | string | A .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.
/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
| name | type | description |
|---|---|---|
| name* | string | A 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.
/api/statsFunnel 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.
/api/subscribeAdd an email to the drop-alert list. Idempotent per address. Included for completeness — most API consumers won't need it.
Body (JSON)
| name | type | description |
|---|---|---|
| email* | string | A 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.