FastComments.com

FastComments JavaScript/TypeScript SDK


這是 FastComments 的官方 JavaScript/TypeScript SDK。

可從 Node.js 或瀏覽器管理評論、使用者、SSO(單一登入)和審核。

儲存庫

在 GitHub 上查看


安裝 Internal Link

npm

npm install fastcomments-sdk

API 文件 Internal Link


完整的 API 參考: docs/api/README.md

瀏覽器與伺服器相容性 Internal Link


此 SDK 使用 雙入口點 以確保最佳相容性並避免執行時錯誤:

  • fastcomments-sdk/browser - 瀏覽器安全的版本,使用原生 fetch
  • fastcomments-sdk/server - 完整的 Node.js 版本,支援 SSO
  • fastcomments-sdk (default) - 僅型別,能安全在任何地方匯入

公開與受保護的 API Internal Link

此 SDK 提供三個主要的 API 類別:

  • DefaultApi - 需要您的 API 金鑰進行驗證的受保護端點。用於伺服器端操作。
  • PublicApi - 可在無需 API 金鑰的情況下存取的公開端點。可直接從瀏覽器/行動裝置等呼叫。
  • HiddenApi - 供內部/管理用途的端點,適用於進階使用情境。

範例:使用 Public API(瀏覽器安全)

import { PublicApi } from 'fastcomments-sdk/browser';

const publicApi = new PublicApi();

// 取得頁面評論(不需要 API 金鑰)
const response = await publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id'
});

範例:使用 Default API(僅限伺服器端)

import { DefaultApi, Configuration } from 'fastcomments-sdk/server';

const config = new Configuration({
  apiKey: 'your-api-key' // 請保密!
});
const defaultApi = new DefaultApi(config);

// 以完整管理權限取得評論
const response = await defaultApi.getComments({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id'
});

單一登入 (SSO) 整合 Internal Link

FastComments 支援 SSO 以整合您現有的使用者認證系統。 SSO 功能僅在伺服器端匯出時可用,因為它需要 Node.js 的 crypto 功能。

Simple SSO (Server-Side Only)

簡易 SSO 應在伺服器端產生並傳送給客戶端:

// 伺服器端程式碼(Node.js/backend)
import { FastCommentsSSO, PublicApi } from 'fastcomments-sdk/server';

// 使用內建輔助函式建立簡易 SSO  
const userData = {
  username: 'john_doe',
  email: 'john@example.com',
  displayName: 'John Doe',
  avatar: 'https://example.com/avatar.jpg'
};

const sso = FastCommentsSSO.createSimple(userData, {
  loginURL: '/login',
  logoutURL: '/logout'
});

const ssoToken = sso.createToken();

// 將 ssoToken 傳送到你的客戶端程式碼
// 客戶端程式碼之後可以使用此 token 與瀏覽器 SDK

安全 SSO 應在伺服器端實作,並提供較佳的安全性:

// 伺服器端程式碼(Node.js/backend)
import { FastCommentsSSO, PublicApi } from 'fastcomments-sdk/server';

// 使用內建輔助函式建立安全 SSO
const userData = {
  id: 'user-123',
  email: 'john@example.com',
  username: 'john_doe',
  displayName: 'John Doe',
  avatar: 'https://example.com/avatar.jpg',
  isAdmin: false,
  isModerator: false
};

const sso = FastCommentsSSO.createSecure('your-api-key', userData, {
  loginURL: '/login',
  logoutURL: '/logout'
});

const ssoConfig = sso.prepareToSend();

// 用於伺服器上的 API 呼叫
const publicApi = new PublicApi();
const response = await publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id',
  sso: JSON.stringify(ssoConfig)
});

// 或將 ssoConfig 傳送給客戶端供瀏覽器使用

Using SSO from Browser (with Server-Generated Token)

// 客戶端程式碼(瀏覽器)
import { PublicApi } from 'fastcomments-sdk/browser';

// 從你的伺服器端點取得 SSO token
const ssoToken = await fetch('/api/sso-token').then(r => r.json());

const publicApi = new PublicApi();
const response = await publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id',
  sso: ssoToken // 使用伺服器產生的 SSO token
});

SSO with Comment Creation

// 伺服器端:建立 SSO 與留言
import { FastCommentsSSO, PublicApi } from 'fastcomments-sdk/server';

const sso = FastCommentsSSO.createSecure('your-api-key', userData);
const ssoConfig = sso.prepareToSend();

const response = await publicApi.createCommentPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id',
  broadcastId: 'unique-broadcast-id',
  commentData: {
    comment: 'This is my comment',
    date: Date.now(),
    commenterName: 'John Doe',
    url: 'https://example.com/page',
    urlId: 'page-url-id'
  },
  sso: JSON.stringify(ssoConfig)
});

常見應用情境 Internal Link

取得頁面留言

const comments = await sdk.publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'article-123'
});

建立留言

const newComment = await sdk.publicApi.createCommentPublic({
  createCommentParams: {
    tenantId: 'your-tenant-id',
    urlId: 'article-123',
    comment: 'Great article!',
    commenterName: 'John Doe',
    commenterEmail: 'john@example.com'
  }
});

對留言投票

const voteResponse = await sdk.publicApi.voteComment({
  voteBodyParams: {
    commentId: 'comment-id',
    direction: 1 // 1 表示讚,-1 表示踩
  }
});

使用者管理(需要 API 金鑰)

// 搜尋使用者(需要 DefaultApi)
const users = await sdk.defaultApi.searchUsers({
  tenantId: 'your-tenant-id',
  urlId: 'page-id',
  usernameStartsWith: 'john'
});

即時事件(即時更新) Internal Link

訂閱即時事件以獲取有關留言、點讚和其他活動的即時更新。

頁面層級事件

監聽特定頁面的即時事件(留言、點讚等):

import { subscribeToChanges, LiveEvent, LiveEventType } from 'fastcomments-sdk/browser';

const config = {
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id',
};

// 訂閱該頁面的即時事件
const subscription = subscribeToChanges(
  config,
  'your-tenant-id', // tenantIdWS(租戶 ID)
  'page-url-id',    // urlIdWS(頁面 URL ID)  
  'user-session-id', // userIdWS(從 getComments 回應取得)
  (event: LiveEvent) => {
    console.log('Live event received:', event);

    switch (event.type) {
      case LiveEventType.new_comment:
        console.log('New comment:', event.comment);
        // 使用新留言更新您的介面
        break;
      case LiveEventType.new_vote:
        console.log('New vote:', event.vote);
        // 在介面中更新票數
        break;
      case LiveEventType.updated_comment:
        console.log('Comment updated:', event.comment);
        break;
      default:
        console.log('Other event type:', event.type);
    }

    return true; // 若事件已處理則回傳 true
  },
  (isConnected: boolean) => {
    console.log('Connection status:', isConnected ? 'Connected' : 'Disconnected');
  }
);

// 完成後關閉訂閱
subscription.close();

訂閱使用者事件

監聽與特定使用者相關的事件(通知、提及等):

import { subscribeToUserFeed, LiveEvent, LiveEventType } from 'fastcomments-sdk/browser';

const userConfig = {
  userIdWS: 'user-session-id', // 從 getComments 回應取得
};

// 訂閱使用者的個人資訊流
const userSubscription = subscribeToUserFeed(
  userConfig,
  (event: LiveEvent) => {
    console.log('User event received:', event);

    switch (event.type) {
      case LiveEventType.notification:
        console.log('New notification:', event.notification);
        // 在您的介面中顯示通知
        break;
      case LiveEventType.notification_update:
        console.log('Notification updated:', event.notification);
        break;
      default:
        console.log('Other user event:', event.type);
    }

    return true;
  },
  (isConnected: boolean) => {
    console.log('User feed connection:', isConnected ? 'Connected' : 'Disconnected');
  }
);

// 完成後關閉
userSubscription.close();

取得 userIdWS

參數 userIdWS 為即時事件所需,可從 API 回應中取得:

const response = await sdk.publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-id'
});

// 從回應中擷取 userIdWS
const userIdWS = response.data?.userSessionInfo?.userIdWS;

if (userIdWS) {
  // 現在您可以訂閱即時事件
  const subscription = subscribeToChanges(config, tenantIdWS, urlIdWS, userIdWS, handleEvent);
}

廣播 ID Internal Link

你會看到在某些 API 呼叫中應該傳入 broadcastId。當你接收事件時,你會得到這個 ID 回傳,因此如果你打算在客戶端採取樂觀更新(你很可能會想這麼做,因為它提供最佳體驗),你就會知道要忽略該事件。請在此傳入 UUID。該 ID 應該足夠唯一,以免在瀏覽器會話中出現兩次。

import { v4 as uuidv4 } from 'uuid';

const response = await sdk.publicApi.createCommentPublic({
  createCommentParams: {
    tenantId: 'your-tenant-id',
    urlId: 'page-id',
    comment: 'My comment',
    broadcastId: uuidv4() // 此操作的唯一識別碼
  }
});

錯誤處理 Internal Link

try {
  const comments = await sdk.publicApi.getCommentsPublic({
    tenantId: 'your-tenant-id',
    urlId: 'page-id'
  });
} catch (error) {
  if (error.response?.status === 404) {
    console.log('Page not found');
  } else {
    console.error('API Error:', error.message);
  }
}

彙總 (aggregate) Internal Link

透過分組(如果提供了 groupBy)並套用多個運算,來彙總文件。 支援不同的運算(例如 sum、countDistinct、avg 等)。

參數

Name Type Required Description
tenantId string
aggregationRequest AggregationRequest
parentTenantId string
includeStats boolean

回應

回傳:AggregationResponse


取得稽核日誌 (getAuditLogs) Internal Link

參數

名稱 類型 必填 說明
tenantId string
limit number
skip number
order SORTDIR
after number
before number

回應

回傳: GetAuditLogs200Response

範例

getAuditLogs 範例
Copy Copy
1
2const tenantId: string = 'tenant_9a8b7c';
3const limit: number = 100;
4const skip: number = 0;
5const after: number = Date.now() - 30 * 24 * 60 * 60 * 1000; // 30 天前
6const before: number = Date.now();
7const auditLogs: GetAuditLogs200Response = await getAuditLogs(tenantId, limit, skip, undefined, after, before);
8

從評論封鎖 (blockFromCommentPublic) Internal Link

參數

Name Type Required Description
tenantId string
commentId string
publicBlockFromCommentParams PublicBlockFromCommentParams
sso string

回應

回傳: BlockFromCommentPublic200Response

範例

blockFromCommentPublic 範例
Copy Copy
1
2const tenantId: string = "site_7f9b2e";
3const commentId: string = "comment_2026-03-25_001";
4const publicBlockFromCommentParams: PublicBlockFromCommentParams = {
5 reason: "Repeated harassment and targeted abuse",
6 blockDurationDays: 90,
7 includeHistory: true,
8 notifyModeratorTeam: true
9};
10const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.fakePayload.signature";
11const result: BlockFromCommentPublic200Response = await blockFromCommentPublic(tenantId, commentId, publicBlockFromCommentParams, sso);
12

解除公開評論封鎖 (unBlockCommentPublic) Internal Link

參數

名稱 類型 必填 描述
tenantId string
commentId string
publicBlockFromCommentParams PublicBlockFromCommentParams
sso string

回應

回傳: UnBlockCommentPublic200Response

範例

unBlockCommentPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_42e8a1';
3const commentId: string = 'cmt_9b3f2d';
4const publicBlockFromCommentParams: PublicBlockFromCommentParams = {
5 reason: 'abusive_language',
6 blockedByModeratorId: 'mod_17',
7 note: 'Targeted harassment; review complete',
8 unblockRequestedAt: new Date().toISOString()
9};
10const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.signature';
11const result: UnBlockCommentPublic200Response = await unBlockCommentPublic(tenantId, commentId, publicBlockFromCommentParams, sso);
12

檢查被封鎖的評論 (checkedCommentsForBlocked) Internal Link

參數

Name Type Required Description
tenantId string
commentIds string
sso string

回應

回傳: CheckedCommentsForBlocked200Response

範例

checkedCommentsForBlocked 範例
Copy Copy
1
2const tenantId: string = 'tenant_4f3b2a1e';
3const commentIds: string = 'c_1001,c_1002,c_1003';
4const ssoToken: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIn0.Sf4ke7nQP3mZx9v2';
5
6const resultWithoutSSO: CheckedCommentsForBlocked200Response = await checkedCommentsForBlocked(tenantId, commentIds);
7const resultWithSSO: CheckedCommentsForBlocked200Response = await checkedCommentsForBlocked(tenantId, commentIds, ssoToken);
8

封鎖使用者於評論 (blockUserFromComment) Internal Link

參數

名稱 型別 必填 說明
tenantId string
id string
blockFromCommentParams BlockFromCommentParams
userId string
anonUserId string

回應

回傳:BlockFromCommentPublic200Response

範例

blockUserFromComment 範例
Copy Copy
1
2const tenantId: string = 'acme-corp';
3const id: string = 'comment_7f3b2a9c';
4const blockFromCommentParams: BlockFromCommentParams = {
5 reason: 'Repeated abusive language and targeted harassment',
6 durationDays: 90,
7 preventReposting: true
8};
9const userId: string = 'user_12345';
10const anonUserId: string = 'anon_98765';
11
12const result: BlockFromCommentPublic200Response = await blockUserFromComment(
13 tenantId,
14 id,
15 blockFromCommentParams,
16 userId,
17 anonUserId
18);
19

建立公開評論 (createCommentPublic) Internal Link

參數

名稱 類型 必填 說明
tenantId string
urlId string
broadcastId string
commentData CommentData
sessionId string
sso string

回應

回傳: CreateCommentPublic200Response

範例

createCommentPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_prod_42';
3const urlId: string = 'article-2026-03-25-tech-deep-dive';
4const broadcastId: string = 'live-broadcast-001';
5const sessionId: string = 'sess_9f8e7d6a3b';
6const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.signature';
7const commentData: CommentData = {
8 content: 'Great reporting — appreciated the depth on performance tradeoffs.',
9 authorName: 'Jordan M.',
10 language: 'en-US',
11 metadata: { client: 'web' }
12};
13const result: CreateCommentPublic200Response = await createCommentPublic(tenantId, urlId, broadcastId, commentData, sessionId, sso);
14

刪除評論 (deleteComment) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
contextUserId string
isLive boolean

回應

回傳: DeleteComment200Response

範例

deleteComment 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_01";
3const id: string = "comment_5f3a2b7c";
4const contextUserId: string = "user_1229";
5const isLive: boolean = true;
6const response: DeleteComment200Response = await deleteComment(tenantId, id, contextUserId, isLive);
7

刪除公開評論 (deleteCommentPublic) Internal Link

參數

名稱 類型 必填 描述
tenantId string Yes
commentId string Yes
broadcastId string Yes
editKey string No
sso string No

回應

回傳: DeleteCommentPublic200Response

範例

deleteCommentPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_4f2c9b';
3const commentId: string = 'comment-7c3a9f2d';
4const broadcastId: string = 'article-2026-03-20';
5const editKey: string | undefined = 'ek_pub_abc12345';
6const sso: string | undefined = 'sso_eyJhbGciOiJIUzI1Ni';
7
8const result: DeleteCommentPublic200Response = await deleteCommentPublic(
9 tenantId,
10 commentId,
11 broadcastId,
12 editKey,
13 sso
14);
15

刪除評論投票 (deleteCommentVote) Internal Link

參數

Name 類型 必填 說明
tenantId string
commentId string
voteId string
urlId string
broadcastId string
editKey string
sso string

回應

回傳: DeleteCommentVote200Response

範例

deleteCommentVote 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-87e4fd';
3const commentId: string = 'cmt-9a12b3f4';
4const voteId: string = 'vote-4f6d21b9';
5const urlId: string = 'https://www.acme.com/articles/2026/03/25/how-to-test';
6const broadcastId: string = 'broadcast-20260325-01';
7const editKey: string = 'editkey-6b7c8d9e';
8const sso: string = 'sso-jwt-eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9';
9
10const response: DeleteCommentVote200Response = await deleteCommentVote(
11 tenantId,
12 commentId,
13 voteId,
14 urlId,
15 broadcastId,
16 editKey,
17 sso
18);
19

檢舉評論 (flagComment) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
userId string
anonUserId string

回應

回傳: FlagComment200Response

範例

flagComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f3b21';
3const commentId: string = 'cmt_9a2b4';
4const userId: string = 'user_1024';
5const result: FlagComment200Response = await flagComment(tenantId, commentId, userId);
6

取得評論 (getComment) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳:GetComment200Response

範例

getComment 範例
Copy Copy
1
2const tenantId: string = "acme-publishing-001";
3const commentId: string = "f3b2c1d0-9a8e-4b7c-8123-6d5f0a1e2b3c";
4const result: GetComment200Response = await getComment(tenantId, commentId);
5const wrapper: GetComment200Response & { comment?: APIComment } = result;
6const comment: APIComment | undefined = wrapper.comment;
7const authorBadge: CommentUserBadgeInfo | undefined = comment?.user?.badge;
8const userHashTags: CommentUserHashTagInfo[] | undefined = comment?.user?.hashTags
9

取得多則評論 (getComments) Internal Link

參數

Name Type Required Description
tenantId string
page number
limit number
skip number
asTree boolean
skipChildren number
limitChildren number
maxTreeDepth number
urlId string
userId string
anonUserId string
contextUserId string
hashTag string
parentId string
direction SortDirections

回應

回傳: GetComments200Response

範例

getComments 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_42';
3const response: GetComments200Response = await getComments(
4 tenantId,
5 1, // 頁碼
6 20, // 每頁數量
7 0, // 跳過
8 true, // 以樹狀回傳
9 1, // 跳過子項
10 3, // 子項限制
11 4, // 最大樹層級
12 'articles/2026/new-product-launch', // 網址識別碼
13 'user_7890', // 使用者 ID
14 'anon_4f3b2', // 匿名使用者 ID
15 undefined, // 上下文使用者 ID
16 '#launch', // 標籤
17 undefined // 父項 ID
18);
19

取得公開評論 (getCommentsPublic) Internal Link

req tenantId urlId

參數

Name Type Required Description
tenantId string
urlId string
page number
direction SortDirections
sso string
skip number
skipChildren number
limit number
limitChildren number
countChildren boolean
fetchPageForCommentId string
includeConfig boolean
countAll boolean
includei10n boolean
locale string
modules string
isCrawler boolean
includeNotificationCount boolean
asTree boolean
maxTreeDepth number
useFullTranslationIds boolean
parentId string
searchText string
hashTags Array
userId string
customConfigStr string
afterCommentId string
beforeCommentId string

回應

回傳: GetCommentsPublic200Response

範例

getCommentsPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_eu-west_01';
3const urlId: string = 'https://www.financialtimes.com/articles/2026/market-update-q1';
4const response: GetCommentsPublic200Response = await getCommentsPublic(
5 tenantId,
6 urlId,
7 2,
8 undefined,
9 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.tokenPayload.signature',
10 undefined,
11 0,
12 50,
13 5,
14 true,
15 undefined,
16 true,
17 false,
18 true,
19 'en-US',
20 'reactions,moderation',
21 false,
22 true,
23 true,
24 3,
25 false,
26 undefined,
27 'performance',
28 ['feature','fastcomments'],
29 'user_9876',
30 undefined,
31 undefined,
32 undefined
33);
34

取得評論文字 (getCommentText) Internal Link

參數

名稱 型別 必填 描述
tenantId string
commentId string
editKey string
sso string

回應

回傳: GetCommentText200Response

範例

getCommentText 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_001';
3const commentId: string = 'cmt_7890b';
4const editKey: string = 'edit_4f2d9b7c';
5const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9';
6
7const result: GetCommentText200Response = await getCommentText(tenantId, commentId, editKey, sso);
8

取得評論投票使用者名稱 (getCommentVoteUserNames) Internal Link

參數

名稱 類型 必填 說明
tenantId string Yes
commentId string Yes
dir number Yes
sso string No

回應

回傳:GetCommentVoteUserNames200Response

範例

getCommentVoteUserNames 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = 'tenant_4f2c1e';
4 const commentId: string = 'cmt_9a7b3d';
5 const dir: number = 1;
6 const resultUpvotes: GetCommentVoteUserNames200Response = await getCommentVoteUserNames(tenantId, commentId, dir);
7 const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.fakepayload.signature';
8 const dirDown: number = -1;
9 const resultDownvotes: GetCommentVoteUserNames200Response = await getCommentVoteUserNames(tenantId, commentId, dirDown, sso);
10 console.log(resultUpvotes, resultDownvotes);
11})();
12

鎖定評論 (lockComment) Internal Link

參數

Name Type Required Description
tenantId string
commentId string
broadcastId string
sso string

回應

回傳: LockComment200Response

範例

lockComment 範例
Copy Copy
1
2const tenantId: string = "tenant_prod_8f3a2b";
3const commentId: string = "cmt_5d7e9a92";
4const broadcastId: string = "broadcast_2026_03_25_1400";
5const ssoToken: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.signature";
6const resultWithSso: LockComment200Response = await lockComment(tenantId, commentId, broadcastId, ssoToken);
7const resultWithoutSso: LockComment200Response = await lockComment(tenantId, commentId, broadcastId);
8

置頂評論 (pinComment) Internal Link

參數

名稱 型別 必填 說明
tenantId string
commentId string
broadcastId string
sso string

回應

回傳: PinComment200Response

範例

pinComment 範例
Copy Copy
1
2const tenantId: string = "tenant_4f2b9a";
3const commentId: string = "cmt_9f8e7d6c";
4const broadcastId: string = "brd_live_concert_2026-03-25";
5const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.sso_payload_signature";
6
7const result: PinComment200Response = await pinComment(tenantId, commentId, broadcastId, sso);
8

儲存評論 (saveComment) Internal Link


參數

名稱 類型 必填 描述
tenantId string
createCommentParams CreateCommentParams
isLive boolean
doSpamCheck boolean
sendEmails boolean
populateNotifications boolean

回應

回傳: SaveComment200Response

範例

saveComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_001';
3const createCommentParams: CreateCommentParams = {
4 content: 'Great article — helped me fix a production issue in minutes.',
5 url: 'https://app.acme.com/blog/performance-tips',
6 author: { name: 'Maya Chen', email: 'maya.chen@acme.com' },
7 metadata: { locale: 'en-US', appVersion: '4.2.1' }
8} as CreateCommentParams;
9const isLive: boolean = true;
10const doSpamCheck: boolean = true;
11const sendEmails: boolean = false;
12const populateNotifications: boolean = true;
13const result: SaveComment200Response = await saveComment(tenantId, createCommentParams, isLive, doSpamCheck, sendEmails, populateNotifications);
14

批次儲存評論 (saveCommentsBulk) Internal Link

參數

名稱 類型 必填 描述
tenantId string
createCommentParams Array
isLive boolean
doSpamCheck boolean
sendEmails boolean
populateNotifications boolean

回應

回傳: Array<SaveComment200Response

範例

saveCommentsBulk 範例
Copy Copy
1
2const tenantId: string = 'acme-corp-01';
3const mentions1: CommentUserMentionInfo[] = [{ userId: 'user-123', displayName: 'Jane Doe' }];
4const hashtags1: CommentUserHashTagInfo[] = [{ tag: 'typescript' }];
5const createCommentParams: CreateCommentParams[] = [
6 {
7 content: 'Great insights on async/await patterns.',
8 authorName: 'John Smith',
9 authorEmail: 'john.smith@acme.com',
10 externalId: 'comment-001',
11 createdAt: '2026-03-25T10:15:00Z',
12 userMentions: mentions1,
13 userHashTags: hashtags1
14 },
15 {
16 content: 'I prefer using Promise.all for bulk ops.',
17 authorName: 'Emily Turner',
18 authorEmail: 'emily.turner@acme.com',
19 externalId: 'comment-002',
20 createdAt: '2026-03-25T10:20:00Z'
21 }
22];
23const result: SaveComment200Response[] = await saveCommentsBulk(tenantId, createCommentParams, true, true, false, true);
24

設定評論文字 (setCommentText) Internal Link

參數

Name Type Required Description
tenantId string
commentId string
broadcastId string
commentTextUpdateRequest CommentTextUpdateRequest
editKey string
sso string

回傳

回傳: SetCommentText200Response

範例

setCommentText 範例
Copy Copy
1
2const tenantId: string = 'tenant_6721f4';
3const commentId: string = 'cmt_9a3b2d';
4const broadcastId: string = 'live_2026_03_25';
5const editKey: string = 'edit_k_4f7b9';
6const sso: string = 'sso_tok_eyJhbGciOiJIUzI1';
7const commentTextUpdateRequest: CommentTextUpdateRequest = {
8 text: 'Updated to clarify the timeline and link the relevant docs.',
9 mentions: [{ userId: 'user_102', displayName: 'Alex Rivera' }],
10 hashtags: [{ tag: 'product-update' }]
11};
12const result: SetCommentText200Response = await setCommentText(tenantId, commentId, broadcastId, commentTextUpdateRequest, editKey, sso);
13

解除使用者評論封鎖 (unBlockUserFromComment) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string
unBlockFromCommentParams UnBlockFromCommentParams
userId string
anonUserId string

回應

回傳: UnBlockCommentPublic200Response

範例

unBlockUserFromComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_87f3e1';
3const id: string = 'comment_9b2a4f';
4const unBlockFromCommentParams: UnBlockFromCommentParams = {
5 reason: 'Reviewed by moderation team — reinstated',
6 moderatorId: 'mod_21',
7 unblockedAt: new Date().toISOString()
8};
9const userId: string = 'user_42';
10const anonUserId: string = 'anon_e7f9';
11const result: UnBlockCommentPublic200Response = await unBlockUserFromComment(tenantId, id, unBlockFromCommentParams, userId, anonUserId);
12

解除檢舉評論 (unFlagComment) Internal Link

參數

名稱 型別 必填 描述
tenantId string
id string
userId string
anonUserId string

回應

回傳: FlagComment200Response

範例

unFlagComment 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-001';
3const commentId: string = 'cmt_9f8e7d6c';
4const userId: string = 'user_72b4a1c9';
5const anonUserId: string = 'anon_3d2c1b0a';
6const response: FlagComment200Response = await unFlagComment(tenantId, commentId, userId, anonUserId);
7

解除鎖定評論 (unLockComment) Internal Link

參數

Name Type Required Description
tenantId string
commentId string
broadcastId string
sso string

回應

回傳: LockComment200Response

範例

unLockComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_9d4f2b';
3const commentId: string = 'cmt_8a3e1f';
4const broadcastId: string = 'broadcast_2026_03_25';
5const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.signature';
6
7const result: LockComment200Response = await unLockComment(tenantId, commentId, broadcastId, sso);
8

取消置頂評論 (unPinComment) Internal Link

參數

名稱 類型 必填 描述
tenantId string
commentId string
broadcastId string
sso string

回應

回傳: PinComment200Response

範例

unPinComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f9d2a3b';
3const commentId: string = 'comment_842b9c1f';
4const broadcastId: string = 'bcast_frontpage_202603';
5const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.exampleSignature';
6
7const result: PinComment200Response = await unPinComment(tenantId, commentId, broadcastId, sso);
8

更新評論 (updateComment) Internal Link

參數

