FastComments.com

FastComments JavaScript/TypeScript SDK

Ovo je službeni JavaScript/TypeScript SDK za FastComments.

Upravljajte komentarima, korisnicima, SSO-om i moderacijom iz Node.js-a ili preglednika.

Repozitorij

Pogledajte na GitHubu


Instalacija Internal Link

npm

npm install fastcomments-sdk

Dokumentacija API-ja Internal Link


Potpuna referenca API-ja: docs/api/README.md

Kompatibilnost preglednika i poslužitelja Internal Link


Ovaj SDK koristi dvostruke ulazne točke kako bi osigurao optimalnu kompatibilnost i spriječio pogreške u izvođenju:

  • fastcomments-sdk/browser - Verzija sigurna za preglednik s nativnim fetch
  • fastcomments-sdk/server - Puna Node.js verzija s podrškom za SSO
  • fastcomments-sdk (zadano) - Samo tipovi, sigurno za uvoz bilo gdje

Javni i zaštićeni API-ji Internal Link

SDK pruža tri glavne klase API-ja:

  • DefaultApi - Zaštićene krajnje točke koje zahtijevaju vaš API ključ za autentifikaciju. Koristite ih za operacije na strani poslužitelja.
  • PublicApi - Javne krajnje točke kojima se može pristupiti bez API ključa. One se mogu pozivati izravno iz preglednika/mobilnih uređaja/itd.
  • HiddenApi - Interni/admin krajnje točke za napredne slučajeve upotrebe.

Primjer: Korištenje Public API-ja (sigurno za preglednik)

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

const publicApi = new PublicApi();

// Dohvati komentare za stranicu (nije potreban API ključ)
const response = await publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id'
});

Primjer: Korištenje Default API-ja (samo na strani poslužitelja)

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

const config = new Configuration({
  apiKey: 'your-api-key' // Držite ovo u tajnosti!
});
const defaultApi = new DefaultApi(config);

// Dohvati komentare s punim administratorskim pristupom
const response = await defaultApi.getComments({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id'
});

Integracija SSO (Single Sign-On) Internal Link

FastComments podržava SSO za integraciju s vašim postojećim sustavom autentikacije korisnika. SSO funkcionalnost dostupna je samo u server exportu jer zahtijeva kriptografske značajke Node.js.

Jednostavni SSO (samo na strani poslužitelja)

Jednostavni SSO treba generirati na strani poslužitelja i poslati klijentu:

// Kôd na strani poslužitelja (Node.js/backend)
import { FastCommentsSSO, PublicApi } from 'fastcomments-sdk/server';

// Kreirajte jednostavni SSO koristeći ugrađeni helper  
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();

// Pošaljite ssoToken vašem klijentskom kodu
// Klijentski kod može tada koristiti ovaj token s browser SDK-om

Sigurni SSO (na strani poslužitelja, preporučeno)

Sigurni SSO treba implementirati na strani poslužitelja i pruža bolju sigurnost:

// Kôd na strani poslužitelja (Node.js/backend)
import { FastCommentsSSO, PublicApi } from 'fastcomments-sdk/server';

// Kreirajte siguran SSO koristeći ugrađeni helper
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();

// Koristite s API pozivima na poslužitelju
const publicApi = new PublicApi();
const response = await publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id',
  sso: JSON.stringify(ssoConfig)
});

// Ili pošaljite ssoConfig klijentu za korištenje u pregledniku

Korištenje SSO iz preglednika (s tokenom generiranim na serveru)

// Klijentski kod (preglednik)
import { PublicApi } from 'fastcomments-sdk/browser';

// Dohvatite SSO token s vašeg server endpointa
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 // Koristite token SSO generiran na serveru
});

SSO s kreiranjem komentara

// Na strani poslužitelja: Kreirajte SSO i komentar
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)
});

Uobičajeni slučajevi upotrebe Internal Link

Dohvaćanje komentara za stranicu

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

Stvaranje komentara

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

Glasanje za komentar

const voteResponse = await sdk.publicApi.voteComment({
  voteBodyParams: {
    commentId: 'comment-id',
    direction: 1 // 1 za glas u korist, -1 za glas protiv
  }
});

Upravljanje korisnicima (potreban API ključ)

// Pretraži korisnike (zahtijeva DefaultApi)
const users = await sdk.defaultApi.searchUsers({
  tenantId: 'your-tenant-id',
  urlId: 'page-id',
  usernameStartsWith: 'john'
});

Live događaji (ažuriranja u stvarnom vremenu) Internal Link

Pretplatite se na događaje uživo kako biste dobili ažuriranja u stvarnom vremenu za komentare, glasove i druge aktivnosti.

Događaji na razini stranice

Slušajte događaje uživo na određenoj stranici (komentari, glasovi itd.):

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

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

// Pretplatite se na događaje uživo za stranicu
const subscription = subscribeToChanges(
  config,
  'your-tenant-id', // tenantIdWS
  'page-url-id',    // urlIdWS  
  'user-session-id', // userIdWS (dobijte ovo iz getComments odgovora)
  (event: LiveEvent) => {
    console.log('Live event received:', event);

    switch (event.type) {
      case LiveEventType.new_comment:
        console.log('New comment:', event.comment);
        // Ažurirajte svoje korisničko sučelje s novim komentarom
        break;
      case LiveEventType.new_vote:
        console.log('New vote:', event.vote);
        // Ažurirajte brojače glasova u vašem korisničkom sučelju
        break;
      case LiveEventType.updated_comment:
        console.log('Comment updated:', event.comment);
        break;
      default:
        console.log('Other event type:', event.type);
    }

    return true; // Vratite true ako je događaj obrađen
  },
  (isConnected: boolean) => {
    console.log('Connection status:', isConnected ? 'Connected' : 'Disconnected');
  }
);

