> ## 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. # Searches for a phrase inside a workspace ## OpenAPI ````json GET /v2/ProjectVersions/{projectVersionId}/{langCode} { "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/ProjectVersions/{projectVersionId}/{langCode}": { "get": { "tags": [ "ProjectVersions" ], "summary": "Searches for a phrase inside a workspace", "operationId": "searchProjectVersion", "parameters": [ { "name": "projectVersionId", "in": "path", "description": "The ID of the workspace (also called project version). Fetch via `GET /v2/projectversions`.", "required": true, "schema": { "type": "string" }, "example": "46f48bc7-760f-4b07-b2d2-fce4aa8ba234" }, { "name": "searchQuery", "in": "query", "description": "Phrase to search across all articles in the workspace.", "schema": { "type": "string" }, "example": "how to publish an article" }, { "name": "langCode", "in": "path", "description": "Language code (for example `en`, `fr`, `de-DE`, `pt-BR`). Use `GET /v2/language/{projectVersionId}` to list the codes enabled for the workspace. Defaults to `en` when omitted.", "required": true, "schema": { "type": "string", "default": "en" }, "example": "en" }, { "name": "page", "in": "query", "description": "0-based page index. Valid range: 0–1000.", "schema": { "type": "integer", "format": "int32", "default": 0 }, "example": 1 }, { "name": "hitsPerPage", "in": "query", "description": "Number of results per page. Valid range: 0–1000. Default: 10.", "schema": { "type": "integer", "format": "int32", "default": 10 }, "example": 10 } ], "responses": { "200": { "description": "Operation succeeded. Inspect the response envelope's `success` flag and the `result`/`data` payload.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SearchProjectVersionResponseCustomerApi" }, "examples": { "Example for 200 response": { "summary": "200 response in searches for a phrase inside project version", "value": { "data": { "hits": [ { "title": "Understanding Home page builder", "content": "The home page is the first page an end-user will see when they visit your knowledge base. The Home Page Builder lets you customize your home page by adding links, changing colors, including categories from your knowledge base, and more. \n The home page builder comes with an intuitive interface to design a professional looking front-page to your knowledge base. You do not need any developer support to create a good looking home page. \n If you do not want a home page and would like to direct the user directly to the real content, you can easily turn off the home page for your knowledge base. \n \n \n This is a sample article, you can safely delete it. \n \n", "is_hidden": false, "tags": [], "slug": "understanding-home-page-builder", "version": 1, "article_id": "6116080f-5b38-4037-b878-82d318543dsw", "category_id": "6116080f-5b38-4037-b878-82d318543af", "is_category_hidden": null, "order": 5, "is_draft": false, "exclude": false, "breadcrumb": null, "is_category": null, "attachment_ids": null, "is_deleted": null, "is_folder_type_category": null, "updated_on_timestamp": null, "is_private": null, "language_id": null, "project_id": null, "is_latest_version": null, "contributors": null, "is_shared_article": null, "lang_code": null, "category_unique_id": null, "unique_id": null, "deleted_by": null, "deleted_at": null, "is_git_hub_entity": null, "original_article_id": null, "object_id": "", "_snippet_result": { "content": { "value": " The home page is the first page an end-user will see when they visit your knowledge base. The Home Page Builder lets you customize your home page by adding links, changing colors, including categories from your knowledge base, and more. \n The home page builder comes with an intuitive", "match_level": "" } }, "_highlight_result": { "title": null } } ], "nb_hits": null, "page": null, "nb_pages": null, "hits_per_page": null, "processing_time_ms": null, "query": null }, "extension_data": null, "success": true, "errors": [], "warnings": [], "information": [] } } } } } }, "400": { "description": "The request body or query parameters failed validation. Inspect `errors[].description` for the offending fields.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerApiBaseResponse" }, "examples": { "Example for 400 response due to project version Id ": { "summary": "400 bad response due to invalid Project version Id ", "value": { "extension_data": null, "success": false, "errors": [ { "extension_data": null, "stack_trace": null, "description": "The supplied project version id does not exist in your project", "error_code": "400", "custom_data": null } ], "warnings": [], "information": [] } }, "Example for 400 response due to Lanuage Code ": { "summary": "400 bad response due to invalid Language Code ", "value": { "extension_data": null, "success": false, "errors": [ { "extension_data": null, "stack_trace": null, "description": "Invalid Language code", "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" } } } }, "404": { "description": "The requested resource was not found, or the supplied identifier does not exist in the project.", "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": { "SearchProjectVersionResponseCustomerApi": { "type": "object", "properties": { "data": { "allOf": [ { "$ref": "#/components/schemas/ArticleMatchedData" } ], "nullable": true }, "extension_data": { "allOf": [ { "$ref": "#/components/schemas/ExtensionDataObject" } ], "description": "Extention data for customer API response", "nullable": true }, "success": { "type": "boolean", "description": "Status indication for customer API response", "readOnly": true }, "errors": { "type": "array", "items": { "$ref": "#/components/schemas/BaseError" }, "description": "Errors in the customer API response", "nullable": true }, "warnings": { "type": "array", "items": { "$ref": "#/components/schemas/BaseWarning" }, "description": "Warnings in the customer API response", "nullable": true }, "information": { "type": "array", "items": { "$ref": "#/components/schemas/BaseInformation" }, "description": "Information passed by the customer API response", "nullable": true } }, "additionalProperties": false }, "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 }, "ArticleMatchedData": { "type": "object", "properties": { "hits": { "type": "array", "items": { "$ref": "#/components/schemas/Hit" }, "description": "The list of articles that matched the search query.", "nullable": true }, "nb_hits": { "type": "integer", "description": "The number of hits (articles) matched by the query.", "format": "int32", "nullable": true }, "page": { "type": "integer", "description": "The position of the current page (zero-based).", "format": "int32", "nullable": true }, "nb_pages": { "type": "integer", "description": "The number of returned pages. Calculation is based on the total number of hits (nbHits) divided by the number of hits per page (hitsPerPage), rounded up to the nearest integer.", "format": "int32", "nullable": true }, "hits_per_page": { "type": "integer", "description": "Maximum number of hits (articles) per page.", "format": "int32", "nullable": true }, "processing_time_ms": { "type": "integer", "description": "The time the server took to process the request, in milliseconds. This doesn’t include network time.", "format": "int32", "nullable": true }, "query": { "type": "string", "description": "The query used to search the articles.", "nullable": true } }, "additionalProperties": false }, "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." }, "Hit": { "type": "object", "properties": { "title": { "type": "string", "description": "Article title", "nullable": true }, "content": { "type": "string", "description": "Article HTML content", "nullable": true }, "is_hidden": { "type": "boolean", "description": "Indicates if the article is visible on the site", "nullable": true }, "tags": { "type": "array", "items": { "type": "string" }, "description": "Custom article tags", "nullable": true }, "slug": { "type": "string", "description": "The slug of the article", "nullable": true, "readOnly": true }, "version": { "type": "integer", "description": "The version number that is currently published", "format": "int32", "nullable": true }, "article_id": { "type": "string", "description": "The ID of the article", "nullable": true }, "category_id": { "type": "string", "description": "The ID of the category", "nullable": true }, "is_category_hidden": { "type": "boolean", "description": "Indicates if category is visible on the site", "nullable": true }, "order": { "type": "integer", "description": "The position inside the parent category", "format": "int32" }, "is_draft": { "type": "boolean", "description": "Indicates if the article is marked as a draft", "nullable": true }, "exclude": { "type": "boolean", "description": "Indicates if the article is excluded from search results on user website", "nullable": true }, "breadcrumb": { "type": "string", "description": "The breadcrumb of the article", "nullable": true }, "is_category": { "type": "boolean", "description": "If the value is True, then the object has to considered as a category, otherwise it is an article", "nullable": true }, "attachment_ids": { "type": "array", "items": {}, "description": "The IDs of the files attached to the article", "nullable": true }, "is_deleted": { "type": "boolean", "description": "If the value is True, then it indicates that the article has been deleted", "nullable": true }, "is_folder_type_category": { "type": "boolean", "description": "If the value is True, then it indicates that the category is a folder type category", "nullable": true }, "updated_on_timestamp": { "type": "number", "description": "The last updated timestamp of the article", "format": "double", "nullable": true }, "is_private": { "type": "boolean", "description": "If the value is True, then the article can only be accessed by logged in users in the knowledge base site", "nullable": true }, "language_id": { "type": "string", "description": "The ID of the language", "nullable": true }, "project_id": { "type": "string", "description": "The ID of the project", "nullable": true }, "is_latest_version": { "type": "boolean", "description": "If the value is True, then the article is the latest version", "nullable": true }, "contributors": { "type": "array", "items": { "type": "string" }, "description": "The IDs of users who have contributed to the article", "nullable": true }, "is_shared_article": { "type": "integer", "description": "If the value is True, then it indicates that it is a shared article", "format": "int32", "nullable": true }, "lang_code": { "type": "string", "description": "The language code of the article or category", "nullable": true }, "category_unique_id": { "type": "string", "description": "A unique identifier for the category which is a combination of category ID and the language code", "nullable": true }, "unique_id": { "type": "string", "description": "A unique identifier for the article which is a combination of article ID and the language code", "nullable": true }, "deleted_by": { "type": "string", "description": "The ID of the user who deleted the article", "nullable": true }, "deleted_at": { "type": "string", "description": "The timestamp when the article was deleted", "nullable": true }, "is_git_hub_entity": { "type": "boolean", "description": "If the value is True, then it indicates that the article is synced from GitHub", "nullable": true }, "original_article_id": { "type": "string", "description": "The original article ID. Applicable only for shared articles.", "nullable": true }, "object_id": { "type": "string", "description": "algolia search object ID", "nullable": true }, "_snippet_result": { "allOf": [ { "$ref": "#/components/schemas/_Snippetresult" } ], "description": "Markup text with occurrences highlighted.", "nullable": true }, "_highlight_result": { "allOf": [ { "$ref": "#/components/schemas/_Highlightresult" } ], "description": "Highlighted attributes", "nullable": true } }, "additionalProperties": false }, "_Snippetresult": { "type": "object", "properties": { "content": { "allOf": [ { "$ref": "#/components/schemas/Content" } ], "nullable": true } }, "additionalProperties": false }, "_Highlightresult": { "type": "object", "properties": { "title": { "allOf": [ { "$ref": "#/components/schemas/Title" } ], "nullable": true } }, "additionalProperties": false }, "Content": { "type": "object", "properties": { "value": { "type": "string", "description": "Markup text with occurrences highlighted.", "nullable": true }, "match_level": { "type": "string", "description": "Indicates how well the attribute matched the search query. Can be: none, partial, full", "nullable": true } }, "additionalProperties": false }, "Title": { "type": "object", "properties": { "value": { "type": "string", "description": "Markup text with occurrences highlighted.", "nullable": true }, "match_level": { "type": "string", "description": "Indicates how well the attribute matched the search query. Can be: none, partial, full", "nullable": true }, "fully_highlighted": { "type": "boolean" }, "matched_words": { "type": "array", "items": { "type": "string" }, "description": "List of words from the query that matched the object.", "nullable": true } }, "additionalProperties": false } }, "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" } } } } ````