PageSourceSearch

https://namewhisper.ai/docs

html namewhisper.ai collected 2026-10-05 12:16:59 UTC 177,716 bytes, 2,675 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <!-- Google Analytics -->
vendor: 66 bytes, lines 4-5
4
5  <script async src="https://www.googletagmanager.com/gtag/js?id=
5G-38V5QSNJ8Y
vendor: 14 bytes, lines 5-6
5"></script>
6  
6<script src="/js/analytics.js?v=2be847fbe7"></script>
6
7  <meta charset="UTF-8">
8  <meta name="viewport" content="width=device-width, initial-scale=1.0">
9  <title>Name Whisper — Developer Documentation</title>
10  
10<script>
vendor: 117 bytes, line 10
10window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date());gtag('config','
10G-38V5QSNJ8Y
vendor: 31 bytes, line 10
10',{page_title:document.title});
10</script>
10
11  <meta name="description" content="Complete developer docs for Name Whisper. 44 MCP tools and 120+ REST API endpoints for ENS name search, valuation, Seaport marketplace trading, swaps, agent identity, and management.">
12  <link rel="canonical" href="https://namewhisper.ai/docs">
13  <meta property="og:type" content="website">
14  <meta property="og:url" content="https://namewhisper.ai/docs">
15  <meta property="og:title" content="Name Whisper — Developer Documentation">
16  <meta property="og:image" content="https://namewhisper.ai/api/og/page/docs.png">
17  <meta property="og:description" content="Complete developer docs for Name Whisper. 44 MCP tools and 120+ REST API endpoints for ENS name search, valuation, Seaport marketplace trading, swaps, agent identity, and management.">
18  <meta name="twitter:card" content="summary_large_image">
19  <meta name="twitter:image" content="https://namewhisper.ai/api/og/page/docs.png">
20  <meta name="twitter:title" content="Name Whisper — Developer Documentation">
21  <meta name="twitter:description" content="Complete developer docs for Name Whisper. 44 MCP tools and 120+ REST API endpoints for ENS name search, valuation, Seaport marketplace trading, swaps, agent identity, and management.">
22  
22<script type="application/ld+json">
23  {
24    "@context": "https://schema.org",
25    "@type": "TechArticle",
26    "headline": "Name Whisper Developer Documentation",
27    "description": "Complete API reference for the Name Whisper ENS intelligence platform. 44 MCP tools and 120+ REST API endpoints.",
28    "url": "https://namewhisper.ai/docs",
29    "about": { "@type": "SoftwareApplication", "name": "Name Whisper", "applicationCategory": "DeveloperApplication" }
30  }
31  </script>
31
32  <link rel="preconnect" href="https://fonts.googleapis.com">
33  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
34  <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;1,9..40,300&display=swap" rel="stylesheet">
35  <style>
36    *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
37
38    :root {
39      --bg: #08080a;
40      --bg-elevated: #0e0e12;
41      --surface: #131318;
42      --surface2: #1a1a22;
43      --surface3: #222230;
44      --border: #252530;
45      --border-subtle: #1c1c26;
46      --text: #eae8e4;
47      --text-secondary: #9b99a8;
48      --text-dim: #918ea2;
49      --accent: #d4a853;
50      --accent-bright: #f0c96e;
51      --accent-dim: #b08a35;
52      --accent-glow: rgba(212, 168, 83, 0.12);
53      --accent-glow-strong: rgba(212, 168, 83, 0.25);
54      --green: #5ee6a0;
55      --green-dim: rgba(94, 230, 160, 0.12);
56      --red: #f07070;
57      --blue: #6cacf0;
58      --blue-dim: rgba(108, 172, 240, 0.12);
59      --purple: #b08cf0;
60      --purple-dim: rgba(176, 140, 240, 0.12);
61      --cyan: #5ec6e6;
62      --cyan-dim: rgba(94, 198, 230, 0.12);
63      --font-display: 'Space Grotesk', -apple-system, sans-serif;
64      --font-body: 'DM Sans', -apple-system, sans-serif;
65      --font-mono: 'JetBrains Mono', 'SF Mono', monospace;
66      --radius: 12px;
67      --radius-sm: 8px;
68      --radius-xs: 6px;
69      --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
70    }
71
72    body {
73      font-family: var(--font-body);
74      font-size: 16px;
75      background: var(--bg);
76      color: var(--text);
77      min-height: 100vh;
78      overflow-x: hidden;
79      -webkit-font-smoothing: antialiased;
80    }
81
82    body::before {
83      content: '';
84      position: fixed;
85      inset: 0;
86      opacity: 0.02;
87      background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
88      pointer-events: none;
89      z-index: 9999;
90    }
91
92    .ambient {
93      position: fixed;
94      top: -30vh;
95      left: 50%;
96      transform: translateX(-50%);
97      width: 90vw;
98      height: 60vh;
99      background: radial-gradient(ellipse 70% 55% at 50% 40%, rgba(108,172,240,0.12) 0%, transparent 70%);
100      pointer-events: none;
101      z-index: 0;
102    }
103
104    /* ── Layout ──────────────────────────────────────── */
105    .page {
106      position: relative;
107      z-index: 1;
108      max-width: 1060px;
109      margin: 0 auto;
110      padding: 0 24px;
111    }
112
113    /* ── Header ──────────────────────────────────────── */
114    .header {
115      display: flex;
116      align-items: center;
117      justify-content: space-between;
118      padding: 18px 0;
119      border-bottom: 1px solid var(--border-subtle);
120      animation: fadeIn 0.5s var(--ease-out);
121    }
122    .header-right { display: flex; align-items: center; gap: 8px; }
123    .logo { display: flex; align-items: baseline; gap: 6px; text-decoration: none; }
124    .logo-name {
125      font-family: var(--font-display); font-size: 24px; font-weight: 700;
126      background: linear-gradient(135deg, #f5d98a, var(--accent-bright), var(--accent), var(--accent-dim));
127      -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
128    }
129    .logo-whisper {
130      font-family: var(--font-display); font-size: 24px; font-weight: 300; letter-spacing: 2px;
131      background: linear-gradient(135deg, #999, #bbb, #888, #777);
132      -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
133    }
134    .nav-link {
135      color: var(--text-secondary); font-family: var(--font-body); font-size: 13px;
136      text-decoration: none; padding: 6px 12px; border-radius: 100px;
137      transition: all 0.2s var(--ease-out);
138    }
139    .nav-link:hover { color: var(--accent); background: var(--accent-glow); }
140    .nav-link.active { color: var(--accent); }
141
142    /* ── Hero ─────────────────────────────────────────── */
143    .hero {
144      padding: 60px 0 48px;
145      text-align: center;
146      animation: fadeUp 0.6s var(--ease-out);
147    }
148    .hero-label {
149      font-family: var(--font-mono); font-size: 11px; font-weight: 500;
150      letter-spacing: 2px; text-transform: uppercase; color: var(--accent);
151      margin-bottom: 20px;
152      display: flex; align-items: center; justify-content: center; gap: 8px;
153    }
154    .hero-label::before, .hero-label::after {
155      content: ''; width: 24px; height: 1px; background: var(--accent-dim);
156    }
157    .hero h1 {
158      font-family: var(--font-display); font-size: 44px; font-weight: 700;
159      line-height: 1.1; letter-spacing: -1.5px; margin-bottom: 16px;
160    }
161    .hero h1 em {
162      font-style: normal;
163      background: linear-gradient(135deg, #f5d98a, var(--accent-bright), var(--accent));
164      -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
165    }
166    .hero-sub {
167      font-size: 17px; color: var(--text-secondary); line-height: 1.6;
168      max-width: 600px; margin: 0 auto 28px;
169    }
170    .hero-endpoints {
171      display: flex; justify-content: center; gap: 12px; flex-wrap: wrap;
172    }
173    .hero-endpoint {
174      display: inline-flex; align-items: center; justify-content: center; gap: 10px;
175      background: var(--surface); border: 1px solid var(--border);
176      border-radius: var(--radius-sm); padding: 12px 18px;
177      font-family: var(--font-mono); font-size: 12px;
178      /* The URL is one unbreakable token — let the chip wrap and the URL
179         break so it can never exceed the viewport. */
180      flex-wrap: wrap; max-width: 100%;
180 overflow-wrap: anywhere;
181    }
182    .hero-endpoint .method { color: var(--green); font-weight: 600; }
183    .hero-endpoint .url { color: var(--accent-bright); }
184    .hero-endpoint .label { color: var(--text-dim); font-size: 10px; margin-right: 4px; }
185    .copy-btn {
186      background: var(--surface2); border: 1px solid var(--border);
187      color: var(--text-dim); font-family: var(--font-mono); font-size: 10px;
188      padding: 3px 7px; border-radius: var(--radius-xs); cursor: pointer;
189      transition: all 0.15s ease;
190    }
191    .code-block .copy-btn {
192      position: absolute; top: 8px; right: 8px; margin: 0;
193    }
194    .copy-btn:hover { color: var(--text-secondary); border-color: var(--accent-dim); }
195
196    /* ── Docs Layout ─────────────────────────────────── */
197    .docs-layout {
198      display: grid;
199      grid-template-columns: 200px 1fr;
200      gap: 48px;
201      padding: 48px 0;
202    }
203
204    /* ── Sidebar ─────────────────────────────────────── */
205    .sidebar {
206      position: sticky;
207      top: 24px;
208      max-height: calc(100vh - 48px);
209      overflow-y: auto;
210      padding-right: 16px;
211    }
212    .sidebar::-webkit-scrollbar { width: 3px; }
213    .sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
214    .sidebar-section { margin-bottom: 20px; }
215    .sidebar-label {
216      font-family: var(--font-mono); font-size: 9px; font-weight: 600;
217      letter-spacing: 2px; text-transform: uppercase;
218      color: var(--text-dim); margin-bottom: 8px; padding-left: 10px;
219    }
220    .sidebar-link {
221      display: block; color: var(--text-dim); font-size: 12px;
222      text-decoration: none; padding: 5px 10px; border-radius: var(--radius-xs);
223      border-left: 2px solid transparent;
224      transition: all 0.15s ease;
225    }
226    .sidebar-link:hover { color: var(--text-secondary); background: var(--surface); }
227    .sidebar-link.active { color: var(--accent); border-left-color: var(--accent); background: var(--accent-glow); }
228    .sidebar-tool-link {
229      display: block; color: var(--text-dim); font-family: var(--font-mono); font-size: 10px;
230      text-decoration: none; padding: 3px 10px 3px 18px;
231      transition: color 0.15s ease;
232    }
233    .sidebar-tool-link:hover { color: var(--text-secondary); }
234
235    /* ── Content ──────────────────────────────────────── */
236    .content { min-width: 0; }
237
238    .doc-section { padding-bottom: 48px; margin-bottom: 48px; border-bottom: 1px solid var(--border-subtle); }
239    .doc-section:last-child { border-bottom: none; }
240
241    .section-label {
242      font-family: var(--font-mono); font-size: 10px; font-weight: 600;
243      letter-spacing: 2.5px; text-transform: uppercase;
244      color: var(--text-dim); margin-bottom: 10px;
245    }
246    .section-title {
247      font-family: var(--font-display); font-size: 26px; font-weight: 600;
248      letter-spacing: -0.5px; margin-bottom: 20px;
249    }
250    .section-desc {
251      font-size: 14px; color: var(--text-secondary); line-height: 1.7; margin-bottom: 24px;
252      max-width: 680px;
253    }
254
255    /* ── Code Blocks ─────────────────────────────────── */
256    .code-block {
257      background: var(--bg); border: 1px solid var(--border);
258      border-radius: var(--radius-xs); padding: 16px 50px 16px 18px;
259      font-family: var(--font-mono); font-size: 12px; line-height: 1.7;
260      color: var(--text-secondary); overflow-x: auto; position: relative;
261      white-space: pre; margin-bottom: 16px;
262    }
263    .code-block .kw { color: var(--purple); }
264    .code-block .fn { color: var(--blue); }
265    .code-block .str { color: var(--green); }
266    .code-block .cmt { color: var(--text-dim); }
267    .code-block .num { color: var(--accent-bright); }
268
269    /* ── Connect Cards ───────────────────────────────── */
270    .connect-grid { display: grid; grid-template-columns: 1fr; gap: 2px; margin-bottom: 24px; }
271    .connect-card {
272      background: var(--surface); border: 1px solid var(--border-subtle); padding: 28px 24px;
273      /* Grid items default to min-width:auto, which lets the pre-formatted
274         .code-block inside set the card's width and push the page sideways.
275         Pin it to 0 so the code block scrolls inside its own box instead. */
276      min-width: 0;
277    }
278    .connect-card:first-child { border-radius: var(--radius) var(--radius) 0 0; }
279    .connect-card:last-child { border-radius: 0 0 var(--radius) var(--radius); }
280    .connect-card-label {
281      font-family: var(--font-mono); font-size: 10px; font-weight: 600;
282      letter-spacing: 2px; text-transform: uppercase; color: var(--text-dim); margin-bottom: 6px;
283    }
284    .connect-card-title {
285      font-family: var(--font-display); font-size: 17px; font-weight: 600; margin-bottom: 16px;
286    }
287    .connect-primary .connect-card-title { color: var(--accent-bright); }
288    .connect-note {
289      font-size: 12px; color: var(--text-dim); margin-top: 12px; line-height: 1.5;
290    }
291
292    /* ── Tool Reference ──────────────────────────────── */
293    .tool-category { margin-bottom: 36px; }
294    .tool-category-header {
295      display: flex; align-items: center; gap: 10px;
296      margin-bottom: 16px; padding-bottom: 10px;
297      border-bottom: 1px solid var(--border-subtle);
298    }
299    .tool-category-name { font-family: var(--font-display); font-size: 18px; font-weight: 600; }
300    .tool-badge {
301      font-family: var(--font-mono); font-size: 10px; font-weight: 600;
302      letter-spacing: 1px; text-transform: uppercase; padding: 3px 8px; border-radius: 4px;
303    }
304    .badge-free { color: var(--green); background: var(--green-dim); }
305    .badge-tx { color: var(--accent); background: var(--accent-glow); }
306    .badge-internal { color: var(--text-dim); background: rgba(92,90,106,0.15); }
307    .tool-count {
308      font-family: var(--font-mono); font-size: 11px; color: var(--text-dim); margin-left: auto;
309    }
310
311    /* ── Tool Card ────────────────────────────────────── */
312    .tool-card {
313      background: var(--surface); border: 1px solid var(--border-subtle);
314      border-radius: var(--radius-sm); margin-bottom: 8px;
315      transition: border-color 0.2s ease;
316    }
317    .tool-card:hover { border-color: var(--border); }
318    .tool-card-header {
319      display: flex; align-items: center; gap: 12px;
320      padding: 14px 20px; cursor: pointer; user-select: none;
321    }
322    .tool-card-header::after {
323      content: '+'; font-family: var(--font-mono); font-size: 14px; color: var(--text-dim);
324      margin-left: auto; transition: transform 0.2s ease;
325    }
326    .tool-card.open .tool-card-header::after { content: '\2212'; color: var(--accent); }
327    /* Endpoint paths are single unbreakable tokens — allow them to break so
328       the longest one cannot set the card width on very narrow screens. */
329    .tool-card-name { font-family: var(--font-mono); font-size: 13px; font-weight: 500; color: var(--accent-bright); min-width: 0;
329 overflow-wrap: anywhere; }
330    .tool-card-summary { font-size: 12.5px; color: var(--text-secondary); }
331    .tool-card-body {
332      display: none; padding: 0 20px 20px;
333      border-top: 1px solid var(--border-subtle);
334    }
335    .tool-card.open .tool-card-body { display: block; padding-top: 16px; }
336    .tool-card-desc {
337      font-size: 13px; color: var(--text-secondary); line-height: 1.6; margin-bottom: 16px;
338    }
339
340    /* ── Parameter Table ─────────────────────────────── */
341    .param-table { width: 100%; border-collapse: collapse; margin-bottom: 16px; }
342    .param-table th {
343      font-family: var(--font-mono); font-size: 10px; font-weight: 600;
344      letter-spacing: 1.5px; text-transform: uppercase; color: var(--text-dim);
345      text-align: left; padding: 8px 12px; border-bottom: 1px solid var(--border);
346    }
347    .param-table td {
348      font-size: 12px; padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);
349      color: var(--text-secondary); vertical-align: top;
350    }
351    .param-table td:first-child {
352      font-family: var(--font-mono); font-size: 12px; color: var(--text); white-space: nowrap;
353    }
354    .param-table .type { color: var(--purple); font-family: var(--font-mono); font-size: 11px; }
355    .param-table .required { color: var(--accent); font-family: var(--font-mono); font-size: 10px; }
356    .param-table .optional { color: var(--text-dim); font-family: var(--font-mono); font-size: 10px; }
357
358    .example-label {
359      font-family: var(--font-mono); font-size: 10px; font-weight: 600;
360      letter-spacing: 1.5px; text-transform: uppercase; color: var(--text-dim);
361      margin-bottom: 8px;
362    }
363
364    /* ── Workflow Cards ───────────────────────────────── */
365    .workflow-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
366    .workflow-card {
367      background: var(--surface); border: 1px solid var(--border-subtle);
368      border-radius: var(--radius-sm); padding: 24px;
369    }
370    .workflow-title {
371      font-family: var(--font-display); font-size: 16px; font-weight: 600; margin-bottom: 12px;
372    }
373    .workflow-steps { list-style: none; }
374    .workflow-steps li {
375      font-size: 13px; color: var(--text-secondary); line-height: 1.6;
376      padding: 6px 0; padding-left: 24px; position: relative;
377    }
378    .workflow-steps li::before {
379      content: attr(data-step); position: absolute; left: 0;
380      font-family: var(--font-mono); font-size: 11px; font-weight: 600; color: var(--accent);
381    }
382    .workflow-steps code {
383      font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);
384      background: var(--accent-glow); padding: 1px 6px; border-radius: 3px;
385    }
386
387    /* ── Standards ────────────────────────────────────── */
388    .standards-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2px; }
389    .standard-card {
390      background: var(--surface); border: 1px solid var(--border-subtle); padding: 24px;
391    }
392    .standard-card:first-child { border-radius: var(--radius) 0 0 var(--radius); }
393    .standard-card:last-child { border-radius: 0 var(--radius) var(--radius) 0; }
394    .standard-name {
395      font-family: var(--font-mono); font-size: 14px; font-weight: 600; margin-bottom: 8px;
396    }
397    .standard-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.5; }
398    .standard-status {
399      font-family: var(--font-mono); font-size: 10px; letter-spacing: 1px;
400      text-transform: uppercase; margin-top: 8px;
401    }
402    .status-live { color: var(--green); }
403    .status-partial { color: var(--accent); }
404
405    /* ── Footer ────────────────────────────────────────── */
406    .footer {
407      padding: 40px 0; border-top: 1px solid var(--border-subtle);
408      display: flex; align-items: center; justify-content: space-between; margin-top: 20px;
409    }
410    .footer-brand {
411      font-family: var(--font-display); font-size: 13px; color: var(--text-dim);
412    }
413    .footer-links { display: flex; gap: 20px; flex-wrap: wrap; }
414    .footer-links a { font-family: var(--font-mono); font-size: 11px; color: var(--text-dim); text-decoration: none; letter-spacing: 0.3px; transition: color 0.2s; }
415    .footer-links a:hover { color: var(--accent); }
416
417    /* ── Animation ──────────────────────────────────────── */
418    @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
419    @keyframes fadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }
420
421    /* ── Responsive ─────────────────────────────────────── */
422    @media (max-width: 900px) {
423      .docs-layout { grid-template-columns: 1fr; gap: 0; }
424      .sidebar {
425        position: relative; top: 0; max-height: none;
426        display: flex; flex-wrap: wrap; gap: 4px;
427        padding: 16px 0; border-bottom: 1px solid var(--border-subtle);
428        margin-bottom: 24px;
429      }
430      .sidebar-section { margin-bottom: 8px; }
431      .sidebar-label { display: none; }
432      .sidebar-tool-link { display: none; }
433      .sidebar-link { font-size: 11px; padding: 4px 10px; }
434    }
435    @media (max-width: 768px) {
436      .page { padding: 0 16px; }
437      .logo-name, .logo-whisper { font-size: 20px; }
438      /* Nav pills wrap onto their own row under the logo rather than
439         widening the page. Sized to match the mobile sidebar pills. */
440      .header { padding: 14px 0; flex-wrap: wrap; gap: 8px 12px; }
441      .logo { flex-shrink: 0; }
442      .header-right { flex-wrap: wrap; min-width: 0; row-gap: 6px; }
443      .nav-link { flex-shrink: 0; font-size: 11px; padding: 4px 10px; }
444      .hero { padding: 40px 0 32px; }
445      .hero h1 { font-size: 28px; letter-spacing: -0.5px; }
446      .hero-sub { font-size: 15px; }
447      .hero-endpoints { flex-direction: column; align-items: center; }
448      .hero-endpoint { font-size: 11px; padding: 10px 14px; }
449      .connect-grid { grid-template-columns: 1fr; }
450      .connect-card { border-radius: 0 !important; }
451      .connect-card:first-child { border-radius: var(--radius) var(--radius) 0 0 !important; }
452      .connect-card:last-child { border-radius: 0 0 var(--radius) var(--radius) !important; }
453      .standards-grid { grid-template-columns: 1fr; }
454      .standard-card { border-radius: 0 !important; }
455      .standard-card:first-child { border-radius: var(--radius) var(--radius) 0 0 !important; }
456      .standard-card:last-child { border-radius: 0 0 var(--radius) var(--radius) !important; }
457      .section-title { font-size: 22px; }
458      .footer { flex-direction: column; gap: 16px; text-align: center; }
459      .tool-card-header { flex-wrap: wrap; }
460      .tool-card-summary { flex-basis: 100%; margin-top: 4px; }
461    }
462  </style>
463</head>
464<body>
465  <div class="ambient"></div>
466
467  <div class="page">
468
469    <!-- Header -->
470    <header class="header">
471      <a class="logo" href="/" title="Home">
472        <span class="logo-name">Name</span>
473        <span class="logo-whisper">Whisper</span>
474      </a>
475      <div class="header-right">
476        <a href="/terminal" class="nav-link">Terminal</a>
477        <a href="/guide" class="nav-link">Guide</a>
478        <a href="/docs" class="nav-link active">Docs</a>
479        <a href="/agents" class="nav-link">Agents</a>
480        <a href="/launch" class="nav-link">Launch</a>
481      </div>
482    </header>
483
484    <!-- Hero -->
485    <section class="hero">
486      <div class="hero-label">Developer Documentation</div>
487      <h1><em>44 MCP tools</em> for ENS</h1>
488      <p class="hero-sub">Search, value, trade, swap, and manage ENS names programmatically &mdash; and provision agent identities. 120+ REST API endpoints. Dual transport &mdash; connect via HTTP or stdio.</p>
489      <div class="hero-endpoints">
490        <div class="hero-endpoint">
491          <span class="label">HTTP</span>
492          <span class="method">POST</span>
493          <span class="url">https://namewhisper.ai/mcp</span>
494          <button class="copy-btn" onclick="copyText('https://namewhisper.ai/mcp', this)">copy</button>
495        </div>
496        <div class="hero-endpoint">
497          <span class="label">stdio</span>
498          <span class="method">RUN</span>
499          <span class="url">node mcp-server.js</span>
500          <button class="copy-btn" onclick="copyText('node mcp-server.js', this)">copy</button>
501        </div>
502      </div>
503    </section>
504
505    <!-- Docs Layout -->
506    <div class="docs-layout">
507
508      <!-- Sidebar -->
509      <nav class="sidebar">
510        <div class="sidebar-section">
511          <div class="sidebar-label">Getting Started</div>
512          <a href="#quickstart" class="sidebar-link active">Quick Start</a>
513          <a href="#workflows" class="sidebar-link">Workflows</a>
514          <a href="#standards" class="sidebar-link">Standards</a>
515          <a href="#payments" class="sidebar-link">Payments</a>
516        </div>
517        <div class="sidebar-section">
518          <div class="sidebar-label">MCP Tools</div>
519          <a href="#cat-discovery" class="sidebar-link">Discovery (9)</a>
520          <a href="#cat-intelligence" class="sidebar-link">Intelligence (3)</a>
521          <a href="#cat-commerce" class="sidebar-link">Commerce (10)</a>
522          <a href="#cat-management" class="sidebar-link">Management (8)</a>
523          <a href="#cat-namewrapper" class="sidebar-link">NameWrapper (5)</a>
524          <a href="#cat-access" class="sidebar-link">Access (2)</a>
525          <a href="#cat-agent" class="sidebar-link">Agent Identity (4)</a>
526          <a href="#cat-auth" class="sidebar-link">Authentication (1)</a>
527          <a href="#cat-knowledge" class="sidebar-link">Knowledge (1)</a>
528          <a href="#cat-internal" class="sidebar-link">Internal (1)</a>
529        </div>
530        <div class="sidebar-section">
531          <div class="sidebar-label">REST API</div>
532          <a href="#rest-auth" class="sidebar-link">Authentication</a>
533          <a href="#rest-search" class="sidebar-link">Search (2)</a>
534          <a href="#rest-profiles" class="sidebar-link">Name Profiles (5)</a>
535          <a href="#rest-market" class="sidebar-link">Market Intel (4)</a>
536          <a href="#rest-categories" class="sidebar-link">Categories (4)</a>
537          <a href="#rest-expiry" class="sidebar-link">Expiry (2)</a>
538          <a href="#rest-whales" class="sidebar-link">Whales (4)</a>
539          <a href="#rest-catstats" class="sidebar-link">Category Stats (2)</a>
540          <a href="#rest-marketplace" class="sidebar-link">Marketplace (5)</a>
541          <a href="#rest-trading" class="sidebar-link">Trading (26)</a>
542          <a href="#rest-orderbook" class="sidebar-link">Orderbook (14)</a>
543          <a href="#rest-user" class="sidebar-link">User (17)</a>
544          <a href="#rest-portfolio" class="sidebar-link">Portfolio (4)</a>
545          <a href="#rest-terminal" class="sidebar-link">Terminal (5)</a>
546          <a href="#rest-knowledge" class="sidebar-link">Knowledge (1)</a>
547          <a href="#rest-media" class="sidebar-link">Media (1)</a>
548          <a href="#rest-agents" class="sidebar-link">Agents & Hosting (6)</a>
549          <a href="#rest-guardian" class="sidebar-link">Renewal Guardian (3)</a>
550        </div>
551      </nav>
552
553      <!-- Content -->
554      <main class="content">
555
556        <!-- Quick Start -->
557        <section id="quickstart" class="doc-section">
558          <div class="section-label">Getting Started</div>
559          <div class="section-title">Quick Start</div>
560          <div class="section-desc">Connect to the Name Whisper MCP server in under a minute. Choose HTTP for remote agents or stdio for local development.</div>
561
562          <div class="connect-grid">
563            <div class="connect-card connect-primary">
564              <div class="connect-card-label">Remote</div>
565              <div class="connect-card-title">
565HTTP Transport</div>
566              <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button><span class="kw">import</span> { Client } <span class="kw">from</span> <span class="str">"@modelcontextprotocol/sdk/client/index.js"</span>;
567<span class="kw">import</span> { StreamableHTTPClientTransport } <span class="kw">from</span>
568  <span class="str">"@modelcontextprotocol/sdk/client/streamableHttp.js"</span>;
569
570<span class="kw">const</span> transport = <span class="kw">new</span> <span class="fn">StreamableHTTPClientTransport</span>({
571  url: <span class="str">"https://namewhisper.ai/mcp"</span>,
572});
573
574<span class="kw">const</span> client = <span class="kw">new</span> <span class="fn">Client</span>({
575  name: <span class="str">"my-agent"</span>,
576  version: <span class="str">"1.0.0"</span>,
577});
578
579<span class="kw">await</span> client.<span class="fn">connect</span>(transport);
580
581<span class="cmt">// Call a tool</span>
582<span class="kw">const</span> result = <span class="kw">await</span> client.<span class="fn">callTool</span>({
583  name: <span class="str">"search_ens_names"</span>,
584  arguments: { query: <span class="str">"3-letter words under 0.1 ETH"</span> },
585});</div>
586              <div class="connect-note">Stateful sessions with 30-minute idle timeout. No API key required.</div>
587            </div>
588            <div class="connect-card">
589              <div class="connect-card-label">Local</div>
590              <div class="connect-card-title">stdio Transport</div>
591              <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button><span class="cmt">// Claude Desktop / Cursor config</span>
592{
593  <span class="str">"mcpServers"</span>: {
594    <span class="str">"name-whisper"</span>: {
595      <span class="str">"command"</span>: <span class="str">"node"</span>,
596      <span class="str">"args"</span>: [<span class="str">"mcp-server.js"</span>],
597      <span class="str">"cwd"</span>: <span class="str">"/path/to/nw-terminal"</span>,
598      <span class="str">"env"</span>: {
599        <span class="str">"SUPABASE_URL"</span>: <span class="str">"..."</span>,
600        <span class="str">"SUPABASE_KEY"</span>: <span class="str">"..."</span>
601      }
602    }
603  }
604}</div>
605              <div class="connect-note">Requires the repository cloned with <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">npm install</code> and environment variables configured.</div>
606            </div>
607          </div>
608        </section>
609
610        <!-- Tool Reference -->
611        <section id="tools" class="doc-section">
612          <div class="section-label">Tool Reference</div>
613          <div class="section-title">All 44 tools</div>
614          <div class="section-desc">Each tool accepts JSON parameters and returns <code style="font-family: var(--font-mono); font-size: 12px; color: var(--accent-bright);">{ content: [{ type: "text", text: "..." }] }</code>. Click a tool to see parameters and examples. Trading tools build standard <strong>Seaport</strong> orders, so listings and fills share the same on-chain liquidity as the wider market (including OpenSea); they return unsigned transactions for the caller to sign &mdash; Name Whisper never holds keys.</div>
615
616          <!-- Discovery -->
617          <div id="cat-discovery" class="tool-category">
618            <div class="tool-category-header">
619              <span class="tool-category-name">Discovery</span>
620              <span class="tool-badge badge-free">Read-Only</span>
621              <span class="tool-count">8 tools</span>
622            </div>
623
624            <div class="tool-card" data-tool="search_ens_names">
625              <div class="tool-card-header" onclick="toggleTool(this)">
626                <span class="tool-card-name">search_ens_names</span>
627                <span class="tool-card-summary">Natural language search across 3.5M indexed ENS names</span>
628              </div>
629              <div class="tool-card-body">
630                <div class="tool-card-desc">Automatic intent detection routes to filtered DB search, semantic vector search, creative AI generation, or bulk availability check.</div>
631                <table class="param-table">
632                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
633                  <tr><td>query</td><td>
633<span class="type">string</span></td><td><span class="required">required</span></td><td>Natural language query</td></tr>
634                </table>
635                <div class="example-label">Example</div>
636                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"query"</span>: <span class="str">"ocean themed names under 0.5 ETH"</span> }</div>
637              </div>
638            </div>
639
640            <div class="tool-card" data-tool="enumerate_entities">
641              <div class="tool-card-header" onclick="toggleTool(this)">
642                <span class="tool-card-name">enumerate_entities</span>
643                <span class="tool-card-summary">List a real-world category as ENS labels + availability</span>
644              </div>
645              <div class="tool-card-body">
646                <div class="tool-card-desc">Give a finite real-world category ("NBA hall of fame players", "Pixar feature films", "F1 world champions") and get back verified, correctly-spelled ENS labels grouped by status (available vs registered). Use this instead of generating entity names yourself and calling check_availability &mdash; it eliminates misspellings and invented entries.</div>
647                <table class="param-table">
648                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
649                  <tr><td>category</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>A specific real-world entity category (no price/quality qualifiers)</td></tr>
650                  <tr><td>filter</td><td><span class="type">enum</span></td><td><span class="optional">default: all</span></td><td>all, available, or registered</td></tr>
651                </table>
652                <div class="example-label">Example</div>
653                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"category"</span>: <span class="str">"F1 world champions"</span>, <span class="str">"filter"</span>: <span class="str">"available"</span> }</div>
654              </div>
655            </div>
656
657            <div class="tool-card" data-tool="get_name_details">
658              <div class="tool-card-header" onclick="toggleTool(this)">
659                <span class="tool-card-name">get_name_details</span>
660                <span class="tool-card-summary">Full metadata + listings + ENSIP-25 agent bindings</span>
661              </div>
662              <div class="tool-card-body">
663                <div class="tool-card-desc">Owner, expiry, tags, active listings with prices, active offers, and agent identity text records.<
663/div>
664                <table class="param-table">
665                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
666                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name or label (e.g. "vitalik.eth")</td></tr>
667                </table>
668                <div class="example-label">Example</div>
669                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"name"</span>: <span class="str">"vitalik.eth"</span> }</div>
670              </div>
671            </div>
672
673            <div class="tool-card" data-tool="check_availability">
674              <div class="tool-card-header" onclick="toggleTool(this)">
675                <span class="tool-card-name">check_availability</span>
676                <span class="tool-card-summary">Bulk verify registration status</span>
677              </div>
678              <div class="tool-card-body">
679                <div class="tool-card-desc">Returns status (AVAILABLE, REGISTERED, EXPIRED, INVALID), owner, expiry, and registration cost for each name.</div>
680                <table class="param-table">
681                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
682                  <tr><td>names</td><td><span class="type">string[]</span></td><td><span class="required">required</span></td><td>Array of ENS names or labels</td></tr>
683                </table>
684                <div class="example-label">Example</div>
685                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"names"</span>: [<span class="str">"coffee.eth"</span>, <span class="str">"tea.eth"</span>, <span class="str">"pixel.eth"</span>] }</div>
686              </div>
687            </div>
688
689            <div class="tool-card" data-tool="get_similar_names">
690              <div class="tool-card-header" onclick="toggleTool(this)">
691                <span class="tool-card-name">get_similar_names</span>
692                <span class="tool-card-summary">Semantic vector search for related names</span>
693              </div>
694              <div class="tool-card-body">
695                <div class="tool-card-desc">256-dimensional vector embeddings across 3.5M indexed ENS names. Returns similarity scores and live marketplace data.</div>
696                <table class="param-table">
697                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
698                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name or label</td></tr>
699                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 20</span></td><td>Max results (max 50)</td></tr>
700                </table>
701                <div class="example-label">Example</div>
702                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"name"</span>: <span class="str">"coffee"</span>, <span class="str">"limit"</span>: <span class="num">10</span> }</div>
703              </div>
704            </div>
705
706            <div class="tool-card" data-tool="get_primary_name">
707              <div class="tool-card-header" onclick="toggleTool(this)">
708                <span class="tool-card-name">get_primary_name</span>
709                <span class="tool-card-summary">Reverse ENS resolution (address &rarr; name)</span>
710              </div>
711              <div class="tool-card-body">
712                <div class="tool-card-desc">Check what primary ENS name is set for a wallet address. Verifies both directions (reverse: address &rarr; name, forward: name &rarr; address).</div>
713                <table class="param-table">
714                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
715                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Ethereum wallet address (0x...)</td></tr>
716                </table>
717                <div class="example-label">Example</div>
718                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"walletAddress"</span>: <span class="str">"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"</span> }</div>
719              </div>
720            </div>
721
722            <div class="tool-card" data-tool="wash_check">
723              <div class="tool-card-header" onclick="toggleTool(this)">
724                <span class="tool-card-name">wash_check</span>
725                <span class="tool-card-summary">Detect wash trading with confidence scoring</span>
726              </div>
727              <div class="tool-card-body">
728                <div class="tool-card-desc">Analyse an ENS sale for wash trading signals. Returns confidence score (0&ndash;1), label (clean/suspicious/likely_wash), detected signals, and summary. Provide tx_hash for pre-computed score, or label + buyer + seller + price for live analysis.</div>
729                <table class="param-table">
730                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
731                  <tr><td>tx_hash</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Transaction hash for pre-computed lookup</td></tr>
732                  <tr><td>label</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>ENS label for live analysis</td></tr>
733                  <tr><td>buyer</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Buyer wallet address</td></tr>
734                  <tr><td>seller</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Seller wallet address</td></tr>
735                  <tr><td>price_eth</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Sale price in ETH</td></tr>
736                </table>
737                <div class="example-label">Example</div>
738                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"tx_hash"</span>: <span class="str">"0xabc123..."</span> }</div>
739              </div>
740            </div>
741
742            <div class="tool-card" data-tool="get_market_activity">
743              <div class="tool-card-header" onclick="toggleTool(this)">
744                <span class="tool-card-name">get_market_activity</span>
745                <span class="tool-card-summary">Recent sales, premium registrations, swaps</span>
746              </div>
747              <div class="tool-card-body">
748                <table class="param-table">
749                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
750                  <tr><td>eventTypes</td><td><span class="type">string[]</span></td><td><span class="optional">default: all</span></td><td>SALE, PREMIUM_REGISTRATION, SWAP (the only three values)</td></tr>
751                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 25</span></td><td>Max results (max 100)</td></tr>
752                  <tr><td>offset</td><td><span class="type">number</span></td><td><span class="optional">default: 0</span></td><td>Pagination offset</td></tr>
753                </table>
754                <div class="example-label">Example</div>
755                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"eventTypes"</span>: [<span class="str">"SALE"</span>], <span class="str">"limit"</span>: <span class="num">10</span> }</div>
756              </div>
757            </div>
758
759            <div class="tool-card" data-tool="get_expiring_names">
760              <div class="tool-card-header" onclick="toggleTool(this)">
761                <span class="tool-card-name">get_expiring_names</span>
762                <span class="tool-card-summary">Names expiring, in grace, or in premium auction</span>
763              </div>
764              <div class="tool-card-body">
765                <div class="tool-card-desc">List ENS names by lifecycle window: expiring soon, in grace (0&n
765dash;90d past expiry, renewable only), or in the 21-day premium Dutch auction (registerable at a decaying premium). Grace and premium rows are validated against on-chain state, and premium rows carry live pricing.</div>
766                <table class="param-table">
767                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
768                  <tr><td>status</td><td><span class="type">string</span></td><td><span class="optional">default: premium</span></td><td>premium, grace, active, all</td></tr>
769                  <tr><td>days</td><td><span class="type">number</span></td><td><span class="optional">default: 30</span></td><td>Look-ahead window for status active/all</td></tr>
770                  <tr><td>minLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Minimum label length in characters</td></tr>
771                  <tr><td>maxLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Maximum label length in characters</td></tr>
772                  <tr><td>charType</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>letters, numbers, emoji, mixed</td></tr>
773                  <tr><td>category</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Collection slug (e.g. 999-club)</td></tr>
774                  <tr><td>dictionaryOnly</td><td><span class="type">boolean</span></td><td><span class="optional">optional</span></td><td>Only dictionary words</td></tr>
775                  <tr><td>sortBy</td><td><span class="type">string</span></td><td><span class="optional">default: expires</span></td><td>expires, length, social</td></tr>
776                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 25</span></td><td>Max results (max 100)</td></tr>
777                </table>
778                <div class="example-label">Example</div>
779                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"status"</span>: <span class="str">"premium"</span>, <span class="str">"charType"</span>: <span class="str">"numbers"</span>, <span class="str">"limit"</span>: <span class="num">10</span> }</div>
780              </div>
781            </div>
782          </div>
783
784          <!-- Intelligence -->
785          <div id="cat-intelligence" class="tool-category">
786            <div class="tool-category-header">
787              <span class="tool-category-name">Intelligence</span>
788              <span class="tool-badge badge-free">Read-Only</span>
789              <span class="tool-count">3 tools</span>
790            </div>
791
792            <div class="tool-card" data-tool="get_valuation">
793              <div class="tool-card-header" onclick="toggleTool(this)">
794                <span class="tool-card-name">get_valuation</span>
795                <span class="tool-card-summary">Three-track valuation with confidence rating</span>
796              </div>
797              <div class="tool-card-body">
798                <div class="tool-card-desc">Track A: comparable sales with IQR outlier removal. Track B: quality-reference from word frequency + entity fame + search interest. Track C: self-history. The three tracks are combined into a weighted blend (re-weighted by how much data each track has), then adjusted by category floors and a market-trend multiplier. Returns low/mid/high with a confidence score.</div>
799                <table class="param-table">
800                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
801                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name or label to value</td></tr>
802                </table>
803                <div class="example-label">Example</div>
804                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"name"</span>: <span class="str">"bitcoin.eth"</span> }</div>
805              </div>
806            </div>
807
808            <div class="tool-card" data-tool="get_wallet_portfolio">
809              <div class="tool-card-header" onclick="toggleTool(this)">
810                <span class="tool-card-name">get_wallet_portfolio</span>
811                <span class="tool-card-summary">All ENS names owned by a wallet</span>
812              </div>
813              <div class="tool-card-body">
814                <table class="param-table">
815                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
816                  <tr><td>wallet</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Wallet address (0x...) or ENS name</td></tr>
817                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 100</span></td><td>Max results (max 200)</td></tr>
818                  <tr><td>offset</td><td><span class="type">number</span></td><td><span class="optional">default: 0</span></td><td>Pagination offset</td></tr>
819                </table>
820                <div class="example-label">Example</div>
821                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"wallet"</span>: <span class="str">"vitalik.eth"</span> }</div>
822              </div>
823            </div>
824
825            <div class="tool-card" data-tool="find_alpha">
826              <div class="tool-card-header" onclick="toggleTool(this)">
827                <span class="tool-card-name">find_alpha</span>
828                <span class="tool-card-summary">Discover underpriced listings</span>
829              </div>
830              <div class="tool-card-body">
831                <div class="tool-card-desc">Scan for names listed below their comparable-sales valuation. Returns ranked opportunities with discount percentage and confidence.</div>
832                <table class="param-table">
833                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
834                  <tr><td>maxPriceEth</td><td><span class="type">number</span></td><td><span class="optional">no cap</span></td><td>Max listing price in ETH</td></tr>
835                  <tr><td>minDiscountPct</td><td><span class="type">number</span></td><td><span class="optional">default: 20</span></td><td>Min discount vs estimated value (1-99)</td></tr>
836                  <tr><td>minLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Min label length</td></tr>
837                  <tr><td>maxLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Max label length</td></tr>
838                  <tr><td>tags</td><td><span class="type">string[]</span></td><td><span class="optional">optional</span></td><td>LETTERS_ONLY, NUMBERS_ONLY, EMOJI, PALINDROME</td></tr>
839                  <tr><td>minConfidence</td><td><span class="type">enum</span></td><td><span class="optional">default: LOW</span></td><td>HIGH (20+ sales), MEDIUM (10+), LOW (3+)</td></tr>
840                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 25</span></td><td>Max results (max 100)</td></tr>
841                </table>
842                <div class="example-label">Example</div>
843                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"maxPriceEth"</span>: <span class="num">0.5</span>, <span class="str">"minDiscountPct"</span>: <span class="num">30</span>, <span class="str">"limit"</span>: <span class="num">10</span> }</div>
844              </div>
845            </div>
846          </div>
847
848          <!-- Commerce -->
849          <div id="cat-commerce" class="tool-category">
850            <div class="tool-category-header">
851              <span class="tool-category-name">Commerce</span>
852              <span class="tool-badge badge-tx">Transaction</span>
853              <span class="tool-count">10 tools</span>
854            </div>
855
856            <div class="tool-card" data-tool="purchase_name">
857              <div class="tool-card-header" onclick="toggleTool(this)">
858                <span class="tool-card-name">purchase_name</span>
859                <span class="tool-card-summary">Register available or buy listed names</span>
860              </div>
861              <div class="tool-card-body">
862                <div class="tool-card-desc">Auto-detects available vs listed. Available: returns registration recipe (commit &rarr; wait 60s &rarr; register). Listed: searches all marketplaces for best price, returns Seaport order data.</div>
863                <table class="param-table">
864                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
865                  <tr><td>name</td><td>
865<span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to purchase</td></tr>
866                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Buyer wallet address</td></tr>
867                  <tr><td>maxPriceEth</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Max price (for listed names)</td></tr>
868                  <tr><td>durationYears</td><td><span class="type">number</span></td><td><span class="optional">default: 1</span></td><td>Registration duration</td></tr>
869                  <tr><td>action</td><td><span class="type">enum</span></td><td><span class="optional">default: auto</span></td><td>buy_listing, register, or auto</td></tr>
870                </table>
871              </div>
872            </div>
873
874            <div class="tool-card" data-tool="make_offer">
875              <div class="tool-card-header" onclick="toggleTool(this)">
876                <span class="tool-card-name">make_offer</span>
877                <span class="tool-card-summary">Submit a bid on a registered name</span>
878              </div>
879              <div class="tool-card-body">
880                <table class="param-table">
881                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
882                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to bid on</td></tr>
883                  <tr><td>amountEth</td><td><span class="type">number</span></td><td><span class="required">required</span></td><td>Offer amount in ETH</td></tr>
884                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Your wallet address</td></tr>
885                  <tr><td>currency</td><td><span class="type">enum</span></td><td><span class="optional">default: WETH</span></td><td>WETH, USDC, or DAI</td></tr>
886                  <tr><td>expiryHours</td><td><span class="type">number</span></td><td><span class="optional">default: 72</span></td><td>Offer expiry in hours</td></tr>
887                </table>
888              </div>
889            </div>
890
891            <div class="tool-card" data-tool="bulk_register">
892              <div class="tool-card-header" onclick="toggleTool(this)">
893                <span class="tool-card-name">bulk_register</span>
894                <span class="tool-card-summary">Batch register up to 20 names in 2 txns</span>
895              </div>
896              <div class="tool-card-body">
897                <div class="tool-card-desc">All names batched into a single batchCommit + batchRegister via Multicall3. Each name gets its own front-running protection secret. A 1% NameWhisper interface fee is charged on top of the ENS price and returned broken out as <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">totalCost.feeEth</code>.</div>
898                <table class="param-table">
899                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
900                  <tr><td>names</td><td><span class="type">string[]</span></td><td><span class="required">required</span></td><td>Array of ENS names (max 20)</td></tr>
901                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Owner wallet address</td></tr>
902                  <tr><td>durationYears</td><td><span class="type">number</span></td><td><span class="optional">default: 1</span></td><td>Duration (same for all)</td></tr>
903                </table>
904              </div>
905            </div>
906
907            <div class="tool-card" data-tool="batch_purchase">
908              <div class="tool-card-header" onclick="toggleTool(this)">
909                <span class="tool-card-name">batch_purchase</span>
910                <span class="tool-card-summary">Buy up to 20 specific listed names in one Seaport tx</span>
911              </div>
912              <div class="tool-card-body">
913                <div class="tool-card-desc">Picks the cheapest batchable listing per name from the shared Seaport orderbook (NameWhisper + OpenSea liquidity), loads each full Seaport order, and encodes one fulfillAvailableAdvancedOrders call. NFTs go directly to your wallet. Seaport skips stale orders and refunds excess ETH — partial success is safe. To buy the cheapest N in a category instead of named names, use sweep.</div>
914                <table class="param-table">
915                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
916                  <tr><td>names</td><td>
916<span class="type">string[]</span></td><td><span class="required">required</span></td><td>ENS names to buy (max 20)</td></tr>
917                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Buyer wallet (receives all names)</td></tr>
918                </table>
919              </div>
920            </div>
921
922            <div class="tool-card" data-tool="sweep">
923              <div class="tool-card-header" onclick="toggleTool(this)">
924                <span class="tool-card-name">sweep</span>
925                <span class="tool-card-summary">Floor-sweep the cheapest N in a category in one tx</span>
926              </div>
927              <div class="tool-card-body">
928                <div class="tool-card-desc">Buys the cheapest N listed names in a category/collection (or matching a filter) in a single Seaport transaction. Same engine as batch_purchase, but selects names cheapest-first across the shared Seaport orderbook (NameWhisper + OpenSea liquidity). Bound it by count and/or total budget, with an optional per-name cap. Capped at 20 names per tx.</div>
929                <table class="param-table">
930                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
931                  <tr><td>category</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Collection slug(s), comma-separated (e.g. 999-club)</td></tr>
932                  <tr><td>q / charType / minLength / maxLength</td><td><span class="type">mixed</span></td><td><span class="optional">optional</span></td><td>Additional cohort filters</td></tr>
933                  <tr><td>count</td><td><span class="type">number</span></td><td><span class="optional">default: 10</span></td><td>How many to sweep, cheapest-first (max 20)</td></tr>
934                  <tr><td>maxBudgetEth</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Total ETH budget</td></tr>
935                  <tr><td>maxPriceEth</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Per-name price cap</td></tr>
936                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Buyer wallet (receives all swept names)</td></tr>
937                </table>
938              </div>
939            </div>
940
941            <div class="tool-card" data-tool="create_listing">
942              <div class="tool-card-header" onclick="toggleTool(this)">
943                <span class="tool-card-name">create_listing</span>
944                <span class="tool-card-summary">List a name for sale on NameWhisper</span>
945              </div>
946              <div class="tool-card-body">
947                <div class="tool-card-desc">Builds an unsigned Seaport OrderComponents payload for wallet signing. After signing, POST the signature to /api/orderbook/submit. 1% seller-paid fee embedded. Requires setApprovalForAll on NameWrapper or BaseRegistrar.</div>
948                <table class="param-table">
949                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
950                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to list</td></tr>
951                  <tr><td>priceEth</td><td><span class="type">number</span></td><td><span class="required">required</span></td><td>Listing price in ETH</td></tr>
952                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seller wallet (must own the name)</td></tr>
953                  <tr><td>durationSeconds</td><td><span class="type">number</span></td><td><span class="optional">default: 2592000</span></td><td>Listing duration (default: 30 days)</td></tr>
954                </table>
955              </div>
956            </div>
957
958            <div class="tool-card" data-tool="batch_create_listings">
959              <div class="tool-card-header" onclick="toggleTool(this)">
960                <span class="tool-card-name">batch_create_listings</span>
961                <span class="tool-card-summary">Bulk-list up to 10 names with one signature</span>
962              </div>
963              <div class="tool-card-body">
964                <div class="tool-card-desc">Returns an array of unsigned Seaport orders. Wallet bulk-signs (EIP-712 SIP-6) in one popup, then each signature is POSTed to /api/orderbook/submit. Per-name errors collected instead of aborting the batch.</div>
965                <table class="param-table">
966                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
967                  <tr><td>listings</td><td><span class="type">object[]</span></td><td><span class="required">required</span></td><td>Array of { name, priceEth } (max 10)</td></tr>
968                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seller wallet (must own all names)</td></tr>
969                  <tr><td>durationSeconds</td><td><span class="type">number</span></td><td><span class="optional">default: 2592000</span></td><td>Duration applied to every listing</td></tr>
970                </table>
971              </div>
972            </div>
973
974            <div class="tool-card" data-tool="cancel_listing">
975              <div class="tool-card-header" onclick="toggleTool(this)">
976                <span class="tool-card-name">cancel_listing</span>
977                <span class="tool-card-summary">Cancel a listing via Seaport.cancel()</span>
978              </div>
979              <div class="tool-card-body">
980                <div class="tool-card-desc">Returns unsigned Seaport.cancel() calldata. Once mined, the order is invalidated everywhere it lives on the shared Seaport orderbook (NameWhisper + OpenSea). Only the original seller can cancel. Use alsoCancel to kill sibling variants atomically.</div>
981                <table class="param-table">
982                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
983                  <tr><td>orderHash</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seaport order hash of the listing</td></tr>
984                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seller wallet (must be the offerer)</td></tr>
985                  <tr><td>alsoCancel</td><td><span class="type">string[]</span></td><td><span class="optional">optional</span></td><td>Sibling order hashes to cancel in same tx</td></tr>
986                </table>
987              </div>
988            </div>
989
990            <div class="tool-card" data-tool="accept_offer">
991              <div class="tool-card-header" onclick="toggleTool(this)">
992                <span class="tool-card-name">accept_offer</span>
993                <span class="tool-card-summary">Seller-side acceptance of a standing offer</span>
994              </div>
995              <div class="tool-card-body">
996                <div class="tool-card-desc">Returns unsigned Seaport.fulfillOrder() calldata. Atomically: pulls buyer's WETH, transfers name to buyer, pays 1% fee. Seller receives offerAmount - 1%. Requires approval for Seaport on NameWrapper / BaseRegistrar.</div>
997                <table class="param-table">
998                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
999                  <tr><td>orderHash</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seaport order hash of the buyer's offer</td></tr>
1000                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seller wallet (must own the ENS name)</td></tr>
1001                </table>
1002              </div>
1003            </div>
1004
1005            <div class="tool-card" data-tool="cancel_offer">
1006              <div class="tool-card-header" onclick="toggleTool(this)">
1007                <span class="tool-card-name">cancel_offer</span>
1008                <span class="tool-card-summary">Cancel an offer you made</span>
1009              </div>
1010              <div class="tool-card-body">
1011                <div class="tool-card-desc">Returns unsigned Seaport.cancel() calldata for the bidder. Once mined, the offer is invali
1011dated across all venues. Only the original bidder can cancel.</div>
1012                <table class="param-table">
1013                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1014                  <tr><td>orderHash</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Seaport order hash of the offer</td></tr>
1015                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Bidder wallet (must be the offerer)</td></tr>
1016                  <tr><td>alsoCancel</td><td><span class="type">string[]</span></td><td><span class="optional">optional</span></td><td>Sibling order hashes to cancel in same tx</td></tr>
1017                </table>
1018              </div>
1019            </div>
1020          </div>
1021
1022          <!-- Management -->
1023          <div id="cat-management" class="tool-category">
1024            <div class="tool-category-header">
1025              <span class="tool-category-name">Management</span>
1026              <span class="tool-badge badge-tx">Transaction</span>
1027              <span class="tool-count">8 tools</span>
1028            </div>
1029
1030            <div class="tool-card" data-tool="set_ens_records">
1031              <div class="tool-card-header" onclick="toggleTool(this)">
1032                <span class="tool-card-name">set_ens_records</span>
1033                <span class="tool-card-summary">Set resolver records (addresses, texts, content hash)</span>
1034              </div>
1035              <div class="tool-card-body">
1036                <div class="tool-card-desc">Multiple records batched into a single multicall transaction. Supports ENSIP-25 agent-registration via agentRegistration shorthand.</div>
1037                <table class="param-table">
1038                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1039                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to configure</td></tr>
1040                  <tr><td>records</td><td><span class="type">object</span></td><td><span class="required">required</span></td><td>{ addresses, texts, contentHash, agentRegistration }</td></tr>
1041                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Owner wallet address</td></tr>
1042                </table>
1043                <div class="example-label">Example</div>
1044                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{
1045  <span class="str">"name"</span>: <span class="str">"myagent.eth"</span>,
1046  <span class="str">"records"</span>: {
1047    <span class="str">"texts"</span>: { <span class="str">"ai.agent"</span>: <span class="str">"true"</span>, <span class="str">"ai.capabilities"</span>: <span class="str">"trading"</span> },
1048    <span class="str">"agentRegistration"</span>: { <span class="str">"registryAddress"</span>: <span class="str">"0xABC..."</span>, <span class="str">"agentId"</span>: <span class="str">"42"</span> }
1049  },
1050  <span class="str">"walletAddress"</span>: <span class="str">"0x1234..."</span>
1051}</div>
1052              </div>
1053            </div>
1054
1055            <div class="tool-card" data-tool="bulk_set_records">
1056              <div class="tool-card-header" onclick="toggleTool(this)">
1057                <span class="tool-card-name">bulk_set_records</span>
1058                <span class="tool-card-summary">Batch set records across up to 50 names</span>
1059              </div>
1060              <div class="tool-card-body">
1061                <div class="tool-card-desc">All record updates batched into one resolver.multicall() call. Supports addresses, texts, contentHash, and ENSIP-25 agent-registration.</div>
1062                <table class="param-table">
1063                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1064                  <tr><td>nameRecords</td><td><span class="type">object[]</span></td><td><span class="required">required</span></td><td>Array of { name, records } pairs (max 50)</td></tr>
1065                  <tr><td>walletAddress</td><td>
1065<span class="type">string</span></td><td><span class="required">required</span></td><td>Owner wallet address</td></tr>
1066                </table>
1067              </div>
1068            </div>
1069
1070            <div class="tool-card" data-tool="renew_ens_name">
1071              <div class="tool-card-header" onclick="toggleTool(this)">
1072                <span class="tool-card-name">renew_ens_name</span>
1073                <span class="tool-card-summary">Renew single or batch names (Multicall3)</span>
1074              </div>
1075              <div class="tool-card-body">
1076                <div class="tool-card-desc">No commit/reveal needed. Any duration (no minimum). Anyone can renew any name. Batch renewals bundled into a single Multicall3 transaction. A 1% NameWhisper interface fee is charged on top of the ENS price and returned broken out as <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">feeEth</code> alongside <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">ensCostEth</code>.</div>
1077                <table class="param-table">
1078                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1079                  <tr><td>names</td><td><span class="type">string | string[]</span></td><td><span class="required">required</span></td><td>Name or array of names</td></tr>
1080                  <tr><td>duration</td><td><span class="type">number</span></td><td><span class="optional">default: 365</span></td><td>Duration in days</td></tr>
1081                </table>
1082              </div>
1083            </div>
1084
1085            <div class="tool-card" data-tool="transfer_ens_name">
1086              <div class="tool-card-header" onclick="toggleTool(this)">
1087                <span class="tool-card-name">transfer_ens_name</span>
1088                <span class="tool-card-summary">Transfer ownership (wrapped + unwrapped)</span>
1089              </div>
1090              <div class="tool-card-body">
1091                <div class="tool-card-desc">Auto-detects wrapped (ERC-1155) vs unwrapped (ERC-721). Resolver records are NOT affected by transfer.</div>
1092                <table class="param-table">
1093                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1094                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to transfer</td></tr>
1095                  <tr><td>fromAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Current owner (must sign)</td></tr>
1096                  <tr><td>toAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Recipient wallet</td></tr>
1097                </table>
1098              </div>
1099            </div>
1100
1101            <div class="tool-card" data-tool="bulk_transfer_ens_names">
1102              <div class="tool-card-header" onclick="toggleTool(this)">
1103                <span class="tool-card-name">bulk_transfer_ens_names</span>
1104                <span class="tool-card-summary">Batch transfer up to 20 names in 1 txn</span>
1105              </div>
1106              <div class="tool-card-body">
1107                <div class="tool-card-desc">Transfer multiple ENS names in a single Multicall3 transaction. Each name can go to a different recipient. Auto-detects wrapped (ERC-1155) vs unwrapped (ERC-721) per name.</div>
1108                <table class="param-table">
1109                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1110                  <tr><td>transfers</td><td><span class="type">array</span></td><td><span class="required">required</span></td><td>Array of { name, toAddress } pairs. Max 20.</td></tr>
1111                  <tr><td>fromAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Current owner of all names (must sign)</td></tr>
1112                </table>
1113              </div>
1114            </div>
1115
1116            <div class="tool-card" data-tool="set_primary_name">
1117              <div class="tool-card-header" onclick="toggleTool(this)">
1118                <span class="tool-card-name">set_primary_name</span>
1119                <span class="tool-card-summary">Set reverse resolution (primary name)</span>
1120              </div>
1121              <div class="tool-card-body">
1122                <div class="tool-card-desc">Controls what name displays when someone looks up your address. Name's ETH record must point to the wallet. One primary per address.</div>
1123                <table class="param-table">
1124                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1125                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to set as primary</td></tr>
1126                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Wallet address (must sign)</td></tr>
1127                </table>
1128              </div>
1129            </div>
1130
1131            <div class="tool-card" data-tool="set_resolver">
1132              <div class="tool-card-header" onclick="toggleTool(this)">
1133                <span class="tool-card-name">set_resolver</span>
1134                <span class="tool-card-summary">Change resolver contract</span>
1135              </div>
1136              <div class="tool-card-body">
1137                <div class="tool-card-desc">Pass "public" to use the ENS Public Resolver. Records on the old resolver won't be visible after switching.</div>
1138                <table class="param-table">
1139                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1140                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name</td></tr>
1141                  <tr><td>resolver</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Resolver address or "public"</td></tr>
1142                </table>
1143              </div>
1144            </div>
1145
1146            <div class="tool-card" data-tool="manage_ens_name">
1147              <div class="tool-card-header" onclick="toggleTool(this)">
1148                <span class="tool-card-name">manage_ens_name</span>
1149                <span class="tool-card-summary">Status check with recommendations</span>
1150              </div>
1151              <div class="tool-card-body">
1152                <div class="tool-card-desc">Returns registration status, expiry, wrapper state, owner, renewal pricing, and recommended actions. Use before any management operation.</div>
1153                <table class="param-table">
1154                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1155                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to check</td></tr>
1156                  <tr><td>includeRenewalPricing</td><td><span class="type">boolean</span></td><td><span class="optional">default: true</span></td><td>Include on-chain pricing</td></tr>
1157                </table>
1158              </div>
1159            </div>
1160          </div>
1161
1162          <!-- NameWrapper -->
1163          <div id="cat-namewrapper" class="tool-category">
1164            <div class="tool-category-header">
1165              <span class="tool-category-name">NameWrapper</span>
1166              <span class="tool-badge badge-tx">Transaction</span>
1167              <span class="tool-count">5 tools</span>
1168            </div>
1169
1170            <div class="tool-card" data-tool="wrap_name">
1171              <div class="tool-card-header" onclick="toggleTool(this)">
1172                <span class="tool-card-name">wrap_name</span>
1173                <span class="tool-card-summary">Wrap name into NameWrapper (ERC-1155)</span>
1174              </div>
1175              <div class="tool-card-body">
1176                <div class="tool-card-desc">ERC-721 &rarr; ERC-1155. Enables fuse permissions and protected subnames. Returns two-step recipe: approve + wrap.</div>
1177                <table class="param-table">
1178                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1179                  <tr><td>name</td><td><span class="type">string</span></td><td>
1179<span class="required">required</span></td><td>ENS name to wrap</td></tr>
1180                  <tr><td>owner</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Current owner address</td></tr>
1181                  <tr><td>fuses</td><td><span class="type">string[]</span></td><td><span class="optional">optional</span></td><td>Fuses to burn on wrap (irreversible)</td></tr>
1182                </table>
1183              </div>
1184            </div>
1185
1186            <div class="tool-card" data-tool="unwrap_name">
1187              <div class="tool-card-header" onclick="toggleTool(this)">
1188                <span class="tool-card-name">unwrap_name</span>
1189                <span class="tool-card-summary">Unwrap back to BaseRegistrar (ERC-721)</span>
1190              </div>
1191              <div class="tool-card-body">
1192                <div class="tool-card-desc">Clears all fuses. Fails if CANNOT_UNWRAP has been burned.</div>
1193                <table class="param-table">
1194                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1195                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to unwrap</td></tr>
1196                  <tr><td>owner</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Current wrapped owner</td></tr>
1197                </table>
1198              </div>
1199            </div>
1200
1201            <div class="tool-card" data-tool="manage_fuses">
1202              <div class="tool-card-header" onclick="toggleTool(this)">
1203                <span class="tool-card-name">manage_fuses</span>
1204                <span class="tool-card-summary">Read/burn fuses on wrapped names</span>
1205              </div>
1206              <div class="tool-card-body">
1207                <div class="tool-card-desc">Three modes: read (check current), burn_owner_fuses, burn_child_fuses. All burning is irreversible. Fuses expire when the name expires.</div>
1208                <table class="param-table">
1209                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1210                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name</td></tr>
1211                  <tr><td>action</td><td><span class="type">enum</span></td><td><span class="optional">default: read</span></td><td>read, burn_owner_fuses, burn_child_fuses</td></tr>
1212                  <tr><td>fuses</td><td><span class="type">string[]</span></td><td><span class="optional">conditional</span></td><td>Required for burn actions</td></tr>
1213                  <tr><td>expiry</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Unix timestamp (burn_child_fuses only)</td></tr>
1214                </table>
1215              </div>
1216            </div>
1217
1218            <div class="tool-card" data-tool="mint_subnames">
1219              <div class="tool-card-header" onclick="toggleTool(this)">
1220                <span class="tool-card-name">mint_subnames</span>
1221                <span class="tool-card-summary">Bulk create subnames for agent fleets</span>
1222              </div>
1223              <div class="tool-card-body">
1224                <div class="tool-card-desc">Each subname gets its own owner and records. Free to create &mdash; only gas costs. Designed for agent001.company.eth style fleet deployment.</div>
1225                <table class="param-table">
1226                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1227                  <tr><td>parentName</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Parent ENS name</td></tr>
1228                  <tr><td>subnames</td><td><span class="type">object[]</span></td><td><span class="required">required</span></td><td>Array of { label, owner?, records? }</td></tr>
1229                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Parent name owner</td></tr>
1230                </table>
1231              </div>
1232            </div>
1233
1234            <div class="tool-card" data-tool="extend_subname_expiry">
1235              <div class="tool-card-header" onclick="toggleTool(this)">
1236                <span class="tool-card-name">extend_subname_expiry</span>
1237                <span class="tool-card-summary">Extend subname expiry</span>
1238              </div>
1239              <div class="tool-card-body">
1240                <div class="tool-card-desc">Cannot exceed parent expiry. Parent owner can always extend; subname owner can only if CAN_EXTEND_EXPIRY fuse is burned.</div>
1241                <table class="param-table">
1242                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1243                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Full subname (e.g. "sub.coffee.eth")</td></tr>
1244                  <tr><td>years</td><td><span class="type">number</span></td><td><span class="optional">default: 1</span></td><td>Years to extend (1-10)</td></tr>
1245                </table>
1246              </div>
1247            </div>
1248          </div>
1249
1250          <!-- Access & Recovery -->
1251          <div id="cat-access" class="tool-category">
1252            <div class="tool-category-header">
1253              <span class="tool-category-name">Access &amp; Recovery</span>
1254              <span class="tool-badge badge-tx">Transaction</span>
1255              <span class="tool-count">2 tools</span>
1256            </div>
1257
1258            <div class="tool-card" data-tool="approve_operator">
1259              <div class="tool-card-header" onclick="toggleTool(this)">
1260                <span class="tool-card-name">approve_operator</span>
1261                <span class="tool-card-summary">Approve/revoke operator for ENS contracts</span>
1262              </div>
1263              <div class="tool-card-body">
1264                <div class="tool-card-desc">setApprovalForAll &mdash; covers ALL tokens on the specified contract. Use before wrapping, marketplace trading, or batch operations.</div>
1265                <table class="param-table">
1266                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1267                  <tr><td>owner</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Address granting approval</td></tr>
1268                  <tr><td>operator</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Address being approved</td></tr>
1269                  <tr><td>contract</td><td><span class="type">enum</span></td><td><span class="required">required</span></td><td>base_registrar, name_wrapper, or ens_registry</td></tr>
1270                  <tr><td>approved</td><td><span class="type">boolean</span></td><td><span class="optional">default: true</span></td><td>true to approve, false to revoke</td></tr>
1271                </table>
1272              </div>
1273            </div>
1274
1275            <div class="tool-card" data-tool="reclaim_name">
1276              <div class="tool-card-header" onclick="toggleTool(this)">
1277                <span class="tool-card-name">reclaim_name</span>
1278                <span class="tool-card-summary">Reclaim ENS Registry ownership</span>
1279              </div>
1280              <div class="tool-card-body">
1281                <div class="tool-card-desc">Syncs the ENS Registry owner to match the BaseRegistrar token owner. Used when ownership is out of sync after direct token transfers.</div>
1282                <table class="param-table">
1283                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1284                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to reclaim</td></tr>
1285                  <tr><td>owner</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Address (must own BaseRegistrar token)</td></tr>
1286                </table>
1287              </div>
1288            </div>
1289          </div>
1290
1291          <!-- Agent Identity -->
1292          <div id="cat-agent" class="tool-category">
1293            <div class="tool-category-header">
1294              <span class="tool-category-name">Agent Identity</span>
1295              <span class="tool-badge badge-free">Read + Write</span>
1296              <span class="tool-count">4 tools</span>
1297            </div>
1298
1299            <div class="tool-card" data-tool="provision_agent_identity">
1300              <div class="tool-card-header" onclick="toggleTool(this)">
1301                <span class="tool-card-name">provision_agent_identity</span>
1302                <span class="tool-card-summary">One-call agent identity setup with ENSIP-25</span>
1303              </div>
1304              <div class="tool-card-body">
1305                <div class="tool-card-desc">Describe your agent's purpose and budget &rarr; get name recommendations with registration recipes, suggested ENS records, and ENSIP-25 agent-registration binding.</div>
1306                <table class="param-table">
1307                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1308                  <tr><td>purpose</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>What the agent does</td></tr>
1309                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Agent wallet address</td></tr>
1310                  <tr><td>budgetEth</td><td><span class="type">number</span></td><td><span class="optional">default: 0.1</span></td><td>Max budget in ETH</td></tr>
1311                  <tr><td>preferences</td><td><span class="type">object</span></td><td><span class="optional">optional</span></td><td>{ maxLength, style, mustInclude }</td></tr>
1312                  <tr><td>agentRegistry</td><td><span class="type">object</span></td><td><span class="optional">optional</span></td><td>ENSIP-25: { registryAddress, agentId, chainId? }</td></tr>
1313                </table>
1314                <div class="example-label">Example</div>
1315                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{
1316  <span class="str">"purpose"</span>: <span class="str">"DeFi trading bot"</span>,
1317  <span class="str">"walletAddress"</span>: <span class="str">"0x1234..."</span>,
1318  <span class="str">"budgetEth"</span>: <span class="num">5.0</span>,
1319  <span class="str">"preferences"</span>: { <span class="str">"style"</span>: <span class="str">"technical"</span> }
1320}</div>
1321              </div>
1322            </div>
1323
1324            <div class="tool-card" data-tool="register_agent">
1325              <div class="tool-card-header" onclick="toggleTool(this)">
1326                <span class="tool-card-name">register_agent</span>
1327                <span class="tool-card-summary">Register an ENS name as an ERC-8004 agent identity</span>
1328              </div>
1329              <div class="tool-card-body">
1330                <div class="tool-card-desc">Builds a ready-to-sign registration for the canonical ERC-8004 IdentityRegistry on mainnet. The default "adapter" route binds the agent to the name via ERC-8217 &mdash; control and marketplace visibility follow the name, and the agent transfers when the name is sold. After it confirms, write the ENSIP-25 binding record with set_ens_records to make the identity verifiable.</div>
1331                <table class="param-table">
1332                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1333                  <tr><td>name</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name to register (you must own it)</td></tr>
1334                  <tr><td>walletAddress</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Signing wallet; auto-filled from ERC-8128 auth</td></tr>
1335                  <tr><td>route</td><td><span class="type">enum</span></td><td><span class="optional">default: adapter</span></td><td>adapter (ERC-8217-bound to the name) or direct (minted to wallet)</td></tr>
1336                  <tr><td>agentURI</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Override the hosted agent registration file URI</td></tr>
1337                </table>
1338                <div class="example-label">Example</div>
1339                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"name"</span>: <span class="str">"myagent.eth"</span>, <span class="str">"route"</span>: <span class="str">"adapter"</span> }</div>
1340              </div>
1341            </div>
1342
1343            <div class="tool-card" data-tool="get_agent_reputation">
1344              <div class="tool-card-header" onclick="toggleTool(this)">
1345                <span class="tool-card-name">get_agent_reputation</span>
1346                <span class="tool-card-summary">Check agent credentials via ENSIP-25 + ERC-8004</span>
1347              </div>
1348              <div class="tool-card-body">
1349                <div class="tool-card-desc">ENSIP-25 verification is live: reads agent-registration text records. ERC-8004 reputation data is live on mainnet via the IdentityRegistry contract. <a href="/agents" style="color: var(--accent);">Browse the agent registry &rarr;</a></div>
1350                <table class="param-table">
1351                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1352                  <tr><td>nameOrWallet</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>ENS name or wallet address</td></tr>
1353                </table>
1354              </div>
1355            </div>
1356
1357            <div class="tool-card" data-tool="search_agent_directory">
1358              <div class="tool-card-header" onclick="toggleTool(this)">
1359                <span class="tool-card-name">search_agent_directory</span>
1360                <span class="tool-card-summary">Search registered AI agents via ERC-8004 registry</span>
1361              </div>
1362              <div class="tool-card-body">
1363                <div class="tool-card-desc">Queries the ERC-8004 IdentityRegistry on mainnet via 8004scan. Search by keyword, filter by capabilities or minimum reputation score. Returns on-chain agent profiles with ENS names and metadata.</div>
1364                <table class="param-table">
1365                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1366                  <tr><td>query</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Search query</td></tr>
1367                  <tr><td>capabilities</td><td><span class="type">string[]</span></td><td><span class="optional">optional</span></td><td>Filter by capabilities</td></tr>
1368                  <tr><td>minReputation</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Minimum score (0-100)</td></tr>
1369                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 25</span></td><td>Max results</td></tr>
1370                </table>
1371              </div>
1372            </div>
1373
1374          </div>
1375
1376          <!-- Authentication -->
1377          <div id="cat-auth" class="tool-category">
1378            <div class="tool-category-header">
1379              <span class="tool-category-name">Authentication</span>
1380              <span class="tool-badge badge-free">ERC-8128</span>
1381              <span class="tool-count">1 tool</span>
1382            </div>
1383
1384            <div class="tool-card" data-tool="get_caller_identity">
1385              <div class="tool-card-header" onclick="toggleTool(this)">
1386                <span class="tool-card-name">get_caller_identity</span>
1387                <span class="tool-card-summary">Resolve your authenticated identity via ERC-8128</span>
1388              </div>
1389              <div class="tool-card-body">
1390                <div class="tool-card-desc">Returns the identity of an ERC-8128 authenticated caller: wallet address, primary ENS name, text records, ENSIP-25 status, and portfolio summary. Call this first to confirm your signed identity is recognised. Unsigned callers get an anonymous result.</div>
1391                <table class="param-table">
1392                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1393                  <tr><td colspan="4"><em>No parameters &mdash; identity is derived from the ERC-8128 signed request</em></td></tr>
1394                </table>
1395              </div>
1396            </div>
1397          </div>
1398
1399          <!-- Knowledge -->
1400          <div id="cat-knowledge" class="tool-category">
1401            <div class="tool-category-header">
1402              <span class="tool-category-name">Knowledge</span>
1403              <span class="tool-badge badge-free">Read-Only</span>
1404              <span class="tool-count">1 tool</span>
1405            </div>
1406
1407            <div class="tool-card" data-tool="search_knowledge">
1408              <div class="tool-card-header" onclick="toggleTool(this)">
1409                <span class="tool-card-name">search_knowledge</span>
1410                <span class="tool-card-summary">Search ENS governance + protocol knowledge base</span>
1411              </div>
1412              <div class="tool-card-body">
1413                <div class="tool-card-desc">Governance proposals, protocol docs, developer insights, blog posts, forum discussions, and Farcaster casts from key ENS figures.</div>
1414                <table class="param-table">
1415                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1416                  <tr><td>query</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>What you want to know about ENS</td></tr>
1417                  <tr><td>source</td><td><span class="type">enum</span></td><td><span class="optional">default: all</span></td><td>ens-forum, vitalik-blog, ens-blog, ens-docs, farcaster</td></tr>
1418                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 6</span></td><td>Number of results</td></tr>
1419                </table>
1420              </div>
1421            </div>
1422          </div>
1423
1424          <!-- Internal -->
1425          <div id="cat-internal" class="tool-category">
1426            <div class="tool-category-header">
1427              <span class="tool-category-name">Internal</span>
1428              <span class="tool-badge badge-internal">Session</span>
1429              <span class="tool-count">1 tool</span>
1430            </div>
1431
1432            <div class="tool-card" data-tool="get_usage_stats">
1433              <div class="tool-card-header" onclick="toggleTool(this)">
1434                <span class="tool-card-name">get_usage_stats</span>
1435                <span class="tool-card-summary">Session tool call counts, success rates, latency</span>
1436              </div>
1437              <div class="tool-card-body">
1438                <div class="tool-card-desc">No parameters. Returns per-tool call counts, success rates, and average latency for the current MCP session.</div>
1439              </div>
1440            </div>
1441          </div>
1442        </section>
1443
1444        <!-- REST API -->
1445        <section id="rest-api" class="doc-section">
1446          <div class="section-label">REST API</div>
1447          <div class="section-title">120+ HTTP endpoints</div>
1448          <div class="section-desc">In addition to MCP tools, Name Whisper exposes a full REST API at <code style="font-family: var(--font-mono); font-size: 12px; color: var(--accent-bright);">https://namewhisper.ai/api/</code>. All responses are JSON. Authenticated routes require a Bearer token from <code style="font-family: var(--font-mono); font-size: 12px; color: var(--accent-bright);">/api/auth/connect</code>.</div>
1449
1450          <!-- Auth -->
1451          <div id="rest-auth" class="tool-category">
1452            <div class="tool-category-header">
1453              <span class="tool-category-name">Authentication</span>
1454              <span class="tool-badge badge-free">Public</span>
1455              <span class="tool-count">3 endpoints</span>
1456            </div>
1457
1458            <div class="tool-card">
1459              <div class="tool-card-header" onclick="toggleTool(this)">
1460                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/auth/connect</span>
1461                <span class="tool-card-summary">Wallet connection (returns JWT)</span>
1462              </div>
1463              <div class="tool-card-body">
1464                <div class="tool-card-desc">Simple address-based authentication. Send a wallet address, receive a JWT token for authenticated routes. No signature required.</div>
1465                <div class="example-label">Request</div>
1466                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{ <span class="str">"address"</span>: <span class="str">"0x1234..."</span> }</div>
1467                <div class="example-label">Response</div>
1468                <div class="code-block">{ <span class="str">"token"</span>: <span class="str">"eyJ..."</span>, <span class="str">"user"</span>: { <span class="str">"address"</span>: <span class="str">"0x1234..."</span> } }</div>
1469                <div class="tool-card-desc" style="margin-top:12px">Use the token in subsequent requests:<br><code style="font-family:var(--font-mono);font-size:11px;color:var(--accent-bright)">Authorization: Bearer &lt;token&gt;</code></div>
1470              </div>
1471            </div>
1472
1473            <div class="tool-card">
1474              <div class="tool-card-header" onclick="toggleTool(this)">
1475                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/auth/nonce</span>
1476                <span class="tool-card-summary">Generate SIWE nonce</span>
1477              </div>
1478              <div class="tool-card-body">
1479                <div class="tool-card-desc">Generate a nonce for Sign-In with Ethereum (EIP-4361) authentication flow.</div>
1480              </div>
1481            </div>
1482
1483            <div class="tool-card">
1484              <div class="tool-card-header" onclick="toggleTool(this)">
1485                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/auth/signin</span>
1486                <span class="tool-card-summary">SIWE signature verification</span>
1487              </div>
1488              <div class="tool-card-body">
1489                <div class="tool-card-desc">Verify a SIWE message + signature. Returns JWT token on success.</div>
1490                <table class="param-table">
1491                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1492                  <tr><td>message</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>SIWE message string</td></tr>
1493                  <tr><td>signature</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Wallet signature of the message</td></tr>
1494                </table>
1495              </div>
1496            </div>
1497          </div>
1498
1499          <!-- Search & Discovery -->
1500          <div id="rest-search" class="tool-category">
1501            <div class="tool-category-header">
1502              <span class="tool-category-name">Search &amp; Discovery</span>
1503              <span class="tool-badge badge-free">Public</span>
1504              <span class="tool-count">2 endpoints</span>
1505            </div>
1506
1507            <div class="tool-card">
1508              <div class="tool-card-header" onclick="toggleTool(this)">
1509                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/search</span>
1510                <span class="tool-card-summary">LLM-powered semantic search</span>
1511              </div>
1512              <div class="tool-card-body">
1513                <div class="tool-card-desc">Natural language search with automatic intent detection. Routes to filtered DB search, semantic vector search, creative AI generation, or bulk availability check. Returns a searchId for async summary retrieval.</div>
1514                <table class="param-table">
1515                  <tr><th>Param</th><th>Type</th><th></th><th>Description</th></tr>
1516                  <tr><td>query</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Natural language search query</td></tr>
1517                  <tr><td>mode</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>"create" for creative name generation</td></tr>
1518                </table>
1519                <div class="example-label">Example</div>
1520                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button><span class="fn">POST</span> /api/search
1521{ <span class="str">"query"</span>: <span class="str">"3-letter words under 0.1 ETH"</span> }</div>
1522              </div>
1523            </div>
1524
1525            <div class="tool-card">
1526              <div class="tool-card-header" onclick="toggleTool(this)">
1527                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/summary/:searchId</span>
1528                <span class="tool-card-summary">Async AI search summary</span>
1529              </div>
1530              <div class="tool-card-body">
1531                <div class="tool-card-desc">Retrieve the AI-generated summary for a previous search. Generated asynchronously after search completes.</div>
1532              </div>
1533            </div>
1534          </div>
1535
1536          <!-- Name Profiles -->
1537          <div id="rest-profiles" class="tool-category">
1538            <div class="tool-category-header">
1539              <span class="tool-category-name">Name Profiles</span>
1540              <span class="tool-badge badge-free">Public</span>
1541              <span class="tool-count">5 endpoints</span>
1542            </div>
1543
1544            <div class="tool-card">
1545              <div class="tool-card-header" onclick="toggleTool(this)">
1546                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/name-profile/:label</span>
1547                <span class="tool-card-summary">Comprehensive name profile</span>
1548              </div>
1549              <div class="tool-card-body">
1550                <div class="tool-card-desc">Registration info, transfer history, sales history, ownership, social scores, avatar, website, ENS records, holder intelligence (ETH balance, wallet age, ENS count). Aggregates data from ENS Subgraph, Etherscan, Web3.bio, and Alchemy.</div>
1551              </div>
1552            </div>
1553
1554            <div class="tool-card">
1555              <div class="tool-card-header" onclick="toggleTool(this)">
1556                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/name-profile/:label/market</span>
1557                <span class="tool-card-summary">Live marketplace data for a name</span>
1558              </div>
1559              <div class="tool-card-body">
1560                <div class="tool-card-desc">Current listings and offers across all marketplaces, aggregated and filtered by current owner.</div>
1561              </div>
1562            </div>
1563
1564            <div class="tool-card">
1565              <div class="tool-card-header" onclick="toggleTool(this)">
1566                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/name/:label/records</span>
1567                <span class="tool-card-summary">On-chain resolver records</span>
1568              </div>
1569              <div class="tool-card-body">
1570                <div class="tool-card-desc">Address records, text records (avatar, description, socials, AI metadata), and contenthash read directly from the on-chain resolver.</div>
1571              </div>
1572            </div>
1573
1574            <div class="tool-card">
1575              <div class="tool-card-header" onclick="toggleTool(this)">
1576                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/name/:label/build-record-tx</span>
1577                <span class="tool-card-summary">Build record update transaction</span>
1578              </div>
1579              <div class="tool-card-body">
1580                <div class="tool-card-desc">Returns encoded transaction calldata to update resolver records. Sign and broadcast with your wallet.</div>
1581              </div>
1582            </div>
1583
1584            <div class="tool-card">
1585              <div class="tool-card-header" onclick="toggleTool(this)">
1586                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/wallet/:address/names</span>
1587                <span class="tool-card-summary">All names owned by an address</span>
1588              </div>
1589              <div class="tool-card-body">
1590                <div class="tool-card-desc">Deduplicated list of ENS names owned or registered by a wallet address.</div>
1591              </div>
1592            </div>
1593          </div>
1594
1595          <!-- Market Intelligence -->
1596          <div id="rest-market" class="tool-category">
1597            <div class="tool-category-header">
1598              <span class="tool-category-name">Market Intelligence</span>
1599              <span class="tool-badge badge-free">Public</span>
1600              <span class="tool-count">4 endpoints</span>
1601            </div>
1602
1603            <div class="tool-card">
1604              <div class="tool-card-header" onclick="toggleTool(this)">
1605                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/market-stats</span>
1606                <span class="tool-card-summary">Global market overview</span>
1607              </div>
1608              <div class="tool-card-body">
1609                <div class="tool-card-desc">Sales counts, volume (24h &amp; 7d), floor prices by category (3L, 4L, 5L, 999, 100K), top sale, trending categories, 24h floor deltas. Cached 5 minutes.</div>
1610              </div>
1611            </div>
1612
1613            <div class="tool-card">
1614              <div class="tool-card-header" onclick="toggleTool(this)">
1615                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/recent-sales</span>
1616                <span class="tool-card-summary">Recent name sales</span>
1617              </div>
1618              <div class="tool-card-body">
1619                <div class="tool-card-desc">Filterable by category, price, and event type.</div>
1620                <table class="param-table">
1621                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
1622                  <tr><td>days</td><td><span class="type">number</span></td><td><span class="optional">default: 7</span></td><td>Lookback period (max 90)</td></tr>
1623                  <tr><td>minPrice</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Minimum sale price in ETH</td></tr>
1624                  <tr><td>category</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Filter by category</td></tr>
1625                </table>
1626              </div>
1627            </div>
1628
1629            <div class="tool-card">
1630              <div class="tool-card-header" onclick="toggleTool(this)">
1631                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/recent-sales/:label</span>
1632                <span class="tool-card-summary">Sales history for a specific name</span>
1633              </div>
1634              <div class="tool-card-body">
1635                <div class="tool-card-desc">Last 20 sales for a specific ENS name.</div>
1636              </div>
1637            </div>
1638          </div>
1639
1640          <!-- Categories -->
1641          <div id="rest-categories" class="tool-category">
1642            <div class="tool-category-header">
1643              <span class="tool-category-name">Categories &amp; Collections</span>
1644              <span class="tool-badge badge-free">Public</span>
1645              <span class="tool-count">4 endpoints</span>
1646            </div>
1647
1648            <div class="tool-card">
1649              <div class="tool-card-header" onclick="toggleTool(this)">
1650                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/categories</span>
1651                <span class="tool-card-summary">All categories with 7-day stats</span>
1652              </div>
1653              <div class="tool-card-body">
1654                <div class="tool-card-desc">Sales, volume, avg price, floor, ceiling per category. Includes club and collection mappings. Cached 5 minutes.</div>
1655              </div>
1656            </div>
1657
1658            <div class="tool-card">
1659              <div class="tool-card-header" onclick="toggleTool(this)">
1660                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/categories/:slug</span>
1661                <span class="tool-card-summary">Category detail with trends</span>
1662              </div>
1663              <div class="tool-card-body">
1664                <div class="tool-card-desc">Member list, market data, 7d/30d trends, badges.</div>
1665              </div>
1666            </div>
1667
1668            <div class="tool-card">
1669              <div class="tool-card-header" onclick="toggleTool(this)">
1670                <span class="tool-card-name"><span style="color:var(--blue)">GET</span>
1670 /api/categories/:slug/ai-report</span>
1671                <span class="tool-card-summary">AI-generated category analysis</span>
1672              </div>
1673              <div class="tool-card-body">
1674                <div class="tool-card-desc">AI analysis of category trends, market health, and opportunities.</div>
1675              </div>
1676            </div>
1677
1678            <div class="tool-card">
1679              <div class="tool-card-header" onclick="toggleTool(this)">
1680                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/collections</span>
1681                <span class="tool-card-summary">All collections</span>
1682              </div>
1683              <div class="tool-card-body">
1684                <div class="tool-card-desc">Complete list of ENS name collections with metadata.</div>
1685              </div>
1686            </div>
1687          </div>
1688
1689          <!-- Expiry -->
1690          <div id="rest-expiry" class="tool-category">
1691            <div class="tool-category-header">
1692              <span class="tool-category-name">Expiry Calendar</span>
1693              <span class="tool-badge badge-free">Public</span>
1694              <span class="tool-count">2 endpoints</span>
1695            </div>
1696
1697            <div class="tool-card">
1698              <div class="tool-card-header" onclick="toggleTool(this)">
1699                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/expiry-calendar</span>
1700                <span class="tool-card-summary">Upcoming name expirations</span>
1701              </div>
1702              <div class="tool-card-body">
1703                <table class="param-table">
1704                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
1705                  <tr><td>days</td><td><span class="type">number</span></td><td><span class="optional">default: 30</span></td><td>Days ahead (max 90)</td></tr>
1706                  <tr><td>minLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Minimum label length</td></tr>
1707                  <tr><td>maxLength</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Maximum label length</td></tr>
1708                  <tr><td>charType</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>Character type filter</td></tr>
1709                  <tr><td>dictionary</td><td><span class="type">boolean</span></td><td><span class="optional">optional</span></td><td>Dictionary words only</td></tr>
1710                  <tr><td>status</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>active, grace, premium</td></tr>
1711                  <tr><td>sort</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>expiry, value, length</td></tr>
1712                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 50</span></td><td>Max results (max 500)</td></tr>
1713                </table>
1714              </div>
1715            </div>
1716
1717            <div class="tool-card">
1718              <div class="tool-card-header" onclick="toggleTool(this)">
1719                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/expiry-summary</span>
1720                <span class="tool-card-summary">Expiry rollup by date range</span>
1721              </div>
1722              <div class="tool-card-body">
1723                <div class="tool-card-desc">High-level summary of upcoming expirations grouped by date range.</div>
1724              </div>
1725            </div>
1726          </div>
1727
1728          <!-- Whales -->
1729          <div id="rest-whales" class="tool-category">
1730            <div class="tool-category-header">
1731              <span class="tool-category-name">Whale Analytics</span>
1732              <span class="tool-badge badge-free">Public</span>
1733              <span class="tool-count">4 endpoints</span>
1734            </div>
1735
1736            <div class="tool-card">
1737              <div class="tool-card-header" onclick="toggleTool(this)">
1738                <span class="tool-card-name"><span style="color:var(--blue)">
1738GET</span> /api/whales/addresses</span>
1739                <span class="tool-card-summary">Top whale addresses</span>
1740              </div>
1741              <div class="tool-card-body">
1742                <table class="param-table">
1743                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
1744                  <tr><td>days</td><td><span class="type">number</span></td><td><span class="optional">default: 7</span></td><td>Lookback period (max 90)</td></tr>
1745                </table>
1746              </div>
1747            </div>
1748
1749            <div class="tool-card">
1750              <div class="tool-card-header" onclick="toggleTool(this)">
1751                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/whales</span>
1752                <span class="tool-card-summary">Whale leaderboard</span>
1753              </div>
1754              <div class="tool-card-body">
1755                <div class="tool-card-desc">Ranking, purchase count, total spent, average price. Includes ENS name resolution.</div>
1756              </div>
1757            </div>
1758
1759            <div class="tool-card">
1760              <div class="tool-card-header" onclick="toggleTool(this)">
1761                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/whale/:address</span>
1762                <span class="tool-card-summary">Individual whale detail</span>
1763              </div>
1764              <div class="tool-card-body">
1765                <div class="tool-card-desc">Purchase history, portfolio size, ENS names owned, total spent.</div>
1766              </div>
1767            </div>
1768
1769            <div class="tool-card">
1770              <div class="tool-card-header" onclick="toggleTool(this)">
1771                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/sellers</span>
1772                <span class="tool-card-summary">Top sellers in a period</span>
1773              </div>
1774              <div class="tool-card-body">
1775                <table class="param-table">
1776                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
1777                  <tr><td>days</td><td><span class="type">number</span></td><td><span class="optional">default: 7</span></td><td>Lookback period (max 90)</td></tr>
1778                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 20</span></td><td>Max results (max 50)</td></tr>
1779                </table>
1780              </div>
1781            </div>
1782          </div>
1783
1784          <!-- Category Stats -->
1785          <div id="rest-catstats" class="tool-category">
1786            <div class="tool-category-header">
1787              <span class="tool-category-name">Category Statistics</span>
1788              <span class="tool-badge badge-free">Public</span>
1789              <span class="tool-count">2 endpoints</span>
1790            </div>
1791
1792            <div class="tool-card">
1793              <div class="tool-card-header" onclick="toggleTool(this)">
1794                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/category-stats</span>
1795                <span class="tool-card-summary">Sales stats by name length</span>
1796              </div>
1797              <div class="tool-card-body">
1798                <div class="tool-card-desc">Sale count, volume, avg/median/floor/ceiling prices for 3L, 4L, 5L, etc. Cached 5 minutes.</div>
1799              </div>
1800            </div>
1801
1802            <div class="tool-card">
1803              <div class="tool-card-header" onclick="toggleTool(this)">
1804                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/category-trends</span>
1805                <span class="tool-card-summary">Time-series category trends</span>
1806              </div>
1807              <div class="tool-card-body">
1808                <div class="tool-card-desc">Daily breakdown of sales trends per category. Cached 10 minutes.</div>
1809                <table class="param-table">
1810                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
1811                  <tr><td>days</td><td><span class="type">number</span></td><td>
1811<span class="optional">default: 7</span></td><td>Lookback period (max 90)</td></tr>
1812                  <tr><td>length</td><td><span class="type">number</span></td><td><span class="optional">optional</span></td><td>Filter to specific label length</td></tr>
1813                </table>
1814              </div>
1815            </div>
1816          </div>
1817
1818          <!-- Marketplace -->
1819          <div id="rest-marketplace" class="tool-category">
1820            <div class="tool-category-header">
1821              <span class="tool-category-name">Marketplace</span>
1822              <span class="tool-badge badge-free">Public</span>
1823              <span class="tool-count">5 endpoints</span>
1824            </div>
1825
1826            <div class="tool-card">
1827              <div class="tool-card-header" onclick="toggleTool(this)">
1828                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/marketplace/browse</span>
1829                <span class="tool-card-summary">Browse marketplace listings</span>
1830              </div>
1831              <div class="tool-card-body"><div class="tool-card-desc">Paginated listings aggregated from the shared Seaport orderbook (NameWhisper + OpenSea) plus ENS Vision market data. Supports filters for price range, name length, category, source, and sort order.</div></div>
1832            </div>
1833            <div class="tool-card">
1834              <div class="tool-card-header" onclick="toggleTool(this)">
1835                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/marketplace/panel/:label</span>
1836                <span class="tool-card-summary">Marketplace data for a name</span>
1837              </div>
1838              <div class="tool-card-body"><div class="tool-card-desc">All active listings, offers, and last sale for a specific name across all marketplaces.</div></div>
1839            </div>
1840            <div class="tool-card">
1841              <div class="tool-card-header" onclick="toggleTool(this)">
1842                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/marketplace/trending</span>
1843                <span class="tool-card-summary">Trending names</span>
1844              </div>
1845              <div class="tool-card-body"><div class="tool-card-desc">Names with unusual marketplace activity: new listings, price drops, or incoming offers.</div></div>
1846            </div>
1847            <div class="tool-card">
1848              <div class="tool-card-header" onclick="toggleTool(this)">
1849                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/marketplace/dynamic-categories</span>
1850                <span class="tool-card-summary">Dynamic category suggestions</span>
1851              </div>
1852              <div class="tool-card-body"><div class="tool-card-desc">Auto-generated categories based on current marketplace patterns and activity.</div></div>
1853            </div>
1854            <div class="tool-card">
1855              <div class="tool-card-header" onclick="toggleTool(this)">
1856                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/marketplace/filters</span>
1857                <span class="tool-card-summary">Available filter options</span>
1858              </div>
1859              <div class="tool-card-body"><div class="tool-card-desc">Returns available filter values for marketplace browsing (categories, price ranges, etc.).</div></div>
1860            </div>
1861          </div>
1862
1863          <!-- Trading -->
1864          <div id="rest-trading" class="tool-category">
1865            <div class="tool-category-header">
1866              <span class="tool-category-name">Trading</span>
1867              <span class="tool-badge badge-tx">Auth Required</span>
1868              <span class="tool-count">26 endpoints</span>
1869            </div>
1870
1871            <div class="tool-card">
1872              <div class="tool-card-header" onclick="toggleTool(this)">
1873                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/listings/:label</span>
1874                <span class="tool-card-summary">Current listings for a name</span>
1875              </div>
1876              <div class="tool-card-body"><div class="tool-card-desc">Aggregated marketplace listings. Public, no auth required.</div></div>
1877            </div>
1878            <div class="tool-card">
1879              <div class="tool-card-header" onclick="toggleTool(this)">
1880                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/offers/:label</span>
1881                <span class="tool-card-summary">Current offers on a name</span>
1882              </div>
1883              <div class="tool-card-body"><div class="tool-card-desc">All active offers. Public, no auth required.</div></div>
1884            </div>
1885            <div class="tool-card">
1886              <div class="tool-card-header" onclick="toggleTool(this)">
1887                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/market-data/:label</span>
1888                <span class="tool-card-summary">Combined listings + offers</span>
1889              </div>
1890              <div class="tool-card-body"><div class="tool-card-desc">One-call aggregation of all marketplace data for a name.</div></div>
1891            </div>
1892            <div class="tool-card">
1893              <div class="tool-card-header" onclick="toggleTool(this)">
1894                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/availability/:label</span>
1895                <span class="tool-card-summary">Registration availability + pricing</span>
1896              </div>
1897              <div class="tool-card-body"><div class="tool-card-desc">Check if a name is available for registration and get pricing tiers.</div></div>
1898            </div>
1899            <div class="tool-card">
1900              <div class="tool-card-header" onclick="toggleTool(this)">
1901                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/name-status/:label</span>
1902                <span class="tool-card-summary">On-chain name status</span>
1903              </div>
1904              <div class="tool-card-body"><div class="tool-card-desc">Available, registered, premium auction, grace period, etc.</div></div>
1905            </div>
1906            <div class="tool-card">
1907              <div class="tool-card-header" onclick="toggleTool(this)">
1908                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/expiry/:label</span>
1909                <span class="tool-card-summary">Expiry date + premium price</span>
1910              </div>
1911              <div class="tool-card-body"><div class="tool-card-desc">Days remaining, expiry timestamp, premium price if applicable.</div></div>
1912            </div>
1913            <div class="tool-card">
1914              <div class="tool-card-header" onclick="toggleTool(this)">
1915                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/trade/rent-price/:label</span>
1916                <span class="tool-card-summary">NameWrapper rental pricing</span>
1917              </div>
1918              <div class="tool-card-body"><div class="tool-card-desc">ENS rental pricing tiers for wrapped domains.</div></div>
1919            </div>
1920            <div class="tool-card">
1921              <div class="tool-card-header" onclick="toggleTool(this)">
1922                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/register-recipe</span>
1923                <span class="tool-card-summary">Build registration transaction</span>
1924              </div>
1925              <div class="tool-card-body"><div class="tool-card-desc">Returns complete registration recipe with contract, ABI, steps, and gas estimate. Optional <code>recipientAddress</code> registers the name to a different wallet than the one paying. Requires auth.</div></div>
1926            </div>
1927            <div class="tool-card">
1928              <div class="tool-card-header" onclick="toggleTool(this)">
1929                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/renew-recipe</span>
1930                <span class="tool-card-summary">Build renewal transaction</span>
1931              </div>
1932              <div class="tool-card-body"><div class="tool-card-desc">Returns transaction data to extend name registration. Requires auth.</div></div>
1933            </div>
1934            <div class="tool-card">
1935              <div class="tool-card-header" onclick="toggleTool(this)">
1936                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/batch-renew-recipe</span>
1937                <span class="tool-card-summary">Batch renewal via Multicall3</span>
1938              </div>
1939              <div class="tool-card-body"><div class="tool-card-desc">Bundle multiple renewals into a single transaction. Requires auth.</div></div>
1940            </div>
1941            <div class="tool-card">
1942              <div class="tool-card-header" onclick="toggleTool(this)">
1943                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/transfer-recipe</span>
1944                <span class="tool-card-summary">Build transfer transaction</span>
1945              </div>
1946              <div class="tool-card-body"><div class="tool-card-desc">Returns transaction data to transfer name ownership. Auto-detects wrapped vs unwrapped. Requires auth.</div></div>
1947            </div>
1948            <div class="tool-card">
1949              <div class="tool-card-header" onclick="toggleTool(this)">
1950                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/set-primary-name</span>
1951                <span class="tool-card-summary">Set primary ENS name</span>
1952              </div>
1953              <div class="tool-card-body"><div class="tool-card-desc">Set reverse resolution for a wallet address. Requires auth.</div></div>
1954            </div>
1955            <div class="tool-card">
1956              <div class="tool-card-header" onclick="toggleTool(this)">
1957                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/set-records</span>
1958                <span class="tool-card-summary">Update resolver records</span>
1959              </div>
1960              <div class="tool-card-body"><div class="tool-card-desc">Build a multicall transaction to set address records, text records, and contenthash. Requires auth.</div></div>
1961            </div>
1962            <div class="tool-card">
1963              <div class="tool-card-header" onclick="toggleTool(this)">
1964                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/fulfillment</span>
1965                <span class="tool-card-summary">Execute purchase/offer</span>
1966              </div>
1967              <div class="tool-card-body"><div class="tool-card-desc">Fulfill a Seaport order (buy listing or accept offer). Requires auth.</div></div>
1968            </div>
1969            <div class="tool-card">
1970              <div class="tool-card-header" onclick="toggleTool(this)">
1971                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/submit-order</span>
1972                <span class="tool-card-summary">Submit Seaport order</span>
1973              </div>
1974              <div class="tool-card-body"><div class="tool-card-desc">Submit a signed Seaport order to the orderbook. Requires auth.</div></div>
1975            </div>
1976            <div class="tool-card">
1977              <div class="tool-card-header" onclick="toggleTool(this)">
1978                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/batch-fulfillment</span>
1979                <span class="tool-card-summary">Batch buy multiple names</span>
1980              </div>
1981              <div class="tool-card-body"><div class="tool-card-desc">Fulfil multiple Seaport orders in a single transaction. Requires auth.</div></div>
1982            </div>
1983            <div class="tool-card">
1984              <div class="tool-card-header" onclick="toggleTool(this)">
1985                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/batch-transfer-recipe</span>
1986                <span class="tool-card-summary">Batch transfer via Multicall3</span>
1987              </div>
1988              <div class="tool-card-body"><div class="tool-card-desc">Transfer up to 20 names in a single transaction. Auto-detects wrapped vs unwrapped. Requires auth.</div></div>
1989            </div>
1990            <div class="tool-card">
1991              <div class="tool-card-header" onclick="toggleTool(this)">
1992                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/batch-set-records</span>
1993                <span class="tool-card-summary">Batch set records for multiple names</span>
1994              </div>
1995              <div class="tool-card-body"><div class="tool-card-desc">Set resolver records across up to 50 names in a single resolver multicall transaction. Requires auth.</div></div>
1996            </div>
1997            <div class="tool-card">
1998              <div class="tool-card-header" onclick="toggleTool(this)">
1999                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/bulk-register-recipe</span>
2000                <span class="tool-card-summary">Bulk registration via Multicall3</span>
2001              </div>
2002              <div class="tool-card-body"><div class="tool-card-desc">Batch register up to 20 names in 2 transactions (commit + register). Each name gets its own front-running secret. Optional <code>recipientAddress</code> registers the batch to a different wallet than the one paying. Requires auth.</div></div>
2003            </div>
2004            <div class="tool-card">
2005              <div class="tool-card-header" onclick="toggleTool(this)">
2006                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/wrap-recipe</span>
2007                <span class="tool-card-summary">Wrap name into NameWrapper</span>
2008              </div>
2009              <div class="tool-card-body"><div class="tool-card-desc">Returns approve + wrap transaction recipe to convert ERC-721 to ERC-1155. Optional fuses can be burned on wrap. Requires auth.</div></div>
2010            </div>
2011            <div class="tool-card">
2012              <div class="tool-card-header" onclick="toggleTool(this)">
2013                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/unwrap-recipe</span>
2014                <span class="tool-card-summary">Unwrap name from NameWrapper</span>
2015              </div>
2016              <div class="tool-card-body"><div class="tool-card-desc">Returns transaction recipe to convert ERC-1155 back to ERC-721. Fails if CANNOT_UNWRAP fuse is burned. Requires auth.</div></div>
2017            </div>
2018            <div class="tool-card">
2019              <div class="tool-card-header" onclick="toggleTool(this)">
2020                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/mint-subnames</span>
2021                <span class="tool-card-summary">Bulk create subnames</span>
2022              </div>
2023              <div class="tool-card-body"><div class="tool-card-desc">Create subnames under a parent name via NameWrapper. Each subname can have its own owner and records. Requires auth.</div></div>
2024            </div>
2025            <div class="tool-card">
2026              <div class="tool-card-header" onclick="toggleTool(this)">
2027                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/trade/renew</span>
2028                <span class="tool-card-summary">Execute renewal</span>
2029              </div>
2030              <div class="tool-card-body"><div class="tool-card-desc">Execute a name renewal directly. Requires auth.</div></div>
2031            </div>
2032            <div class="tool-card">
2033              <div class="tool-card-header" onclick="toggleTool(this)">
2034                <span class="tool-card-name"><span style="color:var(--red)">DELETE</span> /api/trade/order/:orderId</span>
2035                <span class="tool-card-summary">Cancel an order</span>
2036              </div>
2037              <div class="tool-card-body"><div class="tool-card-desc">Cancel an active listing or offer. Requires auth.</div></div>
2038            </div>
2039          </div>
2040
2041          <!-- Orderbook -->
2042          <div id="rest-orderbook" class="tool-category">
2043            <div class="tool-category-header">
2044              <span class="tool-category-name">Orderbook</span>
2045              <span class="tool-badge badge-tx">Auth Required</span>
2046              <span class="tool-count">14 endpoints</span>
2047            </div>
2048
2049            <div class="tool-card">
2050              <div class="tool-card-header" onclick="toggleTool(this)">
2051                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/orderbook/listings/:label</span>
2052                <span class="tool-card-summary">Listings for a specific name</span>
2053              </div>
2054              <div class="tool-card-body"><div class="tool-card-desc">All active orderbook listings for a specific name. Public.</div></div>
2055            </div>
2056            <div class="tool-card">
2057              <div class="tool-card-header" onclick="toggleTool(this)">
2058                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/orderbook/listings</span>
2059                <span class="tool-card-summary">All listings (paginated)</span>
2060              </div>
2061              <div class="tool-card-body"><div class="tool-card-desc">Browse all orderbook listings with pagination. Public.</div></div>
2062            </div>
2063            <div class="tool-card">
2064              <div class="tool-card-header" onclick="toggleTool(this)">
2065                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/orderbook/offers/:label</span>
2066                <span class="tool-card-summary">Offers on a specific name</span>
2067              </div>
2068              <div class="tool-card-body"><div class="tool-card-desc">All active offers on a name. Public.</div></div>
2069            </div>
2070            <div class="tool-card">
2071              <div class="tool-card-header" onclick="toggleTool(this)">
2072                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/create-listing</span>
2073                <span class="tool-card-summary">Create orderbook listing</span>
2074              </div>
2075              <div class="tool-card-body"><div class="tool-card-desc">Submit a new listing to the orderbook. Requires auth.</div></div>
2076            </div>
2077            <div class="tool-card">
2078              <div class="tool-card-header" onclick="toggleTool(this)">
2079                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/create-offer</span>
2080                <span class="tool-card-summary">Create orderbook offer</span>
2081              </div>
2082              <div class="tool-card-body"><div class="tool-card-desc">Submit a bid to the orderbook. Requires auth.</div></div>
2083            </div>
2084            <div class="tool-card">
2085              <div class="tool-card-header" onclick="toggleTool(this)">
2086                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/submit</span>
2087                <span class="tool-card-summary">Submit signed order</span>
2088              </div>
2089              <div class="tool-card-body"><div class="tool-card-desc">Submit a signed Seaport order to the orderbook. Requires auth.</div></div>
2090            </div>
2091            <div class="tool-card">
2092              <div class="tool-card-header" onclick="toggleTool(this)">
2093                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/fulfill</span>
2094                <span class="tool-card-summary">Fulfil orderbook order</span>
2095              </div>
2096              <div class="tool-card-body"><div class="tool-card-desc">Fulfil an existing orderbook order. Requires auth.</div></div>
2097            </div>
2098            <div class="tool-card">
2099              <div class="tool-card-header" onclick="toggleTool(this)">
2100                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/batch-create-listings</span>
2101                <span class="tool-card-summary">Batch create listings</span>
2102              </div>
2103              <div class="tool-card-body"><div class="tool-card-desc">Submit multiple listings in a single request. Requires auth.</div></div>
2104            </div>
2105            <div class="tool-card">
2106              <div class="tool-card-header" onclick="toggleTool(this)">
2107                <span class="tool-card-name"><span style="color:var(--red)">DELETE</span> /api/orderbook/order/:orderHash</span>
2108                <span class="tool-card-summary">
2108Cancel orderbook order</span>
2109              </div>
2110              <div class="tool-card-body"><div class="tool-card-desc">Cancel an active orderbook listing or offer by order hash. Requires auth.</div></div>
2111            </div>
2112            <div class="tool-card">
2113              <div class="tool-card-header" onclick="toggleTool(this)">
2114                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/create-swap</span>
2115                <span class="tool-card-summary">Build an ENS-for-ENS swap order</span>
2116              </div>
2117              <div class="tool-card-body"><div class="tool-card-desc">Build an unsigned Seaport barter order: names you give, names you want, plus optional WETH on either side. Returns the order for EIP-712 signing. Requires auth.</div></div>
2118            </div>
2119            <div class="tool-card">
2120              <div class="tool-card-header" onclick="toggleTool(this)">
2121                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/submit-swap</span>
2122                <span class="tool-card-summary">Submit a signed swap order</span>
2123              </div>
2124              <div class="tool-card-body"><div class="tool-card-desc">Submit the signed swap order to the orderbook so the counterparty can accept it. Requires auth.</div></div>
2125            </div>
2126            <div class="tool-card">
2127              <div class="tool-card-header" onclick="toggleTool(this)">
2128                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/orderbook/swaps/incoming</span>
2129                <span class="tool-card-summary">Swaps offered to you</span>
2130              </div>
2131              <div class="tool-card-body"><div class="tool-card-desc">List open swap orders where you are the requested counterparty. Requires auth.</div></div>
2132            </div>
2133            <div class="tool-card">
2134              <div class="tool-card-header" onclick="toggleTool(this)">
2135                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/orderbook/swaps/outgoing</span>
2136                <span class="tool-card-summary">Swaps you've proposed</span>
2137              </div>
2138              <div class="tool-card-body"><div class="tool-card-desc">List swap orders you've created and their status. Requires auth.</div></div>
2139            </div>
2140            <div class="tool-card">
2141              <div class="tool-card-header" onclick="toggleTool(this)">
2142                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/orderbook/accept-swap</span>
2143                <span class="tool-card-summary">Accept a swap (atomic settle)</span>
2144              </div>
2145              <div class="tool-card-body"><div class="tool-card-desc">Build the fulfillment for an incoming swap. Both sides settle atomically in one transaction; the acceptor pays a flat fee. Requires auth.</div></div>
2146            </div>
2147          </div>
2148
2149          <!-- User Management -->
2150          <div id="rest-user" class="tool-category">
2151            <div class="tool-category-header">
2152              <span class="tool-category-name">User Management</span>
2153              <span class="tool-badge badge-tx">Auth Required</span>
2154              <span class="tool-count">17 endpoints</span>
2155            </div>
2156
2157            <div class="tool-card">
2158              <div class="tool-card-header" onclick="toggleTool(this)">
2159                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/user/me</span>
2160                <span class="tool-card-summary">Current user profile</span>
2161              </div>
2162              <div class="tool-card-body"><div class="tool-card-desc">Address, ENS name, email, settings.</div></div>
2163            </div>
2164            <div class="tool-card">
2165              <div class="tool-card-header" onclick="toggleTool(this)">
2166                <span class="tool-card-name">Watchlist</span>
2167                <span class="tool-card-summary">GET, POST, PATCH, DELETE /api/user/watchlist</span>
2168              </div>
2169              <div class="tool-card-body">
2170                <div class="tool-card-desc">CRUD operations for the user's watchlist. POST to add, GET to list, PATCH /:label to update the target price, note, or toggle one alert type (<code>{ alertType, enable }</code>), DELETE /:label to remove. Alert types: listing, price_target, new_offer, sale, transfer, expiry_warning, available. Detected events land in the inbox: <code>GET /api/user/notifications</code>, <code>GET /api/user/notifications/unread-count</code>, <code>POST /api/user/notifications/read</code>.</div>
2171              </div>
2172            </div>
2173            <div class="tool-card">
2174              <div class="tool-card-header" onclick="toggleTool(this)">
2175                <span class="tool-card-name">Search History</span>
2176                <span class="tool-card-summary">GET, DELETE /api/user/history</span>
2177              </div>
2178              <div class="tool-card-body"><div class="tool-card-desc">GET to retrieve search history, DELETE to clear it.</div></div>
2179            </div>
2180            <div class="tool-card">
2181              <div class="tool-card-header" onclick="toggleTool(this)">
2182                <span class="tool-card-name">Portfolio</span>
2183                <span class="tool-card-summary">5 endpoints under /api/user/portfolio-*</span>
2184              </div>
2185              <div class="tool-card-body">
2186                <div class="tool-card-desc">
2187                  <strong>GET /api/user/portfolio-history</strong> &mdash; Historical portfolio snapshots<br>
2188                  <strong>POST /api/user/portfolio-snapshot</strong> &mdash; Create point-in-time snapshot<br>
2189                  <strong>GET /api/user/portfolio-stats</strong> &mdash; Aggregate stats (total value, count, unrealized PnL)<br>
2190                  <strong>GET /api/user/portfolio-pnl</strong> &mdash; Detailed P&amp;L per name<br>
2191                  <strong>GET /api/user/portfolio-realized</strong> &mdash; Realized gains/losses on sold names
2192                </div>
2193              </div>
2194            </div>
2195            <div class="tool-card">
2196              <div class="tool-card-header" onclick="toggleTool(this)">
2197                <span class="tool-card-name">Email</span>
2198                <span class="tool-card-summary">PUT, DELETE /api/user/email</span>
2199              </div>
2200              <div class="tool-card-body"><div class="tool-card-desc">PUT to set email for alerts, DELETE to remove.</div></div>
2201            </div>
2202          </div>
2203
2204          <!-- Portfolio -->
2205          <div id="rest-portfolio" class="tool-category">
2206            <div class="tool-category-header">
2207              <span class="tool-category-name">Portfolio</span>
2208              <span class="tool-badge badge-free">Public</span>
2209              <span class="tool-count">4 endpoints</span>
2210            </div>
2211
2212            <div class="tool-card">
2213              <div class="tool-card-header" onclick="toggleTool(this)">
2214                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/portfolio/:address/stats</span>
2215                <span class="tool-card-summary">Portfolio statistics</span>
2216              </div>
2217              <div class="tool-card-body"><div class="tool-card-desc">Aggregate portfolio statistics for any wallet: total value, holdings count, concentration metrics.</div></div>
2218            </div>
2219            <div class="tool-card">
2220              <div class="tool-card-header" onclick="toggleTool(this)">
2221                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/portfolio/:address/activity</span>
2222                <span class="tool-card-summary">Portfolio activity log</span>
2223              </div>
2224              <div class="tool-card-body"><div class="tool-card-desc">Recent activity for a portfolio: registrations, transfers, sales, renewals.</div></div>
2225            </div>
2226            <div class="tool-card">
2227              <div class="tool-card-header" onclick="toggleTool(this)">
2228                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/portfolio/:address/transactions</span>
2229                <span class="tool-card-summary">Transaction history</span>
2230              </div>
2231              <div class="tool-card-body"><div class="tool-card-desc">Full transaction history for a portfolio with prices and counterparties.</div></div>
2232            </div>
2233            <div class="tool-card">
2234              <div class="tool-card-header" onclick="toggleTool(this)">
2235                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/portfolio/:address/pnl</span>
2236                <span class="tool-card-summary">Profit &amp; loss analysis</span>
2237              </div>
2238              <div class="tool-card-body"><div class="tool-card-desc">Detailed P&amp;L breakdown per name: cost basis, current value, unrealized/realized gains.</div></div>
2239            </div>
2240          </div>
2241
2242          <!-- Terminal -->
2243          <div id="rest-terminal" class="tool-category">
2244            <div class="tool-category-header">
2245              <span class="tool-category-name">Terminal / Chat</span>
2246              <span class="tool-badge badge-tx">Auth Required</span>
2247              <span class="tool-count">5 endpoints</span>
2248            </div>
2249
2250            <div class="tool-card">
2251              <div class="tool-card-header" onclick="toggleTool(this)">
2252                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/terminal/chat</span>
2253                <span class="tool-card-summary">AI chat (SSE stream)</span>
2254              </div>
2255              <div class="tool-card-body">
2256                <div class="tool-card-desc">Multi-turn conversation with the Claude-powered ENS agent. Returns Server-Sent Events stream. Backed by RAG over the ENS knowledge base.</div>
2257              </div>
2258            </div>
2259            <div class="tool-card">
2260              <div class="tool-card-header" onclick="toggleTool(this)">
2261                <span class="tool-card-name">Sessions</span>
2262                <span class="tool-card-summary">CRUD at /api/terminal/sessions</span>
2263              </div>
2264              <div class="tool-card-body">
2265                <div class="tool-card-desc">
2266                  <strong>GET /api/terminal/sessions</strong> &mdash; List user's chat sessions<br>
2267                  <strong>GET /api/terminal/sessions/:id</strong> &mdash; Fetch session messages<br>
2268                  <strong>POST /api/terminal/sessions</strong> &mdash; Create new session<br>
2269                  <strong>DELETE /api/terminal/sessions/:id</strong> &mdash; Delete session
2270                </div>
2271              </div>
2272            </div>
2273          </div>
2274
2275          <!-- Knowledge -->
2276          <div id="rest-knowledge" class="tool-category">
2277            <div class="tool-category-header">
2278              <span class="tool-category-name">Knowledge</span>
2279              <span class="tool-badge badge-free">Public</span>
2280              <span class="tool-count">1 endpoint</span>
2281            </div>
2282
2283            <div class="tool-card">
2284              <div class="tool-card-header" onclick="toggleTool(this)">
2285                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/knowledge-search</span>
2286                <span class="tool-card-summary">Search ENS knowledge base</span>
2287              </div>
2288              <div class="tool-card-body">
2289                <div class="tool-card-desc">Governance proposals, protocol docs, developer insights, blog posts, forum discussions, and Farcaster casts from key ENS figures.</div>
2290                <table class="param-table">
2291                  <tr><th>Query Param</th><th>Type</th><th></th><th>Description</th></tr>
2292                  <tr><td>q</td><td><span class="type">string</span></td><td><span class="required">required</span></td><td>Search query</td></tr>
2293                  <tr><td>source</td><td><span class="type">string</span></td><td><span class="optional">optional</span></td><td>ens-forum, vitalik-blog, ens-blog, ens-docs, farcaster</td></tr>
2294                  <tr><td>limit</td><td><span class="type">number</span></td><td><span class="optional">default: 6</span></td><td>Number of results</td></tr>
2295                </table>
2296              </div>
2297            </div>
2298          </div>
2299
2300          <!-- Media -->
2301          <div id="rest-media" class="tool-category">
2302            <div class="tool-category-header">
2303              <span class="tool-category-name">Media</span>
2304              <span class="tool-badge badge-free">Public</span>
2305              <span class="tool-count">1 endpoint</span>
2306            </div>
2307
2308            <div class="tool-card">
2309              <div class="tool-card-header" onclick="toggleTool(this)">
2310                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/upload-avatar</span>
2311                <span class="tool-card-summary">Upload avatar to IPFS</span>
2312              </div>
2313              <div class="tool-card-body">
2314                <div class="tool-card-desc">Multipart upload. Accepts PNG, JPG, GIF, WebP, SVG (max 5 MB). Returns IPFS URI, gateway URL, and CID. Use the IPFS URI as the ENS avatar text record value.</div>
2315              </div>
2316            </div>
2317          </div>
2318
2319          <!-- Agents & Hosting -->
2320          <div id="rest-agents" class="tool-category">
2321            <div class="tool-category-header">
2322              <span class="tool-category-name">Agents & Hosting</span>
2323              <span class="tool-badge badge-free">Public + Auth</span>
2324              <span class="tool-count">6 endpoints</span>
2325            </div>
2326
2327            <div class="tool-card">
2328              <div class="tool-card-header" onclick="toggleTool(this)">
2329                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/agents/:label/profile</span>
2330                <span class="tool-card-summary">Hosted agent profile (persona, greeting, skills)</span>
2331              </div>
2332              <div class="tool-card-body"><div class="tool-card-desc">Public identity for a hosted agent: persona, greeting, enabled skills, and ENS binding. Powers the <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">/agent/&lt;label&gt;</code> chat page.</div></div>
2333            </div>
2334            <div class="tool-card">
2335              <div class="tool-card-header" onclick="toggleTool(this)">
2336                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/agents/:label/chat</span>
2337                <span class="tool-card-summary">Stream a chat turn with a hosted agent</span>
2338              </div>
2339              <div class="tool-card-body"><div class="tool-card-desc">SSE chat with the agent in its persona. Action skills stream unsigned transactions back as sign-cards for the visitor to sign in their own wallet (directed signing). Auth required for write actions.</div></div>
2340            </div>
2341            <div class="tool-card">
2342              <div class="tool-card-header" onclick="toggleTool(this)">
2343                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/agents/draft-brain</span>
2344                <span class="tool-card-summary">AI-draft an agent persona + skills</span>
2345              </div>
2346              <div class="tool-card-body"><div class="tool-card-desc">Given a short description, returns a suggested persona, greeting, and skill set to seed the Launch flow.</div></div>
2347            </div>
2348            <div class="tool-card">
2349              <div class="tool-card-header" onclick="toggleTool(this)">
2350                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/agents/:label/brain</span>
2351                <span class="tool-card-summary">Read an agent's saved config (owner)</span>
2352              </div>
2353              <div class="tool-card-body"><div class="tool-card-desc">Returns the full saved brain for an agent you own. Requires auth as the name's owner.</div></div>
2354            </div>
2355            <div class="tool-card">
2356              <div class="tool-card-header" onclick="toggleTool(this)">
2357                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/agents/:label/brain</span>
2358                <span class="tool-card-summary">Save persona, greeting & skills (owner)</span>
2359              </div>
2360              <div class="tool-card-body"><div class="tool-card-desc">Create or update an agent's persona, greeting, and enabled skills. Requires auth as the name's owner (wrapped-name owners supported).</div></div>
2361            </div>
2362            <div class="tool-card">
2363              <div class="tool-card-header" onclick="toggleTool(this)">
2364                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/og/agent/:label.png</span>
2365                <span class="tool-card-summary">Agent share / unfurl card image</span>
2366              </div>
2367              <div class="tool-card-body"><div class="tool-card-desc">Generated 1200&times;630 Open Graph image for an agent, used when its <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">/agent/&lt;label&gt;</code> link is shared. Public.</div></div>
2368            </div>
2369          </div>
2370
2371          <!-- Guardian -->
2372          <div id="rest-guardian" class="tool-category">
2373            <div class="tool-category-header">
2374              <span class="tool-category-name">Renewal Guardian</span>
2375              <span class="tool-badge badge-free">Public + Auth</span>
2376              <span class="tool-count">3 endpoints</span>
2377            </div>
2378
2379            <div class="tool-card">
2380              <div class="tool-card-header" onclick="toggleTool(this)">
2381                <span class="tool-card-name"><span style="color:var(--blue)">GET</span> /api/guardian/:address/renewals</span>
2382                <span class="tool-card-summary">What a wallet should renew, and why</span>
2383              </div>
2384              <div class="tool-card-body"><div class="tool-card-desc">The assisted renewal agent: scans a wallet's names and returns a prioritised renewal recommendation with reasoning and cost. Read-only and public.</div></div>
2385            </div>
2386            <div class="tool-card">
2387              <div class="tool-card-header" onclick="toggleTool(this)">
2388                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/guardian/:address/renewal-plan</span>
2389                <span class="tool-card-summary">Build a signable batch-renew recipe</span>
2390              </div>
2391              <div class="tool-card-body"><div class="tool-card-desc">Returns an unsigned batch-renewal transaction for the recommended names, ready for the owner to sign. Requires auth as the wallet owner.</div></div>
2392            </div>
2393            <div class="tool-card">
2394              <div class="tool-card-header" onclick="toggleTool(this)">
2395                <span class="tool-card-name"><span style="color:var(--green)">POST</span> /api/guardian/:address/renewal-status</span>
2396                <span class="tool-card-summary">Confirm a renewal landed</span>
2397              </div>
2398              <div class="tool-card-body"><div class="tool-card-desc">Reports the on-chain status of a submitted renewal so the agent can confirm completion.</div></div>
2399            </div>
2400          </div>
2401
2402        </section>
2403
2404        <!-- Workflows -->
2405        <section id="workflows" class="doc-section">
2406          <div class="section-label">Recipes</div>
2407          <div class="section-title">Common Workflows</div>
2408          <div class="workflow-grid">
2409            <div class="workflow-card">
2410              <div class="workflow-title">Provision an agent identity</div>
2411              <ul class="workflow-steps">
2412                <li data-step="1.">Call <code>provision_agent_identity</code> with purpose, budget, and wallet</li>
2413                <li data-step="2.">Pick a name from the recommendations</li>
2414                <li data-step="3.">Execute the registration recipe with your wallet (commit &rarr; wait 60s &rarr; register)</li>
2415                <li data-step="4.">Call <code>set_ens_records</code> with the suggested records (ai.agent, ai.capabilities, etc.)</li>
2416                <li data-step="5.">Call <code>set_primary_name</code> to set reverse resolution</li>
2417              </ul>
2418            </div>
2419            <div class="workflow-card">
2420              <div class="workflow-title">Find and buy underpriced names</div>
2421              <ul class="workflow-steps">
2422                <li data-step="1.">Call <code>find_alpha</code> with your price ceiling and minimum discount</li>
2423                <li data-step="2.">For each opportunity, call <code>get_valuation</code> for deep analysis</li>
2424                <li data-step="3.">Call <code>purchase_name</code> to get the Seaport fulfillment data</li>
2425                <li data-step="4.">Sign and broadcast the transaction with your wallet</li>
2426              </ul>
2427            </div>
2428            <div class="workflow-card">
2429              <div class="workflow-title">Deploy an agent fleet</div>
2430              <ul class="workflow-steps">
2431                <li data-step="1.">Register the parent name: <code>purchase_name</code> with action "register"</li>
2432                <li data-step="2.">Wrap it: <code>wrap_name</code> to enable subname features</li>
2433                <li data-step="3.">Mint fleet subnames: <code>mint_subnames</code> (e.g. agent001.fleet.eth, agent002.fleet.eth)</li>
2434                <li data-step="4.">Configure all at once: <code>bulk_set_records</code> with agent metadata per subname</li>
2435              </ul>
2436            </div>
2437            <div class="workflow-card">
2438              <div class="workflow-title">Bind an ERC-8004 identity to a name</div>
2439              <ul class="workflow-steps">
2440                <li data-step="1.">Call <code>register_agent</code> for your name (default "adapter" route, ERC-8217-bound)</li>
2441                <li data-step="2.">Sign and broadcast the registration transaction</li>
2442                <li data-step="3.">Read the new agentId from the receipt</li>
2443                <li data-step="4.">Call <code>set_ens_records</code> with the agentRegistration shorthand to write the ENSIP-25 binding</li>
2444                <li data-step="5.">Verify with <code>get_agent_reputation</code></li>
2445              </ul>
2446            </div>
2447            <div class="workflow-card">
2448              <div class="workflow-title">Batch renew a portfolio</div>
2449              <ul class="workflow-steps">
2450                <li data-step="1.">Call <code>get_wallet_portfolio</code> for the wallet</li>
2451                <li data-step="2.">Filter names expiring soon (or use <code>get_name_details</code> for exact expiry)</li>
2452                <li data-step="3.">Call <code>renew_ens_name</code> with the full array (bundled via Multicall3)</li>
2453                <li data-step="4.">Sign one transaction;
2453 excess ETH is refunded</li>
2454              </ul>
2455            </div>
2456          </div>
2457        </section>
2458
2459        <!-- Standards -->
2460        <section id="standards" class="doc-section">
2461          <div class="section-label">Standards</div>
2462          <div class="section-title">Protocol Support</div>
2463          <div class="section-desc">Name Whisper builds on open standards for trading, authentication, and AI agent identity on Ethereum &mdash; no proprietary lock-in.</div>
2464          <div class="standards-grid">
2465            <div class="standard-card">
2466              <div class="standard-name">Seaport</div>
2467              <div class="standard-desc">The open order protocol Name Whisper uses for every listing, offer, swap, and fill &mdash; the same protocol that powers OpenSea. Orders live on a shared on-chain orderbook, so liquidity is pooled across the ecosystem. Name Whisper builds unsigned orders; the caller always signs.</div>
2468              <div class="standard-status status-live">Live</div>
2469            </div>
2470            <div class="standard-card">
2471              <div class="standard-name">ERC-8128</div>
2472              <div class="standard-desc">Signed-request authentication. Agents sign HTTP requests with an Ethereum wallet to unlock identity-aware features (reputation, per-agent usage, future premium tiers). Max validity 300s with nonce replay protection. Unsigned requests still work. See get_caller_identity and <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">/.well-known/erc8128</code>.</div>
2473              <div class="standard-status status-live">Live</div>
2474            </div>
2475            <div class="standard-card">
2476              <div class="standard-name">ENSIP-25</div>
2477              <div class="standard-desc">Agent-to-ENS binding protocol. Cryptographically links an ENS name to an on-chain agent registry entry via standardized text records. Supported in set_ens_records, bulk_set_records, provision_agent_identity, and get_agent_reputation.</div>
2478              <div class="standard-status status-live">Live</div>
2479            </div>
2480            <div class="standard-card">
2481              <div class="standard-name">ERC-8004</div>
2482              <div class="standard-desc">Agent identity registry standard. On-chain agent registration, reputation scoring, and capability validation. Live on Ethereum mainnet since Jan 2026. <a href="/agents" style="color: var(--accent);">View the live registry feed &rarr;</a></div>
2483              <div class="standard-status status-live">Live</div>
2484            </div>
2485            <div class="standard-card">
2486              <div class="standard-name">ERC-8217</div>
2487              <div class="standard-desc">Token-bound agent identity. Binds an ERC-8004 agent to the ENS name's token so control and marketplace visibility follow the name &mdash; sell the name and the agent transfers with it. The default route in register_agent.</div>
2488              <div class="standard-status status-live">Live</div>
2489            </div>
2490          </div>
2491        </section>
2492
2493        <!-- Payments -->
2494        <section id="payments" class="doc-section">
2495          <div class="section-label">Payments</div>
2496          <div class="section-title">Interface Fees</div>
2497          <div class="section-desc">Separate from the machine-payment rails below, Name Whisper charges a 1% interface fee on the transactions it builds &mdash; identically whether the transaction comes from MCP, REST, or the web app. Every recipe returns the fee broken out so a client can display it before signing.</div>
2498
2499          <div class="tool-category" style="margin-bottom: 24px;">
2500            <div style="font-size: 13px; color: var(--text-secondary); line-height: 1.9;">
2501              <strong style="color: var(--text);">1% seller-paid</strong>, deducted from proceeds &mdash; selling via a Name Whisper listing, accepting an offer. Returned as <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">listing.protocolFeeEth</code> / <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">sellerProceedsEth</code>.<br>
2502              <strong style="color: var(--text);">1% on top of the ENS price</strong> &mdash; registering and renewing, single or bulk. Returned as <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">totalCost.feeEth</code> / <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">feeBps</code> on register recipes, and <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">feeEth</code> / <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">ensCostEth</code> / <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">feeBps</code> from <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">/api/trade/renew</code>. Fixed at 100 bps in the contracts themselves.<br>
2503              <strong style="color: var(--text);">Flat $5</strong>, priced in ETH at settlement &mdash; accepting a swap, paid by the acceptor.<br>
2504              <strong style="color: var(--text);">No fee</strong> &mdash; buying a listed name, transfers, records, wrapping, subnames. Gas only.<br>
2505              <span style="color: var(--text-dim);">Full schedule and verified contract addresses: <a href="/guide#fees" style="color: var(--accent);">namewhisper.ai/guide#fees</a></span>
2506            </div>
2507          </div>
2508
2509          <div class="section-title">Machine Payment Protocols</div>
2510          <div class="section-desc">Name Whisper supports two machine-to-machine payment protocols for agent transactions. All tools are currently free &mdash; fee switches exist to activate either protocol later.</div>
2511
2512          <div class="standards-grid" style="margin-bottom: 24px;">
2513            <div class="standard-card">
2514              <div class="standard-name">x402</div>
2515              <div class="standard-desc">HTTP-native payment protocol via Coinbase. USDC on Base (chain ID 8453). Payment challenges and receipts flow through HTTP 402 responses and headers. <a href="https://x402.org" style="color: var(--accent);" target="_blank" rel="noopener">x402.org</a></div>
2516              <div class="standard-status status-partial">Dormant</div>
2517            </div>
2518            <div class="standard-card">
2519              <div class="standard-name">MPP</div>
2520              <div class="standard-desc">MCP-native payment protocol via Stripe/Tempo. pathUSD on Tempo network. Payment challenges, credentials, and receipts flow through JSON-RPC <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">_meta</code> fields in the MCP SDK transport. <a href="https://mpp.dev" style="color: var(--accent);" target="_blank" rel="noopener">mpp.dev</a></div>
2521              <div class="standard-status status-partial">Dormant</div>
2522            </div>
2523          </div>
2524
2525          <div class="tool-category">
2526            <div class="tool-category-header">
2527              <div class="tool-category-name">Tool Classification</div>
2528            </div>
2529
2530            <div style="font-size: 13px; color: var(--text-secondary); line-height: 1.7; margin-bottom: 20px;">
2531              34 tools are permanently free (search, discovery, valuation, portfolio, market data, knowledge, identity, and all order-building reads). 9 transaction tools (<code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">purchase_name</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">make_offer</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">accept_offer</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">create_listing</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">batch_create_listings</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">batch_purchase</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">sweep</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">set_ens_records</code>, <code style="font-family: var(--font-mono); font-size: 11px; color: var(--accent-bright);">mint_subnames</code>) are wrapped with payment gating. When fees activate, these tools return a 402 challenge that the agent resolves via the active protocol.
2532            </div>
2533
2534            <div class="tool-category-header">
2535              <div class="tool-category-name">Payment Discovery</div>
2536            </div>
2537
2538            <div style="font-size: 13px; color: var(--text-secondary); line-height: 1.7; margin-bottom: 12px;">
2539              Agents can query the payment discovery endpoint to check which protocols are available, which tools are free vs paid, and current pricing.
2540            </div>
2541
2542            <div class="tool-card">
2543              <div class="tool-card-header" onclick="toggleTool(this)">
2544                <span class="tool-card-name">GET /mcp/payments</span>
2545                <span class="tool-card-summary">Payment protocol discovery</span>
2546              </div>
2547              <div class="tool-card-body">
2548                <div class="tool-card-desc">Returns supported payment protocols, active protocol, and per-tool classification with current pricing.</div>
2549                <div class="example-label">Response</div>
2550                <div class="code-block"><button class="copy-btn" onclick="copyCode(this)">copy</button>{
2551  <span class="str">"activeProtocol"</span>: <span class="str">null</span>,
2552  <span class="str">"protocols"</span>: {
2553    <span class="str">"x402"</span>: {
2554      <span class="str">"supported"</span>: <span class="num">true</span>,
2555      <span class="str">"enabled"</span>: <span class="num">false</span>,
2556      <span class="str">"currency"</span>: <span class="str">"USDC"</span>,
2557      <span class="str">"network"</span>: <span class="str">"base"</span>,
2558      <span class="str">"chainId"</span>: <span class="num">8453</span>
2559    },
2560    <span class="str">"mpp"</span>: {
2561      <span class="str">"supported"</span>: <span class="num">true</span>,
2562      <span class="str">"enabled"</span>: <span class="num">false</span>,
2563      <span class="str">"currency"</span>: <span class="str">"pathUSD"</span>,
2564      <span class="str">"network"</span>: <span class="str">"tempo"</span>,
2565      <span class="str">"transport"</span>: <span class="str">"mcp-sdk"</span>
2566    }
2567  },
2568  <span class="str">"tools"</span>: [
2569    { <span class="str">"name"</span>: <span class="str">"search_ens_names"</span>, <span class="str">"classification"</span>: <span class="str">"FREE"</span>, <span class="str">"requiresPayment"</span>: <span class="num">false</span> },
2570    { <span class="str">"name"</span>: <span class="str">"purchase_name"</span>, <span class="str">"classification"</span>: <span class="str">"TRANSACTION"</span>, <span class="str">"requiresPayment"</span>: <span class="num">false</span>, <span class="str">"currentPrice"</span>: <span class="str">"0"</span> },
2571    <span class="cmt">// ... all 44 tools listed</span>
2572  ]
2573}</div>
2574              </div>
2575            </div>
2576          </div>
2577
2578          <div class="tool-category">
2579            <div class="tool-category-header">
2580              <div class="tool-category-name">Payment Flow</div>
2581            </div>
2582
2583            <div style="font-size: 13px; color: var(--text-secondary); line-height: 1.7; margin-bottom: 16px;">
2584              When fee switches are activated, transaction tools use this flow:
2585            </div>
2586
2587            <div class="workflow-card" style="background: var(--surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 24px; margin-bottom: 16px;">
2588              <div style="font-family: var(--font-display); font-size: 16px; font-weight: 600; margin-bottom: 12px;">x402 (HTTP transport)</div>
2589              <ol class="workflow-steps">
2590                <li data-step="1.">Agent calls a TRANSACTION tool via HTTP</li>
2591                <li data-step="2.">Server responds with HTTP 402 + payment challenge (USDC amount, pay-to address)</li>
2592                <li data-step="3.">Agent pays on Base, receives receipt</li>
2593                <li data-step="4.">Agent retries the tool call with payment receipt in headers</li>
2594                <li data-step="5.">Server verifies receipt and executes the tool</li>
2595              </ol>
2596            </div>
2597
2598            <div class="workflow-card" style="background: var(--surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 24px;">
2599              <div style="font-family: var(--font-display); font-size: 16px; font-weight: 600; margin-bottom: 12px;">MPP (MCP SDK transport)</div>
2600              <ol class="workflow-steps">
2601                <li data-step="1.">Agent calls a TRANSACTION tool via MCP SDK</li>
2602                <li data-step="2.">Server returns an MCP error <code>-32042</code> with payment challenge in <code>_meta</code></li>
2603                <li data-step="3.">Agent pays on Tempo (pathUSD), receives credential</li>
2604                <li data-step="4.">Agent retries with payment credential in the <code>_meta</code> field</li>
2605                <li data-step="5.">Server verifies credential and executes the tool</li>
2606              </ol>
2607            </div>
2608          </div>
2609        </section>
2610
2611      </main>
2612    </div>
2613
2614    <!-- Footer -->
2615    <footer class="footer">
2616      <div class="footer-brand">&copy; 2026 Name Whisper</div>
2617      <div class="footer-links">
2618        <a href="/terminal">Terminal</a>
2619        <a href="/guide">Guide</a>
2620        <a href="/docs">Docs</a>
2621        <a href="/agents">Agents</a>
2622        <a href="/launch">Launch</a>
2623        <a href="/swap">Swap</a>
2624        <a href="/tools">Tools</a>
2625        <a href="/terms">Terms</a>
2626        <a href="/privacy">Privacy</a>
2627        <a href="https://x.com/NameWhisper_AI" target="_blank" rel="noopener">@NameWhisper_AI</a>
2628      </div>
2629    </footer>
2630
2631  </div>
2632
2633  
2633<script>
2634    function copyText(text, btn) {
2635      navigator.clipboard.writeText(text).then(function() {
2636        btn.textContent = 'copied';
2637        setTimeout(function() { btn.textContent = 'copy'; }, 1500);
2638      });
2639    }
2640    function copyCode(btn) {
2641      var block = btn.parentElement;
2642      var clone = block.cloneNode(true);
2643      var b = clone.querySelector('.copy-btn');
2644      if (b) b.remove();
2645      navigator.clipboard.writeText(clone.textContent.trim()).then(function() {
2646        btn.textContent = 'copied';
2647        setTimeout(function() { btn.textContent = 'copy'; }, 1500);
2648      });
2649    }
2650    function toggleTool(header) {
2651      header.parentElement.classList.toggle('open');
2652    }
2653
2654    // Sidebar active state on scroll
2655    var sections = document.querySelectorAll('[id]');
2656    var sidebarLinks = document.querySelectorAll('.sidebar-link');
2657    window.addEventListener('scroll', function() {
2658      var scrollY = window.scrollY + 100;
2659      sections.forEach(function(section) {
2660        var top = section.offsetTop;
2661        var height = section.offsetHeight;
2662        var id = section.getAttribute('id');
2663        if (scrollY >= top && scrollY < top + height) {
2664          sidebarLinks.forEach(function(link) {
2665            link.classList.remove('active');
2666            if (link.getAttribute('href') === '#' + id) {
2667              link.classList.add('active');
2668            }
2669          });
2670        }
2671      });
2672    });
2673  </script>
2673
2674</body>
2675</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.