// Close the subscription when done
subscription.close();

Pretplata na korisničke događaje

Slušajte događaje specifične za korisnika (obavijesti, spominjanja itd.):

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

const userConfig = {
  userIdWS: 'user-session-id', // Get this from getComments response
};

// Pretplatite se na osobni feed korisnika
const userSubscription = subscribeToUserFeed(
  userConfig,
  (event: LiveEvent) => {
    console.log('User event received:', event);

    switch (event.type) {
      case LiveEventType.notification:
        console.log('New notification:', event.notification);
        // Prikažite obavijest u vašem korisničkom sučelju
        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');
  }
);

// Zatvorite kada završite
userSubscription.close();

Dobivanje userIdWS

Parametar userIdWS je obavezan za događaje uživo i može se dobiti iz odgovora API-ja:

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

// Extract userIdWS from the response
const userIdWS = response.data?.userSessionInfo?.userIdWS;

if (userIdWS) {
  // Now you can subscribe to live events
  const subscription = subscribeToChanges(config, tenantIdWS, urlIdWS, userIdWS, handleEvent);
}

ID-ovi prijenosa Internal Link


Vidjet ćete da trebate proslijediti broadcastId u nekim API pozivima. Kada primite događaje, dobit ćete ovaj ID natrag, tako da znate zanemariti događaj ako planirate optimistično primijeniti promjene na klijentu (što ćete vjerojatno htjeti učiniti jer pruža najbolji doživljaj). Ovdje proslijedite UUID. ID bi trebao biti dovoljno jedinstven da se ne pojavi dva puta u istoj sesiji preglednika.

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() // Jedinstveni ID za ovu operaciju
  }
});

Rukovanje pogreškama 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);
  }
}

Agregacija Internal Link

Agregira dokumente grupiranjem (ako je groupBy naveden) i primjenom više operacija. Podržane su različite operacije (npr. sum, countDistinct, avg itd.).

Parametri

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

Odgovor

Vraća: AggregationResponse


Dohvati dnevnike revizije Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
limit number Ne
skip number Ne
order SORTDIR Ne
after number Ne
before number Ne

Odgovor

Vraća: GetAuditLogs200Response

Primjer

Primjer 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; // prije 30 dana
6const before: number = Date.now();
7const auditLogs: GetAuditLogs200Response = await getAuditLogs(tenantId, limit, skip, undefined, after, before);
8