Name Type Required Description
tenantId string
id string
updatableCommentParams UpdatableCommentParams
contextUserId string
doSpamCheck boolean
isLive boolean

回應

回傳: FlagCommentPublic200Response

範例

updateComment 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_corp_01";
3const id: string = "comment_20260325_4592";
4const updatableCommentParams: UpdatableCommentParams = {
5 body: "Updated the response to include a link to the RFC and fixed a typo in the second paragraph.",
6 editedByUserId: "user_8721",
7 isVisible: true
8};
9const contextUserId: string = "user_8721";
10const doSpamCheck: boolean = true;
11const isLive: boolean = true;
12const result: FlagCommentPublic200Response = await updateComment(tenantId, id, updatableCommentParams, contextUserId, doSpamCheck, isLive);
13

對評論投票 (voteComment) Internal Link

參數

名稱 類型 必填 說明
tenantId string
commentId string
urlId string
broadcastId string
voteBodyParams VoteBodyParams
sessionId string
sso string

回應

回傳:VoteComment200Response

範例

voteComment 範例
Copy Copy
1
2const tenantId: string = 'tenant_9f8b7c';
3const commentId: string = 'cmt_42f3a1';
4const urlId: string = 'articles/ai-trends-2026';
5const broadcastId: string = 'web';
6const voteBodyParams: VoteBodyParams = { vote: 1, reason: 'Insightful and on-topic' };
7const sessionId: string = 'sess_6d2b4c9e';
8const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9';
9const result: VoteComment200Response = await voteComment(tenantId, commentId, urlId, broadcastId, voteBodyParams, sessionId, sso);
10

取得使用者的評論 (getCommentsForUser) Internal Link

參數

名稱 類型 必填 說明
userId string
tenantId string
urlId string
page number
direction SortDirections
lastGenDate number
repliesToUserId string
fetchPageForCommentId string
includei10n boolean
useFullTranslationIds boolean
locale string
includeConfig boolean
includeNotificationCount boolean
countAll boolean
sso string

回應

回傳: GetCommentsForUserResponse

範例

getCommentsForUser 範例
Copy Copy
1
2const userId: string = "user_92b7f4";
3const tenantId: string = "news-tenant-uk";
4const urlId: string = "https://news.example.co.uk/articles/2026/05/01/local-election";
5const page: number = 1;
6const lastGenDate: number = Date.now() - 24 * 60 * 60 * 1000;
7const fetchPageForCommentId: string = "c_987654321";
8const includei10n: boolean = true;
9const locale: string = "en-GB";
10const includeConfig: boolean = true;
11const includeNotificationCount: boolean = false;
12const result: GetCommentsForUserResponse = await getCommentsForUser(
13 userId,
14 tenantId,
15 urlId,
16 page,
17 undefined,
18 lastGenDate,
19 undefined,
20 fetchPageForCommentId,
21 includei10n,
22 false,
23 locale,
24 includeConfig,
25 includeNotificationCount,
26 false,
27 undefined
28);
29

新增網域設定 (addDomainConfig) Internal Link


參數

名稱 類型 必填 說明
tenantId string
addDomainConfigParams AddDomainConfigParams

回應

回傳:AddDomainConfig200Response


刪除網域設定 (deleteDomainConfig) Internal Link

參數

名稱 類型 必填 說明
tenantId string
domain string

回應

回傳: DeleteDomainConfig200Response

取得網域設定 (getDomainConfig) Internal Link


參數

名稱 類型 必填 說明
tenantId string
domain string

回應

回傳: GetDomainConfig200Response


取得多個網域設定 (getDomainConfigs) Internal Link


參數

名稱 類型 必填 說明
tenantId string

回應

回傳: GetDomainConfigs200Response


部分更新網域設定 (patchDomainConfig) Internal Link

參數

名稱 類型 必填 說明
tenantId string
domainToUpdate string
patchDomainConfigParams PatchDomainConfigParams

回應

回傳: GetDomainConfig200Response


取代網域設定 (putDomainConfig) Internal Link


參數

名稱 類型 是否必填 說明
tenantId string
domainToUpdate string
updateDomainConfigParams UpdateDomainConfigParams

回應

回傳: GetDomainConfig200Response


建立電子郵件範本 (createEmailTemplate) Internal Link

參數

名稱 類型 必填 說明
tenantId string Yes
createEmailTemplateBody CreateEmailTemplateBody Yes

回應

回傳: CreateEmailTemplate200Response

範例

createEmailTemplate 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = 'tenant_9f4a2b';
4 const createEmailTemplateBody: CreateEmailTemplateBody = {
5 name: 'Weekly Digest',
6 subject: 'Your weekly discussion highlights',
7 html: '<!doctype html><body><h1>Hello {{user.name}}</h1><p>Top comments this week...</p></body>',
8 fromAddress: 'no-reply@fastcomments-example.com',
9 replyTo: 'moderation@fastcomments-example.com',
10 isDefault: false
11 };
12 const result: CreateEmailTemplate200Response = await createEmailTemplate(tenantId, createEmailTemplateBody);
13 console.log(result);
14})();
15

刪除電子郵件範本 (deleteEmailTemplate) Internal Link


參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳:FlagCommentPublic200Response

範例

deleteEmailTemplate 範例
Copy Copy
1
2const tenantId: string = "acme-corp-42";
3const idSuffix: string | undefined = "-archived";
4const templateId: string = "email_tmpl_6a1b2c" + (idSuffix ?? "");
5const result: FlagCommentPublic200Response = await deleteEmailTemplate(tenantId, templateId);
6

刪除電子郵件範本渲染錯誤 (deleteEmailTemplateRenderError) Internal Link

參數

Name Type Required Description
tenantId string Yes
id string Yes
errorId string Yes

回應

回傳: FlagCommentPublic200Response

範例

deleteEmailTemplateRenderError 範例
Copy Copy
1
2const tenantId: string = "tenant_7a1d2f9b";
3const id: string = "email_template_42b1";
4const errorId: string = "render_err_2026-04-24_7f3c";
5const includeStackTrace: boolean | undefined = undefined; // 可選旗標範例
6
7const response: FlagCommentPublic200Response = await deleteEmailTemplateRenderError(tenantId, id, errorId);
8// 若支援可選的 options 物件,它可能看起來像:
9 // await deleteEmailTemplateRenderError(tenantId, id, errorId /*, { includeStackTrace } */);
10

取得電子郵件範本 (getEmailTemplate) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: GetEmailTemplate200Response

範例

getEmailTemplate 範例
Copy Copy
1
2const tenantId: string = "acme-marketing-042";
3const templateId: string = "tpl_welcome_2026";
4const result: GetEmailTemplate200Response = await getEmailTemplate(tenantId, templateId);
5const template: CustomEmailTemplate | undefined = result.template;
6const subject: string | undefined = template?.subject;
7const customParams: CustomConfigParameters | undefined = template?.customConfigParameters;
8

取得電子郵件範本定義 (getEmailTemplateDefinitions) Internal Link

參數

Name Type Required Description
tenantId string

回應

回傳: GetEmailTemplateDefinitions200Response

範例

getEmailTemplateDefinitions 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_eu_01';
3const templates: GetEmailTemplateDefinitions200Response = await getEmailTemplateDefinitions(tenantId);
4console.log('Email template definitions loaded for', tenantId, templates);
5

取得電子郵件範本渲染錯誤 (getEmailTemplateRenderErrors) Internal Link

參數

名稱 類型 是否必填 描述
tenantId string
id string
skip number

回應

回傳: GetEmailTemplateRenderErrors200Response

範例

getEmailTemplateRenderErrors 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = 'acme-tenant-42';
4 const id: string = 'tmpl_3fa85f64-5717-4562-b3fc-2c963f66afa6';
5 const skip: number = 20;
6 const result: GetEmailTemplateRenderErrors200Response = await getEmailTemplateRenderErrors(tenantId, id, skip);
7 console.log(result);
8})();
9

取得電子郵件範本清單 (getEmailTemplates) Internal Link

參數

名稱 類型 必填 說明
tenantId string
skip number

回應

回傳: GetEmailTemplates200Response

範例

getEmailTemplates 範例
Copy Copy
1
2async function main(): Promise<void> {
3 const tenantId: string = 'tenant_5f3a9c2b';
4 const templates: GetEmailTemplates200Response = await getEmailTemplates(tenantId);
5 const skip: number = 20;
6 const pagedTemplates: GetEmailTemplates200Response = await getEmailTemplates(tenantId, skip);
7 console.log(templates, pagedTemplates);
8}
9main();
10

渲染電子郵件範本 (renderEmailTemplate) Internal Link

參數

名稱 類型 是否必填 描述
tenantId string
renderEmailTemplateBody RenderEmailTemplateBody
locale string

回應

回傳:RenderEmailTemplate200Response

範例

renderEmailTemplate 範例
Copy Copy
1
2const tenantId: string = 'tenant_b6f3c2';
3const renderEmailTemplateBody: RenderEmailTemplateBody = {
4 templateId: 'comment-notification',
5 recipient: { name: 'Ava Thompson', email: 'ava.thompson@publisher.com' },
6 context: {
7 siteName: 'City Gazette',
8 commentText: 'Thanks for the in-depth coverage — very helpful.',
9 articleTitle: 'Downtown Redevelopment Plan Advances',
10 threadUrl: 'https://citygazette.example/articles/2026/redevelopment#comments'
11 }
12};
13const locale: string = 'en-US';
14const result: RenderEmailTemplate200Response = await renderEmailTemplate(tenantId, renderEmailTemplateBody, locale);
15

更新電子郵件範本 (updateEmailTemplate) Internal Link


參數

Name Type Required Description
tenantId string
id string
updateEmailTemplateBody UpdateEmailTemplateBody

回應

回傳: FlagCommentPublic200Response

範例

updateEmailTemplate 範例
Copy Copy
1
2const tenantId: string = "tenant_76a4b2";
3const id: string = "template_9f3c1e";
4const updateEmailTemplateBody: UpdateEmailTemplateBody = {
5 name: "Comment Flag Notification",
6 subject: "A comment was flagged on your-site.com",
7 bodyHtml: "<p>Admin,</p><p>User {{commenterName}} flagged a comment: “{{commentText}}”</p>",
8 isEnabled: true,
9 description: "Email sent to moderators when a comment is flagged (optional field included)"
10};
11const result: FlagCommentPublic200Response = await updateEmailTemplate(tenantId, id, updateEmailTemplateBody);
12

取得事件記錄 (getEventLog) Internal Link

req tenantId urlId userIdWS

參數

名稱 類型 必填 說明
tenantId string
urlId string
userIdWS string
startTime number
endTime number

回應

回傳: GetEventLog200Response

範例

getEventLog 範例
Copy Copy
1
2const tenantId: string = 'fastcomments-tenant-01';
3const urlId: string = 'article-2026-03-25';
4const userIdWS: string | undefined = undefined; // 選填的上游值
5const startTime: number = Date.parse('2026-03-01T00:00:00Z');
6const endTime: number = Date.parse('2026-03-25T23:59:59Z');
7
8const eventLogResponse: GetEventLog200Response = await getEventLog(
9 tenantId,
10 urlId,
11 userIdWS ?? 'ws_user_8b1f',
12 startTime,
13 endTime
14);
15

取得全域事件記錄 (getGlobalEventLog) Internal Link

req tenantId urlId userIdWS

參數

Name Type Required Description
tenantId string
urlId string
userIdWS string
startTime number
endTime number

回應

回傳: GetEventLog200Response

範例

getGlobalEventLog 範例
Copy Copy
1
2const tenantId: string = "tenant-84b2f1";
3const urlId: string = "article-6721";
4const userIdWS: string = "ws-conn-9a3c";
5const startTime: number = Date.now() - 7 * 24 * 60 * 60 * 1000; // 7 天前
6const endTimeOptional: number | undefined = undefined; // 可選的時間範圍結束
7const endTime: number = endTimeOptional ?? Date.now();
8const eventLog: GetEventLog200Response = await getGlobalEventLog(tenantId, urlId, userIdWS, startTime, endTime);
9

建立動態貼文 (createFeedPost) Internal Link

參數

名稱 類型 必要 說明
tenantId string
createFeedPostParams CreateFeedPostParams
broadcastId string
isLive boolean
doSpamCheck boolean
skipDupCheck boolean

回應

回傳: CreateFeedPost200Response

範例

createFeedPost 範例
Copy Copy
1
2const tenantId: string = 'tenant_87f3b2';
3const mediaAsset: FeedPostMediaItemAsset = { url: 'https://cdn.example.com/images/post-123.jpg', mimeType: 'image/jpeg', width: 1200, height: 800, size: 245000 };
4const mediaItem: FeedPostMediaItem = { id: 'media_1', type: 'image', assets: [mediaAsset], altText: 'Conference keynote stage' };
5const link: FeedPostLink = { url: 'https://news.example.com/keynote-recap', title: 'Keynote recap' };
6const createFeedPostParams: CreateFeedPostParams = {
7 title: 'Product Launch Highlights',
8 content: 'Highlights from today’s product launch and roadmap updates.',
9 authorId: 'user_42',
10 mediaItems: [mediaItem],
11 links: [link],
12 tags: ['product', 'launch', 'announcement']
13};
14const broadcastId: string = 'broadcast_20260424';
15const isLive: boolean = true;
16const doSpamCheck: boolean = true;
17const skipDupCheck: boolean = false;
18const result: CreateFeedPost200Response = await createFeedPost(tenantId, createFeedPostParams, broadcastId, isLive, doSpamCheck, skipDupCheck);
19

建立公開動態貼文 (createFeedPostPublic) Internal Link

參數

名稱 類型 必要 描述
tenantId string
createFeedPostParams CreateFeedPostParams
broadcastId string
sso string

回應

回傳: CreateFeedPostPublic200Response

範例

