> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.document360.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get article settings
> Returns the SEO metadata, visibility flags, tags, status indicator, related articles, and custom field values
(every active custom field of the project, with `null` values for unset fields) for the specified article.
Settings are language-specific; pass `langCode` to retrieve settings for a non-default language.
Use `PATCH /v3/projects/{projectId}/articles/{articleId}/settings` to update individual settings without affecting the article content.
## OpenAPI
````json GET /v3/projects/{project_id}/articles/{article_id}/settings
{
"openapi": "3.0.1",
"info": {
"title": "Document360 Customer API",
"description": "> **⚠️ Beta:** Version 3 of the Document360 Customer API is currently in **Beta**. The contract (routes, request/response field names, status codes) may change without notice prior to GA. Pin to a specific revision and review release notes before upgrading.\n\nDocument360 RESTful APIs let you integrate your documentation with your software — onboard readers, manage articles, automate publishing, and more.\n\nFull reference: [API Documentation](https://apidocs.document360.io/docs).\n\n## Authentication\nV3 authenticates with an **API key** — not the `api_token` used by V1/V2. Create one in the Document360 portal under **Settings → Knowledge base portal → API keys**, then click **Create API key**. (Projects that still have the older screen show two tabs; choose **Enhanced keys (v3)**, or pick **API v3** from the Create menu.)\n\nSend it in the `X-API-Key` header:\n\n```\nX-API-Key: d360_sk_...\n```\n\nThe plaintext key is shown **once**, at creation — only its hash is stored, so a lost key must be replaced rather than recovered. Each key carries a fixed portal role, content role and content-access scope, supports an optional expiry, and can be disabled or deleted at any time from the same screen. Treat it as an opaque string: it is a pre-shared secret, not an OAuth 2.0 access token, and must not be parsed.\n\nFor flows that act on behalf of a specific person, V3 also accepts an OAuth 2.0 bearer token carrying the `customerApi` scope.\n\nAPI access is part of your subscription plan. If your plan does not include it, every endpoint returns `403` with the error code `FEATURE_NOT_IN_LICENSE` — including for keys created while an earlier plan was active. Contact your Customer Success Manager or `support@document360.com` to enable it.\n\n> **Note on terminology:** V1/V2 call these *API tokens* and manage them under **Settings → Knowledge base portal → API tokens**. V3 keys are a separate credential with their own screen, roles and scope — a V1/V2 token will not authenticate a V3 request.\n\n## Rate Limits\nAll endpoints are rate-limited per API key per project. Default limits vary by plan. When rate-limited, responses include `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers. Use exponential backoff with jitter for optimal retry behavior.",
"termsOfService": "https://document360.com/terms",
"contact": {
"name": "Document360 Support",
"url": "https://document360.io/contact-us/",
"email": "support@document360.com"
},
"license": {
"name": "Document360 API Terms of Use",
"url": "https://document360.com/terms"
},
"version": "3.0.0"
},
"servers": [
{
"url": "https://apihub.document360.io",
"description": "Document 360 API Hub"
},
{
"url": "https://apihub.us.document360.io",
"description": "Document360 API Hub - US data center"
},
{
"url": "https://apihub.{private_hosting}.document360.io",
"description": "Private hosting - Please provide the subdomain name.",
"variables": {
"private_hosting": {
"default": "domain",
"description": "Sub domain for private hosting"
}
}
}
],
"security": [
{
"ApiKey": []
},
{
"Bearer": [
"customerApi"
]
}
],
"tags": [
{
"name": "Projects",
"description": "List and manage knowledge base projects. Export and import project documentation, and manage project-level site customization such as custom CSS and JavaScript."
},
{
"name": "Projects > Import & export",
"description": "Start a project export or import and poll the resulting background operation for completion."
},
{
"name": "Workspaces",
"description": "Manage workspaces and access workspace-scoped categories and articles."
},
{
"name": "Workspaces > AI",
"description": "Query the workspace with Eddy AI and submit feedback on AI answers."
},
{
"name": "Articles",
"description": "Create, read, update, and delete knowledge base articles and their settings, including bulk operations."
},
{
"name": "Articles > Publishing & workflow",
"description": "Publish and unpublish articles (single and bulk) and update the article workflow status."
},
{
"name": "Articles > Versions",
"description": "List, fork, and delete article versions."
},
{
"name": "Articles > Attachments",
"description": "Manage the files attached to an article — list, upload, and delete article attachments."
},
{
"name": "Articles > Content drafts",
"description": "(Internal) Stage AI-generated article content with an Accept/Reject review lifecycle — used by Eddy Copilot to preview content before committing to the live article body."
},
{
"name": "Articles > Labels",
"description": "Read and set the labels associated with an article."
},
{
"name": "Categories",
"description": "Manage the category hierarchy that organizes articles. Create, update, and delete categories and their settings, including bulk operations."
},
{
"name": "Categories > Page category",
"description": "Read and update the content body of page-type categories, including bulk content updates."
},
{
"name": "Categories > Publishing & workflow",
"description": "Publish and unpublish categories (single and bulk) and update the category workflow status."
},
{
"name": "Categories > Versions",
"description": "List, fork, and delete category versions."
},
{
"name": "Categories > Labels",
"description": "Read and set the labels associated with a category."
},
{
"name": "ArticleTemplates",
"description": "Manage reusable article templates — per-language article skeletons that authors and AI tools (such as Eddy Copilot) can apply when starting a new article.",
"x-displayName": "Article templates"
},
{
"name": "Content reuse > Glossaries",
"description": "Manage glossary entries — terminology definitions referenced inside articles via merge codes (`{{glossary.name}}`) and rendered as tooltips on the public KB."
},
{
"name": "Content reuse > Snippets",
"description": "Manage reusable snippets — markdown or WYSIWYG content fragments referenced across articles via merge codes (`{{snippet.name}}`)."
},
{
"name": "Content reuse > Variables",
"description": "Manage reusable variables — short text values referenced across articles via merge codes (`{{variable.name}}`)."
},
{
"name": "AiWriterStyleGuides",
"description": "Retrieve AI writer style guides configured for the project — voice / tone instructions Eddy Copilot follows when generating article content. Used to let users pick a style before kicking off generation.",
"x-displayName": "AI writer style guides"
},
{
"name": "RedirectRules",
"description": "Manage article-redirection rules — 301/302 redirects from old article URLs to new locations after renames or restructures.",
"x-displayName": "Redirect rules"
},
{
"name": "Tags",
"description": "Manage tags — labels used to classify articles, categories, and files for filtering and discovery."
},
{
"name": "Labels",
"description": "Manage labels shown on the article list and category tree. (Associating labels with a specific article or category lives under Articles and Categories.)"
},
{
"name": "CustomFields",
"description": "Retrieve the custom field definitions configured for the project. Custom field values are read and written through the article and category settings endpoints.",
"x-displayName": "Custom fields"
},
{
"name": "ApiReferences",
"description": "Import, resync, and publish OpenAPI/Swagger specifications for API reference documentation.",
"x-displayName": "API references"
},
{
"name": "ApiReferences > Logs",
"description": "Monitor API reference import logs and inspect individual log entries."
},
{
"name": "Drive",
"description": "Search Drive and retrieve files associated with an article, and track Drive background tasks."
},
{
"name": "Drive > Folders",
"description": "Create, read, update, and delete Drive folders."
},
{
"name": "Drive > Files",
"description": "Upload, copy, move, delete, and tag Drive files."
},
{
"name": "Drive > Image drafts",
"description": "(Internal) Stage uploaded or AI-generated images (committed to Drive and associated with a staged article draft) — used by Eddy Copilot."
},
{
"name": "Readers",
"description": "Manage reader accounts, invitations, and access scopes for private documentation."
},
{
"name": "Readers > Groups",
"description": "Create, read, update, and delete reader groups."
},
{
"name": "Users",
"description": "Manage users, their portal and content roles, and consolidated (effective) permissions within a project."
},
{
"name": "Users > Groups",
"description": "Manage user groups, their portal role, and consolidated (effective) group permissions."
},
{
"name": "Roles",
"description": "Create, read, update, and delete portal and content roles, list the users assigned to a role, and retrieve the permission dependency matrix."
},
{
"name": "ContentAccess",
"description": "Manage per-node content-access permissions — grant, allow, deny, and inheritance overrides for users and groups against specific versions, languages, categories, or articles, plus version/language site protection.",
"x-displayName": "Content access"
},
{
"name": "ContentAccess > Eligibility",
"description": "List the readers and groups eligible to be granted content access."
},
{
"name": "Languages",
"description": "Retrieve configured languages for a workspace."
},
{
"name": "Translations",
"description": "Query translation status of articles across languages."
},
{
"name": "Operations",
"description": "Track asynchronous operations — long-running tasks (bulk updates, merges, exports) accepted with `202 Accepted` and an `Operation-Location` header. Poll until the operation reaches a terminal status, honouring the `Retry-After` header."
},
{
"name": "Analytics > Articles",
"description": "View article performance metrics including views, top articles, reader locations, and category breakdowns."
},
{
"name": "Analytics > Search",
"description": "View search usage metrics including top keywords, no-result queries, and bounced searches."
},
{
"name": "Analytics > AI search",
"description": "View AI-powered search metrics including usage trends, most-referenced articles, and trending topics."
},
{
"name": "Analytics > Feedback",
"description": "View reader feedback trends across articles, including top-performing articles and feedback keywords."
}
],
"externalDocs": {
"description": "Document360 API Documentation",
"url": "https://apidocs.document360.io/docs"
},
"x-tagGroups": [
{
"name": "Workspace",
"tags": [
"Projects",
"Projects > Import & export",
"Workspaces",
"Workspaces > AI"
]
},
{
"name": "Content",
"tags": [
"Articles",
"Articles > Publishing & workflow",
"Articles > Versions",
"Articles > Attachments",
"Articles > Content drafts",
"Articles > Labels",
"Categories",
"Categories > Page category",
"Categories > Publishing & workflow",
"Categories > Versions",
"Categories > Labels",
"ArticleTemplates",
"AiWriterStyleGuides",
"RedirectRules",
"Tags",
"Labels",
"ApiReferences",
"ApiReferences > Logs"
]
},
{
"name": "Content reuse",
"tags": [
"Content reuse > Glossaries",
"Content reuse > Snippets",
"Content reuse > Variables"
]
},
{
"name": "Media",
"tags": [
"Drive",
"Drive > Folders",
"Drive > Files",
"Drive > Image drafts"
]
},
{
"name": "Access",
"tags": [
"Readers",
"Readers > Groups",
"Users",
"Users > Groups",
"Roles",
"ContentAccess",
"ContentAccess > Eligibility"
]
},
{
"name": "Localization",
"tags": [
"Languages",
"Translations"
]
},
{
"name": "Operations",
"tags": [
"Operations"
]
},
{
"name": "Analytics",
"tags": [
"Analytics > Articles",
"Analytics > Search",
"Analytics > AI search",
"Analytics > Feedback"
]
}
],
"paths": {
"/v3/projects/{project_id}/articles/{article_id}/settings": {
"get": {
"tags": [
"Articles"
],
"summary": "Get article settings.",
"description": "Returns the SEO metadata, visibility flags, tags, status indicator, related articles, and custom field values\r\n(every active custom field of the project, with `null` values for unset fields) for the specified article.\r\nSettings are language-specific; pass `langCode` to retrieve settings for a non-default language.\r\nUse `PATCH /v3/projects/{projectId}/articles/{articleId}/settings` to update individual settings without affecting the article content.",
"operationId": "getArticleSettings",
"parameters": [
{
"$ref": "#/components/parameters/ProjectId"
},
{
"$ref": "#/components/parameters/ArticleId"
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "Article settings retrieved successfully.",
"headers": {
"X-RateLimit-Limit": {
"description": "The maximum number of requests allowed in the current time window for this request's bucket. Read requests (GET/HEAD) and write requests (POST/PUT/PATCH/DELETE) have independent limits, applied per caller (API key or user) per project.",
"schema": {
"type": "integer",
"format": "int32"
}
},
"X-RateLimit-Remaining": {
"description": "The number of requests remaining in the current time window. When this reaches 0, subsequent requests receive a 429 response.",
"schema": {
"type": "integer",
"format": "int32"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ArticleSettingsResponseApiResponse"
},
"examples": {
"Article settings retrieved successfully": {
"summary": "Returns SEO settings, tags, status indicator, and related articles for the specified article.",
"value": {
"data": {
"slug": "getting-started-with-single-sign-on",
"seo_title": "SSO Setup Guide - Product Documentation",
"description": "Step-by-step instructions for configuring single sign-on with SAML or OIDC providers.",
"allow_comments": true,
"show_table_of_contents": true,
"show_published_version_log": true,
"project_show_published_version_log": true,
"effective_show_published_version_log": true,
"featured_image_url": "https://cdn.example.com/images/sso-hero-banner.png",
"tags": [
"SSO",
"authentication",
"SAML",
"OIDC"
],
"status_indicator": "updated",
"status_indicator_expiry_date": "2025-12-31T23:59:59Z",
"exclude_from_search": false,
"exclude_from_ai_search": false,
"exclude_from_external_search": false,
"related_articles": [
{
"id": "c5d6e7f8-9a0b-1c2d-3e4f-5a6b7c8d9e0f",
"title": "Configuring SAML Identity Providers",
"hidden": false,
"slug": "configuring-saml-identity-providers"
}
],
"is_acknowledgement_enabled": false,
"review_reminder": {
"status": "fresh",
"review_date": "2026-05-28T00:00:00Z",
"reason": "Periodic accuracy review",
"inherited_from_workspace": false
},
"mark_as_deprecated": false,
"deprecated_text": null,
"show_outline_view": true,
"enable_article_feedback": true,
"enable_two_way_link": false,
"url": "https://docs.example.com/en/articles/getting-started-with-single-sign-on",
"custom_fields": [
{
"field_id": "9f8b7c6d-1234-4a5b-8c9d-0e1f2a3b4c5d",
"name": "Reviewer",
"type": "Text",
"value": "Jane Doe"
},
{
"field_id": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
"name": "Review due",
"type": "Date",
"value": null
}
]
},
"success": true,
"request_id": "req_abc123def456",
"errors": null,
"warnings": null
}
}
}
}
}
},
"401": {
"description": "Authentication token is missing or invalid.",
"headers": {
"WWW-Authenticate": {
"description": "Indicates the authentication scheme required. Returns `Bearer` with optional `error` and `error_description` parameters per RFC 6750.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/V3ProblemDetails"
},
{
"type": "object",
"properties": {
"type": {
"enum": [
"https://apidocs.document360.io/apidocs/errors/unauthorized"
],
"type": "string",
"description": "RFC 7807 error type URI. Always `https://apidocs.document360.io/apidocs/errors/unauthorized` for 401 responses."
},
"status": {
"enum": [
401
],
"type": "integer",
"description": "HTTP status code. Always `401` for this response.",
"format": "int32"
}
}
}
]
},
"examples": {
"Missing or invalid token": {
"summary": "Authentication token is missing or invalid.",
"value": {
"type": "https://apidocs.document360.io/apidocs/errors/unauthorized",
"title": "Unauthorized.",
"status": 401,
"detail": "The authentication token is missing or has expired.",
"instance": null,
"trace_id": "req_abc123def456",
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Bearer token is missing or invalid.",
"field": null,
"details": null
}
],
"warnings": null
}
}
}
}
}
},
"404": {
"description": "Article not found.",
"content": {
"application/problem+json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/V3ProblemDetails"
},
{
"type": "object",
"properties": {
"type": {
"enum": [
"https://apidocs.document360.io/apidocs/errors/resource-not-found"
],
"type": "string",
"description": "RFC 7807 error type URI. Always `https://apidocs.document360.io/apidocs/errors/resource-not-found` for 404 responses."
},
"status": {
"enum": [
404
],
"type": "integer",
"description": "HTTP status code. Always `404` for this response.",
"format": "int32"
}
}
}
]
},
"examples": {
"Resource not found": {
"summary": "The requested resource was not found.",
"value": {
"type": "https://apidocs.document360.io/apidocs/errors/resource-not-found",
"title": "Not Found.",
"status": 404,
"detail": "The requested resource does not exist or has been deleted.",
"instance": null,
"trace_id": "req_abc123def456",
"errors": [
{
"code": "RESOURCE_NOT_FOUND",
"message": "The requested resource was not found.",
"field": null,
"details": null
}
],
"warnings": null
}
}
}
}
}
},
"429": {
"description": "Rate limit exceeded. Retry after the duration specified in the Retry-After header.",
"headers": {
"Retry-After": {
"description": "Number of seconds to wait before retrying the request. Use exponential backoff with jitter for optimal retry behavior.",
"schema": {
"type": "integer",
"format": "int32"
}
},
"X-RateLimit-Limit": {
"description": "The maximum number of requests allowed in the current time window for this request's bucket. Read requests (GET/HEAD) and write requests (POST/PUT/PATCH/DELETE) have independent limits, applied per caller (API key or user) per project. Read limits are typically higher than write limits.",
"schema": {
"type": "integer",
"format": "int32"
}
},
"X-RateLimit-Remaining": {
"description": "The number of requests remaining in the current time window. When this reaches 0, subsequent requests will receive a 429 response.",
"schema": {
"type": "integer",
"format": "int32"
}
},
"X-RateLimit-Reset": {
"description": "The UTC epoch timestamp (in seconds) when the current rate limit window resets.",
"schema": {
"type": "integer",
"format": "int64"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/V3ProblemDetails"
},
{
"type": "object",
"properties": {
"type": {
"enum": [
"https://apidocs.document360.io/apidocs/errors/too-many-requests"
],
"type": "string",
"description": "RFC 7807 error type URI. Always `https://apidocs.document360.io/apidocs/errors/too-many-requests` for 429 responses."
},
"status": {
"enum": [
429
],
"type": "integer",
"description": "HTTP status code. Always `429` for this response.",
"format": "int32"
}
}
}
]
},
"examples": {
"Rate limit exceeded": {
"summary": "Rate limit exceeded.",
"value": {
"type": "https://apidocs.document360.io/apidocs/errors/too-many-requests",
"title": "Too Many Requests.",
"status": 429,
"detail": "Rate limit exceeded. Retry after the duration specified in the Retry-After header.",
"instance": null,
"trace_id": "req_abc123def456",
"errors": [
{
"code": "TOO_MANY_REQUESTS",
"message": "Rate limit exceeded. Retry after the duration specified in the Retry-After header.",
"field": null,
"details": null
}
],
"warnings": null
}
}
}
}
}
},
"500": {
"description": "An unexpected server error occurred.",
"content": {
"application/problem+json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/V3ProblemDetails"
},
{
"type": "object",
"properties": {
"type": {
"enum": [
"https://apidocs.document360.io/apidocs/errors/internal-server-error"
],
"type": "string",
"description": "RFC 7807 error type URI. Always `https://apidocs.document360.io/apidocs/errors/internal-server-error` for 500 responses."
},
"status": {
"enum": [
500
],
"type": "integer",
"description": "HTTP status code. Always `500` for this response.",
"format": "int32"
}
}
}
]
},
"examples": {
"Unexpected server error": {
"summary": "Unexpected server error.",
"value": {
"type": "https://apidocs.document360.io/apidocs/errors/internal-server-error",
"title": "Internal Server Error.",
"status": 500,
"detail": "An unexpected error occurred. Please try again or contact support.",
"instance": null,
"trace_id": "req_abc123def456",
"errors": [
{
"code": "INTERNAL_SERVER_ERROR",
"message": "An unexpected error occurred.",
"field": null,
"details": null
}
],
"warnings": null
}
}
}
}
}
}
},
"security": [
{
"ApiKey": []
},
{
"Bearer": [
"customerApi"
]
}
]
}
}
},
"components": {
"parameters": {
"ProjectId": {
"name": "project_id",
"in": "path",
"description": "The unique identifier of the project. Retrieve project IDs from `GET /v3/projects`.",
"required": true,
"schema": {
"type": "string",
"format": "uuid",
"example": "9a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d"
}
},
"ArticleId": {
"name": "article_id",
"in": "path",
"description": "The unique identifier of the article. Retrieve article IDs from `GET /v3/projects/{projectId}/articles`.",
"required": true,
"schema": {
"type": "string",
"format": "uuid",
"example": "9a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d"
}
},
"LangCode": {
"name": "lang_code",
"in": "query",
"description": "ISO 639-1 language code (e.g., `en`, `fr`). Defaults to the project's primary language if omitted.",
"schema": {
"pattern": "^[a-z]{2}(-[A-Z]{2})?$",
"type": "string",
"format": "language-tag",
"example": "en"
}
}
},
"schemas": {
"ArticleSettingsResponseApiResponse": {
"required": [
"data",
"request_id",
"success"
],
"type": "object",
"properties": {
"data": {
"allOf": [
{
"$ref": "#/components/schemas/ArticleSettingsResponse"
}
],
"description": "Response data payload."
},
"success": {
"type": "boolean",
"description": "Whether the API request was successful.",
"readOnly": true
},
"request_id": {
"minLength": 1,
"type": "string",
"description": "Unique identifier for request tracing and correlation.",
"readOnly": true
},
"errors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiError"
},
"description": "List of errors if the request failed.",
"nullable": true
},
"warnings": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiWarning"
},
"description": "List of non-fatal warnings from the request.",
"nullable": true
}
},
"additionalProperties": false,
"description": "Generic API response wrapper containing typed data."
},
"V3ProblemDetails": {
"required": [
"status",
"title",
"type"
],
"type": "object",
"properties": {
"type": {
"minLength": 1,
"enum": [
"https://apidocs.document360.io/apidocs/errors/bad-request",
"https://apidocs.document360.io/apidocs/errors/unauthorized",
"https://apidocs.document360.io/apidocs/errors/forbidden",
"https://apidocs.document360.io/apidocs/errors/resource-not-found",
"https://apidocs.document360.io/apidocs/errors/conflict",
"https://apidocs.document360.io/apidocs/errors/validation-error",
"https://apidocs.document360.io/apidocs/errors/too-many-requests",
"https://apidocs.document360.io/apidocs/errors/internal-server-error"
],
"type": "string",
"description": "URI reference identifying the error type (links to documentation)."
},
"title": {
"minLength": 1,
"type": "string",
"description": "Short human-readable summary of the error type."
},
"status": {
"enum": [
400,
401,
403,
404,
409,
422,
429,
500
],
"type": "integer",
"description": "HTTP status code.",
"format": "int32"
},
"detail": {
"type": "string",
"description": "Human-readable explanation specific to this occurrence.",
"nullable": true
},
"instance": {
"type": "string",
"description": "URI of the request that generated the error.",
"nullable": true
},
"trace_id": {
"type": "string",
"description": "Request trace identifier for correlation.",
"nullable": true
},
"errors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiError"
},
"description": "Structured list of specific errors (extension field).",
"nullable": true
},
"warnings": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiWarning"
},
"description": "Non-fatal warnings (extension field).",
"nullable": true
}
},
"additionalProperties": false,
"description": "RFC 7807 Problem Details response for V3 API errors.\r\nContent-Type: application/problem+json"
},
"ArticleSettingsResponse": {
"required": [
"allow_comments",
"effective_show_published_version_log",
"enable_article_feedback",
"enable_two_way_link",
"exclude_from_ai_search",
"exclude_from_external_search",
"exclude_from_search",
"is_acknowledgement_enabled",
"mark_as_deprecated",
"project_show_published_version_log",
"show_outline_view",
"show_table_of_contents"
],
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The URL slug for the article.",
"nullable": true,
"readOnly": true,
"example": "getting-started-with-single-sign-on"
},
"seo_title": {
"type": "string",
"description": "The custom SEO title for search engines.",
"nullable": true,
"example": "SSO Setup Guide - Product Documentation"
},
"description": {
"type": "string",
"description": "The meta description for search engines.",
"nullable": true,
"example": "Step-by-step instructions for configuring single sign-on with SAML or OIDC providers."
},
"allow_comments": {
"type": "boolean",
"description": "Whether reader comments are allowed on the article.",
"example": true
},
"show_table_of_contents": {
"type": "boolean",
"description": "Whether the table of contents is displayed.",
"example": true
},
"show_published_version_log": {
"type": "boolean",
"description": "Read-only resolved value for showing the published version history log on the KB site / export PDF: your article override when set, otherwise the effective value (never `null` on read). To change the override, send `show_published_version_log` on the update-settings request (`null` clears the override so the project default applies).",
"nullable": true,
"example": true
},
"project_show_published_version_log": {
"type": "boolean",
"description": "Read-only. The project-level default for showing the published version history log.",
"example": true
},
"effective_show_published_version_log": {
"type": "boolean",
"description": "Read-only. The effective (resolved) visibility = project default AND (article override ?? true). This is what the KB site / export PDF actually uses.",
"example": true
},
"featured_image_url": {
"type": "string",
"description": "The URL of the featured image for the article. For private or mixed-visibility projects, a time-limited SAS token is automatically appended. Read-only; the featured image can only be set via the Document360 portal.",
"nullable": true,
"example": "https://cdn.example.com/images/sso-hero-banner.png"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The list of tags associated with the article.",
"nullable": true
},
"status_indicator": {
"enum": [
"none",
"new",
"updated",
"custom"
],
"type": "string",
"allOf": [
{
"$ref": "#/components/schemas/ArticleStatusIndicator"
}
],
"description": "The status indicator badge shown on the article.",
"x-enumNames": [
"None",
"New",
"Updated",
"Custom"
],
"x-enum-varnames": [
"None",
"New",
"Updated",
"Custom"
],
"x-ms-enum": {
"name": "ArticleStatusIndicator",
"modelAsString": true
}
},
"status_indicator_expiry_date": {
"type": "string",
"description": "The expiry date for the status indicator badge. Only applicable when StatusIndicator is set.",
"format": "date-time",
"nullable": true,
"example": "2025-12-31T23:59:59Z"
},
"exclude_from_search": {
"type": "boolean",
"description": "Whether the article is excluded from internal search results.",
"example": false
},
"exclude_from_ai_search": {
"type": "boolean",
"description": "Whether the article is excluded from AI-powered search.",
"example": false
},
"exclude_from_external_search": {
"type": "boolean",
"description": "Whether the article is excluded from external search engine indexing.",
"example": false
},
"related_articles": {
"type": "array",
"items": {
"$ref": "#/components/schemas/RelatedArticle"
},
"description": "The list of related articles linked to this article, returned as enriched objects. When updating via `PATCH`, supply only article IDs as strings.",
"nullable": true
},
"is_acknowledgement_enabled": {
"type": "boolean",
"description": "Whether reader acknowledgement is required for this article.",
"example": false
},
"review_reminder": {
"allOf": [
{
"$ref": "#/components/schemas/ReviewReminderResponse"
}
],
"description": "The review reminder (freshness) state of the article. Null when no reminder has been configured.",
"nullable": true
},
"mark_as_deprecated": {
"type": "boolean",
"description": "Whether the article is marked as deprecated. Deprecated articles show a banner on the knowledge base site.",
"example": false
},
"deprecated_text": {
"type": "string",
"description": "The message shown in the deprecation banner. Only applicable when `mark_as_deprecated` is true.",
"nullable": true,
"example": "This article is deprecated. See the v2 SSO guide instead."
},
"show_outline_view": {
"type": "boolean",
"description": "Whether the outline view is displayed in the editor.",
"example": true
},
"enable_article_feedback": {
"type": "boolean",
"description": "Whether end-user feedback is enabled on the article.",
"example": true
},
"enable_two_way_link": {
"type": "boolean",
"description": "Whether related-article links are mirrored two-way (linking this article from a related article also links back).",
"example": false
},
"url": {
"type": "string",
"description": "The full URL of the article.",
"format": "uri",
"nullable": true,
"example": "https://docs.example.com/en/articles/getting-started-with-single-sign-on"
},
"custom_fields": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CustomFieldValueResponse"
},
"description": "Every active custom field of the project with its current value for this article (`null` value when unset). Update values via `custom_fields` on the update-settings request.",
"nullable": true
}
},
"additionalProperties": false,
"description": "Article settings including SEO and display options."
},
"ApiError": {
"required": [
"code",
"message"
],
"type": "object",
"properties": {
"code": {
"minLength": 1,
"enum": [
"BAD_REQUEST",
"CONFLICT",
"FEATURE_NOT_IN_LICENSE",
"FORBIDDEN",
"INTERNAL_SERVER_ERROR",
"LICENSE_LIMIT_EXCEEDED",
"OPERATION_FAILED",
"PREMIUM_FEATURE_NOT_IN_LICENSE",
"RESOURCE_NOT_FOUND",
"TOO_MANY_REQUESTS",
"UNAUTHORIZED",
"UNRECOGNIZED_FIELD",
"UNRECOGNIZED_FIELDS",
"VALIDATION_ERROR"
],
"type": "string",
"description": "Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND)."
},
"message": {
"minLength": 1,
"type": "string",
"description": "Human-readable error message."
},
"field": {
"type": "string",
"description": "The request field that caused the error, if applicable.",
"nullable": true
},
"details": {
"type": "string",
"description": "Additional context about the error.",
"nullable": true
}
},
"additionalProperties": false,
"description": "Represents an error returned by the API."
},
"ApiWarning": {
"required": [
"code",
"message"
],
"type": "object",
"properties": {
"code": {
"minLength": 1,
"type": "string",
"description": "Machine-readable warning code."
},
"message": {
"minLength": 1,
"type": "string",
"description": "Human-readable warning message."
}
},
"additionalProperties": false,
"description": "Represents a non-fatal warning from the API."
},
"ArticleStatusIndicator": {
"enum": [
"none",
"new",
"updated",
"custom"
],
"type": "string",
"description": "The status indicator badge type for an article.",
"x-enumNames": [
"None",
"New",
"Updated",
"Custom"
],
"x-enum-varnames": [
"None",
"New",
"Updated",
"Custom"
],
"x-ms-enum": {
"name": "ArticleStatusIndicator",
"modelAsString": true
}
},
"RelatedArticle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier of the related article.",
"format": "uuid",
"nullable": true,
"readOnly": true,
"example": "c5d6e7f8-9a0b-1c2d-3e4f-5a6b7c8d9e0f"
},
"title": {
"type": "string",
"description": "The title of the related article.",
"nullable": true,
"example": "Configuring SAML Identity Providers"
},
"hidden": {
"type": "boolean",
"description": "Whether the related article is hidden from readers.",
"example": false
},
"slug": {
"type": "string",
"description": "The URL slug of the related article.",
"nullable": true,
"readOnly": true,
"example": "configuring-saml-identity-providers"
}
},
"additionalProperties": false,
"description": "A related article linked from another article's settings."
},
"ReviewReminderResponse": {
"required": [
"inherited_from_workspace",
"status"
],
"type": "object",
"properties": {
"status": {
"enum": [
"fresh",
"stale"
],
"type": "string",
"allOf": [
{
"$ref": "#/components/schemas/ReviewReminderStatus"
}
],
"description": "The freshness state of the article.",
"example": "stale",
"x-enumNames": [
"Fresh",
"Stale"
],
"x-enum-varnames": [
"Fresh",
"Stale"
],
"x-ms-enum": {
"name": "ReviewReminderStatus",
"modelAsString": true
}
},
"review_date": {
"type": "string",
"description": "The scheduled review date (UTC). When in the future and status is `fresh`, the article becomes stale on this date.",
"format": "date-time",
"nullable": true,
"example": "2026-05-28T00:00:00Z"
},
"reason": {
"type": "string",
"description": "The optional reason recorded for the review.",
"nullable": true,
"example": "Periodic accuracy review"
},
"inherited_from_workspace": {
"type": "boolean",
"description": "Whether the reminder is inherited from project-level documentation settings rather than set on this article.",
"example": false
}
},
"additionalProperties": false,
"description": "The review-reminder (freshness) state returned for an article."
},
"CustomFieldValueResponse": {
"required": [
"name"
],
"type": "object",
"properties": {
"field_id": {
"type": "string",
"description": "Identifier of the custom field definition. Use this as `field_id` when updating the\r\nvalue through the update-settings endpoints.",
"nullable": true,
"example": "9f8b7c6d-1234-4a5b-8c9d-0e1f2a3b4c5d"
},
"name": {
"type": "string",
"description": "Display name of the custom field.",
"nullable": true,
"example": "Reviewer"
},
"type": {
"type": "string",
"description": "Field data type (for example `Text`, `TextArea`, `Dropdown`,\r\n`MultiSelectDropdown`, `Date`, `Boolean`, or `Number`).",
"nullable": true,
"example": "Text"
},
"value": {
"description": "The stored value, typed per the field definition (option values are returned as option\r\nIDs; resolve labels via `GET /v3/projects/{projectId}/custom-fields`).\r\n`null` when the field has no value for this entity and language.",
"nullable": true
}
},
"additionalProperties": false,
"description": "A custom field definition together with its current value for the requested article or page\r\ncategory, as returned by the settings endpoints. Every active field of the project is listed;\r\nfields with no stored value have a `null` value."
},
"ReviewReminderStatus": {
"enum": [
"fresh",
"stale"
],
"type": "string",
"description": "The review-reminder (freshness) state of an article.",
"x-enumNames": [
"Fresh",
"Stale"
],
"x-enum-varnames": [
"Fresh",
"Stale"
],
"x-ms-enum": {
"name": "ReviewReminderStatus",
"modelAsString": true
}
}
},
"securitySchemes": {
"ApiKey": {
"type": "apiKey",
"description": "API key for machine-to-machine integrations, webhooks, and CI/CD (recommended). This is a static, pre-shared secret - treat it as an opaque string and do not parse it; it is an API key, not an OAuth 2.0 access token. Create one in the portal under **Settings > Knowledge base portal > API keys** using the **Create API key** button - this is a different credential from the V1/V2 *API token*, which lives on its own screen and will not authenticate a V3 request. The plaintext key (format `d360_sk_...`) is shown only once, at creation. Send it in the `X-API-Key` header: `X-API-Key: d360_sk_...`. Each key carries a fixed portal role, content role, and content-access scope, supports an optional expiry, and can be disabled or deleted at any time from the portal.",
"name": "X-API-Key",
"in": "header"
},
"Bearer": {
"type": "oauth2",
"description": "All V3 endpoints require a Bearer token. Generate tokens in the Document360 portal under **Settings > API Tokens**. Tokens are project-scoped, require the `customerApi` scope, and do not expire by default. Tokens can be revoked at any time from the portal. Include the token in every request: `Authorization: Bearer `. Alternatively, use the Authorize button below to sign in via OAuth2 Authorization Code flow with PKCE.",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://identity.document360.io/connect/authorize",
"tokenUrl": "https://identity.document360.io/connect/token",
"scopes": {
"openid": "OpenID Connect",
"profile": "User profile",
"email": "User email",
"customerApi": "Document360 Customer API"
},
"x-usePkce": {
"disableManualConfiguration": true,
"hideClientSecretInput": true
}
}
},
"x-d360-clientId": "apiHubWebClient"
}
}
}
}
````