Blokiraj iz komentara (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
publicBlockFromCommentParams PublicBlockFromCommentParams Da
sso string Ne

Odgovor

Vraća: BlockFromCommentPublic200Response

Primjer

blockFromCommentPublic Primjer
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

Ukloni blokadu komentara (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
publicBlockFromCommentParams PublicBlockFromCommentParams Da
sso string Ne

Odgovor

Vraća: UnBlockCommentPublic200Response

Primjer

Primjer 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

Provjeri komentare za blokirane Internal Link

Parametri

Name Type Required Description
tenantId string Da
commentIds string Da
sso string Ne

Odgovor

Vraća: CheckedCommentsForBlocked200Response

Primjer

Primjer 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

Blokiraj korisnika u vezi komentara Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
blockFromCommentParams BlockFromCommentParams Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: BlockFromCommentPublic200Response

Primjer

Primjer 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

Kreiraj komentar (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
broadcastId string Da
commentData CommentData Da
sessionId string Ne
sso string Ne

Odgovor

Vraća: CreateCommentPublic200Response

Primjer

createCommentPublic Primjer
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

Izbriši komentar Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
id string Da
contextUserId string Ne
isLive boolean Ne

Odgovor

Vraća: DeleteComment200Response

Primjer

Primjer 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

Izbriši komentar (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
broadcastId string Da
editKey string Ne
sso string Ne

Odgovor

Vraća: DeleteCommentPublic200Response

Primjer

Primjer 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

Izbriši glas za komentar Internal Link

Parametri

Name Type Required Description
tenantId string Yes
commentId string Yes
voteId string Yes
urlId string Yes
broadcastId string Yes
editKey string No
sso string No

Odgovor

Vraća: DeleteCommentVote200Response

Primjer

deleteCommentVote Primjer
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

Prijavi komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: FlagComment200Response

Primjer

flagComment Primjer
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

Dohvati komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetComment200Response

Primjer

Primjer 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

Dohvati komentare Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
page number Ne
limit number Ne
skip number Ne
asTree boolean Ne
skipChildren number Ne
limitChildren number Ne
maxTreeDepth number Ne
urlId string Ne
userId string Ne
anonUserId string Ne
contextUserId string Ne
hashTag string Ne
parentId string Ne
direction SortDirections Ne

Odgovor

Vraća: GetComments200Response

Primjer

Primjer getComments
Copy Copy
1
2const tenantId: string = 'tenant_acme_42';
3const response: GetComments200Response = await getComments(
4 tenantId,
5 1, // stranica
6 20, // broj po stranici
7 0, // preskoči
8 true, // kao stablo
9 1, // preskoči djecu
10 3, // ograničenje djece
11 4, // maksimalna dubina stabla
12 'articles/2026/new-product-launch', // identifikator URL-a
13 'user_7890', // identifikator korisnika
14 'anon_4f3b2', // identifikator anonimnog korisnika
15 undefined, // identifikator kontekstnog korisnika
16 '#launch', // hashtag
17 undefined // identifikator roditelja
18);
19

Dohvati komentare (javno) Internal Link

req tenantId urlId

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
page number Ne
direction SortDirections Ne
sso string Ne
skip number Ne
skipChildren number Ne
limit number Ne
limitChildren number Ne
countChildren boolean Ne
fetchPageForCommentId string Ne
includeConfig boolean Ne
countAll boolean Ne
includei10n boolean Ne
locale string Ne
modules string Ne
isCrawler boolean Ne
includeNotificationCount boolean Ne
asTree boolean Ne
maxTreeDepth number Ne
useFullTranslationIds boolean Ne
parentId string Ne
searchText string Ne
hashTags Array Ne
userId string Ne
customConfigStr string Ne
afterCommentId string Ne
beforeCommentId string Ne

Odgovor

Vraća: GetCommentsPublic200Response

Primjer

Primjer 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

Dohvati tekst komentara Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
editKey string Ne
sso string Ne

Odgovor

Vraća: GetCommentText200Response

Primjer

Primjer 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

Dohvati imena korisnika koji su glasali za komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
dir number Da
sso string Ne

Odgovor

Vraća: GetCommentVoteUserNames200Response

Primjer

getCommentVoteUserNames Primjer
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

Zaključaj komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
broadcastId string Da
sso string Ne

Odgovor

Vraća: LockComment200Response

Primjer

Primjer 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

Pričvrsti komentar Internal Link

Parametri

Name Tip Obavezno Opis
tenantId string Yes
commentId string Yes
broadcastId string Yes
sso string No

Odgovor

Vraća: PinComment200Response

Primjer

Primjer 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

Spremi komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createCommentParams CreateCommentParams Da
isLive boolean Ne
doSpamCheck boolean Ne
sendEmails boolean Ne
populateNotifications boolean Ne

Odgovor

Vraća: SaveComment200Response

Primjer

Primjer 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

Masovno spremi komentare Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createCommentParams Array Da
isLive boolean Ne
doSpamCheck boolean Ne
sendEmails boolean Ne
populateNotifications boolean Ne

Odgovor

Vraća: Array<SaveComment200Response

Primjer

Primjer 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

Postavi tekst komentara Internal Link

Parametri

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

Odgovor

Vraća: SetCommentText200Response

Primjer

Primjer 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

Ukloni blokadu korisnika za komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
unBlockFromCommentParams UnBlockFromCommentParams Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: UnBlockCommentPublic200Response

Primjer

unBlockUserFromComment Primjer
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

Poništi prijavu komentara Internal Link

Parametri

Name Type Obavezno Opis
tenantId string Da
id string Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: FlagComment200Response

Primjer

Primjer 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

Otključaj komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
broadcastId string Da
sso string Ne

Odgovor

Vraća: LockComment200Response

Primjer

Primjer 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

Ukloni pričvršćenje komentara Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
broadcastId string Da
sso string Ne

Odgovor

Vraća: PinComment200Response

Primjer

Primjer 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

Ažuriraj komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updatableCommentParams UpdatableCommentParams Da
contextUserId string Ne
doSpamCheck boolean Ne
isLive boolean Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Glasaj za komentar Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Yes
commentId string Yes
urlId string Yes
broadcastId string Yes
voteBodyParams VoteBodyParams Yes
sessionId string No
sso string No

Odgovor

Vraća: VoteComment200Response

Primjer

Primjer 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

Dohvati komentare za korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
userId string Ne
tenantId string Ne
urlId string Ne
page number Ne
direction SortDirections Ne
lastGenDate number Ne
repliesToUserId string Ne
fetchPageForCommentId string Ne
includei10n boolean Ne
useFullTranslationIds boolean Ne
locale string Ne
includeConfig boolean Ne
includeNotificationCount boolean Ne
countAll boolean Ne
sso string Ne

Odgovor

Vraća: GetCommentsForUserResponse

Primjer

Primjer 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

Dodaj konfiguraciju domene Internal Link

Parametri

Name Type Required Description
tenantId string Da
addDomainConfigParams AddDomainConfigParams Da

Odgovor

Vraća: AddDomainConfig200Response


Izbriši konfiguraciju domene Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
domain string Da

Odgovor

Vraća: DeleteDomainConfig200Response


Dohvati konfiguraciju domene Internal Link


Parametri

Name Type Required Description
tenantId string Da
domain string Da

Odgovor

Vraća: GetDomainConfig200Response


Dohvati konfiguracije domena Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da

Odgovor

Vraća: GetDomainConfigs200Response


Djelomično ažuriraj konfiguraciju domene Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
domainToUpdate string Da
patchDomainConfigParams PatchDomainConfigParams Da

Odgovor

Vraća: GetDomainConfig200Response


Zamijeni konfiguraciju domene Internal Link


Parametri

Naziv Tip Obvezno Opis
tenantId string Da
domainToUpdate string Da
updateDomainConfigParams UpdateDomainConfigParams Da

Odgovor

Vraća: GetDomainConfig200Response


Kreiraj predložak e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createEmailTemplateBody CreateEmailTemplateBody Da

Odgovor

Vraća: CreateEmailTemplate200Response

Primjer

Primjer 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

Izbriši predložak e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Response

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Izbriši pogrešku renderiranja predloška e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
errorId string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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; // primjer opcionalne zastavice
6
7const response: FlagCommentPublic200Response = await deleteEmailTemplateRenderError(tenantId, id, errorId);
8// Ako bi bio podržan neobavezni objekt opcija, mogao bi izgledati ovako:
9// await deleteEmailTemplateRenderError(tenantId, id, errorId /*, { includeStackTrace } */);
10

Dohvati predložak e-pošte Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetEmailTemplate200Response

Primjer

getEmailTemplate Primjer
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

Dohvati definicije predložaka e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da

Odgovor

Vraća: GetEmailTemplateDefinitions200Response

Primjer

Primjer 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

Dohvati pogreške renderiranja predložaka e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
skip number Ne

Odgovor

Vraća: GetEmailTemplateRenderErrors200Response

Primjer

Primjer 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

Dohvati predloške e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetEmailTemplates200Response

Primjer

Primjer 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

Renderiraj predložak e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
renderEmailTemplateBody RenderEmailTemplateBody Da
locale string Ne

Odgovor

Vraća: RenderEmailTemplate200Response

Primjer

Primjer 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

Ažuriraj predložak e-pošte Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateEmailTemplateBody UpdateEmailTemplateBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati dnevnik događaja Internal Link


req tenantId urlId userIdWS

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
userIdWS string Da
startTime number Da
endTime number Da

Odgovor

Vraća: GetEventLog200Response

Primjer

Primjer getEventLog
Copy Copy
1
2const tenantId: string = 'fastcomments-tenant-01';
3const urlId: string = 'article-2026-03-25';
4const userIdWS: string | undefined = undefined; // neobavezna vrijednost upstream-a
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

Dohvati globalni dnevnik događaja Internal Link

req tenantId urlId userIdWS

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
userIdWS string Da
startTime number Da
endTime number Da

Odgovor

Vraća: GetEventLog200Response

Primjer

Primjer 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; // prije 7 dana
6const endTimeOptional: number | undefined = undefined; // neobavezni kraj vremenskog razdoblja
7const endTime: number = endTimeOptional ?? Date.now();
8const eventLog: GetEventLog200Response = await getGlobalEventLog(tenantId, urlId, userIdWS, startTime, endTime);
9

Kreiraj objavu feeda Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createFeedPostParams CreateFeedPostParams Da
broadcastId string Ne
isLive boolean Ne
doSpamCheck boolean Ne
skipDupCheck boolean Ne

Odgovor

Vraća: CreateFeedPost200Response

Primjer

Primjer 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

Kreiraj objavu feeda (javno) Internal Link

Parameters

Naziv Tip Obavezno Opis
tenantId string Da
createFeedPostParams CreateFeedPostParams Da
broadcastId string Ne
sso string Ne

Odgovor

Vraća: CreateFeedPostPublic200Response

Primjer

Primjer 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

Izbriši objavu feeda (javno) Internal Link

Parametri

Name Type Required Description
tenantId string Yes
postId string Yes
broadcastId string No
sso string No

Odgovor

Vraća: DeleteFeedPostPublic200Response

Primjer

Primjer 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

Dohvati objave feeda Internal Link

req tenantId afterId

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
afterId string Ne
limit number Ne
tags Array Ne

Odgovor

Vraća: GetFeedPosts200Response

Primjer

Primjer 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

Dohvati objave feeda (javno) Internal Link

req tenantId afterId

Parametri

Name Type Required Description
tenantId string Da
afterId string Ne
limit number Ne
tags Array Ne
sso string Ne
isCrawler boolean Ne
includeUserInfo boolean Ne

Odgovor

Vraća: GetFeedPostsPublic200Response

Primjer

Primjer 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

Dohvati statistiku objava feeda Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
postIds Array Da
sso string Ne

Odgovor

Vraća: GetFeedPostsStats200Response

Primjer

Primjer 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

Dohvati reakcije korisnika (javno) Internal Link

Parametri

Name Type Required Description
tenantId string Da
postIds Array Ne
sso string Ne

Odgovor

Vraća: GetUserReactsPublic200Response

Primjer

Primjer 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

Reagiraj na objavu feeda (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
postId string Da
reactBodyParams ReactBodyParams Da
isUndo boolean Ne
broadcastId string Ne
urlId string Ne
sso string Ne

Odgovor

Vraća: ReactFeedPostPublic200Response

Primjer

reactFeedPostPublic Primjer
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

Ažuriraj objavu feeda Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
feedPost FeedPost Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

updateFeedPost Primjer
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], // neobavezni niz uključen
27 links: [link], // neobavezni linkovi uključeni
28 isPublished: true // neobavezna zastavica objave korištena ovdje
29};
30
31const result: FlagCommentPublic200Response = await updateFeedPost(tenantId, id, feedPost);
32

Ažuriraj objavu feeda (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
postId string Da
updateFeedPostParams UpdateFeedPostParams Da
broadcastId string Ne
sso string Ne

Odgovor

Vraća: CreateFeedPostPublic200Response

Primjer

Primjer 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

Prijavi komentar (javno) Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
isFlagged boolean Da
sso string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati veliki GIF Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
largeInternalURLSanitized string Da

Odgovor

Vraća: GifGetLargeResponse

Primjer

Primjer 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; // neobavezna zastavica koju pozivatelj može koristiti
5const result: GifGetLargeResponse = await getGifLarge(tenantId, largeInternalURLSanitized);
6console.log(result, includePreview);
7

Pretraži GIF-ove Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
search string Da
locale string Ne
rating string Ne
page number Ne

Odgovor

Vraća: GifSearchResponse

Primjer

Primjer 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

Dohvati trendi GIF-ove Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
locale string Ne
rating string Ne
page number Ne

Odgovor

Vraća: GifSearchResponse

Primjer

Primjer 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

Dodaj hashtag Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Ne
createHashTagBody CreateHashTagBody Ne

Odgovor

Vraća: AddHashTag200Response

Primjer

Primjer 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

Masovno dodaj hashtage Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Ne
bulkCreateHashTagsBody BulkCreateHashTagsBody Ne

Odgovor

Vraća: AddHashTagsBulk200Response

Primjer

addHashTagsBulk Primjer
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

Izbriši hashtag Internal Link


Parametri

Naziv Tip Obavezno Opis
tag string Da
tenantId string Ne
deleteHashTagRequest DeleteHashTagRequest Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati hashtage Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
page number Ne

Odgovor

Vraća: GetHashTags200Response

Primjer

Primjer 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

Djelomično ažuriraj hashtag Internal Link

Parametri

Naziv Tip Obavezno Opis
tag string Da
tenantId string Ne
updateHashTagBody UpdateHashTagBody Ne

Odgovor

Vraća: PatchHashTag200Response

Primjer

patchHashTag Primjer
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

Kreiraj moderatora Internal Link

Parametri

Name Type Required Description
tenantId string Da
createModeratorBody CreateModeratorBody Da

Odgovor

Vraća: CreateModerator200Response

Primjer

Primjer 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

Izbriši moderatora Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
sendEmail string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati moderatora Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetModerator200Response

Primjer

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

Dohvati moderatore Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetModerators200Response

Primjer

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

Pošalji pozivnicu Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
id string Da
fromName string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Ažuriraj moderatora Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateModeratorBody UpdateModeratorBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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" // neobavezno polje prikazano
10};
11const result: FlagCommentPublic200Response = await updateModerator(tenantId, id, updateModeratorBody);
12

Izbriši broj obavijesti Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer za 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

Dohvati predmemorirani broj obavijesti Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetCachedNotificationCount200Response

Primjer

getCachedNotificationCount Primjer
Copy Copy
1
2const tenantId: string = 'tenant_acme_42';
3const id: string = 'user_00012345';
4const includeUnreadOnly: boolean | undefined = true; // zastavica neobaveznog parametra (demonstrirano)
5const result: GetCachedNotificationCount200Response = await getCachedNotificationCount(tenantId, id);
6

Dohvati broj obavijesti Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Ne
urlId string Ne
fromCommentId string Ne
viewed boolean Ne
type string Ne

Odgovor

Vraća: GetNotificationCount200Response

Primjer

Primjer 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

Dohvati obavijesti Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Ne
urlId string Ne
fromCommentId string Ne
viewed boolean Ne
type string Ne
skip number Ne

Odgovor

Vraća: GetNotifications200Response

Primjer

getNotifications Primjer
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

Ažuriraj obavijest Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Yes
id string Yes
updateNotificationBody UpdateNotificationBody Yes
userId string No

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dodaj stranicu Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createAPIPageData CreateAPIPageData Da

Odgovor

Vraća: AddPageAPIResponse


Izbriši stranicu Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: DeletePageAPIResponse


Dohvati stranicu po URL ID-u Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da

Odgovor

Vraća: GetPageByURLIdAPIResponse


Dohvati stranice Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da

Odgovor

Vraća: GetPagesAPIResponse

Djelomično ažuriraj stranicu Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateAPIPageData UpdateAPIPageData Da

Odgovor

Vraća: PatchPageAPIResponse


Izbriši webhook događaj na čekanju Internal Link

Parametri

Name Type Required Description
tenantId string Da
id string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer deletePendingWebhookEvent
Copy Copy
1
2const tenantId: string = "tenant_7f3b2a";
3const webhookEventId: string = "wh_evt_9a8c7d1234";
4const dryRun: boolean | undefined = undefined; // primjer opcionalne zastavice (nije obavezno za ovaj poziv)
5const result: FlagCommentPublic200Response = await deletePendingWebhookEvent(tenantId, webhookEventId);
6

Dohvati broj webhook događaja na čekanju Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Ne
externalId string Ne
eventType string Ne
type string Ne
domain string Ne
attemptCountGT number Ne

Odgovor

Vraća: GetPendingWebhookEventCount200Response

Primjer

getPendingWebhookEventCount Primjer
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

Dohvati webhook događaje na čekanju Internal Link

Parametri

Name Type Required Description
tenantId string Da
commentId string Ne
externalId string Ne
eventType string Ne
type string Ne
domain string Ne
attemptCountGT number Ne
skip number Ne

Odgovor

Vraća: GetPendingWebhookEvents200Response

Primjer

getPendingWebhookEvents Primjer
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

Kreiraj konfiguraciju pitanja Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createQuestionConfigBody CreateQuestionConfigBody Da

Odgovor

Vraća: CreateQuestionConfig200Response

Primjer

Primjer 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

Izbriši konfiguraciju pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati konfiguraciju pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetQuestionConfig200Response

Primjer

Primjer 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

Dohvati konfiguracije pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetQuestionConfigs200Response

Primjer

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

Ažuriraj konfiguraciju pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateQuestionConfigBody UpdateQuestionConfigBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

updateQuestionConfig Primjer
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

Kreiraj rezultat pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createQuestionResultBody CreateQuestionResultBody Da

Odgovor

Vraća: CreateQuestionResult200Response

Primjer

Primjer 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 // neobavezni parametar
10} as CreateQuestionResultBody;
11const result: CreateQuestionResult200Response = await createQuestionResult(tenantId, createQuestionResultBody);
12

Izbriši rezultat pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati rezultat pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetQuestionResult200Response

Primjer

getQuestionResult Primjer
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

Dohvati rezultate pitanja Internal Link

Parametri

Name Tip Obvezno Opis
tenantId string Da
urlId string Ne
userId string Ne
startDate string Ne
questionId string Ne
questionIds string Ne
skip number Ne

Odgovor

Vraća: GetQuestionResults200Response

Primjer

Primjer 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

Ažuriraj rezultat pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateQuestionResultBody UpdateQuestionResultBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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[], // neobavezni metapodaci
10 status: { code: 'review_pending' } as APIStatus
11} as UpdateQuestionResultBody;
12const result: FlagCommentPublic200Response = await updateQuestionResult(tenantId, id, updateQuestionResultBody);
13

Agregiraj rezultate pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
questionId string Ne
questionIds Array Ne
urlId string Ne
timeBucket AggregateTimeBucket Ne
startDate Date Ne
forceRecalculate boolean Ne

Odgovor

Vraća: AggregateQuestionResults200Response

Primjer

Primjer 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

Masovno agregiraj rezultate pitanja Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
bulkAggregateQuestionResultsRequest BulkAggregateQuestionResultsRequest Da
forceRecalculate boolean Ne

Odgovor

Vraća: BulkAggregateQuestionResults200Response

Primjer

Primjer 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

Kombiniraj komentare s rezultatima pitanja Internal Link

Parametri

Name Type Required Description
tenantId string Da
questionId string Ne
questionIds Array Ne
urlId string Ne
startDate Date Ne
forceRecalculate boolean Ne
minValue number Ne
maxValue number Ne
limit number Ne

Odgovor

Vraća: CombineCommentsWithQuestionResults200Response

Primjer

Primjer 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

Dodaj SSO korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createAPISSOUserData CreateAPISSOUserData Da

Odgovor

Vraća: AddSSOUserAPIResponse

Izbriši SSO korisnika Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
deleteComments boolean Ne
commentDeleteMode string Ne

Odgovor

Vraća: DeleteSSOUserAPIResponse


Dohvati SSO korisnika po e-pošti Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
email string Da

Odgovor

Vraća: GetSSOUserByEmailAPIResponse


Dohvati SSO korisnika po ID-u Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetSSOUserByIdAPIResponse


Dohvati SSO korisnike Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetSSOUsers200Response


Djelomično ažuriraj SSO korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateAPISSOUserData UpdateAPISSOUserData Da
updateComments boolean Ne

Odgovor

Vraća: PatchSSOUserAPIResponse


Zamijeni SSO korisnika Internal Link


Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateAPISSOUserData UpdateAPISSOUserData Da
updateComments boolean Ne

Odgovor

Vraća: PutSSOUserAPIResponse


Kreiraj pretplatu Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createAPIUserSubscriptionData CreateAPIUserSubscriptionData Da

Odgovor

Vraća: CreateSubscriptionAPIResponse

Primjer

Primjer 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, // neobavezni parametar prikazan
9 metadata: { campaign: "spring_launch" } // neobavezni parametar prikazan
10};
11const result: CreateSubscriptionAPIResponse = await createSubscription(tenantId, createAPIUserSubscriptionData);
12

