@pipeshub-ai/sdk
v1.2.0
Published
<!-- Start Summary [summary] --> ## Summary
Readme
pipeshub-sdk-typescript
Summary
PipesHub API: Unified API documentation for PipesHub services.
PipesHub is an enterprise-grade platform providing:
- User authentication and management
- Document storage and version control
- Knowledge base management
- Enterprise search and conversational AI
- Third-party integrations via connectors
- System configuration management
- Crawling job scheduling
- Email services
Authentication
Most endpoints require JWT Bearer token authentication. Some internal endpoints use scoped tokens for service-to-service communication.
OAuth 2.0 Bearer tokens from POST /oauth2/token use the same Authorization: Bearer header. For client_credentials, machine tokens may encode userId === client_id in the JWT; the Node API gateway resolves the OAuth app creator, sets the authenticated user accordingly, and forwards x-oauth-user-id to Python services on proxied calls. Do not send x-oauth-user-id yourself—the gateway removes untrusted values on ingress. See the OAuth Provider tag for full behavior.
Base URLs
All endpoints use the /api/v1 prefix unless otherwise noted.
Table of Contents
SDK Installation
The SDK can be installed with either npm, pnpm, bun or yarn package managers.
NPM
npm add @pipeshub-ai/sdkPNPM
pnpm add @pipeshub-ai/sdkBun
bun add @pipeshub-ai/sdkYarn
yarn add @pipeshub-ai/sdk[!NOTE] This package is published with CommonJS and ES Modules (ESM) support.
Requirements
For supported JavaScript runtimes, please consult RUNTIMES.md.
SDK Example Usage
Example
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub();
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
}
run();
Authentication
Per-Client Security Schemes
This SDK supports the following security schemes globally:
| Name | Type | Scheme |
| ------------ | ------ | ------------ |
| bearerAuth | http | HTTP Bearer |
| oauth2 | oauth2 | OAuth2 token |
You can set the security parameters through the security optional parameter when initializing the SDK client instance. The selected scheme will be used by default to authenticate with the API for all operations that support it. For example:
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
security: {
bearerAuth: "<YOUR_BEARER_TOKEN_HERE>",
},
});
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
}
run();
Per-Operation Security Schemes
Some operations in this SDK require the security scheme to be specified at the request level. For example:
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub();
async function run() {
const result = await pipeshub.userAccount.refreshToken({
scopedToken: "<YOUR_BEARER_TOKEN_HERE>",
});
console.log(result);
}
run();
Available Resources and Operations
Agents
- listAgents - List agents
- createAgent - Create agent
- getAgent - Get agent
- updateAgent - Update agent
- deleteAgent - Delete agent
- listAgentArchivedConversationsGrouped - List archived agent conversations grouped by agent
- listAgentConversationArchives - List archived conversations for an agent
- uploadAgentConversationChatAttachments - Upload agent chat attachments
- deleteAgentConversationChatAttachment - Delete an agent chat attachment
- streamAgentConversation - Create agent conversation with streaming response
- streamAgentConversationMessage - Add message to agent conversation with streaming response
- regenerateAgentConversationMessage - Regenerate agent conversation message
- updateAgentConversationMessageFeedback - Submit feedback for an agent message
- archiveAgentConversation - Archive an agent conversation
- unarchiveAgentConversation - Unarchive an agent conversation
- updateAgentConversationTitle - Update agent conversation title
- deleteAgentConversationById - Delete an agent conversation
- getAgentConversationById - Get agent conversation by ID
- listAgentConversations - List agent conversations
AIModelsProviders
- getAvailableModelsByType - Get available models by type
Conversations
- streamChat - Create conversation with streaming response
- getAllConversations - List all conversations
- getArchivedConversations - List archived conversations
- searchArchivedConversations - Search archived conversations
- getConversationById - Get conversation by ID
- deleteConversationById - Delete conversation
- addMessageStream - Add message to a conversation with streaming response
- updateConversationTitle - Update conversation title
- archiveConversation - Archive conversation
- unarchiveConversation - Unarchive conversation
- regenerateAnswer - Regenerate AI response
- updateMessageFeedback - Submit feedback on AI response
KnowledgeHub
- getKnowledgeHubRootNodes - Get knowledge hub root nodes
- getKnowledgeHubChildNodes - Get knowledge hub child nodes
OAuthApps
- listOAuthApps - List OAuth apps
- createOAuthApp - Create OAuth app
- listOAuthScopes - List available scopes
- getOAuthApp - Get OAuth app details
- updateOAuthApp - Update OAuth app
- deleteOAuthApp - Delete OAuth app
- regenerateOAuthAppSecret - Regenerate client secret
- suspendOAuthApp - Suspend OAuth app
- activateOAuthApp - Activate suspended OAuth app
- listOAuthAppTokens - List app tokens
- revokeAllOAuthAppTokens - Revoke all app tokens
OAuthProvider
- oauthToken - Exchange authorization code for tokens
- oauthRevoke - Revoke an access or refresh token
- oauthIntrospect - Introspect a token
OpenIDConnect
- oauthUserInfo - Get authenticated user information
OrganizationAuthConfig
- getAuthMethods - Get organization authentication methods
- updateAuthMethod - Update organization authentication methods
- setUpAuthConfig - Set up auth configuration
Organizations
- getCurrentOrganization - Get current organization
SemanticSearch
- search - Perform semantic search
- searchHistory - Get search history
- deleteSearchHistory - Clear all search history
- getSearchById - Get search by ID
- deleteSearchById - Delete search by ID
- archiveSearch - Archive a search
- unarchiveSearch - Unarchive a search
UserAccount
- initAuth - Initialize authentication session
- authenticate - Authenticate user with credentials
- refreshToken - Refresh access token
- resetPassword - Reset password
WebSearch
- getWebSearchProviders - Get all web search providers
Standalone functions
All the methods listed above are available as standalone functions. These functions are ideal for use in applications running in the browser, serverless runtimes or other environments where application bundle size is a primary concern. When using a bundler to build your application, all unused functionality will be either excluded from the final bundle or tree-shaken away.
To read more about standalone functions, check FUNCTIONS.md.
agentsArchiveAgentConversation- Archive an agent conversationagentsCreateAgent- Create agentagentsDeleteAgent- Delete agentagentsDeleteAgentConversationById- Delete an agent conversationagentsDeleteAgentConversationChatAttachment- Delete an agent chat attachmentagentsGetAgent- Get agentagentsGetAgentConversationById- Get agent conversation by IDagentsListAgentArchivedConversationsGrouped- List archived agent conversations grouped by agentagentsListAgentConversationArchives- List archived conversations for an agentagentsListAgentConversations- List agent conversationsagentsListAgents- List agentsagentsRegenerateAgentConversationMessage- Regenerate agent conversation messageagentsStreamAgentConversation- Create agent conversation with streaming responseagentsStreamAgentConversationMessage- Add message to agent conversation with streaming responseagentsUnarchiveAgentConversation- Unarchive an agent conversationagentsUpdateAgent- Update agentagentsUpdateAgentConversationMessageFeedback- Submit feedback for an agent messageagentsUpdateAgentConversationTitle- Update agent conversation titleagentsUploadAgentConversationChatAttachments- Upload agent chat attachmentsaiModelsProvidersGetAvailableModelsByType- Get available models by typeconversationsAddMessageStream- Add message to a conversation with streaming responseconversationsArchiveConversation- Archive conversationconversationsDeleteConversationById- Delete conversationconversationsGetAllConversations- List all conversationsconversationsGetArchivedConversations- List archived conversationsconversationsGetConversationById- Get conversation by IDconversationsRegenerateAnswer- Regenerate AI responseconversationsSearchArchivedConversations- Search archived conversationsconversationsStreamChat- Create conversation with streaming responseconversationsUnarchiveConversation- Unarchive conversationconversationsUpdateConversationTitle- Update conversation titleconversationsUpdateMessageFeedback- Submit feedback on AI responseknowledgeHubGetKnowledgeHubChildNodes- Get knowledge hub child nodesknowledgeHubGetKnowledgeHubRootNodes- Get knowledge hub root nodesoAuthAppsActivateOAuthApp- Activate suspended OAuth appoAuthAppsCreateOAuthApp- Create OAuth appoAuthAppsDeleteOAuthApp- Delete OAuth appoAuthAppsGetOAuthApp- Get OAuth app detailsoAuthAppsListOAuthApps- List OAuth appsoAuthAppsListOAuthAppTokens- List app tokensoAuthAppsListOAuthScopes- List available scopesoAuthAppsRegenerateOAuthAppSecret- Regenerate client secretoAuthAppsRevokeAllOAuthAppTokens- Revoke all app tokensoAuthAppsSuspendOAuthApp- Suspend OAuth appoAuthAppsUpdateOAuthApp- Update OAuth appoAuthProviderOauthIntrospect- Introspect a tokenoAuthProviderOauthRevoke- Revoke an access or refresh tokenoAuthProviderOauthToken- Exchange authorization code for tokensopenIDConnectOauthUserInfo- Get authenticated user informationorganizationAuthConfigGetAuthMethods- Get organization authentication methodsorganizationAuthConfigSetUpAuthConfig- Set up auth configurationorganizationAuthConfigUpdateAuthMethod- Update organization authentication methodsorganizationsGetCurrentOrganization- Get current organizationsemanticSearchArchiveSearch- Archive a searchsemanticSearchDeleteSearchById- Delete search by IDsemanticSearchDeleteSearchHistory- Clear all search historysemanticSearchGetSearchById- Get search by IDsemanticSearchSearch- Perform semantic searchsemanticSearchSearchHistory- Get search historysemanticSearchUnarchiveSearch- Unarchive a searchuserAccountAuthenticate- Authenticate user with credentialsuserAccountInitAuth- Initialize authentication sessionuserAccountRefreshToken- Refresh access tokenuserAccountResetPassword- Reset passwordwebSearchGetWebSearchProviders- Get all web search providers
Server-sent event streaming
Server-sent events are used to stream content from certain
operations. These operations will expose the stream as an async iterable that
can be consumed using a for await...of loop. The loop will
terminate when the server no longer has any events to send and closes the
underlying connection.
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
security: {
bearerAuth: "<YOUR_BEARER_TOKEN_HERE>",
},
});
async function run() {
const result = await pipeshub.conversations.streamChat({
query: "What are the key findings from our Q4 financial report?",
recordIds: [
"507f1f77bcf86cd799439011",
"507f1f77bcf86cd799439012",
],
modelKey: "gpt-4-turbo",
modelName: "GPT-4 Turbo",
modelFriendlyName: "GPT-4 Turbo",
chatMode: "web_search",
timezone: "America/New_York",
currentTime: new Date("2026-04-12T16:00:00+05:30"),
tools: [
"jira.create_issue",
"confluence.search_content",
],
});
for await (const event of result) {
console.log(event);
}
}
run();
File uploads
Certain SDK methods accept files as part of a multi-part request. It is possible and typically recommended to upload files as a stream rather than reading the entire contents into memory. This avoids excessive memory consumption and potentially crashing with out-of-memory errors when working with very large files. The following example demonstrates how to attach a file stream to a request.
[!TIP]
Depending on your JavaScript runtime, there are convenient utilities that return a handle to a file without reading the entire contents into memory:
- Node.js v20+: Since v20, Node.js comes with a native
openAsBlobfunction innode:fs.- Bun: The native
Bun.filefunction produces a file handle that can be used for streaming file uploads.- Browsers: All supported browsers return an instance to a
Filewhen reading the value from an<input type="file">element.- Node.js v18: A file stream can be created using the
fileFromhelper fromfetch-blob/from.js.
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
security: {
bearerAuth: "<YOUR_BEARER_TOKEN_HERE>",
},
});
async function run() {
const result = await pipeshub.agents.uploadAgentConversationChatAttachments({
agentKey: "<value>",
body: {
files: [],
},
});
console.log(result);
}
run();
Retries
Some of the endpoints in this SDK support retries. If you use the SDK without any configuration, it will fall back to the default retry strategy provided by the API. However, the default retry strategy can be overridden on a per-operation basis, or across the entire SDK.
To change the default retry strategy for a single API call, simply provide a retryConfig object to the call:
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub();
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
}, {
retries: {
strategy: "backoff",
backoff: {
initialInterval: 1,
maxInterval: 50,
exponent: 1.1,
maxElapsedTime: 100,
},
retryConnectionErrors: false,
},
});
console.log(result);
}
run();
If you'd like to override the default retry strategy for all operations that support retries, you can provide a retryConfig at SDK initialization:
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
retryConfig: {
strategy: "backoff",
backoff: {
initialInterval: 1,
maxInterval: 50,
exponent: 1.1,
maxElapsedTime: 100,
},
retryConnectionErrors: false,
},
});
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
}
run();
Error Handling
PipeshubError is the base class for all HTTP error responses. It has the following properties:
| Property | Type | Description |
| ------------------- | ---------- | --------------------------------------------------------------------------------------- |
| error.message | string | Error message |
| error.statusCode | number | HTTP response status code eg 404 |
| error.headers | Headers | HTTP response headers |
| error.body | string | HTTP body. Can be empty string if no body is returned. |
| error.rawResponse | Response | Raw HTTP response |
| error.data$ | | Optional. Some errors may contain structured data. See Error Classes. |
Example
import { Pipeshub } from "@pipeshub-ai/sdk";
import * as errors from "@pipeshub-ai/sdk/models/errors";
const pipeshub = new Pipeshub();
async function run() {
try {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
} catch (error) {
// The base class for HTTP error responses
if (error instanceof errors.PipeshubError) {
console.log(error.message);
console.log(error.statusCode);
console.log(error.body);
console.log(error.headers);
// Depending on the method different errors may be thrown
if (error instanceof errors.ErrorResponse) {
console.log(error.data$.error); // models.ErrorResponseError
}
}
}
}
run();
Error Classes
Primary error:
PipeshubError: The base class for HTTP error responses.
Network errors:
ConnectionError: HTTP client was unable to make a request to a server.RequestTimeoutError: HTTP request timed out due to an AbortSignal signal.RequestAbortedError: HTTP request was aborted by the client.InvalidRequestError: Any input used to create a request is invalid.UnexpectedClientError: Unrecognised or unexpected error.
Inherit from PipeshubError:
ErrorResponse: Standard error envelope returned by all errors routed throughErrorMiddleware. Applies to allBaseErrorsubclasses includingHttpError,ValidationError, and others. Thecodefield is a machine-readable string identifying the error type (e.g.HTTP_UNAUTHORIZED,HTTP_NOT_FOUND,VALIDATION_ERROR,INTERNAL_ERROR). Applicable to 20 of 65 methods.*OAuthClientManagementRateLimitError: JSON body when OAuth client management routes exceed the per-minute rate limit (same limiter as other/oauth-clients/*routes). Status code429. Applicable to 14 of 65 methods.*ApplicationJsonErrorResponse: Standard JSON error envelope fromErrorMiddlewareforBaseErrorsubclasses (error.middleware.ts). Returned for most API 4xx errors (unauthorized, forbidden, not found, validation failures, etc.). Applicable to 11 of 65 methods.*OAuthErrorResponse: OAuth 2.0 Error Response (RFC 6749 Section 5.2). Standard error format for OAuth endpoints. Status code401. Applicable to 3 of 65 methods.*GetKnowledgeHubRootNodesBadRequestError: Invalid request parameters. The backend's validation message is returned verbatim inerror.message. See the examples below for the common triggers. Status code400. Applicable to 1 of 65 methods.*GetKnowledgeHubChildNodesBadRequestError: Invalid request parameters or path values. The backend's validation message is returned verbatim inerror.message. See the examples below for the common triggers. Status code400. Applicable to 1 of 65 methods.*SearchHistoryBadRequestError: Error envelope for a failed request. Status code400. Applicable to 1 of 65 methods.*GetSearchByIdBadRequestError: Invalid request —searchIdfailed Zod validation (not a valid ObjectId). Status code400. Applicable to 1 of 65 methods.*DeleteAgentConversationChatAttachmentBadRequestError: Invalid or blank path params (agentKeyorrecordId). Status code400. Applicable to 1 of 65 methods.*GetAvailableModelsByTypeBadRequestError: InvalidmodelTypepath parameter. ThemodelTypevalue was not one of the supported enum categories. This response is produced by the Zod validation middleware before the handler runs. Theerror.metadata.errorsarray contains per-field detail about exactly which constraint failed. Status code400. Applicable to 1 of 65 methods.*GetKnowledgeHubRootNodesUnauthorizedError: Missing or invalid authentication token. The bearer token was absent, expired, malformed, or could not be verified by the auth middleware. Status code401. Applicable to 1 of 65 methods.*GetKnowledgeHubChildNodesUnauthorizedError: Missing or invalid authentication token. The bearer token was absent, expired, malformed, or could not be verified by the auth middleware. Status code401. Applicable to 1 of 65 methods.*SearchHistoryUnauthorizedError: Error envelope for a failed request. Status code401. Applicable to 1 of 65 methods.*GetSearchByIdUnauthorizedError: Missing or invalid bearer token. Status code401. Applicable to 1 of 65 methods.*GetAvailableModelsByTypeUnauthorizedError: Missing or invalid authentication token. The bearer token was absent, expired, malformed, or could not be verified by the auth middleware. Status code401. Applicable to 1 of 65 methods.*GetKnowledgeHubRootNodesForbiddenError: Insufficient OAuth scope. Only applies to OAuth tokens. The token did not carry thekb:readscope required by this endpoint. Regular (non-OAuth) JWT bearer tokens are not subject to scope enforcement and will not receive this error. Status code403. Applicable to 1 of 65 methods.*GetKnowledgeHubChildNodesForbiddenError: Insufficient OAuth scope. Only applies to OAuth tokens. The token did not carry thekb:readscope required by this endpoint. Regular (non-OAuth) JWT bearer tokens are not subject to scope enforcement and will not receive this error. Status code403. Applicable to 1 of 65 methods.*SearchHistoryForbiddenError: Error envelope for a failed request. Status code403. Applicable to 1 of 65 methods.*GetSearchByIdForbiddenError: Bearer token lacks thesemantic:readscope. Status code403. Applicable to 1 of 65 methods.*GetAvailableModelsByTypeForbiddenError: Insufficient OAuth scope. Only applies to OAuth tokens. The token did not carry theconfig:readscope required by this endpoint. Regular (non-OAuth) JWT bearer tokens are not subject to scope enforcement and will not receive this error. Status code403. Applicable to 1 of 65 methods.*GetKnowledgeHubChildNodesNotFoundError: Parent node not found. TheparentIddoes not correspond to an existing node of the specifiedparentType, or the node has been deleted. Status code404. Applicable to 1 of 65 methods.*GetSearchByIdNotFoundError: Reserved for parity with sibling routes; this endpoint currently returns200with an empty array for an unknown id rather than emitting404. Status code404. Applicable to 1 of 65 methods.*GetKnowledgeHubRootNodesInternalServerError: An unexpected error occurred on the server. Status code500. Applicable to 1 of 65 methods.*GetKnowledgeHubChildNodesInternalServerError: An unexpected error occurred on the server. Status code500. Applicable to 1 of 65 methods.*SearchHistoryInternalServerError: Error envelope for a failed request. Status code500. Applicable to 1 of 65 methods.*GetSearchByIdInternalServerError: Server error. Possible causes: - ExplicitInternalServerErroror any other 500BaseErrorthrown by the handler. - Non-BaseErrorexception caught by the global error middleware. - Response serializer fallback. Status code500. Applicable to 1 of 65 methods.*GetAvailableModelsByTypeInternalServerError: An unexpected error occurred on the server. Status code500. Applicable to 1 of 65 methods.*ResponseValidationError: Type mismatch between the data returned from the server and the structure expected by the SDK. Seeerror.rawValuefor the raw value anderror.pretty()for a nicely formatted multi-line string.
* Check the method documentation to see if the error is applicable.
Server Selection
Select Server by Index
You can override the default server globally by passing a server index to the serverIdx: number optional parameter when initializing the SDK client instance. The selected server will then be used as the default on the operations that use it. This table lists the indexes associated with the available servers:
| # | Server | Variables | Description |
| --- | ------------------------------- | -------------- | ------------------------------------------------- |
| 0 | https://{instance_url}/api/v1 | instance_url | Base API URL |
| 1 | https://{instance_url} | instance_url | Root URL (used for MCP endpoints mounted at /mcp) |
If the selected server has variables, you may override its default values through the additional parameters made available in the SDK constructor:
| Variable | Parameter | Default | Description |
| -------------- | --------------------- | ---------------------------- | --------------- |
| instance_url | instanceUrl: string | "https://app.pipeshub.com" | Base server URL |
Example
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
serverIdx: 0,
instanceUrl: "https://app.pipeshub.com",
});
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
}
run();
Override Server URL Per-Client
The default server can also be overridden globally by passing a URL to the serverURL: string optional parameter when initializing the SDK client instance. For example:
import { Pipeshub } from "@pipeshub-ai/sdk";
const pipeshub = new Pipeshub({
serverURL: "https://https://app.pipeshub.com",
});
async function run() {
const result = await pipeshub.oAuthProvider.oauthToken({
grantType: "client_credentials",
});
console.log(result);
}
run();
Custom HTTP Client
The TypeScript SDK makes API calls using an HTTPClient that wraps the native
Fetch API. This
client is a thin wrapper around fetch and provides the ability to attach hooks
around the request lifecycle that can be used to modify the request or handle
errors and response.
The HTTPClient constructor takes an optional fetcher argument that can be
used to integrate a third-party HTTP client or when writing tests to mock out
the HTTP client and feed in fixtures.
The following example shows how to:
- route requests through a proxy server using undici's ProxyAgent
- use the
"beforeRequest"hook to add a custom header and a timeout to requests - use the
"requestError"hook to log errors
import { Pipeshub } from "@pipeshub-ai/sdk";
import { ProxyAgent } from "undici";
import { HTTPClient } from "@pipeshub-ai/sdk/lib/http";
const dispatcher = new ProxyAgent("http://proxy.example.com:8080");
const httpClient = new HTTPClient({
// 'fetcher' takes a function that has the same signature as native 'fetch'.
fetcher: (input, init) =>
// 'dispatcher' is specific to undici and not part of the standard Fetch API.
fetch(input, { ...init, dispatcher } as RequestInit),
});
httpClient.addHook("beforeRequest", (request) => {
const nextRequest = new Request(request, {
signal: request.signal || AbortSignal.timeout(5000)
});
nextRequest.headers.set("x-custom-header", "custom value");
return nextRequest;
});
httpClient.addHook("requestError", (error, request) => {
console.group("Request Error");
console.log("Reason:", `${error}`);
console.log("Endpoint:", `${request.method} ${request.url}`);
console.groupEnd();
});
const sdk = new Pipeshub({ httpClient: httpClient });Debugging
You can setup your SDK to emit debug logs for SDK requests and responses.
You can pass a logger that matches console's interface as an SDK option.
[!WARNING] Beware that debug logging will reveal secrets, like API tokens in headers, in log messages printed to a console or files. It's recommended to use this feature only during local development and not in production.
import { Pipeshub } from "@pipeshub-ai/sdk";
const sdk = new Pipeshub({ debugLogger: console });