Quickstart
Go from an API key to a live documentation site in a few minutes.
Before You Start
You need an API key from the dashboard. See Authentication. The cURL steps use jq to read ids from responses. The JavaScript steps build one script, such as quickstart.mjs, for Node 18 or later.
Check the Key
Put your key in an environment variable, then ask the API who you are.
export MANIFEST_ACCOUNT_KEY="mnfst_api_…"
curl https://api.manifestx.dev/v1/me \
-H "Authorization: Bearer $MANIFEST_ACCOUNT_KEY"
A 200 with your account's name means the key works.
Create a Project
source_id is your own id for this project, such as a record id in your system. Keep the new project's id for the next steps.
Subdomains are unique across all of Manifest, so acme-docs may already be taken. Replace it with your own, or leave subdomain out to get a free one made from name.
PROJECT_ID=$(curl -s -X POST https://api.manifestx.dev/v1/projects \
-H "Authorization: Bearer $MANIFEST_ACCOUNT_KEY" \
-H "Content-Type: application/json" \
-d '{ "source_id": "site_8231", "name": "Acme Docs", "subdomain": "acme-docs" }' \
| jq -r .project.id)
echo $PROJECT_ID
The answer is 201 Created:
{
"project": {
"id": "proj_…",
"source_id": "site_8231",
"name": "Acme Docs",
"plan": "free",
"status": "active",
"project_key_prefix": "mfst_free_AbCd1234",
"created_at": 1792138921,
"urls": {
"production": "https://acme-docs.manifestx.ai",
"staging": "https://acme-docs-staging.manifestx.ai"
},
"published": { "production": false, "staging": false }
},
"project_key": "mfst_free_…",
"request_id": "…"
}
You can ignore project_key for now. See Projects.
A 409 subdomain_taken means someone else has that subdomain. Pick another and send the create again. If any step answers an error, see Common Problems.
Send the Content
Two Markdown pages, listed under two groups, become a documentation site.
curl -X POST https://api.manifestx.dev/v1/projects/$PROJECT_ID/content \
-H "Authorization: Bearer $MANIFEST_ACCOUNT_KEY" \
-H "Idempotency-Key: acme-help-sync-1" \
-H "Content-Type: application/json" \
-d '{
"template": "docs",
"site": { "name": "Acme Help", "description": "Answers for Acme customers." },
"articles": [
{ "group": "Getting started", "title": "Welcome", "slug": "welcome", "markdown": "Hello from Acme." },
{ "group": "Billing", "title": "Invoices", "slug": "invoices", "markdown": "## Download\n\nUse the portal." }
]
}'
{
"deployment": { "id": "dep_…", "env": "staging", "status": "ready", "files": 10, "bytes": 26537 },
"template": { "name": "docs", "version": "0.1.2" },
"url": "https://acme-docs-staging.manifestx.ai",
"request_id": "…"
}
Open Staging
The site is live at url as soon as the request returns. The Invoices page is at /docs/billing/invoices on that address. The production address still says "This site hasn't been published yet."
Staging isn't private. Search engines skip it, but anyone with its address can open it, so treat it as a preview, not a place for secrets.
Promote
Once staging looks right, make it live.
curl -X POST https://api.manifestx.dev/v1/projects/$PROJECT_ID/promote \
-H "Authorization: Bearer $MANIFEST_ACCOUNT_KEY" \
-H "Idempotency-Key: acme-help-promote-1"
{
"deployment": { "id": "dep_…", "env": "production", "files": 10 },
"live_deployment_id": "dep_…",
"url": "https://acme-docs.manifestx.ai",
"prerender": { "status": "pending" },
"request_id": "…"
}
The site now answers at the production url. In the background, Manifest also prerenders its pages to static HTML, and swaps that version in when it's done. See Publish.
Clean Up
When you're done trying it, delete the project to free its place in your allowance.
curl -X DELETE https://api.manifestx.dev/v1/projects/$PROJECT_ID \
-H "Authorization: Bearer $MANIFEST_ACCOUNT_KEY"
Next Steps
Article does not exist
There is no documentation at this path.