Izbriši pretplatu Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
userId string Ne

Odgovor

Vraća: DeleteSubscriptionAPIResponse

Dohvati pretplate Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Ne

Odgovor

Vraća: GetSubscriptionsAPIResponse

Primjer

getSubscriptions Primjer
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

Ažuriraj pretplatu Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateAPIUserSubscriptionData UpdateAPIUserSubscriptionData Da
userId string Ne

Odgovor

Vraća: UpdateSubscriptionAPIResponse

Primjer

Primjer 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

Dohvati dnevnu potrošnju zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
yearNumber number Ne
monthNumber number Ne
dayNumber number Ne
skip number Ne

Odgovor

Vraća: GetTenantDailyUsages200Response

Primjer

Primjer 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

Kreiraj paket zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createTenantPackageBody CreateTenantPackageBody Da

Odgovor

Vraća: CreateTenantPackage200Response

Primjer

createTenantPackage Primjer
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" } // demonstriran neobavezni parametar
11};
12const result: CreateTenantPackage200Response = await createTenantPackage(tenantId, createTenantPackageBody);
13

Izbriši paket zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

deleteTenantPackage Primjer
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

Dohvati paket zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetTenantPackage200Response

Primjer

getTenantPackage Primjer
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

Dohvati pakete zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetTenantPackages200Response

