Content (Pages, Posts, Docs)
Endpoints for the core content types. Public reads live under /content/... (no auth); writes live under /dashboard/content/... (bearer token). All write paths also have a /dashboard/projects/{project_id}/content/... form — see the Overview.
Pages
Public reads
GET /content/pages— list published pages. Query:page,page_size.GET /content/pages/{slug}— a published page by slug, with its blocks.
Dashboard (bearer)
GET /dashboard/content/pages— list all pages. Query:status(draft|pending_review|published|archived),page,page_size,format.POST /dashboard/content/pages— create a page. Gated bydry_run/confirm_token.GET /dashboard/content/pages/{page_id}— a page by id. Query:audit_level(off|errors|warnings|all).PATCH /dashboard/content/pages/{page_id}— update a page (any field exceptslug).DELETE /dashboard/content/pages/{page_id}— archive a page. Gated.POST /dashboard/content/pages/{page_id}/publish— publish. Gated.POST /dashboard/content/pages/{page_id}/unpublish— revert to draft. Gated.POST /dashboard/content/pages/{page_id}/duplicate— copy a page.POST /dashboard/content/pages/{page_id}/insert-section— insert a marketplace component.GET /dashboard/content/pages/{page_id}/versions— list version snapshots.POST /dashboard/content/pages/{page_id}/restore?version_number=N— restore a version. Gated.POST /dashboard/content/pages/{page_id}/lock//unlock— edit locking.GET /dashboard/content/pages/{page_id}/export?format=json|md|archive— self-contained export.
POST /dashboard/content/pages body (key fields):
title(string, required)slug(string) — URL-safe; auto-derived if omittedblocks(array) — the page's blocks (see Pages)template(string, default"default")seo_title,seo_description,og_image_url,canonical_url,robots,json_ld
Example — create and publish a page:
# Create
curl -X POST "https://spideriq.ai/api/v1/dashboard/content/pages" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"title": "Pricing",
"slug": "pricing",
"blocks": [
{ "type": "hero", "data": { "headline": "Simple pricing" } },
{ "type": "pricing_table", "data": { "plans": [] } }
]
}'
# → { "id": "…", "slug": "pricing", "status": "draft", … }
# Publish (preview then confirm)
curl -X POST ".../dashboard/content/pages/PAGE_ID/publish?dry_run=true" -H "Authorization: Bearer $TOKEN"
curl -X POST ".../dashboard/content/pages/PAGE_ID/publish?confirm_token=cft_…" -H "Authorization: Bearer $TOKEN"Posts
Public reads
GET /content/posts— list published posts. Query:page,page_size,tag,category,author_id,created_after,format.GET /content/posts/featured— featured posts.GET /content/posts/search?q=...— full-text search.GET /content/posts/{slug}— a published post, body as Tiptap JSON.GET /content/authors,GET /content/authors/{slug}— author profiles.GET /content/categories,GET /content/tags— taxonomy.
Dashboard (bearer)
GET|POST /dashboard/content/posts— list / create.GET|PATCH|DELETE /dashboard/content/posts/{post_id}— read / update / delete.POST /dashboard/content/posts/{post_id}/publish·/unpublish·/duplicate.POST /dashboard/content/posts/{post_id}/status— setdraft|pending_review|published|archived.PUT /dashboard/content/posts/{post_id}/related— set related posts.Authors:
GET|POST /dashboard/content/authors,GET|PATCH|DELETE /authors/{id}.Tags:
GET|POST /dashboard/content/tags,PATCH|DELETE /tags/{id}.Categories:
GET|POST /dashboard/content/categories,PATCH|DELETE /categories/{id}.
POST /dashboard/content/posts body (key fields): title (required), slug, body (Tiptap JSON), excerpt, cover_image_url, author_id or author_name, tags[], category_ids[], is_featured, seo_title, seo_description, vayapin_pins[].
Docs
Public reads
GET /content/docs/tree— the full nested docs tree.GET /content/docs/{path}— a doc by its full path (e.g.getting-started/quickstart).GET /content/docs/search?q=...— search docs.
Dashboard (bearer)
GET /dashboard/content/docs/tree— full tree (incl. drafts).POST /dashboard/content/docs— create a doc or section.GET /dashboard/content/docs/{doc_id}— a doc by id.POST /dashboard/content/docs/{doc_id}/duplicate— copy a doc.PUT /dashboard/content/docs/reorder— reorder the tree.
POST /dashboard/content/docs body: slug (required), title (required), body (Tiptap JSON), parent_id (a section id, or null for top-level), is_section (bool, default false), sort_order (int), seo_title, seo_description.
Tree-build note: a section's
sort_ordermust be smaller than its child pages'sort_order, because the tree is assembled in one pass oversort_order. Sections first, then pages.
Navigation
GET /content/navigation/{location}— public read;locationisheader,footer, ordocs_sidebar.GET|PUT /dashboard/content/navigation/{location}— read / replace a whole menu.
A menu is { "items": [NavItem] } where each NavItem is { label, url?, icon?, badge?, is_external?, children? }. PUT replaces the entire menu, so read it first, edit, then write back.
Media
GET /dashboard/content/media— list media. Query:page,page_size.POST /dashboard/content/media/upload— multipart upload (file, optionalfolder,alt_text,caption).POST /dashboard/content/media/upload-batch— multiple files.PATCH /dashboard/content/media/{media_id}— updatealt_text/caption/folder.DELETE /dashboard/content/media/{media_id}— delete.
Uploads return a permanent CDN URL on media.cdn.spideriq.ai plus detected width/height.
Settings
GET /content/settings— public read of site-level settings.GET /dashboard/content/settings— full settings.PATCH /dashboard/content/settings— update. Gated bydry_run/confirm_token.
Settings include site_name, site_tagline, favicon_url, default_og_image, social_links, and an extensions object that controls the sitemap, robots, and llms.txt surfaces.
Redirects & Domains
GET|POST /dashboard/content/redirects,DELETE /redirects/{id}— manage 301/302 redirects.Domains are covered in Design & Deploy.
Next steps
API Overview — base URL, auth, and the dry-run / confirm flow.
Design & Deploy — components, templates, themes, marketplace, deploy.
Public & SEO Surfaces — public reads, sitemap, llms.txt, feeds, help.
Pages — the block model these endpoints write and read.