Ferndesk

Articles

Update an article

Updates an article. Behavior splits by field:

  • Metadata & placement (slug, keywords, meta_description, og_image, collection, section, listed, noindex) apply immediately.
  • Content edits (title, body via content/markdown) are staged into an open draft owned by this key — not published. The response has published: false and a draft_id. Publish separately with POST /articles/:id/publish.

External articles managed by integrations cannot be updated. Requires the content:write scope.

Required scope: content:write

PATCH /articles/{id}

Update an article

curl --request PATCH \
  --url 'https://api.ferndesk.com/v1/articles/{ID}' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "key": "value"
}'
{
  "id": "<string>",
  "title": "<string>",
  "slug": "<string>",
  "contentHtml": "<string>",
  "contentMarkdown": "<string>",
  "contentJson": "<string>",
  "url": "<url>",
  "sectionId": "<string>",
  "collectionId": "<string>",
  "status": "<string>",
  "publishedAt": "<string>",
  "createdAt": "<string>"
}

Updated article (staged or applied)

Authorizations

  • Authorization string required header

    All requests require a Bearer token in the Authorization header. API keys are prefixed with fdsk_ and should be kept secret. You can generate and manage keys from the Developer settings page.

    Keys can be restricted to any subset of these scopes (each endpoint lists the scope it requires via x-required-scopes):

    • content:read: Read and search help center articles, collections, sections, and translations
    • content:write: Create and edit article drafts, users, tasks; move articles and collections
    • content:publish: Publish, unpublish, restore, and trash content (make changes live)
    • analytics:read: Read help center reporting, analytics, and article feedback
    • conversations:read: Read AI assistant conversations and transcripts
    • webhooks:manage: Create and manage outbound webhook subscriptions

    Granting content:write or content:publish implies content:read. Keys minted before scoping have null scopes = full access (legacy mode).

Path Parameters

  • id string required

    Resource ID for the requested entity. Example: art_01JXY9AZK4KV

Request Body

application/json
  • title string

    Updated article title. Content edit: staged into an open draft, not published.

  • content any

    Updated article body (Tiptap JSON). Content edit: staged into an open draft, not published. Mutually exclusive with markdown.

  • markdown string

    Updated article body as Markdown. Content edit: staged into an open draft, not published. Mutually exclusive with content.

  • collectionId string | null

    Updated collection assignment (placement, applied immediately).

  • sectionId string

    Updated section assignment (placement, applied immediately).

  • keywords string

    Updated SEO keywords.

  • metaDescription string

    Updated SEO meta description.

  • ogImage string

    Updated Open Graph image URL.

  • listed string enum enum

    Listing visibility: everywhere (default), unlisted (reachable by link only), hidden, or assistant_only. Allowed values: everywhere, unlisted, hidden, assistant_only.

  • noindex boolean

    Whether search engines should skip this article.

  • slug string

    Updated custom slug. If changed from the existing slug, custom slug mode is enabled.

Response

application/json
  • id string

    Ferndesk article ID (art_...).

  • title string

    Primary article title.

  • slug string | null

    URL slug for the article.

  • contentHtml string

    Article content rendered as HTML. Present when format=html (default).

  • contentMarkdown string

    Article content rendered as Markdown. Present when format=markdown.

  • contentJson any | null

    Raw stored ProseMirror/Tiptap document. Present when format=json. Uses Ferndesk’s ProseMirror schema (custom nodes like callout, steps, cards) and is the lossless representation.

  • url string (uri) | null

    Canonical public URL for this article.

  • sectionId string | null

    Section ID containing the article.

  • collectionId string | null

    Optional collection grouping ID for the article.

  • status string | null

    Article publish status.

  • publishedAt string | null

    Timestamp when the article was published.

  • createdAt string

    ISO 8601 timestamp in UTC.

  • updatedAt string

    ISO 8601 timestamp in UTC.

  • published boolean

    Whether the change is live. Content edits stage into an open draft (published: false); metadata/placement changes apply immediately.

  • draft_id string | null

    The open draft holding staged content edits, if any.

  • message string

    Human-readable note about staged vs. applied changes.