Primjer

Primjer 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

Zamijeni paket zakupnika Internal Link


Parametri

Name Type Required Description
tenantId string Da
id string Da
replaceTenantPackageBody ReplaceTenantPackageBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

replaceTenantPackage Primjer
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

Ažuriraj paket zakupnika Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
id string Da
updateTenantPackageBody UpdateTenantPackageBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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 // neobavezna polja su namjerno izostavljena (npr. description, limits)
8} as UpdateTenantPackageBody;
9const result: FlagCommentPublic200Response = await updateTenantPackage(tenantId, id, updateTenantPackageBody);
10

Kreiraj korisnika zakupnika Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
createTenantUserBody CreateTenantUserBody Da

Odgovor

Vraća: CreateTenantUser200Response

Primjer

Primjer 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, // neobavezan parametar
8 metadata: { department: "Customer Support" }
9};
10const result: CreateTenantUser200Response = await createTenantUser(tenantId, createTenantUserBody);
11

Izbriši korisnika zakupnika Internal Link

Parameters

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

Response

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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"; // ukloni i komentare korisnika
6 const commentDeleteMode: string = "permanent"; // "permanent" ili "soft"
7 const result: FlagCommentPublic200Response = await deleteTenantUser(tenantId, id, deleteComments, commentDeleteMode);
8 console.log(result);
9}
10run();
11