createFeedPostPublic 範例
Copy Copy
1
2const tenantId: string = "tenant_987654321";
3const asset: FeedPostMediaItemAsset = { url: "https://cdn.fastcomments.com/uploads/team-photo.jpg", mimeType: "image/jpeg", sizeBytes: 324512 };
4const mediaItem: FeedPostMediaItem = { type: "image", assets: [asset], caption: "Team launch day" };
5const link: FeedPostLink = { url: "https://www.example.com/blog/product-update-march-2026", title: "Product update — March 2026" };
6const createFeedPostParams: CreateFeedPostParams = {
7 title: "Product update — March 2026",
8 content: "<p>We shipped performance improvements and two new integrations.</p>",
9 media: [mediaItem],
10 link,
11 visibility: "public",
12 tags: ["product","release","march-2026"],
13 customConfig: { allowComments: true, requireTOS: false }
14};
15const broadcastId: string = "broadcast_2026_03_25_live";
16const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NSIsImlhdCI6MTY5MDI0MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
17const result: CreateFeedPostPublic200Response = await createFeedPostPublic(tenantId, createFeedPostParams, broadcastId, sso);
18

刪除公開動態貼文 (deleteFeedPostPublic) Internal Link

參數

名稱 型別 必填 說明
tenantId string
postId string
broadcastId string
sso string

回應

回傳:DeleteFeedPostPublic200Response

範例

deleteFeedPostPublic 範例
Copy Copy
1
2const tenantId: string = "tenant_5f8a9b3c";
3const postId: string = "post_a1b2c3d4";
4const broadcastId: string = "broadcast_2026-03-25T10:00:00Z";
5const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwiaWF0IjoxNjE5MjM5MjAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
6
7const resultWithOptional: DeleteFeedPostPublic200Response = await deleteFeedPostPublic(tenantId, postId, broadcastId, sso);
8const resultRequiredOnly: DeleteFeedPostPublic200Response = await deleteFeedPostPublic(tenantId, postId);
9

取得動態貼文 (getFeedPosts) Internal Link


req tenantId afterId

參數

Name Type Required Description
tenantId string
afterId string
limit number
tags Array

回應

回傳: GetFeedPosts200Response

範例

getFeedPosts 範例
Copy Copy
1
2const initialPage: GetFeedPosts200Response = await getFeedPosts('tenant_9f1b3d', undefined, 20, ['sports', 'local']);
3const nextPage: GetFeedPosts200Response = await getFeedPosts('tenant_9f1b3d', 'post_abc123', 20, ['sports', 'local']);
4

取得公開動態貼文 (getFeedPostsPublic) Internal Link

req tenantId afterId

參數

名稱 類型 是否必填 描述
tenantId string
afterId string
limit number
tags Array
sso string
isCrawler boolean
includeUserInfo boolean

回應

回傳: GetFeedPostsPublic200Response

範例

getFeedPostsPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_01';
3const afterId: string = 'fp_20260301_042';
4const limit: number = 25;
5const tags: Array<string> = ['technology', 'announcement'];
6const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiamRvZSJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
7const isCrawler: boolean = false;
8const includeUserInfo: boolean = true;
9const response: GetFeedPostsPublic200Response = await getFeedPostsPublic(tenantId, afterId, limit, tags, sso, isCrawler, includeUserInfo);
10

取得動態貼文統計 (getFeedPostsStats) Internal Link

參數

名稱 型別 必填 描述
tenantId string
postIds Array
sso string

回應

回傳: GetFeedPostsStats200Response

範例

getFeedPostsStats 範例
Copy Copy
1
2const tenantId: string = 'tenant_9b2f1c4a';
3const postIds: Array<string> = [
4 '8f14e45f-ea82-4c7a-b6b2-1a2b3c4d5e6f',
5 'd0e1f2a3-b4c5-6d7e-8f90-1234567890ab'
6];
7const sso: string = 'sso_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.signature';
8const statsWithoutSSO: GetFeedPostsStats200Response = await getFeedPostsStats(tenantId, postIds);
9const statsWithSSO: GetFeedPostsStats200Response = await getFeedPostsStats(tenantId, postIds, sso);
10

取得使用者公開反應 (getUserReactsPublic) Internal Link

參數

名稱 類型 必填 描述
tenantId string Yes
postIds Array No
sso string No

回應

回傳: GetUserReactsPublic200Response

範例

getUserReactsPublic 範例
Copy Copy
1
2const tenantId: string = "acme-tenant-8a4d2c";
3const postIds: string[] = ["post-645a2f", "post-645a30"];
4const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsImlhdCI6MTY2MTYwMDAwMH0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
5const result: GetUserReactsPublic200Response = await getUserReactsPublic(tenantId, postIds, sso);
6

對公開動態貼文反應 (reactFeedPostPublic) Internal Link

參數

名稱 類型 必填 說明
tenantId string Yes
postId string Yes
reactBodyParams ReactBodyParams Yes
isUndo boolean No
broadcastId string No
urlId string No
sso string No

回應

回傳: ReactFeedPostPublic200Response

範例

reactFeedPostPublic 範例
Copy Copy
1
2const tenantId: string = 'tenant_84f2b1';
3const postId: string = 'post_12ac9e';
4const reactBodyParams: ReactBodyParams = { emoji: 'thumbs_up', intensity: 1 };
5const isUndo: boolean = false;
6const broadcastId: string = 'broadcast_20260503_01';
7const urlId: string = 'article-4527';
8const sso: string = 'sso_token_7f3b2c';
9
10const result: ReactFeedPostPublic200Response = await reactFeedPostPublic(tenantId, postId, reactBodyParams, isUndo, broadcastId, urlId, sso);
11

更新動態貼文 (updateFeedPost) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string
feedPost FeedPost

回應

回傳: FlagCommentPublic200Response

範例

updateFeedPost 範例
Copy Copy
1
2const tenantId: string = 'acme-global-tenant-42';
3const id: string = 'f47ac10b-58cc-4372-a567-0e02b2c3d479';
4
5const asset: FeedPostMediaItemAsset = {
6 url: 'https://cdn.acme.com/images/product-launch.jpg',
7 mimeType: 'image/jpeg',
8 width: 1200,
9 height: 630
10};
11
12const mediaItem: FeedPostMediaItem = {
13 id: 'media-001',
14 type: 'image',
15 asset
16};
17
18const link: FeedPostLink = {
19 url: 'https://acme.com/blog/product-launch',
20 title: 'Product Launch Details'
21};
22
23const feedPost: FeedPost = {
24 title: 'Introducing the Q3 Product Suite',
25 body: 'We are excited to unveil our new lineup for Q3, focusing on performance and security improvements.',
26 media: [mediaItem], // 選填的陣列
27 links: [link], // 選填的連結
28 isPublished: true // 在此使用選填的發佈旗標
29};
30
31const result: FlagCommentPublic200Response = await updateFeedPost(tenantId, id, feedPost);
32

更新公開動態貼文 (updateFeedPostPublic) Internal Link

參數

名稱 類型 必填 描述
tenantId string
postId string
updateFeedPostParams UpdateFeedPostParams
broadcastId string
sso string

回傳

回傳:CreateFeedPostPublic200Response

範例

updateFeedPostPublic 範例
Copy Copy
1
2const tenantId: string = "tenant_9f4b2";
3const postId: string = "post_21a8e";
4const updateFeedPostParams: UpdateFeedPostParams = {
5 title: "Quarterly product update",
6 body: "Major performance improvements and bug fixes deployed today. See release notes and schedule.",
7 links: [{ url: "https://status.example.com/release-notes", title: "Release notes" }],
8 media: [
9 {
10 type: "image",
11 assets: [{ url: "https://cdn.example.com/updates/q2.png", mimeType: "image/png", width: 1200, height: 628 }]
12 }
13 ]
14};
15const broadcastId: string = "broadcast_live_202603";
16const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.signature";
17const result: CreateFeedPostPublic200Response = await updateFeedPostPublic(tenantId, postId, updateFeedPostParams, broadcastId, sso);
18

檢舉公開評論 (flagCommentPublic) Internal Link

參數

名稱 類型 必填 說明
tenantId string
commentId string
isFlagged boolean
sso string

回應

回傳: FlagCommentPublic200Response

範例

flagCommentPublic 範例
Copy Copy
1
2const tenantId: string = "tenant_9f8b3c";
3const commentId: string = "comment_72a1d4";
4const isFlagged: boolean = true;
5const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI1Njc4OSJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
6const result: FlagCommentPublic200Response = await flagCommentPublic(tenantId, commentId, isFlagged, sso);
7

取得大型 GIF (getGifLarge) Internal Link

參數

Name Type Required Description
tenantId string
largeInternalURLSanitized string

回應

回傳: GifGetLargeResponse

範例

getGifLarge 範例
Copy Copy
1
2const tenantId: string = 'acme_marketing_tenant_7';
3const largeInternalURLSanitized: string = 'https://cdn.acmeinc.com/gifs/promo-spring-2026_large_sanitized.gif';
4const includePreview: boolean | undefined = undefined; // 呼叫者可能會使用的可選旗標
5const result: GifGetLargeResponse = await getGifLarge(tenantId, largeInternalURLSanitized);
6console.log(result, includePreview);
7

搜尋 GIF (getGifsSearch) Internal Link

參數

名稱 類型 必填 描述
tenantId string
search string
locale string
rating string
page number

回應

回傳: GifSearchResponse

範例

getGifsSearch 範例
Copy Copy
1
2const tenantId: string = "tenant_fcm_42";
3const search: string = "funny golden retriever";
4const locale: string = "en-US";
5const rating: string = "pg";
6const page: number = 2;
7const result: GifSearchResponse = await getGifsSearch(tenantId, search, locale, rating, page);
8

取得熱門 GIF (getGifsTrending) Internal Link

參數

名稱 類型 必填 說明
tenantId string
locale string
rating string
page number

回應

回傳: GifSearchResponse

範例

getGifsTrending 範例
Copy Copy
1
2const tenantId: string = "acme-tenant-01";
3const trendingBasic: GifSearchResponse = await getGifsTrending(tenantId);
4
5const locale: string = "en-GB";
6const rating: string = "pg";
7const page: number = 1;
8const trendingWithOptions: GifSearchResponse = await getGifsTrending(tenantId, locale, rating, page);
9

新增標籤 (addHashTag) Internal Link

參數

名稱 型別 必填 說明
tenantId string
createHashTagBody CreateHashTagBody

回應

回傳: AddHashTag200Response

範例

addHashTag 範例
Copy Copy
1
2const tenantId: string | undefined = undefined;
3const createHashTagBody: CreateHashTagBody = {
4 name: 'release-2026',
5 description: 'Feedback and bug reports for the April 2026 product release',
6 synonyms: ['v2-release', 'launch-2026'],
7 color: '#1d72b8',
8 isActive: true,
9 createdBy: 'product.manager@acme-corp.com'
10};
11const result: AddHashTag200Response = await addHashTag(tenantId, createHashTagBody);
12

批次新增標籤 (addHashTagsBulk) Internal Link

參數

名稱 類型 必填 說明
tenantId string
bulkCreateHashTagsBody BulkCreateHashTagsBody

回應

回傳:AddHashTagsBulk200Response

範例

addHashTagsBulk 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_corp_01';
3const bulkCreateHashTagsBody: BulkCreateHashTagsBody = {
4 tags: [
5 { name: 'feature-request', slug: 'feature-request', description: 'Requests for new capabilities', isActive: true, customConfig: { visibility: 'public' } as unknown as CustomConfigParameters }
6 ]
7};
8const addHashTagsResponse: AddHashTagsBulk200Response = await addHashTagsBulk(tenantId, bulkCreateHashTagsBody);
9
10const bulkCreateHashTagsBodyNoTenant: BulkCreateHashTagsBody = {
11 tags: [
12 { name: 'ux-feedback', slug: 'ux-feedback', description: 'User experience suggestions', isActive: true }
13 ]
14};
15const addHashTagsResponseNoTenant: AddHashTagsBulk200Response = await addHashTagsBulk(undefined, bulkCreateHashTagsBodyNoTenant);
16

刪除標籤 (deleteHashTag) Internal Link

參數

名稱 類型 必填 描述
tag string
tenantId string
deleteHashTagRequest DeleteHashTagRequest

回應

回傳: FlagCommentPublic200Response

範例

deleteHashTag 範例
Copy Copy
1
2const tag: string = "spring-sale-2026";
3const tenantId: string = "tenant-9876";
4const deleteHashTagRequest: DeleteHashTagRequest = {
5 requestedBy: "admin@retailco.com",
6 reason: "Campaign ended; remove associated auto-tags",
7 cascadeDelete: true
8};
9const result: FlagCommentPublic200Response = await deleteHashTag(tag, tenantId, deleteHashTagRequest);
10

取得標籤 (getHashTags) Internal Link

參數

名稱 類型 必填 說明
tenantId string
page number

回應

回傳: GetHashTags200Response

範例

getHashTags 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-42';
3const pageNumber: number = 2;
4const responseWithPage: GetHashTags200Response = await getHashTags(tenantId, pageNumber);
5const responseWithoutPage: GetHashTags200Response = await getHashTags(tenantId);
6

部分更新標籤 (patchHashTag) Internal Link

參數

名稱 類型 必填 描述
tag string
tenantId string
updateHashTagBody UpdateHashTagBody

回應

回傳:PatchHashTag200Response

範例

patchHashTag 範例
Copy Copy
1
2const tag: string = "feature-ux-refresh";
3const tenantId: string = "tenant_4f92c1";
4const updateHashTagBody: UpdateHashTagBody = {
5 label: "UX Refresh",
6 description: "Track comments related to the 2026 UX redesign",
7 isActive: true,
8 metadata: { owner: "product-design", rolloutPhase: "phase-2" }
9};
10const response: PatchHashTag200Response = await patchHashTag(tag, tenantId, updateHashTagBody);
11

