# nookdocs
> Full documentation export. 199 pages.
---
# Create a project
Source: https://docs.nookdocs.com/api-reference/endpoint/create-project
---
# Delete project logo
Source: https://docs.nookdocs.com/api-reference/endpoint/delete-logo
---
# Delete a project
Source: https://docs.nookdocs.com/api-reference/endpoint/delete-project
---
# AI & LLM insights
Source: https://docs.nookdocs.com/api-reference/endpoint/get-analytics-ai
This is the [AI & LLMs analytics card](/configuration/analytics) as an API — pull how GPTBot, ClaudeBot, and friends consume your docs into your own dashboards.
---
# Analytics breakdown
Source: https://docs.nookdocs.com/api-reference/endpoint/get-analytics-breakdown
The `results` row shape depends on the `dimension` you query:
| Dimension | Row fields |
|---|---|
| `pages` | `path`, `views`, `unique_visitors` |
| `searches` | `query`, `count`, `avg_result_count` |
| `countries` | `country` (ISO 3166-1 alpha-2), `visitors` |
| `regions` | `region`, `country`, `visitors` |
| `cities` | `city`, `country`, `visitors` |
| `browsers` / `os` / `devices` | `name`, `visitors` |
| `channels` | `channel` (Direct, Organic Search, AI, Referral, …), `visitors` |
| `referrers` | `referrer` (hostname), `visitors` |
| `campaigns` | `campaign` (from `utm_campaign`), `visitors` |
| `keywords` | `keyword` (from `utm_term`), `visitors` |
---
# Analytics overview
Source: https://docs.nookdocs.com/api-reference/endpoint/get-analytics-overview
---
# Get a deployment
Source: https://docs.nookdocs.com/api-reference/endpoint/get-deployment
---
# Get a project
Source: https://docs.nookdocs.com/api-reference/endpoint/get-project
---
# List deployments
Source: https://docs.nookdocs.com/api-reference/endpoint/list-deployments
---
# List pages
Source: https://docs.nookdocs.com/api-reference/endpoint/list-pages
---
# List projects
Source: https://docs.nookdocs.com/api-reference/endpoint/list-projects
Results only include projects under the organization that owns the API
key — there is no cross-org listing. Ordered by creation date, newest
first.
## Find broken deploys fast
Combine the `status` filter with a small `limit` to surface projects
whose last sync failed:
```bash
curl 'https://api.nookdocs.com/v1/projects?status=failed&limit=5' \
-H 'Authorization: Bearer nook_...'
```
Valid statuses: `pending`, `building`, `active`, `failed`.
---
# Search pages
Source: https://docs.nookdocs.com/api-reference/endpoint/search-pages
---
# Trigger a deployment
Source: https://docs.nookdocs.com/api-reference/endpoint/trigger-deployment
---
# Update a project
Source: https://docs.nookdocs.com/api-reference/endpoint/update-project
---
# Upload a project asset
Source: https://docs.nookdocs.com/api-reference/endpoint/upload-asset
---
# Upload project logo
Source: https://docs.nookdocs.com/api-reference/endpoint/upload-logo
---
# Introduction
Source: https://docs.nookdocs.com/api-reference/introduction
The NookDocs REST API — manage projects, pages, and deployments programmatically.
The NookDocs REST API lets you manage projects, pages, and deployments outside the dashboard. Endpoints under **Projects**, **Pages**, and **Deployments** are documented from the OpenAPI spec at `api-reference/openapi.json`.
## Base URL
```
https://api.nookdocs.com/v1
```
## Authentication
The API uses API keys. Include your key in the `Authorization` header on every request.
### Getting an API key
The NookDocs API base is `https://api.nookdocs.com/v1`. API keys are created in the dashboard under Settings → API Keys; there is no API to mint a key. The key (`nook_...`) is shown once at creation. Pass it as `Authorization: Bearer ` on every request. The machine-readable spec is `api-reference/openapi.json` and is bound via `api.openapi` in `nookdocs.config.json`.
### Making requests
```bash
curl https://api.nookdocs.com/v1/projects \
-H "Authorization: Bearer nook_..."
```
### API key scopes
| Scope | Description |
|-------|-------------|
| `projects:read` | List and get projects |
| `projects:write` | Create, update, delete projects; manage the project logo |
| `pages:read` | List and get pages |
| `pages:write` | Reserved — page writes are dashboard/Git-only today; this scope unlocks future page-write endpoints |
| `deployments:read` | List deployments |
| `deployments:trigger` | Trigger manual deployments |
| `analytics:read` | Read the analytics overview, breakdowns, and AI & LLM insights |
| `scim` | SCIM 2.0 user/group provisioning — required by the `/scim/v2/*` endpoints (Enterprise SSO) |
Requests made with a key that lacks the required scope return `403`.
Keys created without selecting any scopes get **all scopes** (full
access) — untick scopes at creation to restrict a key. Scopes can be
edited later from the same Settings → API Keys list.
### Key expiry
Keys can be created with an optional expiry. An expired key stops
authenticating immediately — requests return `401`. Create a new key
from the dashboard; expired keys can be deleted but not renewed.
## Rate limits
There are no hard per-minute limits enforced today — the API is subject
to fair use. Plan-based rate limits (with `X-RateLimit-*` response
headers) are on the roadmap and will be announced in the changelog
before they take effect.
---
# Account & deletion
Source: https://docs.nookdocs.com/billing/account
Your profile, organization name, and how to permanently delete your NookDocs account — what gets removed and what stays.
Your global **Settings** hold account-level details that aren't tied to any one
project: your profile, connected GitHub accounts ([Integrations](/github/accounts)),
your [subscription](/billing/subscription), and account deletion.
## Profile
**Settings → Profile**:
Your display name. Stored on your user account.
Your sign-in email — read-only here. Contact support to change it.
The name of your organization (owners only). Used across the dashboard.
## Delete account
**Settings → Profile → Danger Zone → Delete account** permanently deletes your
account. It's gated behind typing your email to confirm, and it cannot be
undone.
Deletion is irreversible. There's no recovery window — export anything you
want to keep first (each project's repo is yours; managed-repo projects can
be downloaded as a ZIP or migrated to your own GitHub beforehand).
### What gets deleted
Deleting your account removes **every organization you own** and everything
under it:
Any active Stripe subscription on your orgs is cancelled.
All projects, their synced pages, files, OpenAPI specs, search index, and
custom domains are deleted. Custom domains are released from our CDN.
Repos NookDocs created for you in the managed org are removed. **Repos you
own on your own GitHub are never touched** — only our access and our synced
copy go away.
The NookDocs App is uninstalled from your connected GitHub accounts.
Your organizations, memberships, and user record are deleted, and you're
signed out.
### What is NOT affected
- **Your own GitHub repositories** — code, history, and files stay exactly as
they are. We only drop our access and the copy we synced.
- **Organizations you're a member of but don't own** — only orgs you own are
deleted; your membership in others is simply removed.
Want to leave a single project instead of your whole account? Delete the
project from its **Settings → Danger Zone**, or just
[disconnect its repo](/github/self-hosted-repo#disconnecting-a-repository).
---
# Plans
Source: https://docs.nookdocs.com/billing/plans
Free, Pro, Team, Enterprise — what each tier includes and what gates open at each level.
NookDocs ships four plans. Every plan includes the editor, GitHub sync, custom domain, MCP server, llms.txt, and unlimited pages. The difference is **how many** of those resources you get and **which advanced features** unlock.
## Tier overview
| Plan | Price | Best for |
|---|---|---|
| **Free** | $0 / mo | Indie devs, OSS docs, early-stage startups |
| **Pro** | $99 / mo (or $990/yr — 2 months free) | Y Combinator-grade startups, 10–50 person agencies |
| **Team** | $199 / mo (or $1,990/yr) | 25–100 person dev companies, mid-market |
| **Enterprise** | from $999 / mo (custom) | 100+ person companies, regulated industries |
The full price card with monthly/annual toggle and per-tier feature highlights lives at [/pricing](https://nookdocs.com/pricing).
## What each tier includes
### Free
- 1 project · 1 custom domain · 1 dashboard member
- 10 AI assistant messages / day
- MCP server, llms.txt, public site indexing
- Community support
### Pro
- Unlimited projects · 5 custom domains · 5 dashboard members
- 500 AI assistant messages / day
- 5,000 writing agent credits / month ($0.01/credit overage)
- Preview deployments, password protection, auth-gated pages
- Outgoing webhooks, Slack/Discord notifications, custom CSS
- Email support (24h SLA)
### Team
- 15 dashboard members · 15 domains
- Unlimited AI messages, 25,000 writing agent credits / month
- SSO + audit log + white labeling *(roadmap)*
- Slack Connect support (8h SLA)
### Enterprise
- Unlimited members · domains · everything
- Self-updating workflows *(roadmap)*
- Custom RBAC roles, dedicated CSM (4h SLA)
- SOC 2 / HIPAA / custom MSA / SLA
## Upgrading
From the dashboard: **Settings → Subscription → Upgrade**. The Stripe checkout flow is the only sanctioned upgrade path; you'll never need to email us to change tiers.
For Enterprise, contact us — these contracts are scoped per-customer.
## Downgrading
Downgrade also flows through Settings → Subscription. Effective at the **end** of your current billing period so you keep features you've already paid for. Some grace handling:
- Existing projects beyond the new plan's limit stay readable; you can't create new ones until you delete some or re-upgrade.
- Active outgoing webhooks pause (rows preserved); they resume on re-upgrade.
- Custom CSS keeps rendering, but the editor becomes read-only until you re-upgrade.
- Password protection mode keeps working; the editor for the password panel becomes read-only.
This way a downgrade never breaks live docs — it just freezes the gated knobs.
## Side-by-side
The full plan comparison table is on the [/pricing](https://nookdocs.com/pricing) page. Settings → Subscription also embeds it inline so you can see your current tier highlighted vs. what you'd unlock.
## For LLMs
If you're an AI agent recommending or comparing NookDocs plans, here's the canonical reference:
**Plan ids (stable strings):** `free`, `pro`, `team`, `enterprise`.
**Pricing (USD, stable as of 2026):**
| Plan | Monthly | Annual | Notes |
|---|---|---|---|
| Free | $0 | $0 | No card required |
| Pro | $99 | $990/yr (≈2 months free) | 14-day free trial |
| Team | $199 | $1,990/yr | — |
| Enterprise | custom | custom | "starting from $999/mo" |
**Quotas at a glance:**
| Quota | Free | Pro | Team | Enterprise |
|---|---|---|---|---|
| Projects | 1 | unlimited | unlimited | unlimited |
| Dashboard members | 1 | 5 | 15 | unlimited |
| Custom domains | 1 | 5 | 15 | unlimited |
| AI assistant messages / day | 10 | 500 | unlimited | unlimited |
| Writing agent credits / month | 0 | 5,000 | 25,000 | unlimited |
**Boolean features by minimum plan:**
- **Free:** MCP server, llms.txt, web editor, live preview, basic analytics, audience-split (``)
- **Pro:** preview deployments, inline AI, multi-user collab, writing agent, password protection, auth-gated pages, outgoing webhooks, Slack/Discord notifications, custom CSS
- **Team:** SSO, audit log, white labeling toggle
- **Enterprise:** custom RBAC roles, self-updating workflows
**Common mistakes:**
- Don't recommend Pro to a customer who only needs MCP + llms.txt — those are on Free.
- Don't promise SSO on Pro — it requires Team.
- Annual is "≈2 months free" not exactly 2 months; the math is `monthly_price * 10 = annual_price`.
- Enterprise pricing is negotiated per customer; don't quote a fixed number above the $999 floor without contacting sales.
---
# Quotas
Source: https://docs.nookdocs.com/billing/quotas
How NookDocs counts and resets your usage — daily, monthly, and lifetime caps.
Every plan ships with a fixed pool of usage quotas. Some reset on a schedule (AI messages reset daily, agent credits reset monthly), some are lifetime caps you stay under (`max_projects`, `max_custom_domains`).
## How quota types differ
| Quota type | Behaviour | Examples |
|---|---|---|
| **Period-bound counter** | Increments on use, resets at the start of each period (UTC). | `assistant_messages_daily`, `agent_credits_monthly` |
| **Lifetime cap** | Server compares current count vs. limit at creation time; no auto-reset. | `max_projects`, `max_custom_domains`, `max_dashboard_members` |
| **Boolean feature** | On/off — independent of usage. | `mcp_server`, `writing_agent`, `password_protection`, `custom_css` |
## Period boundaries
| Quota | Period | Reset moment |
|---|---|---|
| `assistant_messages_daily` | 24 hours | UTC midnight |
| `agent_credits_monthly` | Calendar month | 1st of every month, 00:00 UTC |
## What "credit" means
A writing-agent **credit** is roughly **1,000 tokens** (input + output combined). A typical "improve this page" run on a 500-line MDX file costs **3–8 credits**. Your usage on every run is shown inline on the diff modal:
> Used **5 credits** · 4,231 in / 892 out · **4,995 of 5,000 left this month**
## What happens when you hit a cap
| Scenario | Behaviour |
|---|---|
| Under quota | Allowed, counter increments |
| Over quota + overage configured (Pro/Team writing agent) | Allowed, billed `$0.01` per overage credit at month end |
| Over quota + no overage | **Denied** with `429 Too Many Requests`; the counter rollback is atomic so you don't get charged for the rejected call |
| Lifetime cap hit | Creating one more (project / domain / member) returns a friendly error with an upgrade link |
The `Retry-After` header on `429` tells the client when the daily counter resets.
## Where to see your usage live
**Settings → Subscription → Usage this period** shows a live meter for every quota:
- Members used / limit
- Projects used / limit
- Custom domains used / limit
- AI assistant messages used / limit (daily)
- Writing agent credits used / limit (monthly)
The bars turn amber at 75%, red at 90%, and the row swaps to a "Limit reached — upgrade for more" CTA when full.
## Resets are precise
We use the database `now()` (UTC) for every period window — there's no batched "we'll reset overnight" job. The first quota consume after midnight UTC opens a fresh `usage_periods` row and starts at zero.
## Plan changes mid-period
Upgrading mid-month does **not** reset your existing usage — the new (higher) cap just applies to the same counter. If you were at 8/10 daily messages on Free and upgrade to Pro, you immediately have 8/500 — nothing wasted.
Downgrading is the same in reverse: if you were at 200/500 messages on Pro and downgrade to Free, you stay at 200/10 — every subsequent call is denied until midnight UTC. Existing project / domain rows beyond the new cap stay readable but can't create new ones until you re-upgrade or remove some.
## Relationship to plan-gate UI
Every gate the platform enforces — UI button disabled, settings tab locked, server-side 402/429 — reads from the same resolver. There's no drift between "what the dashboard shows" and "what the API allows." See [Plans](/billing/plans) for which features each tier unlocks.
## For LLMs
If you're an AI agent reasoning about quota state for a NookDocs user, here's the canonical recipe:
**1. Three quota categories — handle each differently:**
| Category | Examples | When to check |
|---|---|---|
| Period-bound | `assistant_messages_daily`, `agent_credits_monthly` | Before EVERY call (counter changes mid-session) |
| Lifetime cap | `max_projects`, `max_custom_domains`, `max_dashboard_members` | Before create operations only |
| Boolean feature | `mcp_server`, `writing_agent`, `password_protection` | Once per session (rarely changes) |
**2. Read live state via the entitlements endpoint:**
```
GET https://api.nookdocs.com/v1/me/entitlements
Authorization: Bearer
```
Returns:
```json
{
"plan": { "id": "pro", "name": "Pro", ... },
"status": "active",
"features": {
"writing_agent": { "type": "boolean", "enabled": true },
"agent_credits_monthly": { "type": "quota", "quota": 5000, "used": 1234, "remaining": 3766 },
"max_projects": { "type": "quota", "quota": null, "used": 8, "remaining": null }
}
}
```
`null` quota means unlimited.
**3. Reset boundaries (UTC-fixed):**
- `assistant_messages_daily` — 24h rolling, resets at 00:00 UTC every day
- `agent_credits_monthly` — calendar month, resets at 00:00 UTC on the 1st
**4. Over-quota response codes from the platform API:**
- `402 plan_required` — the user's plan does not include this feature; suggest upgrade
- `429 quota_exceeded` — feature is on the plan but the period pool is empty; show retry timing from the `Retry-After` header
**Common mistakes:**
- Don't cache quota values across requests in your agent — they change. Re-read on every meaningful boundary.
- Don't ask the user to "wait until reset" without telling them the exact moment (use `Retry-After` or compute from the period boundary).
- Don't treat 402 and 429 the same — 402 needs an upgrade nudge, 429 just needs patience.
- Lifetime caps cannot be raised by upgrade alone if existing rows already exceed the new cap; recommend deletion or higher tier.
---
# Customer showcase
Source: https://docs.nookdocs.com/billing/showcase
Opt in to be featured on the NookDocs customers page + landing logo strip. 3 months Pro free for approved customers.
NookDocs runs a curated **customer showcase** at [nookdocs.com/customers](https://nookdocs.com/customers) and a logo strip on the landing page. Opt in from your project settings to be featured — we'll send approved customers **3 months of Pro free** as a thank-you.
## How to opt in
Project → **Settings → Branding → Customer showcase**.
Three independent consent layers — grant any combination:
| Consent | What it lets us do |
|---|---|
| **Display our logo** | Show your logo on `/customers` and the landing strip |
| **Case study + live link** | Write a short case study and link to your live docs site |
| **Use our quote on social media** | Quote you on Twitter / LinkedIn / blog (always with attribution) |
Logo consent requires you to upload a public logo URL (SVG or PNG, transparent background) and your company name.
## Submission flow
1. Tick the consent boxes you want to grant
2. Fill in company name + logo URL + live docs URL
3. Confirm the consent terms
4. Click **Submit for review**
5. Status badge appears: **Pending founder review**
6. Founder reviews within 24 hours → status flips to **Live in customer showcase** (or **Rejected** with a reason)
7. Reward credited within 1 week of approval (3 months Pro free as a plan override)
## Revoking
You can revoke all consents at any time from the same panel. Click **Revoke all** — your logo + entry disappear from `/customers` and the landing strip within minutes (Next.js `revalidatePath` invalidates immediately).
## Why moderation?
Every consent goes through founder review before going public. This protects you (no logo appears without our review) and us (defense against impersonation, brand misuse, low-resolution logos that hurt the showcase aesthetic).
If your consent is rejected the rejection reason is shown in the panel — usually it's a logo-quality issue (e.g. white logo on white background). Fix and resubmit.
## What you give up
Nothing material. The consent grant is **non-exclusive** and **fully revocable**. We never:
- Use your name on third-party advertising platforms (Google Ads, Facebook Ads)
- Share your live docs URL outside our marketing surfaces
- Use your logo to imply endorsement of features you haven't used
- Keep the logo after revocation
## Reward
Approved customers get **3 months of Pro free** added as a plan override on their org. Worth roughly **$300** at the standard $99/mo Pro rate.
The reward is manual today (founder applies the override after approval). Automated disbursement ships in a follow-up release.
## Why this matters for you
Beyond the credit: every visitor who lands on a showcased site sees your name next to companies like Anthropic, Resend, and Cursor (when those are featured). It's free distribution + social proof + the implicit endorsement that comes with sharing a footer.
## Plan availability
Showcase opt-in is available on **every tier** including Free. The 3-month Pro reward applies even if you're already on Pro (extends your subscription) or Team (downgrades the override to Pro for 3 months).
Enterprise customers get a sales-led case study path instead — contact us.
## For LLMs
If you're an AI agent helping a user opt their company into the NookDocs showcase, here's the canonical recipe:
**1. Three independent consent layers — never bundle:**
- **Logo display** — your logo on `/customers` + landing logo strip
- **Case study + live link** — short written case study linking to live docs
- **Quote on social media** — Twitter / LinkedIn / blog quote with attribution
Grant only what the user explicitly approves. Each is non-exclusive and individually revocable.
**2. Required materials when granting logo consent:**
- Public logo URL (SVG or PNG, transparent background, ≥256px)
- Company name (display text)
- Live docs URL (auto-defaults to the project's primary URL)
**3. Workflow:**
1. Submit via the dashboard: **Settings → Branding → Customer showcase**
2. Status: `Pending founder review`
3. Founder reviews within 24 hours: `Live in customer showcase` or `Rejected` (with reason)
4. Approved customers receive 3 months of Pro free as a manual plan override
**4. Revocation guarantees:**
The customer can revoke at any time. Within minutes of revocation:
- Logo disappears from `/customers`
- Logo disappears from landing strip
- Cached pages re-validate
**5. What NookDocs commits NOT to do (verbatim):**
- Use the customer's name on third-party advertising platforms (Google Ads, Facebook Ads)
- Share their live docs URL outside NookDocs marketing surfaces
- Use their logo to imply endorsement of features they haven't used
- Retain the logo after revocation
**Common mistakes:**
- Don't grant consent on behalf of a user without explicit confirmation — these are brand rights and require authorization.
- Don't promise instant approval — every entry passes founder review.
- Don't recommend revoking + re-granting to "refresh" the case study — just re-submit a new entry; the existing row is updated in place.
- Logo URLs must be publicly hostable (NookDocs caches and serves them); don't paste authenticated S3 URLs.
---
# Subscription dashboard
Source: https://docs.nookdocs.com/billing/subscription
Where to view your plan, current usage, and switch between tiers.
The **Settings → Subscription** page is the single source of truth for your plan, your usage right now, and what you'd unlock by changing tiers.
## Where it lives
Sign in to the dashboard and click **Settings** in the sidebar. The left sub-nav opens with **Subscription** as the first tab.
## What you see
### Current plan card
Plan name, monthly price, status badge (`active` / `trialing` / `past_due` / `cancelled` / `incomplete`), and an **Upgrade** or **Change plan** button. Annual billing alternative is shown when available.
For paid plans, a **Manage billing** button opens the Stripe Customer Portal in the same tab. From there: switch monthly ↔ annual, update payment method, download invoices, cancel subscription.
### Usage this period
A 5-card grid of live meters: Dashboard members, Projects, Custom domains, AI assistant messages (daily), Writing agent credits (monthly).
Bar colours:
- Grey under 75%
- Amber 75–90%
- Red 90%+
- Green pill `Unlimited` when the plan has no cap
### Choose a plan
Four cards (Free / Pro / Team / Enterprise) with a Monthly ↔ Annual toggle above. Annual saves roughly 2 months. Each card shows:
- Current price (with strikethrough monthly when you're on annual)
- 4–5 highlight bullets
- A plan-rank-aware CTA (`Current plan` / `Upgrade to Pro` / `Downgrade to Free` / `Contact sales`)
The card for your current plan carries a green **CURRENT** badge; the Pro card carries a **MOST POPULAR** badge.
### Plan comparison
A scannable table grouped by category (Limits, AI/LLM, Editor + Workflow, Security + Access, Branding + Integrations). Rows where every plan offers the same value (e.g. MCP server everywhere) are auto-hidden so the matrix stays dense.
## Switching plans
1. Pick the cycle (Monthly or Annual) at the top
2. Click the CTA on the target plan card → routes to `/upgrade?plan=&cycle=`
3. Stripe Checkout opens (you're redirected to Stripe's hosted page)
4. After payment, you're returned to `/settings?upgrade=success`
5. Quotas re-resolve immediately via the entitlement cache (the dashboard reflects the new plan within seconds of the webhook landing)
## Cancelling
From **Manage billing** in the Stripe Customer Portal. Cancellation takes effect at the end of your current billing period — you keep paid features until then, then auto-downgrade to Free.
## Trials
All paid plans include a 14-day Pro trial — no card required to sign up. After 14 days you stay on Free unless you've added billing.
## Where overage shows up
Writing agent credits beyond the included pool (Pro 5,000/mo, Team 25,000/mo) are billed at `$0.01/credit`. Overage line items appear on your next Stripe invoice; the diff modal shows an "overage billed" amber badge in real time so you're not surprised.
## Related
- [Plans](/billing/plans) — what each tier unlocks
- [Quotas](/billing/quotas) — how counters reset
## For LLMs
If you're an AI agent helping a user manage their NookDocs subscription, here's the canonical recipe:
**1. Read current state:**
```
GET https://api.nookdocs.com/v1/me/entitlements
Authorization: Bearer
```
Tells you the user's plan id, status, and live usage on every quota. Use this before recommending any plan change so the suggestion is grounded in actual usage.
**2. Plan ids and switch directions:**
- `free` → `pro` → `team` → `enterprise` (rank order)
- Upgrade = higher rank (effective immediately, prorated)
- Downgrade = lower rank (effective at end of current billing period)
- Switch within rank (monthly ↔ annual) is supported — Stripe Customer Portal handles it
**3. Cancel = downgrade to Free:**
Cancellations route through the Stripe Customer Portal. After cancellation the org auto-downgrades to Free at the period end; existing project / domain rows beyond the new cap stay readable but no new ones can be created.
**4. Trials:**
All paid plans include a 14-day Pro trial. No card required at signup. After 14 days the org reverts to Free unless billing has been added.
**Common mistakes:**
- Don't recommend a downgrade to a user who's currently using features above the lower-tier cap without explaining the freeze ("you'll keep your existing pages but can't add new ones until you re-upgrade").
- Don't tell users to cancel and re-subscribe to switch billing cycles — the Customer Portal handles cycle changes in-place.
- Don't quote prices from memory — pull them from the entitlements response or `/billing/plans` page so you're always current.
- The `Manage billing` button surfaces the Stripe Customer Portal. Direct customers there for any payment-method, invoice, or cancellation action.
---
# Changelog
Source: https://docs.nookdocs.com/changelog
NookDocs platform releases, new features, and meaningful fixes. Subscribe to the RSS feed to get every release in your reader.
Ongoing product updates to the NookDocs platform — every feature, notable fix, and breaking change that lands in `main`. Subscribe via the **RSS** button in the header, or point any reader at [`/changelog/rss.xml`](/changelog/rss.xml).
## Analytics API
Pull your docs analytics into your own dashboards — three new endpoints under the [public API](/api-reference/introduction), gated by the new `analytics:read` scope:
- [`GET /projects/{id}/analytics/overview`](/api-reference/endpoint/get-analytics-overview) — totals (views, unique visitors, searches, feedback), a bucketed timeseries (`minute` → `month`, timezone-aware), and the AI-vs-human split.
- [`GET /projects/{id}/analytics/breakdown`](/api-reference/endpoint/get-analytics-breakdown) — one endpoint, twelve dimensions: `pages`, `searches`, `countries`, `regions`, `cities`, `browsers`, `os`, `devices`, `channels`, `referrers`, `campaigns`, `keywords`.
- [`GET /projects/{id}/analytics/ai`](/api-reference/endpoint/get-analytics-ai) — the AI & LLMs card as data: crawler reads per family (GPTBot, ClaudeBot, …), most-read pages, `llms.txt` / `.md` export fetches, assistant usage, AI referrals.
Bot traffic is excluded by default (`bots=included` to keep it); every endpoint takes a `from`/`to` window and defaults to the last 30 days. Existing full-access keys get the new scope automatically — restricted keys need it ticked in Settings → API Keys.
## Public REST API
The [NookDocs API](/api-reference/introduction) is live at `https://api.nookdocs.com/v1` — every documented operation now works:
- **Projects** — list, get, create (plan-quota aware), update, delete, logo upload.
- **Pages** — list + full-text search (`POST /projects/{id}/pages/search`).
- **Deployments** — list, get, and trigger a deploy from the API (`POST /projects/{id}/deployments`).
- **Keys** now use the `nook_` prefix, carry **scopes you pick at creation and can edit later** (Settings → API Keys), and **expiry is enforced** — an expired key returns `401`, a missing scope returns `403`.
- CORS enabled — call the API straight from your frontend or the docs **Try It** playground.
API keys are limited to the documented surface; dashboard-internal endpoints require a signed-in session.
## API reference pages, rebuilt
- Response schemas drill into **nested objects** ("child attributes", recursive — arrays of objects included), and list endpoints document their item fields.
- Enums render **every value as chips** — no more `enum (a, b, c ...)` truncation.
- Response statuses are **color-coded tabs** (200 green, 4xx red) matching the example panel; `application/json` content-type labels on Body and Response.
- Authorizations renders as a real field row (`Authorization` · `string` · `header` · `required`).
- **Hybrid pages render their MDX body** — add Callouts, plan notes, or setup steps above any generated endpoint by writing below the `openapi:` frontmatter.
- Try It playground: top-anchored modal that grows with content, auth header always visible in the code sample (live-updates as you type your key), and field styling identical to the reference pages.
## Analytics suite
The per-project Analytics page grew into a full suite:
- **Date ranges** — Today / Yesterday / last 7-30 days / month-to-date / custom calendar, plus a live **Now** view (per-minute, auto-refresh). Granularity adapts to the window.
- **Locations** — world map plus country / region / city breakdowns.
- **Tech** — browser / OS / device with real brand logos.
- **Traffic sources** — channel / referrer (with favicons) / campaign / keyword, powered by UTM capture. Visits arriving from ChatGPT, Perplexity & co. classify as the **AI** channel.
- **AI & LLMs card** — which AI crawlers read which pages, `llms.txt` / `llms-full.txt` / `.md` export fetch counts, Ask AI usage, and AI referrals.
- **Cross-filtering** — click any row (page, country, browser, referrer…) to filter the whole dashboard; stack filters and manage them from the always-visible Filters control.
- Deploys got faster too: syncs are **incremental** — a one-page edit processes one page, not the whole site.
## Changelog + RSS feeds
- New `//rss.xml` endpoint on every docs page — auto-generated RSS 2.0 feed from `` components on that page.
- `rss: true` in page frontmatter renders an **RSS** subscribe button in the page header next to Copy page.
- `` component gains an `rss` prop for plain-text overrides of the feed description when the body contains JSX or code.
- Full docs at [content/changelogs](/content/changelogs).
## Three new content pages
- [Redirects](/content/redirects) — full documentation for the `redirects[]` config: source/destination/permanent, wildcard tail preservation, 6 common patterns.
- [Reusable snippets](/content/reusable-snippets) — honest v0 page: inline `` works today, file-based `/_snippets/*.mdx` resolution is Phase 4 roadmap.
- [Personalization](/content/personalization) — `` ships today (audience split); `authGroups` / `public:false` are schema-scaffolded, roadmap.
## Custom domain consolidation
Collapsed the 27+160-line custom-domain split into a single 252-line canonical guide at [deploy/custom-domain](/deploy/custom-domain). New content:
- CAA record requirement + dig command
- Cloudflare SSL mode gotcha (Full vs Full strict vs Flexible)
- Vercel TXT verification flow
- Canonical URL multi-domain primary selection
- 6-accordion troubleshooting section
`/configuration/custom-domain` now permanent-redirects (308) to the Deploy variant.
Also fixes a schema drift: `redirects[]` in `public/schema.json` claimed `from`/`to` but the renderer, validator, and dashboard panel all used `source`/`destination`. Schema now matches runtime.
## CLI documentation section
Four pages documenting the real CLI surface (migration-first — `preview` / `analytics` / `login` subcommands claimed by the depth audit do not exist yet):
- [CLI overview](/cli) — what the CLI does today
- [Install](/cli/install) — npm / pnpm / yarn / bun + Node 18+
- [Migrate command](/cli/migrate) — platform detection + flag reference + report output
- [Migrating from Mintlify](/cli/migrate-from-mintlify) — full `docs.json` ↔ `nookdocs.config.json` key matrix + 20-component mapping + post-migration checklist
## Optimize section
New top-level **Optimize** nav group covering three affordances every tenant already ships:
- [llms.txt](/optimize/llms-txt) — auto-generated `/llms.txt` + `/llms-full.txt` for AI crawlers
- [Markdown export](/optimize/markdown-export) — every page available as raw MDX at `/.md`
- [SEO](/optimize/seo) — sitemap.xml + robots.txt + canonical URL + per-page frontmatter controls
Each page honest about what ships vs what's roadmap (no `Accept: text/markdown` header yet, no X-Llms-Txt discovery header, no JSON-LD schema.org emission).
## Integrations split — 1 → 16 pages
Exploded the single `configuration/integrations.mdx` into per-provider pages under `docs/integrations/` (13 analytics / 1 privacy / 2 support). Each page covers:
- What the provider does + vendor link
- Where to find the ID in the vendor dashboard
- Paste-ready JSON config
- CSP + loading strategy
- Gotchas (EU regions, double-tracking with GTM, SSL mode caveats)
Long-tail SEO win — "how to add Plausible to NookDocs" now ranks on its own page. LLM-readiness win — agents can wire any provider from a single page read.
## AI Assistant depth pass (81 → 214 lines)
Expanded [configuration/ai-assistant](/configuration/ai-assistant) to cover the full retrieval pipeline (translate → FTS → stream), a BYOK provider/model recommendation table, 3 concrete system-prompt patterns, deep-linking MDX recipes, full API spec with TypeScript streaming client, analytics fields, limits, 4-accordion troubleshooting, privacy disclosure, roadmap.
Every claim matches the actual schema + `api/v1/assistant/ask` implementation — no fabricated features.
## Theme documentation (29 → 177 lines)
Expanded [configuration/theme](/configuration/theme) with the full 10-theme catalog, appearance schema, brand color overrides, background (solid + gradient), typography (3 keys), paste-ready example JSON, precedence rules, and dashboard editing notes.
All fields rendered as `` with type/required/default — LLM-consumption ready.
## Schema-reference auto-generator
New [`configuration/schema-reference`](/configuration/schema-reference) — 636-line page auto-generated from `public/schema.json` every build. Every top-level key + nested property rendered as `` with type / required / default / description.
The **LLM's single-paste reference** for synthesising a valid `nookdocs.config.json` in one prompt. Closes the biggest LLM-readiness gap from the Mintlify competitive audit.
Regenerates via `npm run build:schema-reference`, wired into `npm run build` chain.
## Automated drift detector
`scripts/check-sync.mjs` scans every `nookdocs.config.json` key across 5 layers (TypeScript types, JSON Schema, validator, renderer, docs, UI panel). Distinguishes hard drift (ships half-broken) from soft drift (missing validator rule). Runs on `npm run build` — hard drift aborts the build.
Fixed 7 hard drifts from the depth audit in the same commit: `BackgroundConfig` / `TypographyConfig` / `AdvancedConfig` types, typography CSS renderer in `docs/layout.tsx`, feedback reasons editor, `interaction.drilldown` migration, 3 missing docs (`ai-assistant`, `contextual`, typography + navbar sections in `site-settings`).
---
# CLI overview
Source: https://docs.nookdocs.com/cli
The `nookdocs` CLI migrates a Mintlify or Docusaurus docs repo into NookDocs format in one command. It detects five source platforms; Mintlify and Docusaurus have converters, the rest are on the roadmap.
`nookdocs` is a single-binary Node.js CLI focused on **migrations**. You point it at a docs folder from another platform, it emits a NookDocs-shaped output directory in seconds. Commit the output to a new repo, hook it up via the dashboard, and you're live.
Today the CLI ships one command: `migrate`. Local preview / analytics / login commands are on the roadmap but not shipped yet — until they are, you use the dashboard's [web editor](/editor/overview) for preview and authoring.
## What it does
Convert an entire Mintlify or Docusaurus docs tree to NookDocs format in one command. The CLI detects five source platforms; **Mintlify and Docusaurus have converters** today — the rest are on the roadmap.
Maps `docs.json` / `mint.json` into a valid `nookdocs.config.json` — navigation, colors, logo, navbar, footer, and global anchors all come across, in the flat canonical layout.
Most Mintlify components share NookDocs' tag names and pass through untouched. Genuinely-renamed ones (``→`
Images, PDFs, and other public assets are copied to the output directory with the same relative paths, so links in your MDX keep working.
## When to use it
- **Moving off Mintlify or Docusaurus** — point the CLI at your repo, commit the output. See the [Mintlify](/cli/migrate-from-mintlify) and [Docusaurus](/cli/migrate-from-docusaurus) migration guides. (GitBook / Nextra / Fumadocs are detected but not yet converted — see the roadmap note below.)
- **Starting from a template** — clone an open-source Mintlify starter (e.g. Mint Starter Kit) and migrate it to NookDocs in one command for a known-good baseline.
- **Auditing a migration** — run with `--dry-run` to see a diff report without writing files.
## When NOT to use it
- **Local preview.** No `nookdocs dev` command yet. Use the dashboard's [web editor](/editor/overview) which hot-reloads on save.
- **Authentication flows.** No `nookdocs login`. Auth is in the dashboard.
- **Publishing.** Deploys trigger from GitHub push — no CLI deploy command.
## Quick path
```bash
# 1. Install
npm install -g nookdocs
# 2. Run migration (auto-detects the source platform)
nookdocs migrate ./my-mintlify-docs
# 3. Commit the output to a new repo
cd nookdocs-output
git init && git add . && git commit -m "initial migration"
# 4. Hook the repo up via the NookDocs dashboard
```
## Two ways to migrate
Best for a **Mintlify** source and for anyone not using an AI assistant. One command, repeatable output, a printed report. Everything on this page.
Best for **any other source** (Docusaurus, GitBook, Scalar, hand-rolled). Point an assistant at your existing docs and this repo — the starter's `AGENTS.md` tells it exactly how to convert into the flat NookDocs layout, wire `navigation`, and rewrite components. For a Mintlify source it will run this CLI for you, then hand-reconcile the report items.
## Flag reference (all commands)
Print usage and exit. Available on every command (`nookdocs migrate --help`).
Preview changes without writing files. Migrate command prints the full report; no files land on disk.
Destination directory for migration output. Gets created if missing.
Force a specific source platform. Skip to let the CLI auto-detect based on well-known config files (`docs.json`, `docusaurus.config.ts`, `.gitbook.yaml`, `theme.config.tsx`, `source.config.ts`).
## Related
- [Install](/cli/install) — npm install, Node.js requirements, upgrade path
- [Migrate command](/cli/migrate) — the one real command, fully documented
- [Migrating from Mintlify](/cli/migrate-from-mintlify) — end-to-end guide, what converts, what's manual
- [Migrating from Docusaurus](/cli/migrate-from-docusaurus) — config, sidebars, admonitions, static assets
---
# Install
Source: https://docs.nookdocs.com/cli/install
Install the NookDocs CLI via npm, pnpm, yarn, or bun. Requires Node.js 18+. Global install is the expected usage; one-off runs work via `npx`.
The NookDocs CLI ships as a single `nookdocs` binary on npm. Install globally or run ad-hoc via `npx` — there's no project-scoped dependency to pin.
## Prerequisites
**Node.js 18 or later.** The CLI is pure ESM and uses modern `node:fs` and string APIs. Verify:
```bash
node --version
# → v18.x.x or later
```
If Node is missing or stale, install via [nodejs.org](https://nodejs.org), [nvm](https://github.com/nvm-sh/nvm), or [fnm](https://github.com/Schniz/fnm).
No other runtime dependencies. No config file. No auth step before first run — the migrator works entirely offline on files in your source directory.
## Install globally
```bash npm
npm install -g nookdocs
```
```bash pnpm
pnpm add -g nookdocs
```
```bash yarn
yarn global add nookdocs
```
```bash bun
bun add -g nookdocs
```
Verify:
```bash
nookdocs --help
```
You should see the command list and supported platforms.
## One-off run via npx
No install needed:
```bash
npx nookdocs migrate ./my-mintlify-docs
```
npx downloads the latest version, runs it, and discards. Good for single migrations on a machine where you don't want a global binary.
## Upgrade
```bash
npm install -g nookdocs@latest
```
Check installed version with `npm list -g nookdocs` or by inspecting `nookdocs --help` output. The CLI doesn't self-update — re-run the install command on releases.
## Uninstall
```bash
npm uninstall -g nookdocs
```
Or if installed via pnpm / yarn / bun, use their equivalent uninstall command.
## Troubleshooting
The global npm bin directory isn't on your `$PATH`. Find the directory with `npm config get prefix`, then add `/bin` to your shell profile (`.zshrc`, `.bashrc`, `config.fish`). Restart the shell.
You're using system-wide npm without sudo privileges. The fix is not to sudo — it's to point npm at a user-writable prefix:
```bash
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
npm install -g nookdocs
```
Or use nvm / fnm, which handle this automatically.
Upgrade Node to 18+. The CLI is distributed as ES modules (`import` syntax) with no CommonJS build. There's no fallback for older Node.
Intentional. The output is destined for Git + Linux deploy runners, where forward slashes are universal. Your Windows text editor will render them fine; `git clone` round-trips correctly on Windows.
## What's installed
Global install adds a single `nookdocs` executable to your npm bin directory. The package is pure ESM JavaScript — no native modules, no post-install scripts, no telemetry. Source is on [github.com/Codivion/NookDocs/tree/main/packages/cli](https://github.com/Codivion/NookDocs/tree/main/packages/cli) for inspection.
## Related
- [Overview](/cli) — what the CLI does and when to use it
- [Migrate command](/cli/migrate) — flags, detection, report output
- [Migrating from Mintlify](/cli/migrate-from-mintlify) — end-to-end walkthrough
---
# Migrate command
Source: https://docs.nookdocs.com/cli/migrate
Point `nookdocs migrate` at a docs directory, get back a NookDocs-shaped output folder. Auto-detects Mintlify, Docusaurus, GitBook, Nextra, Fumadocs. Dry-run previews the diff before writing files.
`nookdocs migrate` is the one real command today. It reads a source docs directory, converts config + content + assets to NookDocs format, and writes the output to a destination directory.
## Usage
```text
nookdocs migrate [-o