Dohvati korisnika zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetTenantUser200Response

Primjer

getTenantUser Primjer
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; // pristupanje podacima odgovora
6const userEmail: string | undefined = user?.email;
7console.log('Fetched user email:', userEmail);
8

Dohvati korisnike zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
skip number Ne

Odgovor

Vraća: GetTenantUsers200Response

Primjer

getTenantUsers Primjer
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

Zamijeni korisnika zakupnika Internal Link

Parametri

Name Type Required Description
tenantId string Da
id string Da
replaceTenantUserBody ReplaceTenantUserBody Da
updateComments string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

replaceTenantUser Primjer
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

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
redirectURL string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Ažuriraj korisnika zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateTenantUserBody UpdateTenantUserBody Da
updateComments string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

updateTenantUser Primjer
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

Kreiraj zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createTenantBody CreateTenantBody Da

Odgovor

Vraća: CreateTenant200Response

Primjer

Primjer 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 // opcionalna polja poput ssoConfig ili customConfig namjerno su izostavljena
8} as CreateTenantBody;
9
10const result: CreateTenant200Response = await createTenant(tenantId, createTenantBody);
11

Izbriši zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
sure string Ne

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer 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

Dohvati zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetTenant200Response

Primjer

getTenant Primjer
Copy Copy
1
2const tenantId: string = "tenant_9f4b2c1a";
3const idOverride: string | undefined = undefined; // neobavezno nadjačanje, ako je dostupno
4const id: string = idOverride ?? "site_3e7a6b2f";
5const response: GetTenant200Response = await getTenant(tenantId, id);
6console.log(response);
7