建立管理員 (createModerator) Internal Link

參數

名稱 型別 必填 描述
tenantId string
createModeratorBody CreateModeratorBody

回應

回傳:CreateModerator200Response

範例

createModerator 範例
Copy Copy
1
2const tenantId: string = "tenant_8f3b6c";
3const optionalConfig: CustomConfigParameters = { moderationThreshold: 5, escalateOnRepeatedOffenses: true };
4const newModerator: CreateModeratorBody = {
5 email: "lina.gomez@dailynews.com",
6 fullName: "Lina Gomez",
7 role: "senior_moderator",
8 enabled: true,
9 notifyByEmail: true,
10 customConfig: optionalConfig
11};
12const response: CreateModerator200Response = await createModerator(tenantId, newModerator);
13

刪除管理員 (deleteModerator) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
sendEmail string

回應

回傳: FlagCommentPublic200Response

範例

deleteModerator 範例
Copy Copy
1
2const tenantId: string = 'tenant_9f8b7c6d';
3const id: string = 'mod_4a3e11ec9d1f0242ac120003';
4const sendEmail: string = 'true';
5const result: FlagCommentPublic200Response = await deleteModerator(tenantId, id, sendEmail);
6

取得管理員 (getModerator) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回傳

回傳: GetModerator200Response

範例

getModerator 範例
Copy Copy
1
2const tenantId: string = 'acme-corp-tenant-123';
3const id: string = 'mod-987654321';
4const moderatorResponse: GetModerator200Response = await getModerator(tenantId, id);
5

取得管理員清單 (getModerators) Internal Link

參數

名稱 類型 必填 說明
tenantId string
skip number

回應

回傳: GetModerators200Response

範例

getModerators 範例
Copy Copy
1
2const tenantId: string = 'tenant-12345-prod';
3const moderatorsPage1: GetModerators200Response = await getModerators(tenantId);
4const moderatorsPage2: GetModerators200Response = await getModerators(tenantId, 50);
5

發送邀請 (sendInvite) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
fromName string

回應

回傳: FlagCommentPublic200Response

範例

sendInvite 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme-42';
3const id: string = 'comment_8f3b21a7';
4const fromName: string = 'Elena Morales';
5const replyToEmail: string | undefined = undefined;
6
7const result: FlagCommentPublic200Response = await sendInvite(tenantId, id, fromName, replyToEmail);
8

更新管理員 (updateModerator) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
updateModeratorBody UpdateModeratorBody

回應

回傳:FlagCommentPublic200Response

範例

updateModerator 範例
Copy Copy
1
2const tenantId: string = "acme-enterprises-42";
3const id: string = "moderator_517";
4const updateModeratorBody: UpdateModeratorBody = {
5 displayName: "Sofia Martinez",
6 email: "sofia.martinez@acme.com",
7 permissions: ["approve_comments", "flag_spam", "suspend_users"],
8 active: true,
9 avatarUrl: "https://cdn.acme.com/avatars/sofia.jpg" // 示範的可選欄位
10};
11const result: FlagCommentPublic200Response = await updateModerator(tenantId, id, updateModeratorBody);
12

刪除通知計數 (deleteNotificationCount) Internal Link


參數

名稱 Type 必填 說明
tenantId string
id string

回應

回傳: FlagCommentPublic200Response

範例

deleteNotificationCount 範例
Copy Copy
1
2const tenantId: string = "org-72a8f1b9";
3const id: string = "notif-8f9c2e4a";
4const result: FlagCommentPublic200Response = await deleteNotificationCount(tenantId, id);
5console.log(result);
6

取得快取的通知計數 (getCachedNotificationCount) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: GetCachedNotificationCount200Response

範例

getCachedNotificationCount 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_42';
3const id: string = 'user_00012345';
4const includeUnreadOnly: boolean | undefined = true; // 可選參數旗標(示範)
5const result: GetCachedNotificationCount200Response = await getCachedNotificationCount(tenantId, id);
6

取得通知計數 (getNotificationCount) Internal Link

參數

名稱 類型 必填 說明
tenantId string
userId string
urlId string
fromCommentId string
viewed boolean
type string

回應

回傳:GetNotificationCount200Response

範例

getNotificationCount 範例
Copy Copy
1
2const tenantId: string = 'tenant_abc123';
3const userId: string = 'user_987654321';
4const urlId: string = 'https://example.com/news/2026/new-features';
5const viewed: boolean = false;
6const type: string = 'reply';
7const notificationCountResponse: GetNotificationCount200Response = await getNotificationCount(tenantId, userId, urlId, undefined, viewed, type);
8

取得通知 (getNotifications) Internal Link


參數

名稱 類型 必填 描述
tenantId string
userId string
urlId string
fromCommentId string
viewed boolean
type string
skip number

回應

回傳: GetNotifications200Response

範例

getNotifications 範例
Copy Copy
1
2const tenantId: string = "tenant_84b3f2";
3const userId: string = "user_1279";
4const urlId: string = "https://www.example.com/articles/2026/03/25/new-feature";
5const fromCommentId: string = "cmt_5421";
6const viewed: boolean = false;
7const type: string = "mention";
8const skip: number = 0;
9const notifications: GetNotifications200Response = await getNotifications(tenantId, userId, urlId, fromCommentId, viewed, type, skip);
10

更新通知 (updateNotification) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
updateNotificationBody UpdateNotificationBody
userId string

回應

回傳: FlagCommentPublic200Response

範例

updateNotification 範例
Copy Copy
1
2const tenantId: string = 'tenant_prod_8f4b2c';
3const id: string = 'notification_61a2e9';
4const userId: string = 'moderator_107';
5const updateNotificationBody: UpdateNotificationBody = {
6 name: 'Flagged Comment Notification',
7 enabled: true,
8 channels: ['email', 'inbox'],
9 templateId: 'tmpl_mod_alerts_01',
10 severity: 'high'
11};
12const result: FlagCommentPublic200Response = await updateNotification(tenantId, id, updateNotificationBody, userId);
13

新增頁面 (addPage) Internal Link

參數

名稱 類型 必填 說明
tenantId string
createAPIPageData CreateAPIPageData

回應

回傳: AddPageAPIResponse


刪除頁面 (deletePage) Internal Link

參數

Name Type Required Description
tenantId string
id string

Response

回傳: DeletePageAPIResponse

以 URL ID 取得頁面 (getPageByURLId) Internal Link


參數

名稱 類型 必填 描述
tenantId string
urlId string

回應

回傳:GetPageByURLIdAPIResponse


取得頁面清單 (getPages) Internal Link


參數

名稱 類型 必填 描述
tenantId string

回應

回傳: GetPagesAPIResponse


部分更新頁面 (patchPage) Internal Link


參數

Name Type Required Description
tenantId string
id string
updateAPIPageData UpdateAPIPageData

回應

回傳: PatchPageAPIResponse


刪除待處理的 Webhook 事件 (deletePendingWebhookEvent) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: FlagCommentPublic200Response

範例

deletePendingWebhookEvent 範例
Copy Copy
1
2const tenantId: string = "tenant_7f3b2a";
3const webhookEventId: string = "wh_evt_9a8c7d1234";
4const dryRun: boolean | undefined = undefined; // 選用旗標範例(此呼叫不需要)
5const result: FlagCommentPublic200Response = await deletePendingWebhookEvent(tenantId, webhookEventId);
6

取得待處理 Webhook 事件計數 (getPendingWebhookEventCount) Internal Link

參數

名稱 類型 是否必填 說明
tenantId string Yes
commentId string No
externalId string No
eventType string No
type string No
domain string No
attemptCountGT number No

回應

回傳: GetPendingWebhookEventCount200Response

範例

getPendingWebhookEventCount 範例
Copy Copy
1
2const tenantId: string = "tenant_8d3b7a2f";
3const commentId: string | undefined = "comment_79a2b";
4const eventType: string | undefined = "comment.created";
5const domain: string | undefined = "forum.acme-corp.com";
6const attemptCountGT: number | undefined = 1;
7const result: GetPendingWebhookEventCount200Response = await getPendingWebhookEventCount(
8 tenantId,
9 commentId,
10 undefined,
11 eventType,
12 undefined,
13 domain,
14 attemptCountGT
15);
16

取得待處理的 Webhook 事件 (getPendingWebhookEvents) Internal Link

參數

名稱 類型 必填 說明
tenantId string
commentId string
externalId string
eventType string
type string
domain string
attemptCountGT number
skip number

回應

回傳: GetPendingWebhookEvents200Response

範例

getPendingWebhookEvents 範例
Copy Copy
1
2const tenantId: string = 'tenant_9b3f7c';
3const commentId: string | undefined = undefined;
4const externalId: string | undefined = 'external-572a';
5const eventType: string | undefined = 'comment.updated';
6const type: string | undefined = 'outbound';
7const domain: string | undefined = 'reviews.example.com';
8const attemptCountGT: number | undefined = 1;
9const skip: number | undefined = 20;
10
11const result: GetPendingWebhookEvents200Response = await getPendingWebhookEvents(
12 tenantId,
13 commentId,
14 externalId,
15 eventType,
16 type,
17 domain,
18 attemptCountGT,
19 skip
20);
21

建立問卷設定 (createQuestionConfig) Internal Link

參數

名稱 類型 必填 描述
tenantId string
createQuestionConfigBody CreateQuestionConfigBody

回應

回傳:CreateQuestionConfig200Response

範例

createQuestionConfig 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_01";
3const createQuestionConfigBody: CreateQuestionConfigBody = {
4 title: "Post-purchase feedback",
5 description: "Quick survey about your recent order",
6 required: true,
7 renderingType: "single_choice",
8 options: [
9 { label: "Very dissatisfied", value: "1" },
10 { label: "Dissatisfied", value: "2" },
11 { label: "Neutral", value: "3" },
12 { label: "Satisfied", value: "4" },
13 { label: "Very satisfied", value: "5" }
14 ] as QuestionConfigCustomOptionsInner[]
15} as CreateQuestionConfigBody;
16const result: CreateQuestionConfig200Response = await createQuestionConfig(tenantId, createQuestionConfigBody);
17

刪除問卷設定 (deleteQuestionConfig) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string

回應

回傳:FlagCommentPublic200Response

範例

deleteQuestionConfig 範例
Copy Copy
1
2const tenantId: string = "tenant_42fa9b7c";
3const id: string = "qcfg-0f8fad5b-d9cb-469f-a165-70867728950e";
4const result: FlagCommentPublic200Response = await deleteQuestionConfig(tenantId, id);
5

取得問卷設定 (getQuestionConfig) Internal Link

參數

名稱 類型 必填 描述
tenantId string Yes
id string Yes

回應

回傳: GetQuestionConfig200Response

範例

getQuestionConfig 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-92';
3const id: string = 'question-2026-07-42';
4const response: GetQuestionConfig200Response = await getQuestionConfig(tenantId, id);
5
6function summarize(cfg: GetQuestionConfig200Response, includeDetails?: boolean): string {
7 return includeDetails ? 'Question config (detailed)' : 'Question config (summary)';
8}
9
10const summary: string = summarize(response);
11

取得問卷設定清單 (getQuestionConfigs) Internal Link

參數

名稱 型別 必填 描述
tenantId string
skip number

回應

回傳: GetQuestionConfigs200Response

範例

getQuestionConfigs 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_9876";
3const configsWithoutSkip: GetQuestionConfigs200Response = await getQuestionConfigs(tenantId);
4const configsWithSkip: GetQuestionConfigs200Response = await getQuestionConfigs(tenantId, 20);
5

更新問卷設定 (updateQuestionConfig) Internal Link

參數

Name Type Required Description
tenantId string
id string
updateQuestionConfigBody UpdateQuestionConfigBody

回應

回傳: FlagCommentPublic200Response

範例

updateQuestionConfig 範例
Copy Copy
1
2const tenantId: string = 'tenant_42e8b';
3const id: string = 'question_9f4a2';
4const updateQuestionConfigBody: UpdateQuestionConfigBody = {
5 questionText: 'How helpful was this article?',
6 description: 'Shown to users below the question (optional)',
7 required: true,
8 renderingType: 'Likert' as QuestionRenderingType,
9 customOptions: [
10 { label: 'Very helpful', value: '5' } as QuestionConfigCustomOptionsInner,
11 { label: 'Somewhat helpful', value: '3' } as QuestionConfigCustomOptionsInner,
12 { label: 'Not helpful', value: '1' } as QuestionConfigCustomOptionsInner
13 ],
14 whenSave: 'notify' as QuestionWhenSave
15};
16const result: FlagCommentPublic200Response = await updateQuestionConfig(tenantId, id, updateQuestionConfigBody);
17

建立問卷結果 (createQuestionResult) Internal Link

參數

名稱 類型 必要 描述
tenantId string Yes
createQuestionResultBody CreateQuestionResultBody Yes

回應

回傳: CreateQuestionResult200Response

範例

createQuestionResult 範例
Copy Copy
1
2const tenantId: string = 'fastcomments-tenant-01';
3const createQuestionResultBody: CreateQuestionResultBody = {
4 questionId: 'q-34567',
5 respondentId: 'user-8923',
6 answers: [{ optionId: 'opt_A', text: 'Agree', count: 1 }],
7 score: 5,
8 meta: [{ key: 'platform', value: 'web' }],
9 notifyModerators: false // 可選參數
10} as CreateQuestionResultBody;
11const result: CreateQuestionResult200Response = await createQuestionResult(tenantId, createQuestionResultBody);
12

刪除問卷結果 (deleteQuestionResult) Internal Link

參數

Name Type Required Description
tenantId string
id string

回應

回傳: FlagCommentPublic200Response

範例

