v1
Namester API
以 REST 方式访问 Namester 域名索引:一个跨全部已接入市场的搜索端点,一个单域名查询端点。
本页所有数字来自 2026-09-09T15:35Z 对生产库的一次快照,均为精确计数。库存分钟级变动,所以请把它们读成「那一刻的描述」,而不是我们承诺的规模。
- 已收录域名
- 2,920,052
- API 可取到
- 2,594,318
- 进行中的拍卖
- 2,087,217
- 接入市场
- 5
- 接口根地址
- namester.ai
「已索引」不等于「取得到」:已索引 2,920,052 行,但所有代码路径都会排除结束时间已过的挂牌,因此任何请求最多只能取到其中 2,594,318 行,另有 325,734 行根本取不到。GET /api/v1/stats 会现算这两个数字。
鉴权
每个请求都要在 Authorization 头里带 API key。密钥在控制台创建与吊销。我们只存密钥的 SHA-256 哈希,所以完整密钥只在创建那一次显示。
Authorization: Bearer nmst_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx绝不要把密钥放进 URL。 带有下列任一 query 参数的请求会被直接拒绝并返回 400 api_key_in_query,而不是照常返回数据:api_key, apikey, api-key, key, token, access_token。URL 会进入访问日志、Referer 与 shell 历史,所以出现在 URL 里的密钥应当被视为已泄露并立即吊销。
本接口刻意不发任何 CORS 头。写进浏览器 JavaScript 的 API key 就是公开的密钥。请从服务端、定时任务或脚本里调用。
速率限制
额度按 API key 计,不按用户、也不按 IP。一个刷爆的脚本不会连累你其它密钥,共用云出口 IP 的调用者也不会被算成同一个人。
| 档位 | 请求数 | 窗口 | 每小时最多可取行数 |
|---|---|---|---|
| 免费 | 60 | 1 h | 12,000 |
| Pro | 1,000 | 1 h | 200,000 |
每小时行数就是请求额度乘以单页上限 200 行。免费额度的目标是够做真实的选品与监控,而不是够把整个索引镜像一份。
响应始终带 X-RateLimit-Limit 与 X-RateLimit-Window;在我们能报出你的实时用量时,还会带 X-RateLimit-Remaining 与 X-RateLimit-Reset(unix 秒)。请照它们退避,不要靠撞 429 来试探。
超额返回 429,Retry-After 按真实的窗口重置时间算。如果是我们的限流后端自己不可用,我们返回 503 而不是不计量地照常服务 —— 在一个数百万行的公开索引上放开不计量的口子,是更糟的那种失败。
端点
GET/api/v1/domains
搜索索引。下面每一个筛选参数走的都是与站内页面同一条查询,所以同样的条件在网页上看到什么,接口就返回什么。结果用 keyset 游标分页。
省略 status 不等于检索全部。不传 status 时端点只返回进行中的拍卖(status=auction 且尚未结束),在上面那次快照里是 2,920,052 行里的 2,087,217 行。要一次跨所有状态检索,请传 status=all。
所有 status 取值(包括 all)都额外带一条「尚未过期」约束:结束时间已过的挂牌永远不会被返回。这让任何请求的上限停在 2,594,318 行,并把 325,734 行已过期挂牌挡在外面。本就没有结束时间的挂牌(例如一口价库存)不受影响。
curl -s \
-H "Authorization: Bearer $NAMESTER_API_KEY" \
"https://namester.ai/api/v1/domains?status=auction&tld=com&min_score=70&sort=namester_score&order=desc&limit=50"{
"object": "list",
"data": [ { "domain_name": "…", "namester_score": 91, … } ],
"pagination": {
"page_size": 50,
"page_index": 0,
"next_cursor": "eyJ2Ijoi…",
"has_more": true
},
"total": { "value": 11177, "accuracy": "exact" },
"meta": { "api_version": "v1", "namester_score": "…" }
}该响应里的 total 是上面那条查询(status=auction、tld=com、min_score=70)的真实命中数,2026-09-09T15:35Z 实测 11,177 行。它不是库存规模,sort / order / limit 也不会改变它。
GET/api/v1/domains/{domain}
按名字查单个域名。请传 ASCII / punycode 形态;我们只会帮你转成小写,不做其它转换。
如果一个名字当前没有挂在任何已接入的市场上,返回 404 domain_not_found。这是一个真实的答案而不是我们出错:索引里只有此刻在售的名字。
curl -s \
-H "Authorization: Bearer $NAMESTER_API_KEY" \
"https://namester.ai/api/v1/domains/example.com"GET/api/v1/stats
全库口径的计数,免得你从一条带筛选的搜索里去推断库存规模。决定怎么翻页之前先调它。
total 是已索引的全部行数;live 就是省略 status 时搜索端点返回的集合;retrievable 是 status=all 的上限。by_status 与 by_source 是全库计数,它们的键恰好就是 status(去掉 all)与 source 的合法取值。结果缓存五分钟,as_of 告诉你这批计数是什么时候取的。
只要有任何一项计数失败,整个响应就是 503 query_failed。失败的计数绝不会被写成 0:进了你的解析器之后,「真的 0 行」和「我们没量出来」长得一模一样,而你会据此把一整个市场从轮询列表里划掉。
curl -s \
-H "Authorization: Bearer $NAMESTER_API_KEY" \
"https://namester.ai/api/v1/stats"{
"object": "stats",
"data": {
"as_of": "2026-09-09T15:35:02.896Z",
"total": 2920052,
"live": 2087217,
"retrievable": 2594318,
"by_status": {
"auction": 2344608,
"dropping": 118359,
"available": 457085
},
"by_source": {
"namecheap": 1303218,
"godaddy": 1083827,
"dynadot": 495835,
"dropcatch": 22877,
"sedo": 14295
}
},
"meta": { "api_version": "v1", "namester_score": "…", "counts": "…" }
}查询参数
所有参数都是可选的,且只对搜索端点有效。单域名查询端点不接受任何参数。
- 无法识别的参数一律 400,而不是被悄悄忽略。否则一个写错的 min_scores 会让你拿到整个索引最靠前的一页,而你以为它已经被筛过了。
- 同一个参数出现多次一律 400。只取第一个、丢掉其余的,看起来会像是生效了。
- 空值等同于没传,所以 tld= 的行为与完全不写 tld 一致。
- tld 与 source 在使用前会被转成小写。它们与库里的小写值做精确等值比较,否则 tld=COM 会是一个完全合法、却必然什么都匹配不到的请求。
- limit 接受 1 到 200 的整数。小于 10 的值会被抬到 10 —— 那是底层查询层的下限。默认 50。真正生效的值总会在 pagination.page_size 里回给你。
| 参数 | 类型 | 说明 |
|---|---|---|
search | string, ≤ 300 chars | 对域名做子串匹配。关键词按空白切分,每个词都必须命中,与顺序无关。若某个词在剔除主机名里不可能出现的字符后不足两个字符,会连同这个词的名字一起以 400 拒绝,而不是被静默丢弃。重复的词没关系,但不同的词超过五个会 400 —— 丢掉第六个会让结果集变宽而不是变窄。 |
status | auction | dropping | available | all | 检索哪一种挂牌状态。不传时只返回进行中的拍卖(status=auction 且尚未结束);传 status=all 可一次跨所有状态检索。任何取值(包括 all)都仍然排除结束时间已过的挂牌。auction 是进行中的拍卖,dropping 是即将被删除的域名,available 是一口价挂牌。 |
tld | string, ≤ 63 chars | 完整公共后缀,可以含点:com、it.com、co.uk。这是 Public Suffix List 定义的整个后缀,不是最后一段。取值会被自动转小写。tld=all 是「不按 TLD 筛选」的通配值,不是一个叫 all 的后缀。 |
source | string, ≤ 32 chars | 市场标识,会被自动转小写。当前有哪些取值见下方表格。source=all 是「不按来源筛选」的通配值。 |
min_price | number, ≥ 0 | 挂牌价格下限。请连同 bid_count 一起看:出价数为 0 的价格是要价,不是出价。 |
max_price | number, ≥ 0 | 挂牌价格上限。 |
min_length | integer, 1–63 | 品牌部分的最小长度 —— 长度是去掉公共后缀之后算的。 |
max_length | integer, 1–63 | 品牌部分的最大长度。 |
no_hyphens | true | false | 排除品牌部分含连字符的名字。punycode 后缀里的连字符不算。 |
no_numbers | true | false | 排除品牌部分含数字的名字。 |
min_score | number, 0–100 | namester_score 下限。这个分数是什么、不是什么,见下面专门的一节。 |
max_score | number, 0–100 | namester_score 上限。 |
min_dr | number, 0–100 | Ahrefs Domain Rating 下限。只有少数行带 SEO 指标,所以任何大于 0 的下限同时也会把指标未知的行全部筛掉。 |
max_dr | number, 0–100 | Ahrefs Domain Rating 上限。 |
min_tf | number, 0–100 | Majestic Trust Flow 下限。 |
max_tf | number, 0–100 | Majestic Trust Flow 上限。 |
min_backlinks | integer, ≥ 0 | 外链数下限。 |
min_age | integer, 0–100 | 域名年龄下限(年),由最早的存档快照推算。索引里最老的名字目前是 32 年。 |
min_search_volume | integer, ≥ 0 | 对应关键词的月搜索量下限。 |
min_word_count | integer, 0–3 | 覆盖品牌部分所需的英文词数下限。0 表示完全切不开,实测最大值是 3。这是一个「可读性」筛选开关,不是质量分:它在 namester_score 里权重为零。 |
min_extensions | integer, ≥ 0 | 同一个品牌部分已经在多少个**其它**公共后缀上被注册。这是需求信号,不是质量分。传 0 不会下推,因为 extensions_taken >= 0 会悄悄把所有「数值未知」的行筛掉。 |
ending_within | integer, 1–8760 | 只要求在这么多小时内结束的拍卖。可以不传 status(那时等同于 status=auction)。它只对拍卖生效,因此与任何其它 status(包括 all)同时传会直接 400,而不是被静默忽略。 |
sort | domain_name | length | current_bid | auction_end_time | bid_count | buy_now_price | namester_score | 排序字段。 |
order | asc | desc | 排序方向。 |
limit | integer, 1–200 | 每页行数。 |
cursor | string, ≤ 512 chars | 上一页返回的不透明 keyset 游标,原样传回即可。 |
可排序字段:domain_name, length, current_bid, auction_end_time, bid_count, buy_now_price, namester_score。不指定排序时默认按 namester_score 倒序,status=dropping 例外,默认按名字从短到长。
分页
分页是 keyset,不是 offset:每一页返回一个不透明的 next_cursor,原样传回来就能取下一页。刻意没有 offset 或 page 参数 —— 在数百万行上做偏移分页会一页比一页慢,而且只要底层数据在两次请求之间变了就会漏行或重复行,而实时拍卖数据是一直在变的。
读 has_more,或看 next_cursor 是不是 null。不要用「这一页是满的」来推断还有没有下一页:满页就只是满页,不代表到底了。
游标里编码了它被创建时的筛选条件与排序。你改了其中任何一项,这个游标会被判为陈旧,于是你拿到的是新结果集的第一页,而不是旧结果集中间的某一页。
# 翻页:把上一页返回的 pagination.next_cursor 原样传回来
curl -s \
-H "Authorization: Bearer $NAMESTER_API_KEY" \
"https://namester.ai/api/v1/domains?status=auction&tld=com&limit=50&cursor=$CURSOR"total.value 是匹配行数,total.accuracy 说明它是怎么来的:exact 是真实计数,planned 是精确计数超出时间预算时用规划器估算的兜底值。planned 可能偏差很大,不要把它当作精确数字展示。
返回字段
两个端点返回同一种域名对象,字段集合固定如下:
domain_nametldstatussourcelengthhas_hyphenshas_numbersword_countnamester_scorecurrent_bidstart_pricebuy_now_pricebid_countauction_end_timeauction_typemarketplace_urlextensions_takendomain_agevaluationspam_riskahrefs_drahrefs_backlinksmajestic_tfmajestic_cfmajestic_backlinkssemrush_authoritysemrush_backlinkskeyword_search_volumeopen_pagerankcloudflare_rankingumbrella_rankinglast_sold_pricelast_sold_yearlast_checked_atupdated_at没有值的字段返回 null 而不是省略,所以每个对象的形状完全一致。内部字段永远不会返回 —— 正因为如此,我们加列时不会弄坏你的解析代码。
关于 namester_score
namester_score 在 0 到 100 之间衡量的是需求与流动性:这个名字被抢的激烈程度,以及它找到买家的可能性。它由长度、字符构成、公共后缀、域名年龄、市场活跃度,以及我们手上有的权威性指标算出。
它不是价格、不是评估价、不是估值,也不得被当成估值使用。另有一个 valuation 字段是市场方自报的估价,与本分数无关。每一个成功响应都会在 meta.namester_score 里重复这句话,好让这条边界跟着数据一起走。
2026-09-09 索引里出现过的最高分是 98。量程定义为 0 到 100,但上端取决于我们富集到多少权重数据,所以贴近 100 的阈值完全可能合理地返回空结果。
错误
错误始终使用同一个信封,并且绝不包含数据库报错原文、SQL 片段或堆栈。4xx 表示请求本身要改;5xx 表示问题在我们这边,重试是有意义的。
失败绝不会被伪装成空结果。 查询没能完成时返回 503 query_failed,绝不会是 HTTP 200 加一个空数组。这两件事对你的代码意义相反:一个该重试,另一个说明该放宽筛选。真的查成功且一条都没匹配上,返回的是 200、空的 data 数组、total 为 0。
{
"error": {
"code": "invalid_parameter",
"message": "\"min_score\" must be <= 100, got 140.",
"param": "min_score"
}
}| 状态码 | 错误码 | 含义 |
|---|---|---|
| 400 | api_key_in_query | 把 API key 放进了 query string。请求已被拒绝;请吊销那把密钥。 |
| 400 | invalid_parameter | 某个参数的值不可用。param 字段指出是哪一个,message 说明哪里不对。 |
| 400 | unknown_parameter | 存在无法识别的参数。param 字段指出是哪一个。 |
| 400 | invalid_domain | 路径里的这一段不是合法域名。 |
| 401 | missing_api_key | 没有发送 Authorization 头。 |
| 401 | invalid_authorization_header | 有 Authorization 头,但不是 Bearer 加密钥的形式。 |
| 401 | invalid_api_key | 密钥格式不对、不存在,或已被吊销。这三种情况刻意返回完全相同的响应,免得有人靠接口差异去枚举哪些密钥存在。 |
| 404 | domain_not_found | 该域名当前不在索引里。 |
| 429 | rate_limited | 这把密钥的额度已用尽。请等到 Retry-After 指出的时间。 |
| 503 | key_lookup_unavailable | 我们没能完成密钥查询本身,所以无法校验。这与你的密钥无关,请重试。 |
| 503 | plan_lookup_unavailable | 我们没能解析出你的档位,也就无法决定该用哪一档额度。我们选择拒绝而不是猜:猜低会把付费用户挡在门外,猜高等于白送额度。 |
| 503 | rate_limit_unavailable | 限流暂时不可用,所以这个请求被拒绝,而不是不计量地照常服务。 |
| 503 | query_failed | 查询没有完成。这不是空结果集,你的筛选条件很可能是有匹配的。在统计端点上,它表示至少有一项计数没能测出来,而我们拒绝把没量出来的数字写成 0。请重试。 |
每一个 5xx 都带 Retry-After,429 的 Retry-After 按真实的限流窗口重置时间算。请照它退避。
索引里有什么
2026-09-09T15:35Z 那次快照的精确计数。索引里放的是此刻正在下列市场挂牌的域名;下架的域名会在几天内被清理掉。
本页是快照,GET /api/v1/stats 是现算的,永远比这一页新 —— 请以它为准,不要拿这一页来反驳端点返回的数字。
| source | 行数 |
|---|---|
namecheap | 1,303,218 |
godaddy | 1,083,827 |
dynadot | 495,835 |
dropcatch | 22,877 |
sedo | 14,295 |
- 按状态:auction 2,344,608 行,dropping 118,359 行,available 457,085 行。
- 计数当时,118,359 条 dropping 里只有 50,016 条的删除时间还没过。dropping 挂牌是按天成批到期的,所以这一片在某些时段合理地接近空 —— 那是数据本身,不是故障。
- tld 存的是完整公共后缀,所以有 13,020 行的后缀里带点,例如 co.uk 有 1,986 行。请按整个后缀查询,不要按最后一段。
- 2,920,052 行里有 2,333,471 行带着价格但出价数为 0。那是起拍价或要价,不是出价。把一个数字当成「竞争激烈」的证据之前,先看它旁边的 bid_count。
- 每个市场按自己的节奏重新抓取,从每小时一次到每天一次不等。last_checked_at 是我们最后一次看到这条挂牌的时间,updated_at 是这一行最后一次发生变化的时间。
- 在这次快照里,三个 status 的计数之和与五个 source 的计数之和都正好等于 2,920,052,这正是它没有踩在同步换批窗口上的证据。但不要把这条当契约:这些计数是并发发出的,而同步任务一直在改写这张表,同一天下午早些时候的一轮就撞上了换批,加起来对不上。