Dohvati zakupnike Internal Link

Parametri

Naziv Tip Obvezno Opis
tenantId string Da
meta string Ne
skip number Ne

Odgovor

Vraća: GetTenants200Response

Primjer

getTenants Primjer
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

Ažuriraj zakupnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
updateTenantBody UpdateTenantBody Da

Odgovor

Vraća: FlagCommentPublic200Response

Primjer

Primjer updateTenant
Copy Copy
1
2const tenantId: string = "tenant_4821";
3const id: string = "flag_7b9e";
4const billingInfo: BillingInfo | undefined = undefined; // neobavezno, izostavite da zadržite trenutnu naplatu
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

Promijeni stanje zahtjeva Internal Link

Parametri

Name Type Required Description
tenantId string Da
userId string Da
id string Da
changeTicketStateBody ChangeTicketStateBody Da

Odgovor

Vraća: ChangeTicketState200Response

Primjer

Primjer 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" } // demonstrirana neobavezna polja
10};
11const result: ChangeTicketState200Response = await changeTicketState(tenantId, userId, id, changeTicketStateBody);
12

Kreiraj zahtjev Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Da
createTicketBody CreateTicketBody Da

Odgovor

Vraća: CreateTicket200Response

Primjer

Primjer 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', // neobavezno polje uključeno
8 contactEmail: 'jane.doe@acme-corp.com',
9 ccEmails: ['eng-oncall@acme-corp.com'], // neobavezno polje uključeno
10 metadata: { page: '/blog/product-update', browser: 'Chrome 112' } // neobavezno
11};
12const response: CreateTicket200Response = await createTicket(tenantId, userId, createTicketBody);
13

Dohvati zahtjev Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
userId string Ne

Odgovor

Vraća: GetTicket200Response

Primjer

getTicket Primjer
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

Dohvati zahtjeve Internal Link

Parametri

Name Tip Obavezno Opis
tenantId string Da
userId string Ne
state number Ne
skip number Ne
limit number Ne

Odgovor

Vraća: GetTickets200Response

Primjer

getTickets Primjer
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

Dohvati prijevode Internal Link

Parametri

Naziv Tip Obavezno Opis
namespace string Da
component string Da
locale string Ne
useFullTranslationIds boolean Ne

Odgovor

Vraća: GetTranslationsResponse

Primjer

getTranslations Primjer
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

Prenesi sliku Internal Link


Otpremi i promijeni veličinu slike

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
file Blob Da
sizePreset SizePreset Ne
urlId string Ne

Odgovor

Vraća: UploadImageResponse


Dohvati napredak značke korisnika po ID-u Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetUserBadgeProgressById200Response

Primjer

getUserBadgeProgressById Primjer
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

Dohvati napredak značke korisnika po korisničkom ID-u Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Da

Odgovor

Vraća: GetUserBadgeProgressById200Response

Primjer

Primjer getUserBadgeProgressByUserId
Copy Copy
1
2const tenantId: string = 'tenant_7f9c2d3b';
3const maybeUserId: string | undefined = 'user_4b8e1f9a'; // neobavezni izvor (može biti undefined)
4const userId: string = maybeUserId ?? 'user_fallback0001';
5const result: GetUserBadgeProgressById200Response = await getUserBadgeProgressByUserId(tenantId, userId);
6console.log(result);
7

Dohvati listu napretka znački korisnika Internal Link

Parametri

Name Type Required Description
tenantId string Da
userId string Ne
limit number Ne
skip number Ne