deleteQuestionResult 範例
Copy Copy
1
2const tenantIdEnv: string | undefined = process.env.FASTCOMMENTS_TENANT_ID;
3const tenantId: string = tenantIdEnv ?? 'tenant_78b3f2';
4const id: string = 'qres-9f2a3b1c';
5const response: FlagCommentPublic200Response = await deleteQuestionResult(tenantId, id);
6

取得問卷結果 (getQuestionResult) Internal Link

參數

名稱 類型 是否必填 描述
tenantId string
id string

回應

回傳: GetQuestionResult200Response

範例

getQuestionResult 範例
Copy Copy
1
2const post: { title: string; questionId?: string } = { title: 'Product feedback' };
3const tenantId: string = 'acme-corp-tenant-01';
4const id: string = post.questionId ?? 'q-8f3a7b2c4d9e';
5const result: GetQuestionResult200Response = await getQuestionResult(tenantId, id);
6

取得問卷結果清單 (getQuestionResults) Internal Link

參數

Name Type Required Description
tenantId string
urlId string
userId string
startDate string
questionId string
questionIds string
skip number

回應

回傳: GetQuestionResults200Response

範例

getQuestionResults 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_001";
3const urlId: string = "articles/product-launch-2026";
4const userId: string = "user_2048";
5const startDate: string = "2026-03-01T00:00:00Z";
6const questionId: string | undefined = undefined;
7const questionIds: string | undefined = "q_101,q_102";
8const skip: number | undefined = 0;
9
10const result: GetQuestionResults200Response = await getQuestionResults(tenantId, urlId, userId, startDate, questionId, questionIds, skip);
11

更新問卷結果 (updateQuestionResult) Internal Link


參數

名稱 類型 必填 描述
tenantId string
id string
updateQuestionResultBody UpdateQuestionResultBody

回應

回傳: FlagCommentPublic200Response

範例

updateQuestionResult 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f8b3c';
3const id: string = 'questionResult_4621';
4const updateQuestionResultBody: UpdateQuestionResultBody = {
5 questionId: 'q_1024',
6 result: 'flagged',
7 score: 0.92,
8 notes: 'Automated moderation flagged for review',
9 meta: [{ key: 'source', value: 'ai-moderator' }] as MetaItem[], // 可選的元資料
10 status: { code: 'review_pending' } as APIStatus
11} as UpdateQuestionResultBody;
12const result: FlagCommentPublic200Response = await updateQuestionResult(tenantId, id, updateQuestionResultBody);
13

彙總問卷結果 (aggregateQuestionResults) Internal Link

參數

名稱 類型 必填 描述
tenantId string
questionId string
questionIds Array
urlId string
timeBucket AggregateTimeBucket
startDate Date
forceRecalculate boolean

回應

回傳: AggregateQuestionResults200Response

範例

aggregateQuestionResults 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_001";
3const questionIds: string[] = ["q-2026-sales", "q-2026-support"];
4const urlId: string = "url_7f2c";
5const timeBucket: AggregateTimeBucket = { unit: "week", size: 1 };
6const startDate: Date = new Date("2026-01-01T00:00:00Z");
7const forceRecalculate: boolean = true;
8
9const result: AggregateQuestionResults200Response = await aggregateQuestionResults(
10 tenantId,
11 undefined,
12 questionIds,
13 urlId,
14 timeBucket,
15 startDate,
16 forceRecalculate
17);
18

批次彙總問卷結果 (bulkAggregateQuestionResults) Internal Link

參數

名稱 類型 必填 描述
tenantId string
bulkAggregateQuestionResultsRequest BulkAggregateQuestionResultsRequest
forceRecalculate boolean

回應

回傳:BulkAggregateQuestionResults200Response

範例

bulkAggregateQuestionResults 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_42";
3const bulkAggregateQuestionResultsRequest: BulkAggregateQuestionResultsRequest = {
4 questions: [
5 { questionId: "q-001", threadId: "thread-1001", questionType: "rating" },
6 { questionId: "q-002", threadId: "thread-1002", questionType: "yes_no" }
7 ],
8 timeRange: { from: "2026-03-01T00:00:00Z", to: "2026-04-01T00:00:00Z" },
9 groupBy: ["questionId", "threadId"]
10};
11const forceRecalculate: boolean = true;
12const result: BulkAggregateQuestionResults200Response = await bulkAggregateQuestionResults(tenantId, bulkAggregateQuestionResultsRequest, forceRecalculate);
13

將評論與問卷結果合併 (combineCommentsWithQuestionResults) Internal Link

參數

名稱 型別 必填 說明
tenantId string
questionId string
questionIds Array
urlId string
startDate Date
forceRecalculate boolean
minValue number
maxValue number
limit number

回應

回傳: CombineCommentsWithQuestionResults200Response

範例

combineCommentsWithQuestionResults 範例
Copy Copy
1
2const tenantId: string = 'tenant-acme-001';
3const questionId: string | undefined = 'q-analytics-42';
4const questionIds: string[] | undefined = ['q-analytics-42', 'q-feedback-17'];
5const urlId: string | undefined = 'url-987654';
6const startDate: Date | undefined = new Date('2026-01-01T00:00:00Z');
7const forceRecalculate: boolean | undefined = true;
8const minValue: number | undefined = 1;
9const maxValue: number | undefined = 5;
10const limit: number | undefined = 250;
11const result: CombineCommentsWithQuestionResults200Response = await combineCommentsWithQuestionResults(
12 tenantId,
13 questionId,
14 questionIds,
15 urlId,
16 startDate,
17 forceRecalculate,
18 minValue,
19 maxValue,
20 limit
21);
22

新增 SSO 使用者 (addSSOUser) Internal Link


參數

名稱 類型 必填 描述
tenantId string
createAPISSOUserData CreateAPISSOUserData

回應

回傳:AddSSOUserAPIResponse


刪除 SSO 使用者 (deleteSSOUser) Internal Link

參數

Name Type Required Description
tenantId string
id string
deleteComments boolean
commentDeleteMode string

回應

回傳: DeleteSSOUserAPIResponse


以電子郵件取得 SSO 使用者 (getSSOUserByEmail) Internal Link


參數

名稱 類型 必填 說明
tenantId string
email string

回應

回傳: GetSSOUserByEmailAPIResponse


以 ID 取得 SSO 使用者 (getSSOUserById) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string

回應

回傳: GetSSOUserByIdAPIResponse

取得 SSO 使用者清單 (getSSOUsers) Internal Link


參數

名稱 類型 必填 描述
tenantId string
skip number

回應

回傳: GetSSOUsers200Response


部分更新 SSO 使用者 (patchSSOUser) Internal Link


參數

Name Type Required Description
tenantId string
id string
updateAPISSOUserData UpdateAPISSOUserData
updateComments boolean

回應

回傳: PatchSSOUserAPIResponse


取代或建立 SSO 使用者 (putSSOUser) Internal Link


參數

名稱 類型 必填 描述
tenantId string
id string
updateAPISSOUserData UpdateAPISSOUserData
updateComments boolean

回傳

回傳: PutSSOUserAPIResponse


建立訂閱 (createSubscription) Internal Link

參數

名稱 類型 必填 說明
tenantId string
createAPIUserSubscriptionData CreateAPIUserSubscriptionData

回應

回傳:CreateSubscriptionAPIResponse

範例

createSubscription 範例
Copy Copy
1
2const tenantId: string = "acme-corp-tenant-123";
3const createAPIUserSubscriptionData: CreateAPIUserSubscriptionData = {
4 userId: "user_98765",
5 planId: "pro_monthly",
6 paymentMethod: { type: "card", cardId: "card_abc123" },
7 autoRenew: true,
8 trialDays: 14, // 示範可選參數
9 metadata: { campaign: "spring_launch" } // 示範可選參數
10};
11const result: CreateSubscriptionAPIResponse = await createSubscription(tenantId, createAPIUserSubscriptionData);
12

刪除訂閱 (deleteSubscription) Internal Link


參數

名稱 類型 必填 說明
tenantId string
id string
userId string

回應

回傳: DeleteSubscriptionAPIResponse


取得訂閱 (getSubscriptions) Internal Link


參數

Name Type Required Description
tenantId string
userId string

回應

回傳: GetSubscriptionsAPIResponse

範例

getSubscriptions 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_corp_01';
3const userId: string = 'user_76a3b9f2';
4const subscriptionsForUser: GetSubscriptionsAPIResponse = await getSubscriptions(tenantId, userId);
5const subscriptionsForTenant: GetSubscriptionsAPIResponse = await getSubscriptions(tenantId);
6

更新訂閱 (updateSubscription) Internal Link


參數

名稱 類型 必填 描述
tenantId string
id string
updateAPIUserSubscriptionData UpdateAPIUserSubscriptionData
userId string

回應

回傳: UpdateSubscriptionAPIResponse

範例

updateSubscription 範例
Copy Copy
1
2const tenantId: string = 'tenant_9f3b2c';
3const subscriptionId: string = 'sub_7641a2b3';
4const updateData: UpdateAPIUserSubscriptionData = {
5 status: 'active',
6 planId: 'pro_annual',
7 autoRenew: true,
8 renewalDate: '2026-04-15T00:00:00Z',
9 metadata: { upgradedBy: 'billing-team' }
10};
11const userId: string = 'user_215';
12const result: UpdateSubscriptionAPIResponse = await updateSubscription(tenantId, subscriptionId, updateData, userId);
13

取得租戶每日使用量 (getTenantDailyUsages) Internal Link

參數

名稱 類型 必填 描述
tenantId string Yes
yearNumber number No
monthNumber number No
dayNumber number No
skip number No

回應

回傳:GetTenantDailyUsages200Response

範例

getTenantDailyUsages 範例
Copy Copy
1
2const tenantId: string = 'tenant_5f4a3b2c-1d6e-4f9a-b9d8-123456789abc';
3const yearNumber: number = 2026;
4const monthNumber: number = 3;
5const dayNumber: number = 24;
6const skip: number = 0;
7
8const result: GetTenantDailyUsages200Response = await getTenantDailyUsages(tenantId, yearNumber, monthNumber, dayNumber, skip);
9

建立租戶方案 (createTenantPackage) Internal Link

Parameters

Name Type Required Description
tenantId string Yes
createTenantPackageBody CreateTenantPackageBody Yes

Response

Returns: CreateTenantPackage200Response

Example

createTenantPackage 範例
Copy Copy
1
2const tenantId: string = "tenant_acme-corp_001";
3const createTenantPackageBody: CreateTenantPackageBody = {
4 name: "Acme Standard Package",
5 description: "Default package for Acme Corp comments with moderation and SSO enabled",
6 enabled: true,
7 maxCommentsPerThread: 500,
8 voteStyle: "thumbs",
9 gifRating: "PG-13",
10 tosConfig: { enabled: true, url: "https://acme.example.com/terms" } // 示範可選參數
11};
12const result: CreateTenantPackage200Response = await createTenantPackage(tenantId, createTenantPackageBody);
13

刪除租戶方案 (deleteTenantPackage) Internal Link


參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: FlagCommentPublic200Response

範例

deleteTenantPackage 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = "tenant_8f3a2b4c9d01";
4 const packageId: string = "pkg_2026-04-security-patch";
5 const result: FlagCommentPublic200Response = await deleteTenantPackage(tenantId, packageId);
6 console.log(result);
7})();
8

取得租戶方案 (getTenantPackage) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string

回應

回傳: GetTenantPackage200Response

範例

getTenantPackage 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f3b2c8';
3const packageId: string = 'pkg_standard_2026';
4const requestOptions: { includeConfig?: boolean } = { includeConfig: true };
5const packageResponse: GetTenantPackage200Response = await getTenantPackage(tenantId, packageId);
6

取得租戶方案清單 (getTenantPackages) Internal Link


參數

名稱 類型 必填 說明
tenantId string
skip number

回應

回傳: GetTenantPackages200Response

範例

getTenantPackages 範例
Copy Copy
1
2const tenantId: string = "tenant_7f8e3b4c";
3const skip: number = 20;
4const packagesDefault: GetTenantPackages200Response = await getTenantPackages(tenantId);
5const packagesWithSkip: GetTenantPackages200Response = await getTenantPackages(tenantId, skip);
6

取代租戶方案 (replaceTenantPackage) Internal Link

參數

Name Type 必填 描述
tenantId string
id string
replaceTenantPackageBody ReplaceTenantPackageBody

回應

回傳:FlagCommentPublic200Response

範例

replaceTenantPackage 範例
Copy Copy
1
2const tenantId: string = "tenant-9f3c2a";
3const id: string = "pkg_4f8b21";
4const replaceTenantPackageBody: ReplaceTenantPackageBody = {
5 packageName: "Premium Moderation Pack",
6 enabled: true,
7 apiStatus: { mode: "active" } as APIStatus,
8 customConfigParameters: { maxFlagsBeforeReview: 5 } as CustomConfigParameters,
9 voteStyle: "thumbs" as VoteStyle,
10 tosConfig: { requireAcceptance: true } as TOSConfig
11};
12const result: FlagCommentPublic200Response = await replaceTenantPackage(tenantId, id, replaceTenantPackageBody);
13

更新租戶方案 (updateTenantPackage) Internal Link

參數

Name Type Required Description
tenantId string
id string
updateTenantPackageBody UpdateTenantPackageBody

回傳

回傳:FlagCommentPublic200Response

範例

updateTenantPackage 範例
Copy Copy
1
2const tenantId: string = "tenant_3b7f9d-prod";
3const id: string = "pkg_enterprise_2026";
4const updateTenantPackageBody: UpdateTenantPackageBody = {
5 name: "Enterprise Plus",
6 isActive: true,
7 // 已故意省略可選欄位(例如:description、limits)
8} as UpdateTenantPackageBody;
9const result: FlagCommentPublic200Response = await updateTenantPackage(tenantId, id, updateTenantPackageBody);
10

