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 by dry_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 except slug).

  • 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 omitted

  • blocks (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 — set draft|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_order must be smaller than its child pages' sort_order, because the tree is assembled in one pass over sort_order. Sections first, then pages.

Navigation

  • GET /content/navigation/{location} — public read; location is header, footer, or docs_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, optional folder, alt_text, caption).

  • POST /dashboard/content/media/upload-batch — multiple files.

  • PATCH /dashboard/content/media/{media_id} — update alt_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 by dry_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