Odgovor

Vraća: GetUserBadgeProgressList200Response

Primjer

Primjer 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

Kreiraj značku korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
createUserBadgeParams CreateUserBadgeParams Da

Odgovor

Vraća: CreateUserBadge200Response

Primjer

Primjer 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 } // neobavezni parametar
11};
12const result: CreateUserBadge200Response = await createUserBadge(tenantId, params);
13

Izbriši značku korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: UpdateUserBadge200Response

Primjer

deleteUserBadge Primjer
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

Dohvati značku korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetUserBadge200Response

Primjer

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

Dohvati značke korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
userId string Ne
badgeId string Ne
type number Ne
displayedOnComments boolean Ne
limit number Ne
skip number Ne

Odgovor

Vraća: GetUserBadges200Response

Primjer

getUserBadges Primjer
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

Ažuriraj značku korisnika Internal Link

Parametri

Name Type Required Description
tenantId string Da
id string Da
updateUserBadgeParams UpdateUserBadgeParams Da

Odgovor

Vraća: UpdateUserBadge200Response

Primjer

Primjer 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

Dohvati broj obavijesti korisnika Internal Link

Parametri

Ime Tip Obavezno Opis
tenantId string Da
sso string Ne

Odgovor

Vraća: GetUserNotificationCount200Response

Primjer

getUserNotificationCount Primjer
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

Dohvati obavijesti korisnika Internal Link

Parametri

Name Type Required Description
tenantId string Da
pageSize number Ne
afterId string Ne
includeContext boolean Ne
afterCreatedAt number Ne
unreadOnly boolean Ne
dmOnly boolean Ne
noDm boolean Ne
includeTranslations boolean Ne
sso string Ne

Odgovor

Vraća: GetUserNotifications200Response

Primjer

Primjer 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

Resetiraj broj obavijesti korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
sso string Ne

Odgovor

Vraća: ResetUserNotifications200Response

Primjer

Primjer 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

Resetiraj obavijesti korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
afterId string Ne
afterCreatedAt number Ne
unreadOnly boolean Ne
dmOnly boolean Ne
noDm boolean Ne
sso string Ne

Odgovor

Vraća: ResetUserNotifications200Response

Primjer

Primjer 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

Ažuriraj status pretplate na obavijesti o komentarima korisnika Internal Link

Omogućite ili onemogućite obavijesti za određeni komentar.

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
notificationId string Da
optedInOrOut UpdateUserNotificationCommentSubscriptionStatusOptedInOrOutEnum Da
commentId string Da
sso string Ne

Odgovor

Vraća: UpdateUserNotificationStatus200Response

Primjer

Primjer 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

Ažuriraj status pretplate na obavijesti o stranicama korisnika Internal Link


Omogućite ili onemogućite obavijesti za stranicu. Kada su korisnici pretplaćeni na stranicu, obavijesti se stvaraju za nove root komentare, i također

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
url string Da
pageTitle string Da
subscribedOrUnsubscribed UpdateUserNotificationPageSubscriptionStatusSubscribedOrUnsubscribedEnum Da
sso string Ne

Odgovor

Vraća: UpdateUserNotificationStatus200Response

Primjer

Primjer 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

Ažuriraj status obavijesti korisnika Internal Link

Parametri

Ime Tip Obavezno Opis
tenantId string Da
notificationId string Da
newStatus UpdateUserNotificationStatusNewStatusEnum Da
sso string Ne

Odgovor

Vraća: UpdateUserNotificationStatus200Response

Primjer

Primjer 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

Dohvati statuse prisutnosti korisnika Internal Link

Parametri

Ime Tip Obavezno Opis
tenantId string Da
urlIdWS string Da
userIds string Da

Odgovor

Vraća: GetUserPresenceStatuses200Response

Primjer

Primjer 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'; // neobavezni izvor
5const userIds: string = maybeUserIds ?? 'user_123';
6const presence: GetUserPresenceStatuses200Response = await getUserPresenceStatuses(tenantId, urlIdWS, userIds);
7

Pretraži korisnike Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
usernameStartsWith string Ne
mentionGroupIds Array Ne
sso string Ne
searchSection SearchUsersSearchSectionEnum Ne

Odgovor

Vraća: SearchUsers200Response

Primjer

searchUsers Primjer
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

Dohvati korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da

Odgovor

Vraća: GetUser200Response

Primjer

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

Kreiraj glas Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
commentId string Da
direction CreateVoteDirectionEnum Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: VoteComment200Response

Primjer

Primjer 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

Izbriši glas Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
id string Da
editKey string Ne

Odgovor

Vraća: DeleteCommentVote200Response

Primjer

Primjer 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

Dohvati glasove Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da

Odgovor

Vraća: GetVotes200Response

Primjer

Primjer getVotes
Copy Copy
1
2const tenantId: string = 'acme-corp-8f3b';
3const refCampaign: string | undefined = 'newsletter-march2026'; // neobavezni parametar upita
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

Dohvati glasove za korisnika Internal Link

Parametri

Naziv Tip Obavezno Opis
tenantId string Da
urlId string Da
userId string Ne
anonUserId string Ne

Odgovor

Vraća: GetVotesForUser200Response

Primjer

getVotesForUser Primjer
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

Trebate pomoć?

Ako naiđete na bilo kakve probleme ili imate pitanja o JavaScript/TypeScript SDK-u, molimo:

Doprinosi

Doprinosi su dobrodošli! Molimo posjetite GitHub repozitorij za smjernice o doprinosu.