建立租戶使用者 (createTenantUser) Internal Link

參數

名稱 型別 必填 說明
tenantId string
createTenantUserBody CreateTenantUserBody

回應

傳回: CreateTenantUser200Response

範例

createTenantUser 範例
Copy Copy
1
2const tenantId: string = "tenant_74b3a9f4b";
3const createTenantUserBody: CreateTenantUserBody = {
4 email: "jane.doe@acmecorp.com",
5 displayName: "Jane Doe",
6 role: "moderator",
7 sendWelcomeEmail: true, // 示範可選參數
8 metadata: { department: "Customer Support" }
9};
10const result: CreateTenantUser200Response = await createTenantUser(tenantId, createTenantUserBody);
11

刪除租戶使用者 (deleteTenantUser) Internal Link

參數

Name Type Required Description
tenantId string
id string
deleteComments string
commentDeleteMode string

回應

回傳: FlagCommentPublic200Response

範例

deleteTenantUser 範例
Copy Copy
1
2async function run(): Promise<void> {
3 const tenantId: string = "acme_corp_tenant_9f1a2b";
4 const id: string = "user_4d2a1b6c";
5 const deleteComments: string = "true"; // 同時刪除使用者的評論
6 const commentDeleteMode: string = "permanent"; // "permanent" 或 "soft"
7 const result: FlagCommentPublic200Response = await deleteTenantUser(tenantId, id, deleteComments, commentDeleteMode);
8 console.log(result);
9}
10run();
11

取得租戶使用者 (getTenantUser) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: GetTenantUser200Response

範例

getTenantUser 範例
Copy Copy
1
2const tenantId: string = 'tenant_fc5a9b2c';
3const userId: string = 'user_0a12b3';
4const result: GetTenantUser200Response = await getTenantUser(tenantId, userId);
5const user: User | undefined = (result as any).user; // 取得回傳內容
6const userEmail: string | undefined = user?.email;
7console.log('Fetched user email:', userEmail);
8

取得租戶使用者清單 (getTenantUsers) Internal Link

參數

Name Type Required Description
tenantId string Yes
skip number No

回應

Returns: GetTenantUsers200Response

範例

getTenantUsers 範例
Copy Copy
1
2const tenantId: string = 'tenant_prod_8a3f2c';
3const skip: number = 50;
4const usersWithSkip: GetTenantUsers200Response = await getTenantUsers(tenantId, skip);
5const usersNoSkip: GetTenantUsers200Response = await getTenantUsers(tenantId);
6

取代租戶使用者 (replaceTenantUser) Internal Link

參數

Name Type 必填 說明
tenantId string
id string
replaceTenantUserBody ReplaceTenantUserBody
updateComments string

回傳

回傳: FlagCommentPublic200Response

範例

replaceTenantUser 範例
Copy Copy
1
2const tenantId: string = 'tenant_9d8f4b2c';
3const id: string = 'user_f47ac10b';
4const replaceTenantUserBody: ReplaceTenantUserBody = {
5 externalId: 'ext-5234',
6 email: 'jane.doe@acme.com',
7 displayName: 'Jane Doe',
8 roles: ['moderator'],
9 metadata: { department: 'product', region: 'us-east-1' }
10};
11const updateComments: string = 'propagate-display-name-to-comments';
12
13const result: FlagCommentPublic200Response = await replaceTenantUser(tenantId, id, replaceTenantUserBody, updateComments);
14

參數

名稱 類型 必填 說明
tenantId string
id string
redirectURL string

回應

回傳: FlagCommentPublic200Response

範例

sendLoginLink 範例
Copy Copy
1
2const tenantId: string = "tenant_12a9f3b7";
3const id: string = "user_84b2c7d1";
4const redirectURL: string = "https://app.mycompany.com/welcome?ref=login_email";
5const resultWithoutRedirect: FlagCommentPublic200Response = await sendLoginLink(tenantId, id);
6const resultWithRedirect: FlagCommentPublic200Response = await sendLoginLink(tenantId, id, redirectURL);
7

更新租戶使用者 (updateTenantUser) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
updateTenantUserBody UpdateTenantUserBody
updateComments string

回應

回傳: FlagCommentPublic200Response

範例

updateTenantUser 範例
Copy Copy
1
2const tenantId: string = "tenant_8f3b2a9d";
3const id: string = "user_52c9f1ab";
4const updateTenantUserBody: UpdateTenantUserBody = {
5 email: "jane.doe@example.com",
6 displayName: "Jane Doe",
7 roles: ["moderator"],
8 isActive: true,
9 metadata: { signupSource: "sso", locale: "en-US" }
10};
11const updateComments: string = "Promoted to moderator and updated display name";
12const result: FlagCommentPublic200Response = await updateTenantUser(tenantId, id, updateTenantUserBody, updateComments);
13

建立租戶 (createTenant) Internal Link

參數

名稱 Type 必填 描述
tenantId string
createTenantBody CreateTenantBody

回應

回傳:CreateTenant200Response

範例

createTenant 範例
Copy Copy
1
2const tenantId: string = 'acme-corp-001';
3const createTenantBody: CreateTenantBody = {
4 name: 'Acme Corporation',
5 domainConfiguration: { primaryDomain: 'comments.acme.com', enforceHttps: true } as APIDomainConfiguration,
6 billingInfo: { planId: 'enterprise', contactEmail: 'billing@acme.com' } as BillingInfo
7 // 可選欄位(例如 ssoConfig 或 customConfig)故意省略
8} as CreateTenantBody;
9
10const result: CreateTenant200Response = await createTenant(tenantId, createTenantBody);
11

刪除租戶 (deleteTenant) Internal Link

參數

Name Type Required Description
tenantId string
id string
sure string

回應

回傳:FlagCommentPublic200Response

範例

deleteTenant 範例
Copy Copy
1
2const tenantId: string = 'tenant_42c9f1';
3const id: string = 'flag_9a7b3c';
4const sure: string = 'confirm-delete';
5const result: FlagCommentPublic200Response = await deleteTenant(tenantId, id, sure);
6

取得租戶 (getTenant) Internal Link


參數

Name Type Required Description
tenantId string Yes
id string Yes

回應

Returns: GetTenant200Response

範例

getTenant 範例
Copy Copy
1
2const tenantId: string = "tenant_9f4b2c1a";
3const idOverride: string | undefined = undefined; // 可選的覆寫(若可用)
4const id: string = idOverride ?? "site_3e7a6b2f";
5const response: GetTenant200Response = await getTenant(tenantId, id);
6console.log(response);
7

取得租戶清單 (getTenants) Internal Link

參數

Name Type Required Description
tenantId string
meta string
skip number

回應

回傳: GetTenants200Response

範例

getTenants 範例
Copy Copy
1
2const tenantId: string = 'tenant_8421e7';
3const meta: string = 'include=domains,billing,customConfig';
4const skip: number = 20;
5
6const tenantsBasic: GetTenants200Response = await getTenants(tenantId);
7const tenantsWithOptions: GetTenants200Response = await getTenants(tenantId, meta, skip);
8

更新租戶 (updateTenant) Internal Link

參數

Name Type Required Description
tenantId string
id string
updateTenantBody UpdateTenantBody

回應

回傳: FlagCommentPublic200Response

範例

updateTenant 範例
Copy Copy
1
2const tenantId: string = "tenant_4821";
3const id: string = "flag_7b9e";
4const billingInfo: BillingInfo | undefined = undefined; // 選填,省略以保留目前的帳單資訊
5const updateTenantBody: UpdateTenantBody = {
6 name: "Acme News Comments",
7 defaultDomain: "comments.acme.com",
8 ...(billingInfo ? { billingInfo } : {})
9};
10const result: FlagCommentPublic200Response = await updateTenant(tenantId, id, updateTenantBody);
11

變更工單狀態 (changeTicketState) Internal Link

參數

名稱 類型 必填 說明
tenantId string
userId string
id string
changeTicketStateBody ChangeTicketStateBody

回應

回傳: ChangeTicketState200Response

範例

changeTicketState 範例
Copy Copy
1
2const tenantId: string = "tenant_7f3b2c9a";
3const userId: string = "user_5a1d9fb2";
4const id: string = "ticket_3e8a1b6f";
5const changeTicketStateBody: ChangeTicketStateBody = {
6 state: "closed",
7 reason: "Fixed in backend release 2.4.1",
8 notifyUsers: true,
9 metadata: { resolutionOwner: "agent_12", priority: "high" } // 示範可選欄位
10};
11const result: ChangeTicketState200Response = await changeTicketState(tenantId, userId, id, changeTicketStateBody);
12

建立工單 (createTicket) Internal Link


參數

名稱 類型 必要 描述
tenantId string
userId string
createTicketBody CreateTicketBody

回應

回傳: CreateTicket200Response

範例

createTicket 範例
Copy Copy
1
2const tenantId: string = '7f3e9b1a-1c2d-4a5b-b6c7-d8e9f0123456';
3const userId: string = 'd290f1ee-6c54-4b01-90e6-d701748f0851';
4const createTicketBody: CreateTicketBody = {
5 subject: 'Unable to post comments on product update',
6 message: 'Submitting a comment returns a 504 timeout after ~10s. Reproducible in Chrome and Firefox.',
7 priority: 'high', // 可選欄位(已包含)
8 contactEmail: 'jane.doe@acme-corp.com',
9 ccEmails: ['eng-oncall@acme-corp.com'], // 可選欄位(已包含)
10 metadata: { page: '/blog/product-update', browser: 'Chrome 112' } // 可選
11};
12const response: CreateTicket200Response = await createTicket(tenantId, userId, createTicketBody);
13

取得工單 (getTicket) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string
userId string

回應

回傳: GetTicket200Response

範例

getTicket 範例
Copy Copy
1
2const tenantId: string = 'acme-corp-tenant-01';
3const ticketId: string = 'tkt-20260325-42';
4const userId: string = 'user-8452';
5
6const ticketResponseWithUser: GetTicket200Response = await getTicket(tenantId, ticketId, userId);
7const ticketResponseWithoutUser: GetTicket200Response = await getTicket(tenantId, ticketId);
8

取得工單清單 (getTickets) Internal Link

參數

名稱 類型 必填 說明
tenantId string
userId string
state number
skip number
limit number

回應

回傳: GetTickets200Response

範例

getTickets 範例
Copy Copy
1
2const tenantId: string = "tenant_92f3b4c1";
3const userId: string = "user_742a9f3e";
4const state: number = 1;
5const skip: number = 0;
6const limit: number = 25;
7const ticketsFull: GetTickets200Response = await getTickets(tenantId, userId, state, skip, limit);
8const ticketsMinimal: GetTickets200Response = await getTickets("tenant_92f3b4c1");
9

取得翻譯 (getTranslations) Internal Link

參數

名稱 類型 必填 說明
namespace string
component string
locale string
useFullTranslationIds boolean

回應

回傳:GetTranslationsResponse

範例

getTranslations 範例
Copy Copy
1
2const translationsBase: GetTranslationsResponse = await getTranslations("acme-site-482", "commentThread");
3const translationsSpanishFullIds: GetTranslationsResponse = await getTranslations("acme-site-482", "commentThread", "es-ES", true);
4

上傳圖片 (uploadImage) Internal Link

上傳並調整圖片大小

參數

名稱 類型 必填 說明
tenantId string
file Blob
sizePreset SizePreset
urlId string

回應

回傳: UploadImageResponse


以 ID 取得使用者徽章進度 (getUserBadgeProgressById) Internal Link

參數

名稱 類型 是否必填 描述
tenantId string
id string

回應

回傳: GetUserBadgeProgressById200Response

範例

getUserBadgeProgressById 範例
Copy Copy
1
2const optionalTenantSuffix: string | undefined = undefined;
3const tenantId: string = `5f8d0d55-1234-4ab1-9e2a-3f2b5c6d7e8f${optionalTenantSuffix ?? ''}`;
4const id: string = '3a2b1c4d-5678-4ef0-9abc-def123456789';
5const result: GetUserBadgeProgressById200Response = await getUserBadgeProgressById(tenantId, id);
6

以使用者 ID 取得徽章進度 (getUserBadgeProgressByUserId) Internal Link

參數

名稱 類型 必填 說明
tenantId string
userId string

回應

回傳: GetUserBadgeProgressById200Response

範例

getUserBadgeProgressByUserId 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f9c2d3b';
3const maybeUserId: string | undefined = 'user_4b8e1f9a'; // 可選來源(可能為 undefined)
4const userId: string = maybeUserId ?? 'user_fallback0001';
5const result: GetUserBadgeProgressById200Response = await getUserBadgeProgressByUserId(tenantId, userId);
6console.log(result);
7

取得使用者徽章進度清單 (getUserBadgeProgressList) Internal Link


參數

名稱 類型 必填 描述
tenantId string
userId string
limit number
skip number

回應

回傳: GetUserBadgeProgressList200Response

範例

getUserBadgeProgressList 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = 'tenant_4f8c2b9d';
4 const userId: string = 'user_9a7e215c';
5 const limit: number = 25;
6 const skip: number = 0;
7 const resultMinimal: GetUserBadgeProgressList200Response = await getUserBadgeProgressList(tenantId);
8 const resultFull: GetUserBadgeProgressList200Response = await getUserBadgeProgressList(tenantId, userId, limit, skip);
9 console.log(resultMinimal, resultFull);
10})();
11

建立使用者徽章 (createUserBadge) Internal Link

參數

名稱 類型 必填 說明
tenantId string
createUserBadgeParams CreateUserBadgeParams

回應

回傳: CreateUserBadge200Response

範例

