Mintlify-Like Docs Publishing with Codex
Use this guide to generate docs locally with Codex and publish them to your handle site on 10x.in using a scoped PAT, with optional JWT fallback when your workspace still relies on the control-plane deployment route.
When to use
- You want Mintlify-style structure (
docs.jsonnavigation) but host docs on your own 10x handle site. - You want a local generation flow plus API publish to
https://{handle}.10x.in/docs. - You want repeatable deploy commands that Codex can run for you.
Prerequisites
- Your handle already exists (example:
links). - You have a
PAT_TOKENwithsite.deployments.write. - Optional but recommended: a valid creator
JWT_TOKENfor fallback during rollout or scope troubleshooting. - Docs source files are in
docs/external. - Every page you want published is listed in the manifest for the handle you are deploying.
Repository structure
Use this structure when adding or refreshing public documentation:
| Path | Purpose |
|---|---|
docs/external/index.mdx | Public docs landing page. Surface major new features here. |
docs/external/end-user/*.mdx | End-user guides and API implementation guides. |
docs/external/end-user/README.md | Maintainer-facing guide map used during docs review. |
docs/external/docs.json | Product docs navigation for links.10x.in. |
docs/external/developer.docs.json | Developer docs navigation for developers.10x.in. |
docs/external/examples.docs.json | Example and playbook docs navigation for examples.10x.in. |
docs/external/*.seo.config.json | Canonical docs URL, default metadata, and sitemap settings for each handle. |
scripts/site/publish-external-docs.mjs | Local renderer and deployment publisher used by npm run site:publish:external-docs. |
For feature launches, update the feature guide, add or move the page in the matching manifest, add a landing-page card when the feature should be discoverable from the first screen, and run a dry run before live activation.
Current handle split
| Handle | Docs site | Manifest | Best for |
|---|---|---|---|
links | https://links.10x.in/docs | docs/external/docs.json | Product docs, operator workflows, Agentic Pages, AI Visibility, Ad Intelligence, and app workflows. |
developers | https://developers.10x.in/docs | docs/external/developer.docs.json | API auth, MCP, hosted tools, Agentic Pages implementation details, webhooks, lead verification, and publishing handoffs. |
examples | https://examples.10x.in/docs | docs/external/examples.docs.json | Best-practice guides, apparel demos, ops playbooks, job-to-app examples, and Gharart use cases. |
Codex workflow (recommended)
- Ask Codex to create or update markdown pages in
docs/external/.... - Ask Codex to place each page in the right manifest: product, developer, or examples.
- Ask Codex to run a dry run publish for every affected handle.
- Review the summary output (file count, bytes, missing pages).
- Ask Codex to run live publish and activation for each affected handle.
- Verify live URLs.
Command: dry run
PAT_TOKEN="YOUR_PAT_TOKEN" \
HANDLE="links" \
DOCS_JSON_PATH="docs/external/docs.json" \
SEO_CONFIG_PATH="docs/external/seo.config.json" \
DRY_RUN=1 \
npm run site:publish:external-docs
Change HANDLE, DOCS_JSON_PATH, and SEO_CONFIG_PATH together when deploying developers or examples.
Command: live publish
PAT_TOKEN="YOUR_PAT_TOKEN" \
JWT_TOKEN="YOUR_OPTIONAL_JWT_TOKEN" \
HANDLE="links" \
DOCS_JSON_PATH="docs/external/docs.json" \
SEO_CONFIG_PATH="docs/external/seo.config.json" \
API_BASE_URL="https://ai.10x.in" \
ACTIVATE=1 \
VERIFY=1 \
DRY_RUN=0 \
npm run site:publish:external-docs
If API_BASE_URL is omitted, the production default is https://ai.10x.in.
Output URL pattern
- Docs root:
https://{handle}.10x.in/docs - Page route:
https://{handle}.10x.in/docs/<page-route> - SEO artifacts:
https://{handle}.10x.in/docs/sitemap.xmlhttps://{handle}.10x.in/docs/llms.txthttps://{handle}.10x.in/robots.txt
Required auth
- Preferred:
PAT_TOKENwithsite.deployments.write. - Optional fallback: creator-level bearer
JWTinJWT_TOKEN. - Do not commit tokens to git, docs, or scripts.
- Rotate token if exposed.
API fallback
If you need to implement outside the script:
POST /v2/public/handles/{handle}/site-deploymentswithPAT_TOKENto create the draft deployment.- Upload each file to returned pre-signed
putUrl POST /v2/public/handles/{handle}/site-deploymentswith:
{
"activate": true,
"deploymentId": "dep_xxx"
}
If your environment still requires the control-plane deployment route, use the same request body against POST /v2/handles/{handle}/site-deployments with JWT_TOKEN.
Important for MCP-assisted publishing:
site_deploy_multifilecan fully deploy in one MCP call when you provide filecontentfor all text files.- If you omit
content, it falls back to returning upload URLs for manual upload flow. - Use
site_release_get_filesbefore asking the model to edit an already deployed site. - Use
site_release_rollbackto restore an older release after a bad publish. - Do not substitute
PUT /v2/handles/{handle}/site-modefor deployment activation.
Common errors
| Status | Error | Fix |
|---|---|---|
| 401 | Unauthorized | Check that PAT_TOKEN is valid for the target handle. If you are using fallback, refresh JWT_TOKEN too. |
| 403 | insufficient_scope | Add site.deployments.write to the PAT, or provide JWT_TOKEN so the script can fall back. |
| 400 | missing_entrypoint | Ensure index.html is in deployment manifest (script handles this). |
| Script failure | Missing markdown source | Add missing page file or remove page from docs.json. |
| Verify failure | Route returns 404 | Confirm page key exists in docs.json and was included in upload. |
Related:
Updated Jun 19, 2026
