> ## 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. # Gets a document (article or category) by URL path ## OpenAPI ````json GET /v2/Project/Document { "openapi": "3.0.1", "info": { "title": "Document360 Customer API", "description": "Document360 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\nEvery request must include your API token in the `api_token` header. Generate tokens in the Document360 portal under **Settings → Knowledge base portal → API tokens**. Tokens are project-scoped and can be revoked at any time. The same token can be passed via the `api_token` query string for situations where headers are not configurable, but the header form is strongly preferred.\n\n## Project context\nMany endpoints implicitly resolve the project from the API token. When an endpoint requires explicit project context, pass the project identifier in the `ProjectId` header.\n\n## Identifiers — how to fetch them\nMost endpoints accept one or more identifiers as path, query, or body parameters. Use the discovery endpoints below to look them up programmatically rather than hard-coding values:\n\n| Identifier | What it is | Where to fetch it |\n| --- | --- | --- |\n| `projectVersionId` (a.k.a. workspaceId) | A workspace/version inside the project — content (articles, categories, languages) lives within one. | `GET /v2/projectversions` — returns all workspaces with their `id`. Required first to discover articles, categories, and languages. |\n| `categoryId` | A category in the category tree. | `GET /v2/projectversions/{projectVersionId}/categories` — returns the full category hierarchy with each category's `id`. |\n| `articleId` | An article inside a category. | `GET /v2/projectversions/{projectVersionId}/articles` — lists all articles in the workspace. Also available inside the categories tree response. |\n| `langCode` | Two-letter / locale code (`en`, `fr`, `de-DE`, `pt-BR`, …) of an article or category translation. | `GET /v2/language/{projectVersionId}` — returns the languages enabled for the workspace, including `code` and `name`. |\n| `versionNumber` | A specific version of an article or category translation. | `GET /v2/articles/{articleId}/{langCode}/versions` for articles, `GET /v2/categories/{categoryId}/{langCode}versions` for categories. |\n| `userId` (team account) | A portal user (team member). | `GET /v2/teams` — lists all team accounts with their `userId`. `GET /v2/teams/{userId}` returns full details for one. |\n| `groupId` (team) | A team account group. | `GET /v2/teams/groups`. |\n| `roleId` | A role assignable to team accounts. | `GET /v2/teams/roles`. |\n| `readerId` | A reader account (used for private docs / reader analytics). | `GET /v2/readers` — supports pagination and `searchEmail` filtering. |\n| `groupId` (reader) | A reader group. | `GET /v2/readers/groups`. |\n\n**Tip:** In the Document360 portal, the article and category IDs are visible in the URL when an item is open in the editor — e.g. `…/docs//edit/`. `projectId` and `projectVersionId` are visible in **Settings → API tokens** and **Documentation → Workspaces** respectively.\n\n## Query parameter casing\nV1/V2 query parameters use **snake_case** on the wire (for example `search_email`, `exclude_readers`, `version_number`). The server transparently maps snake_case query keys to the camelCase parameter names you see in this specification, so either casing is accepted, but snake_case is the documented convention for V1/V2.\n\n## Response envelope\nAll responses are wrapped in a consistent envelope:\n\n- `success` (boolean) — `true` when the operation succeeded, `false` otherwise. Always check this before reading the payload.\n- `errors` (array) — populated when `success` is `false`. Each entry has a human-readable `description`.\n- `warnings` / `information` (arrays) — non-fatal advisories returned alongside a successful response.\n- `result` or `data` — the operation's payload (the property name depends on the endpoint).\n\nHTTP status codes follow standard semantics (`200` success, `400` validation/business error, `401` missing or invalid token, `403` plan/permission restriction, `404` not found, `429` rate-limited, `5xx` server error). For non-`200` responses the envelope still applies — inspect `errors[].description` for details.\n\n## Rate limits\nEndpoints are rate-limited per API token per project. When throttled, the server returns `429 Too Many Requests` along with `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers. Use exponential backoff with jitter and respect the `Retry-After` header on the response.\n\n## Versioning\nAll routes are prefixed with the API version: `/v1/...` and `/v2/...`. V1 and V2 are stable; V3 is in Beta. New endpoints and fields may be added without notice in V1/V2 — they will never be removed or renamed in a backwards-incompatible way.", "version": "2.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" } } } ], "tags": [ { "name": "Articles", "description": "Create, read, update, publish, fork, and delete knowledge base articles. Manage article versions, settings, descriptions, workflow status, and bulk operations. Supports both Markdown and WYSIWYG/Block content types." }, { "name": "Categories", "description": "Manage the category hierarchy that organizes articles. Create, update, reorder, and delete categories; manage category content, settings, workflow status, and bulk operations." }, { "name": "Drive", "description": "Upload, organize, and manage media files and folders in Drive (used in articles and documentation)." }, { "name": "Readers", "description": "Manage reader accounts and reader groups for private documentation. Create readers, assign them to groups, and manage access scopes." }, { "name": "Teams", "description": "Manage team accounts (portal users), team groups, and role assignments within a project." }, { "name": "Project", "description": "Project-level operations: export and import project documentation as zip archives." }, { "name": "ProjectVersions", "description": "Manage workspaces (also called project versions) within a project. List, search, fetch settings, and inspect version metadata." }, { "name": "Language", "description": "Retrieve languages configured for a workspace." }, { "name": "Translations", "description": "Query article translation status across the configured languages." }, { "name": "CustomField", "description": "Retrieve custom field definitions configured for the project. Custom field values are written/read via the Article and Category settings endpoints." }, { "name": "APIReferences", "description": "Import OpenAPI/Swagger specifications into API reference documentation and inspect import logs." } ], "x-tagGroups": [ { "name": "Workspace", "tags": [ "Project", "ProjectVersions" ] }, { "name": "Content", "tags": [ "Articles", "Categories" ] }, { "name": "Media", "tags": [ "Drive" ] }, { "name": "Access", "tags": [ "Readers", "Teams" ] }, { "name": "Localization", "tags": [ "Language", "Translations" ] }, { "name": "Custom data", "tags": [ "CustomField" ] } ], "paths": { "/v2/Project/Document": { "get": { "tags": [ "Project" ], "summary": "Gets a document (article or category) by URL path", "operationId": "getDocumentByUrl", "parameters": [ { "name": "url", "in": "query", "description": "The relative URL path (for example `/workspace/docs/en/document-slug`).", "required": true, "schema": { "type": "string" }, "example": "/v1/docs/en/getting-started" }, { "name": "redirectionMode", "in": "query", "description": "How the API handles redirection when a redirection rule is configured for the requested resource.\r\n- `0` None — returns the originally requested resource without applying any redirection.\r\n- `1` RedirectOnly — returns an HTTP 302 with the redirected URL, without fetching its content.\r\n- `2` RedirectWithContent — follows the redirection and returns the final resource's content.", "schema": { "enum": [ "none", "redirectOnly", "redirectWithContent" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/RedirectionMode" } ], "description": "Possible values: `\"none\"` = None, `\"redirectOnly\"` = RedirectOnly, `\"redirectWithContent\"` = RedirectWithContent", "default": 0, "x-enumNames": [ "None", "RedirectOnly", "RedirectWithContent" ], "x-enum-varnames": [ "None", "RedirectOnly", "RedirectWithContent" ], "x-ms-enum": { "name": "RedirectionMode", "modelAsString": true } } }, { "name": "isForDisplay", "in": "query", "description": "Set to `true` when rendering the document for an end-user — the response will resolve snippet, variable, and glossary merge codes.", "schema": { "type": "boolean", "default": true }, "example": false }, { "name": "isPublished", "in": "query", "description": "When `true`, returns the latest published version. When `false`, returns the latest draft.", "schema": { "type": "boolean", "default": true }, "example": false }, { "name": "appendSASToken", "in": "query", "description": "Set to `false` to skip appending a SAS token to image/file URLs. SAS tokens are required for private/mixed projects.", "schema": { "type": "boolean", "default": true }, "example": true } ], "responses": { "200": { "description": "Document retrieved successfully.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetDocumentByPathResponseCustomer" } } } }, "302": { "description": "Document has been redirected to a new URL.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" }, "examples": { "Export Documentation - 400 Status response.": { "summary": "The below example shows that the given exportId is Invalid. Track your export Id form /v2/Project/Export.", "value": { "extension_data": null, "success": true, "errors": [ { "extension_data": null, "stack_trace": null, "description": "Invalid export id", "error_code": "400", "custom_data": null } ], "warnings": [], "information": [] } } } } } }, "400": { "description": "Bad request — malformed URL or missing required segments.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" }, "examples": { "Export Documentation - 400 Status response.": { "summary": "The below example shows that the given exportId is Invalid. Track your export Id form /v2/Project/Export.", "value": { "extension_data": null, "success": true, "errors": [ { "extension_data": null, "stack_trace": null, "description": "Invalid export id", "error_code": "400", "custom_data": null } ], "warnings": [], "information": [] } } } } } }, "404": { "description": "Document not found.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" }, "examples": { "Export Documentation - 400 Status response.": { "summary": "The below example shows that the given exportId is Invalid. Track your export Id form /v2/Project/Export.", "value": { "extension_data": null, "success": true, "errors": [ { "extension_data": null, "stack_trace": null, "description": "Invalid export id", "error_code": "400", "custom_data": null } ], "warnings": [], "information": [] } } } } } }, "401": { "description": "Authentication failed — the `api_token` header is missing, malformed, or has been revoked.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" } } } }, "429": { "description": "Rate limit exceeded for this api_token. Wait for the duration in the `Retry-After` header before retrying.", "headers": { "Retry-After": { "description": "Number of seconds to wait before retrying the request.", "schema": { "type": "integer", "format": "int32" } }, "X-RateLimit-Limit": { "description": "The maximum number of requests allowed in the current window.", "schema": { "type": "integer", "format": "int32" } }, "X-RateLimit-Remaining": { "description": "The number of requests remaining in the current window.", "schema": { "type": "integer", "format": "int32" } }, "X-RateLimit-Reset": { "description": "Unix timestamp (seconds) at which the current rate-limit window resets.", "schema": { "type": "integer", "format": "int64" } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" } } } } }, "security": [ { "api_token": [] } ] } } }, "components": { "schemas": { "RedirectionMode": { "enum": [ "none", "redirectOnly", "redirectWithContent" ], "type": "string", "description": "Possible values: `\"none\"` = None, `\"redirectOnly\"` = RedirectOnly, `\"redirectWithContent\"` = RedirectWithContent", "x-enumNames": [ "None", "RedirectOnly", "RedirectWithContent" ], "x-enum-varnames": [ "None", "RedirectOnly", "RedirectWithContent" ], "x-ms-enum": { "name": "RedirectionMode", "modelAsString": true } }, "GetDocumentByPathResponseCustomer": { "type": "object", "properties": { "data": { "allOf": [ { "$ref": "#/components/schemas/DocumentCustomer" } ], "description": "Contains details of the retrieved document, which can be an article or a category.", "nullable": true }, "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "Extension data for customer API response", "nullable": true }, "success": { "type": "boolean", "description": "Indicates the status of the API response. A value of true signifies that the request was successfully processed, while false indicates a failure or error occurred.", "readOnly": true }, "errors": { "type": "array", "items": { "$ref": "#/components/schemas/BaseError" }, "description": "A list of errors encountered during the API request. Each error object provides details about the problem, including an error code and a message explaining the issue. This field is populated when the request fails or encounters issues.", "nullable": true }, "warnings": { "type": "array", "items": { "$ref": "#/components/schemas/BaseWarning" }, "description": "A list of warnings generated during the API request. These are non-critical issues or recommendations that might affect the request but won't stop it from processing. Each warning object provides a message to inform the user of potential problems.", "nullable": true }, "information": { "type": "array", "items": { "$ref": "#/components/schemas/BaseInformation" }, "description": "Contains additional non-critical information relevant to the request or response. This field provides extra details that might assist in understanding the context of the API response but is not essential for processing.", "nullable": true } }, "additionalProperties": false, "description": "Response containing a document (article or category) retrieved by URL path" }, "CustomerApiBaseResponse": { "type": "object", "properties": { "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "Extension data for customer API response", "nullable": true }, "success": { "type": "boolean", "description": "Indicates the status of the API response. A value of true signifies that the request was successfully processed, while false indicates a failure or error occurred.", "readOnly": true }, "errors": { "type": "array", "items": { "$ref": "#/components/schemas/BaseError" }, "description": "A list of errors encountered during the API request. Each error object provides details about the problem, including an error code and a message explaining the issue. This field is populated when the request fails or encounters issues.", "nullable": true }, "warnings": { "type": "array", "items": { "$ref": "#/components/schemas/BaseWarning" }, "description": "A list of warnings generated during the API request. These are non-critical issues or recommendations that might affect the request but won't stop it from processing. Each warning object provides a message to inform the user of potential problems.", "nullable": true }, "information": { "type": "array", "items": { "$ref": "#/components/schemas/BaseInformation" }, "description": "Contains additional non-critical information relevant to the request or response. This field provides extra details that might assist in understanding the context of the API response but is not essential for processing.", "nullable": true } }, "additionalProperties": false }, "DocumentCustomer": { "type": "object", "properties": { "document_type": { "enum": [ "article", "category" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/DocumentTypeCustomer" } ], "description": "Indicates whether the retrieved document is an article or a category.\r\nValid values: 0 - Article, 1 - Category", "x-enumNames": [ "Article", "Category" ], "x-enum-varnames": [ "Article", "Category" ], "x-ms-enum": { "name": "DocumentTypeCustomer", "modelAsString": true } }, "category": { "allOf": [ { "$ref": "#/components/schemas/CategoryDataBySlugCustomer" } ], "description": "Contains information about the category if the DocumentType is a Category.", "nullable": true }, "article": { "allOf": [ { "$ref": "#/components/schemas/ArticleDataBySlugCustomer" } ], "description": "Contains information about the category if the DocumentType is a Article.", "nullable": true } }, "additionalProperties": false, "description": "Unified document payload returned by `GET /v2/project/Document`. The shape depends on Document360.Core.Models.Public.DocumentCustomer.DocumentType: an article populates Document360.Core.Models.Public.DocumentCustomer.Article, a category populates Document360.Core.Models.Public.DocumentCustomer.Category. Lets callers resolve either kind of resource from a single URL lookup." }, "ExtensionDataObject": { "type": "object", "additionalProperties": false }, "BaseError": { "type": "object", "properties": { "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "This is the Extension data object", "nullable": true }, "stack_trace": { "type": "string", "description": "A technical trace showing where the error occurred within the system. Intended for backend debugging.", "nullable": true }, "description": { "type": "string", "description": "A clear message explaining what caused the error. This helps quickly understand what went wrong.", "nullable": true }, "error_code": { "type": "string", "description": "A short, predefined code that identifies the type of error. Useful for logging the error or raising a support request.", "nullable": true }, "custom_data": { "type": "object", "additionalProperties": {}, "description": "Any structured metadata for the error object.", "nullable": true } }, "additionalProperties": false, "description": "One structured error in a response's Document360.Core.Messages.Core.BaseResponse.errors array." }, "BaseWarning": { "type": "object", "properties": { "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "Extension Data for customer Api warning", "nullable": true }, "description": { "type": "string", "description": "A plain message that describes the warning and helps understand what should be reviewed.", "nullable": true }, "warning_code": { "type": "string", "description": "A short, predefined code that uniquely identifies the warning type.", "nullable": true } }, "additionalProperties": false, "description": "One non-fatal warning attached to an otherwise-successful response." }, "BaseInformation": { "type": "object", "properties": { "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "Extension data for customer Api response information", "nullable": true }, "description": { "type": "string", "description": "A plain message offering helpful context about the response, such as confirmation of fallback logic or skipped operations.", "nullable": true } }, "additionalProperties": false, "description": "One informational message in a response's Document360.Core.Messages.Core.BaseResponse.information array. Non-error context the SPA may surface to the user." }, "DocumentTypeCustomer": { "enum": [ "article", "category" ], "type": "string", "description": "Represents the type of document retrieved by URL", "x-enumNames": [ "Article", "Category" ], "x-enum-varnames": [ "Article", "Category" ], "x-ms-enum": { "name": "DocumentTypeCustomer", "modelAsString": true } }, "CategoryDataBySlugCustomer": { "type": "object", "properties": { "id": { "type": "string", "description": "The unique ID of the document.", "nullable": true, "readOnly": true }, "name": { "type": "string", "description": "The Name of the document.", "nullable": true }, "description": { "type": "string", "description": "A short description or summary of the document.", "nullable": true }, "project_version_id": { "type": "string", "description": "The ID of the project version where the document is located.", "nullable": true }, "order": { "type": "integer", "description": "The position the category inside the parent category", "format": "int32" }, "parent_category_id": { "type": "string", "description": "The ID of the parent category containing this document. Returns null for top-level categories.", "nullable": true }, "hidden": { "type": "boolean", "description": "Indicates if the category is visible on the site ( If \"false,\" all the child categories and articles will be hidden as well )" }, "slug": { "type": "string", "description": "The slug (URL-friendly identifier) of the document.", "nullable": true, "readOnly": true }, "content": { "type": "string", "description": "The document content in Markdown format. Populated when the editor type is Markdown.", "nullable": true }, "enable_rtl": { "type": "boolean", "description": "Returns true if right-to-left text alignment is enabled for the selected language for the document." }, "html_content": { "type": "string", "description": "The document content in HTML format. Populated when the editor type is WYSIWYG (HTML). For Markdown editors, this field is read-only.", "nullable": true }, "version_number": { "type": "integer", "description": "The version number of the document currently fetched.", "format": "int32" }, "category_type": { "enum": [ "default", "customContent", "linksToArticle" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/CategoryType" } ], "description": "The editor type used for the document.\r\nValid values: 0 - Markdown, 1 - WYSIWYG(HTML), 2 - Advanced WYSIWYG", "x-enumNames": [ "Default", "CustomContent", "LinksToArticle" ], "x-enum-varnames": [ "Default", "CustomContent", "LinksToArticle" ], "x-ms-enum": { "name": "CategoryType", "modelAsString": true } }, "created_at": { "type": "string", "description": "The date and time when the document was created.", "format": "date-time", "nullable": true, "readOnly": true }, "modified_at": { "type": "string", "description": "The date and time when the document was last modified.", "format": "date-time", "nullable": true, "readOnly": true }, "status": { "allOf": [ { "$ref": "#/components/schemas/ArticleStatusCustomer" } ], "description": "The status of the page type category: 0 - Draft, 3 - Published", "nullable": true }, "content_type": { "allOf": [ { "$ref": "#/components/schemas/ArticleContentType" } ], "description": "The editor type used for the document.\r\nValid values: 0 - Markdown, 1 - WYSIWYG(HTML), 2 - Advanced WYSIWYG", "nullable": true }, "current_workflow_status_id": { "type": "string", "description": "The current workflow status ID of the document.", "nullable": true }, "stale_status": { "allOf": [ { "$ref": "#/components/schemas/StaleStatus" } ], "description": "Fresh - Category page is up-to-date\r\nStale - Category page requires review", "nullable": true }, "lang_code": { "type": "string", "description": "The language code of the category", "nullable": true }, "available_languages": { "type": "array", "items": { "$ref": "#/components/schemas/AvailableLanguageInfo" }, "description": "Lists the languages the article or category is available in, along with their translation status and slug", "nullable": true }, "settings": { "allOf": [ { "$ref": "#/components/schemas/DocumentSettings" } ], "description": "Contains SEO settings and exclusion preferences for the document.", "nullable": true }, "security_visibility": { "allOf": [ { "$ref": "#/components/schemas/SecurityVisibility" } ], "description": "Indicates the visibility level of the article.Valid values are: \r\n0 - Public(accessible to all readers)\r\n1 - Private(accessible only to authenticated users or specific teams).", "nullable": true }, "authors": { "type": "array", "items": { "$ref": "#/components/schemas/ContributorInfoCustomer" }, "nullable": true }, "articles": { "type": "array", "items": { "$ref": "#/components/schemas/ArticleSimpleDataCustomer" }, "description": "The list of articles attached to this category", "nullable": true }, "child_categories": { "type": "array", "items": { "$ref": "#/components/schemas/CategoryDataCustomer" }, "description": "The list of categories attached to this category", "nullable": true }, "custom_fields": { "type": "array", "items": { "$ref": "#/components/schemas/CustomFieldValueResponse" }, "description": "Custom field values associated with the category. Returned for V1 callers only.", "nullable": true }, "custom_fields_data": { "type": "object", "additionalProperties": { "nullable": true }, "description": "Custom field values as a compact key-value map. Returned for V2 callers only.\r\nKey is the field label. Value is in its native type: string, number, boolean, or a comma-separated string of labels for multi-select.", "nullable": true } }, "additionalProperties": false, "description": "Customer-facing payload for a category resolved by slug — includes the category body, available languages, settings, child categories, and articles within it." }, "ArticleDataBySlugCustomer": { "type": "object", "properties": { "id": { "type": "string", "description": "The unique ID of the document.", "nullable": true, "readOnly": true }, "title": { "type": "string", "description": "The title of the document.", "nullable": true }, "content": { "type": "string", "description": "If the article editor is **Markdown**, then the article content will be present in this property", "nullable": true }, "html_content": { "type": "string", "description": " If the article editor is **WYSIWYG (HTML)**, then the content will be present in this property. \r\n**Note**: Markdown editor will also have HTML content (read-only).", "nullable": true }, "category_id": { "type": "string", "description": "The ID of the article's parent category", "nullable": true }, "project_version_id": { "type": "string", "description": "The ID of the project version where the article is located", "nullable": true }, "version_number": { "type": "integer", "description": "The currently fetched version number of the article", "format": "int32" }, "public_version": { "type": "integer", "description": "The currently published version number of the article", "format": "int32", "readOnly": true }, "latest_version": { "type": "integer", "description": "The latest version number of the article", "format": "int32", "readOnly": true }, "enable_rtl": { "type": "boolean", "description": "Returns true if right-to-left text alignment is enabled for the selected language for the document." }, "hidden": { "type": "boolean", "description": "`False` indicates that the article is visible on the site" }, "status": { "enum": [ "draft", "published" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/ArticleStatusCustomer" } ], "description": "The status of the article: 0 - Draft, 3 - Published", "x-enumNames": [ "Draft", "Published" ], "x-enum-varnames": [ "Draft", "Published" ], "x-ms-enum": { "name": "ArticleStatusCustomer", "modelAsString": true } }, "order": { "type": "integer", "description": "The position inside the parent category", "format": "int32" }, "created_by": { "type": "string", "description": "The position of the document within its parent category.", "nullable": true }, "authors": { "type": "array", "items": { "$ref": "#/components/schemas/ContributorInfoCustomer" }, "description": "The list of contributors who have authored or modified the document. Each object includes contributor details such as name, email, and role.", "nullable": true }, "created_at": { "type": "string", "description": "The date and time when the document was created.", "format": "date-time", "readOnly": true }, "modified_at": { "type": "string", "description": "The date and time when the document was last modified.", "format": "date-time", "readOnly": true }, "slug": { "type": "string", "description": "The slug (URL-friendly identifier) of the document.", "nullable": true, "readOnly": true }, "is_fall_back_content": { "type": "boolean", "description": "Returns true if the document is a fallback from the default language when the requested language version is unavailable." }, "stale_status": { "allOf": [ { "$ref": "#/components/schemas/StaleStatus" } ], "description": "Fresh - Article is up-to-date\r\nStale - Article requires review", "nullable": true }, "description": { "type": "string", "description": "A short description or summary of the document.", "nullable": true }, "category_type": { "allOf": [ { "$ref": "#/components/schemas/CategoryType" } ], "description": "0 - Folder, 1 - Page, 2 - Index", "nullable": true }, "content_type": { "allOf": [ { "$ref": "#/components/schemas/ArticleContentType" } ], "description": "The editor type used for the document.\r\nValid values: 0 - Markdown, 1 - WYSIWYG(HTML), 2 - Advanced WYSIWYG", "nullable": true }, "is_shared_article": { "type": "boolean", "description": "Returns true if the document is shared through private sharing." }, "translation_option": { "enum": [ "none", "needTranslation", "translated", "inProgress" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/LanguageTranslationOption" } ], "description": "The translation status of the document.\r\nValid values: 0 - None, 1 - Need Translation, 2 - Translated, 3 - In Progress", "x-enumNames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-enum-varnames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-ms-enum": { "name": "LanguageTranslationOption", "modelAsString": true } }, "url": { "type": "string", "description": "The fully qualified public URL of the document.", "nullable": true }, "current_workflow_status_id": { "type": "string", "description": "The current workflow status ID of the document.", "nullable": true }, "lang_code": { "type": "string", "description": "The language code of the document.", "nullable": true }, "available_languages": { "type": "array", "items": { "$ref": "#/components/schemas/AvailableLanguageInfo" }, "description": "Lists the languages in which the document is available, along with their translation status and URL. Each object includes:", "nullable": true }, "settings": { "allOf": [ { "$ref": "#/components/schemas/DocumentSettings" } ], "description": "Contains SEO settings and exclusion preferences for the document.", "nullable": true }, "security_visibility": { "enum": [ "public", "private" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/SecurityVisibility" } ], "description": "Indicates the visibility level of the article.Valid values are: \r\n0 - Public(accessible to all readers)\r\n1 - Private(accessible only to authenticated users or specific teams).", "x-enumNames": [ "Public", "Private" ], "x-enum-varnames": [ "Public", "Private" ], "x-ms-enum": { "name": "SecurityVisibility", "modelAsString": true } }, "custom_fields": { "type": "array", "items": { "$ref": "#/components/schemas/CustomFieldValueResponse" }, "description": "Custom field values associated with the article. Returned for V1 callers only.", "nullable": true }, "custom_fields_data": { "type": "object", "additionalProperties": { "nullable": true }, "description": "Custom field values as a compact key-value map. Returned for V2 callers only.\r\nKey is the field label. Value is in its native type: string, number, boolean, or a comma-separated string of labels for multi-select.", "nullable": true } }, "additionalProperties": false }, "CategoryType": { "enum": [ "default", "customContent", "linksToArticle" ], "type": "string", "description": "Defines what a category represents in the documentation hierarchy.", "x-enumNames": [ "Default", "CustomContent", "LinksToArticle" ], "x-enum-varnames": [ "Default", "CustomContent", "LinksToArticle" ], "x-ms-enum": { "name": "CategoryType", "modelAsString": true } }, "ArticleStatusCustomer": { "enum": [ "draft", "published" ], "type": "string", "description": "The status of the article: 0 - Draft, 3 - Published", "x-enumNames": [ "Draft", "Published" ], "x-enum-varnames": [ "Draft", "Published" ], "x-ms-enum": { "name": "ArticleStatusCustomer", "modelAsString": true } }, "ArticleContentType": { "enum": [ "markdown", "wysiwyg", "block" ], "type": "string", "description": "0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG", "x-enumNames": [ "Markdown", "Wysiwyg", "Block" ], "x-enum-varnames": [ "Markdown", "Wysiwyg", "Block" ], "x-ms-enum": { "name": "ArticleContentType", "modelAsString": true } }, "StaleStatus": { "type": "object", "properties": { "article_stale_status": { "enum": [ "fresh", "stale" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/ArticleStaleStatus" } ], "description": "The freshness classification of the article (Fresh, Stale, ReviewPending, etc.). Defaults to Fresh.", "x-enumNames": [ "Fresh", "Stale" ], "x-enum-varnames": [ "Fresh", "Stale" ], "x-ms-enum": { "name": "ArticleStaleStatus", "modelAsString": true } }, "stale_reason": { "type": "string", "description": "Free-text explanation captured when the article was marked stale.", "nullable": true }, "expired_at": { "type": "string", "description": "UTC date when this stale-status entry expires (article enters review).", "format": "date-time" }, "is_from_document_settings": { "type": "boolean", "description": "True if the stale policy was inherited from project-level documentation settings rather than set on the article directly." }, "expire_days": { "type": "integer", "description": "Number of days from publication after which the article should next be reviewed.", "format": "int32" } }, "additionalProperties": false, "description": "Freshness/review state for an article: whether it's still considered fresh, the\r\nreason it was marked stale, when the review window expires and how the policy was set." }, "AvailableLanguageInfo": { "type": "object", "properties": { "lang_code": { "type": "string", "description": "The language code of the translated document.", "nullable": true }, "url": { "type": "string", "description": "The URL of the translated document.", "nullable": true }, "translation_status": { "enum": [ "none", "needTranslation", "translated", "inProgress" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/LanguageTranslationOption" } ], "description": "The translation status of the document.\r\nValid values: 0 - None, 1 - Need Translation, 2 - Translated, 3 - In Progress", "x-enumNames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-enum-varnames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-ms-enum": { "name": "LanguageTranslationOption", "modelAsString": true } } }, "additionalProperties": false, "description": "Represents information about an available language translation for an article or category." }, "DocumentSettings": { "type": "object", "properties": { "seo_title": { "type": "string", "description": "The SEO title of the document.", "nullable": true }, "description": { "type": "string", "description": "The SEO description of the document.", "nullable": true }, "exclude_from_external_search": { "type": "boolean", "description": "Returns true if the document is excluded from external search engines. When enabled, Document360 automatically adds a robots meta tag and removes the document from the sitemap it generates." } }, "additionalProperties": false }, "SecurityVisibility": { "enum": [ "public", "private" ], "type": "string", "description": "Protection level of an article or category. Controls whether the resource is publicly accessible or requires reader authentication.", "x-enumNames": [ "Public", "Private" ], "x-enum-varnames": [ "Public", "Private" ], "x-ms-enum": { "name": "SecurityVisibility", "modelAsString": true } }, "ContributorInfoCustomer": { "type": "object", "properties": { "id": { "type": "string", "description": "The unique identifier of the contributor.", "nullable": true, "readOnly": true }, "first_name": { "type": "string", "description": "The contributor's first name.", "nullable": true }, "last_name": { "type": "string", "description": "The contributor's last name.", "nullable": true }, "email_id": { "type": "string", "description": "The email address of the contributor.", "nullable": true }, "profile_logo_url": { "type": "string", "description": "The profile logo URL of the contributor.", "nullable": true } }, "additionalProperties": false, "description": "Compact contributor info — identity and profile picture only. Returned as part of article/category author lists." }, "ArticleSimpleDataCustomer": { "type": "object", "properties": { "id": { "type": "string", "description": "The ID of the article", "nullable": true, "readOnly": true }, "title": { "type": "string", "description": "The article title", "nullable": true }, "public_version": { "type": "integer", "description": "The article version number(revision) that is currently published", "format": "int32", "readOnly": true }, "latest_version": { "type": "integer", "description": "The latest version number of this article", "format": "int32", "readOnly": true }, "language_code": { "type": "string", "description": "The default language code", "nullable": true, "deprecated": true }, "hidden": { "type": "boolean", "description": "Indicates if the article is visible on the site" }, "status": { "enum": [ "draft", "published" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/ArticleStatusCustomer" } ], "description": "The status of the article: 0 - Draft, 3 - Published", "x-enumNames": [ "Draft", "Published" ], "x-enum-varnames": [ "Draft", "Published" ], "x-ms-enum": { "name": "ArticleStatusCustomer", "modelAsString": true } }, "order": { "type": "integer", "description": "The position of the article inside the parent category", "format": "int32" }, "slug": { "type": "string", "description": "The slug of the article", "nullable": true, "readOnly": true }, "content_type": { "allOf": [ { "$ref": "#/components/schemas/ArticleContentType" } ], "description": "The content type of the article: Markdown = 0, Wysiwyg = 1, Block = 2", "nullable": true }, "translation_option": { "enum": [ "none", "needTranslation", "translated", "inProgress" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/LanguageTranslationOption" } ], "description": "The translation status of the document.\r\nValid values: 0 - None, 1 - Need Translation, 2 - Translated, 3 - In Progress", "x-enumNames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-enum-varnames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-ms-enum": { "name": "LanguageTranslationOption", "modelAsString": true } }, "is_shared_article": { "type": "boolean", "description": "`True` indicates that the article is shared" }, "created_at": { "type": "string", "description": "Article created date time", "format": "date-time", "nullable": true, "readOnly": true }, "modified_at": { "type": "string", "description": "Article modified date time", "format": "date-time", "nullable": true, "readOnly": true }, "current_workflow_status_id": { "type": "string", "description": "Current Workflow status of the article", "nullable": true } }, "additionalProperties": false, "description": "Compact article representation — title, slug, current/latest version numbers, hierarchy position, and basic settings. Returned in list endpoints and create/bulk-create responses where the full content body is not required." }, "CategoryDataCustomer": { "type": "object", "properties": { "articles": { "type": "array", "items": { "$ref": "#/components/schemas/ArticleSimpleDataCustomer" }, "description": "The list of articles attached to this category", "nullable": true }, "child_categories": { "type": "array", "items": { "$ref": "#/components/schemas/CategoryDataCustomer" }, "description": "The list of categories attached to this category", "nullable": true }, "id": { "type": "string", "description": "The ID of the category", "nullable": true, "readOnly": true }, "name": { "type": "string", "description": "Name of the category", "nullable": true }, "description": { "type": "string", "description": "Description of the category", "nullable": true }, "project_version_id": { "type": "string", "description": "The ID of the project version where this category is located", "nullable": true }, "order": { "type": "integer", "description": "The position the category inside the parent category", "format": "int32" }, "parent_category_id": { "type": "string", "description": "The ID of the parent category ( null if top-level )", "nullable": true }, "hidden": { "type": "boolean", "description": "Indicates if the category is visible on the site ( If \"false,\" all the child categories and articles will be hidden as well )" }, "icon": { "type": "string", "description": "Unicode representation of the icon or image URL", "nullable": true }, "slug": { "type": "string", "description": "The slug of the category", "nullable": true, "readOnly": true }, "language_code": { "type": "string", "description": "Language code of the category", "nullable": true }, "category_type": { "enum": [ "default", "customContent", "linksToArticle" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/CategoryType" } ], "description": "0 - Folder, 1 - Page, 2 - Index", "x-enumNames": [ "Default", "CustomContent", "LinksToArticle" ], "x-enum-varnames": [ "Default", "CustomContent", "LinksToArticle" ], "x-ms-enum": { "name": "CategoryType", "modelAsString": true } }, "created_at": { "type": "string", "description": "Category created date time", "format": "date-time", "nullable": true, "readOnly": true }, "modified_at": { "type": "string", "description": "Category modified date time", "format": "date-time", "nullable": true, "readOnly": true }, "status": { "allOf": [ { "$ref": "#/components/schemas/ArticleStatusCustomer" } ], "description": "The status of the page type category: 0 - Draft, 3 - Published", "nullable": true }, "content_type": { "allOf": [ { "$ref": "#/components/schemas/ArticleContentType" } ], "description": "The content type of the page type category: Markdown = 0, Wysiwyg = 1, Block = 2", "nullable": true }, "current_workflow_status_id": { "type": "string", "description": "Current Workflow status of the article", "nullable": true } }, "additionalProperties": false, "description": "Full category payload — extends Document360.Core.Models.Public.Categories.CategoryDataBaseCustomer with the articles and child categories that live inside this category. Forms the recursive tree returned by `GET /v2/projectversions/{projectVersionId}/categories`." }, "CustomFieldValueResponse": { "type": "object", "properties": { "field_id": { "type": "string", "description": "Unique identifier of the custom field definition", "nullable": true }, "name": { "type": "string", "description": "The display name of the custom field", "nullable": true }, "type": { "enum": [ "text", "textArea", "dropdown", "multiSelectDropdown", "date", "boolean", "number" ], "type": "string", "allOf": [ { "$ref": "#/components/schemas/CustomFieldType" } ], "description": "The type of the custom field. 0 = Text, 1 = TextArea, 2 = Dropdown, 3 = MultiSelectDropdown, 4 = Date, 5 = Boolean, 6 = Number", "x-enumNames": [ "Text", "TextArea", "Dropdown", "MultiSelectDropdown", "Date", "Boolean", "Number" ], "x-enum-varnames": [ "Text", "TextArea", "Dropdown", "MultiSelectDropdown", "Date", "Boolean", "Number" ], "x-ms-enum": { "name": "CustomFieldType", "modelAsString": true } }, "value": { "description": "The value of the custom field. Type depends on field type:\r\n- Text/TextArea: string\r\n- Number: int or double\r\n- Boolean: bool\r\n- Date: DateTime\r\n- Dropdown: string (selected option ID)\r\n- MultiSelectDropdown: List (array of selected option IDs)", "nullable": true }, "options": { "type": "array", "items": { "$ref": "#/components/schemas/CustomFieldOptionResponse" }, "description": "Available options for Dropdown and MultiSelectDropdown fields.\r\nOmitted for other field types.", "nullable": true } }, "additionalProperties": false, "description": "Represents a custom field value with its definition metadata" }, "LanguageTranslationOption": { "enum": [ "none", "needTranslation", "translated", "inProgress" ], "type": "string", "description": "0 - None, 1 - Needs transation, 2 - Translated, 3 - In progress", "x-enumNames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-enum-varnames": [ "None", "NeedTranslation", "Translated", "InProgress" ], "x-ms-enum": { "name": "LanguageTranslationOption", "modelAsString": true } }, "ArticleStaleStatus": { "enum": [ "fresh", "stale" ], "type": "string", "description": "The status of the article: 0 - None, 1 - New, 2 - Updated, 3 - Custom", "x-enumNames": [ "Fresh", "Stale" ], "x-enum-varnames": [ "Fresh", "Stale" ], "x-ms-enum": { "name": "ArticleStaleStatus", "modelAsString": true } }, "CustomFieldType": { "enum": [ "text", "textArea", "dropdown", "multiSelectDropdown", "date", "boolean", "number" ], "type": "string", "description": "Possible values: `\"text\"` = Text, `\"textArea\"` = TextArea, `\"dropdown\"` = Dropdown, `\"multiSelectDropdown\"` = MultiSelectDropdown, `\"date\"` = Date, `\"boolean\"` = Boolean, `\"number\"` = Number", "x-enumNames": [ "Text", "TextArea", "Dropdown", "MultiSelectDropdown", "Date", "Boolean", "Number" ], "x-enum-varnames": [ "Text", "TextArea", "Dropdown", "MultiSelectDropdown", "Date", "Boolean", "Number" ], "x-ms-enum": { "name": "CustomFieldType", "modelAsString": true } }, "CustomFieldOptionResponse": { "type": "object", "properties": { "id": { "type": "string", "description": "The option ID (use this value when updating)", "nullable": true, "readOnly": true }, "label": { "type": "string", "description": "The display label for the option", "nullable": true } }, "additionalProperties": false, "description": "Option definition for dropdown fields" } }, "securitySchemes": { "api_token": { "type": "apiKey", "description": "The API token used for authenticating the request. This must be passed as a header parameter. To generate an API token, go to **Settings > Knowledge base portal > API tokens**. This token must correspond to a valid workspace and permission level.", "name": "api_token", "in": "header" } } } } ````