createUserBadge 範例
Copy Copy
1
2const tenantId: string = "tenant_9a8b7c";
3const params: CreateUserBadgeParams = {
4 name: "Top Contributor",
5 slug: "top-contributor",
6 description: "Awarded for 100 approved comments",
7 iconUrl: "https://cdn.fastcomments.com/badges/top-contributor.png",
8 active: true,
9 criteria: { approvedComments: 100 },
10 customConfig: { showOnProfile: true } // 可選參數
11};
12const result: CreateUserBadge200Response = await createUserBadge(tenantId, params);
13

刪除使用者徽章 (deleteUserBadge) Internal Link


參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: UpdateUserBadge200Response

範例

deleteUserBadge 範例
Copy Copy
1
2type DeleteOptions = { notifyModerators?: boolean };
3
4const tenantId: string = 'tenant_8a3f21';
5const id: string = 'badge_71f2b';
6const options: DeleteOptions = { notifyModerators: true };
7
8const result: UpdateUserBadge200Response = await deleteUserBadge(tenantId, id);
9

取得使用者徽章 (getUserBadge) Internal Link

參數

名稱 類型 必填 描述
tenantId string
id string

回應

回傳:GetUserBadge200Response

範例

getUserBadge 範例
Copy Copy
1
2const tenantId: string = "tenant_acme_01";
3const id: string = "badge_8c7d2f";
4const response: GetUserBadge200Response = await getUserBadge(tenantId, id);
5

取得使用者徽章清單 (getUserBadges) Internal Link

參數

名稱 Type 必填 說明
tenantId string
userId string
badgeId string
type number
displayedOnComments boolean
limit number
skip number

回傳

回傳: GetUserBadges200Response

範例

getUserBadges 範例
Copy Copy
1
2const tenantId: string = 'tenant_acme_01';
3const userId: string = 'user_5f4d3c2a';
4const badgeId: string = 'badge_top_contributor';
5const type: number = 1;
6const displayedOnComments: boolean = true;
7const limit: number = 50;
8const skip: number = 0;
9
10const result: GetUserBadges200Response = await getUserBadges(tenantId, userId, badgeId, type, displayedOnComments, limit, skip);
11

更新使用者徽章 (updateUserBadge) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string
updateUserBadgeParams UpdateUserBadgeParams

回應

回傳:UpdateUserBadge200Response

範例

updateUserBadge 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = 'tenant_acme_987';
4 const id: string = 'badge_top_contributor_42';
5 const updateUserBadgeParams: UpdateUserBadgeParams = {
6 title: 'Top Contributor',
7 description: 'Awarded for reaching 100 high-quality comments',
8 color: '#FFD700',
9 iconUrl: 'https://cdn.acme.com/badges/top-contributor.svg',
10 active: true,
11 notifyUsers: true
12 } as UpdateUserBadgeParams;
13 const result: UpdateUserBadge200Response = await updateUserBadge(tenantId, id, updateUserBadgeParams);
14 console.log(result);
15})();
16

取得使用者通知計數 (getUserNotificationCount) Internal Link

參數

名稱 類型 必填 說明
tenantId string
sso string

回應

回傳: GetUserNotificationCount200Response

範例

getUserNotificationCount 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = '9f1e2d3c-4b5a-6d7e-8f90-123456789abc';
4 const ssoToken: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MjMifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
5 const resultWithSSO: GetUserNotificationCount200Response = await getUserNotificationCount(tenantId, ssoToken);
6 const resultWithoutSSO: GetUserNotificationCount200Response = await getUserNotificationCount(tenantId);
7 console.log(resultWithSSO, resultWithoutSSO);
8})();
9

取得使用者通知 (getUserNotifications) Internal Link

參數

名稱 型別 必填 描述
tenantId string
pageSize number
afterId string
includeContext boolean
afterCreatedAt number
unreadOnly boolean
dmOnly boolean
noDm boolean
includeTranslations boolean
sso string

回應

回傳: GetUserNotifications200Response

範例

getUserNotifications 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f3b1c';
3const pageSize: number = 25;
4const afterId: string = 'notif_b2f9e4';
5const includeContext: boolean = true;
6const afterCreatedAt: number = Date.now() - 24 * 60 * 60 * 1000;
7const unreadOnly: boolean = true;
8const dmOnly: boolean = false;
9const noDm: boolean = false;
10const includeTranslations: boolean = true;
11const sso: string = 'sso_tok_user_9f8d7c';
12const response: GetUserNotifications200Response = await getUserNotifications(
13 tenantId,
14 pageSize,
15 afterId,
16 includeContext,
17 afterCreatedAt,
18 unreadOnly,
19 dmOnly,
20 noDm,
21 includeTranslations,
22 sso
23);
24

重設使用者通知計數 (resetUserNotificationCount) Internal Link


參數

名稱 類型 必填 描述
tenantId string
sso string

回應

回傳: ResetUserNotifications200Response

範例

resetUserNotificationCount 範例
Copy Copy
1
2(async () => {
3 const tenantId: string = "tenant_9f3b2c4a";
4 const ssoToken: string | undefined = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9._sample_payload_.signature";
5 const responseWithSSO: ResetUserNotifications200Response = await resetUserNotificationCount(tenantId, ssoToken);
6 const responseWithoutSSO: ResetUserNotifications200Response = await resetUserNotificationCount(tenantId);
7 console.log(responseWithSSO, responseWithoutSSO);
8})();
9

重設使用者通知 (resetUserNotifications) Internal Link

參數

名稱 Type 必填 描述
tenantId string
afterId string
afterCreatedAt number
unreadOnly boolean
dmOnly boolean
noDm boolean
sso string

回應

回傳: ResetUserNotifications200Response

範例

resetUserNotifications 範例
Copy Copy
1
2const tenantId: string = "tenant_prod_4a9f12";
3const afterId: string = "notification_87213";
4const afterCreatedAt: number = Math.floor(Date.now() / 1000) - 3600;
5const unreadOnly: boolean = true;
6const dmOnly: boolean = false;
7const sso: string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example.payload";
8const result: ResetUserNotifications200Response = await resetUserNotifications(tenantId, afterId, afterCreatedAt, unreadOnly, dmOnly, undefined, sso);
9

更新使用者評論訂閱狀態 (updateUserNotificationCommentSubscriptionStatus) Internal Link

啟用或停用對特定評論的通知。

參數

名稱 類型 必填 說明
tenantId string
notificationId string
optedInOrOut UpdateUserNotificationCommentSubscriptionStatusOptedInOrOutEnum
commentId string
sso string

回應

回傳: UpdateUserNotificationStatus200Response

範例

updateUserNotificationCommentSubscriptionStatus 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-001';
3const notificationId: string = 'notif-2026-03-25-01';
4const commentId: string = 'cmt-8f3a2b';
5const optedInOrOut: UpdateUserNotificationCommentSubscriptionStatusOptedInOrOutEnum = UpdateUserNotificationCommentSubscriptionStatusOptedInOrOutEnum.OptIn;
6const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.sso-payload.signature';
7const result: UpdateUserNotificationStatus200Response = await updateUserNotificationCommentSubscriptionStatus(tenantId, notificationId, optedInOrOut, commentId, sso);
8

更新使用者頁面訂閱狀態 (updateUserNotificationPageSubscriptionStatus) Internal Link

為頁面啟用或停用通知。當使用者訂閱某個頁面時,會建立通知 針對新的根留言,並且還

參數

名稱 類型 必填 描述
tenantId string
urlId string
url string
pageTitle string
subscribedOrUnsubscribed UpdateUserNotificationPageSubscriptionStatusSubscribedOrUnsubscribedEnum
sso string

回應

回傳: UpdateUserNotificationStatus200Response

範例

updateUserNotificationPageSubscriptionStatus 範例
Copy Copy
1
2const tenantId: string = 'acme-tenant-42';
3const urlId: string = 'blog-launch-2026';
4const url: string = 'https://acme.example.com/blog/launch-march-2026';
5const pageTitle: string = 'Acme Product Launch — March 2026';
6const subscribedOrUnsubscribed: UpdateUserNotificationPageSubscriptionStatusSubscribedOrUnsubscribedEnum = UpdateUserNotificationPageSubscriptionStatusSubscribedOrUnsubscribedEnum.Subscribed;
7const sso: string = 'sso_jwt_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9';
8const response: UpdateUserNotificationStatus200Response = await updateUserNotificationPageSubscriptionStatus(tenantId, urlId, url, pageTitle, subscribedOrUnsubscribed, sso);
9

更新使用者通知狀態 (updateUserNotificationStatus) Internal Link

參數

名稱 類型 必填 描述
tenantId string
notificationId string
newStatus UpdateUserNotificationStatusNewStatusEnum
sso string

回應

回傳: UpdateUserNotificationStatus200Response

範例

updateUserNotificationStatus 範例
Copy Copy
1
2const tenantId: string = 'tenant_84a2c3';
3const notificationId: string = 'notif_20260325_01';
4const newStatus: UpdateUserNotificationStatusNewStatusEnum = UpdateUserNotificationStatusNewStatusEnum.Read;
5const sso: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.sso_signature_example';
6const result: UpdateUserNotificationStatus200Response = await updateUserNotificationStatus(tenantId, notificationId, newStatus, sso);
7

取得使用者在席狀態 (getUserPresenceStatuses) Internal Link

參數

Name Type Required Description
tenantId string
urlIdWS string
userIds string

回應

回傳: GetUserPresenceStatuses200Response

範例

getUserPresenceStatuses 範例
Copy Copy
1
2const tenantId: string = 'tenant_7f3a2b';
3const urlIdWS: string = 'articles/2026/03/25/fastcomments-integration';
4const maybeUserIds: string | undefined = 'user_123,user_456'; // 可選來源
5const userIds: string = maybeUserIds ?? 'user_123';
6const presence: GetUserPresenceStatuses200Response = await getUserPresenceStatuses(tenantId, urlIdWS, userIds);
7

搜尋使用者 (searchUsers) Internal Link

參數

名稱 類型 必填 說明
tenantId string
urlId string
usernameStartsWith string
mentionGroupIds Array
sso string
searchSection SearchUsersSearchSectionEnum

回應

回傳: SearchUsers200Response

範例

searchUsers 範例
Copy Copy
1
2const tenantId: string = 'tenant_8392';
3const urlId: string = 'articles/2026/03/25/fastcomments-release';
4const usernameStartsWith: string = 'jo';
5const mentionGroupIds: Array<string> = ['editors', 'senior-writers'];
6const sso: string = 'sso_jwt_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9';
7const searchSection: SearchUsersSearchSectionEnum = SearchUsersSearchSectionEnum.ALL;
8const result: SearchUsers200Response = await searchUsers(tenantId, urlId, usernameStartsWith, mentionGroupIds, sso, searchSection);
9

取得使用者 (getUser) Internal Link

參數

名稱 類型 必填 說明
tenantId string
id string

回應

回傳: GetUser200Response

範例

getUser 範例
Copy Copy
1
2const tenantId: string = 'tenant_7b3f42';
3const id: string = 'user_9c4d2a';
4const userResponse: GetUser200Response = await getUser(tenantId, id);
5console.log(userResponse);
6

建立投票 (createVote) Internal Link

參數

名稱 類型 必填 說明
tenantId string
commentId string
direction CreateVoteDirectionEnum
userId string
anonUserId string

回應

回傳:VoteComment200Response

範例

createVote 範例
Copy Copy
1
2const tenantId: string = 'tenant_5f2a9b';
3const commentId: string = 'cmt_3b7e21';
4const direction: CreateVoteDirectionEnum = CreateVoteDirectionEnum.Up;
5const anonUserId: string = 'anon_9x7k2p';
6const voteResult: VoteComment200Response = await createVote(tenantId, commentId, direction, undefined, anonUserId);
7

刪除投票 (deleteVote) Internal Link

參數

Name Type Required Description
tenantId string
id string
editKey string

回應

回傳: DeleteCommentVote200Response

範例

deleteVote 範例
Copy Copy
1
2const tenantId: string = '123e4567-e89b-12d3-a456-426614174000';
3const id: string = 'vote-7a1b2c3d-9f8e-4b6a-8123-abcdef012345';
4const editKey: string = 'editKey_4f3e2d1c';
5
6const resultWithEditKey: DeleteCommentVote200Response = await deleteVote(tenantId, id, editKey);
7const resultWithoutEditKey: DeleteCommentVote200Response = await deleteVote(tenantId, id);
8

取得投票 (getVotes) Internal Link

參數

名稱 類型 必填 說明
tenantId string
urlId string

回應

回傳: GetVotes200Response

範例

getVotes 範例
Copy Copy
1
2const tenantId: string = 'acme-corp-8f3b';
3const refCampaign: string | undefined = 'newsletter-march2026'; // 可選的查詢參數
4const urlId: string = `https://www.example.com/articles/2026/03/25/fastcomments-integration${refCampaign ? `?ref=${refCampaign}` : ''}`;
5
6const votes: GetVotes200Response = await getVotes(tenantId, urlId);
7

取得使用者的投票 (getVotesForUser) Internal Link

參數

名稱 類型 必填 描述
tenantId string
urlId string
userId string
anonUserId string

回應

回傳: GetVotesForUser200Response

範例

getVotesForUser 範例
Copy Copy
1
2(async (): Promise<void> => {
3 const tenantId: string = "local-news-ny";
4 const urlId: string = "articles/2026-03-25/ev-infrastructure-update";
5 const userId: string = "user_78b6f3d9";
6 const anonUserId: string = "anon_9c3f7a1b";
7 const result: GetVotesForUser200Response = await getVotesForUser(tenantId, urlId, userId, anonUserId);
8 console.log(result);
9})();
10

需要幫助嗎?

如果您在使用 JavaScript/TypeScript SDK 時遇到任何問題或有任何疑問,請:

貢獻

歡迎貢獻!請造訪 GitHub 儲存庫 以取得貢獻指南。