API комментариев для живых обсуждений

Комментарии, модерация и социальные ленты через один REST API и SDK для 10+ языков. Получайте, публикуйте и модерируйте с вашего бэкенда, а затем передавайте новую активность каждому читателю в реальном времени через WebSockets.

Одна платформа, три API

FastComments это больше, чем просто комментарии. Создавайте обсуждения, модерацию и социальные ленты на одном наборе API и SDK.

API комментариев

Древовидные комментарии и живой чат. Получайте, публикуйте, голосуйте, закрепляйте, отвечайте и ищите, со встроенными SSO и обновлениями в реальном времени.

API модерации

Отдельный набор инструментов модерации с 40+ эндпоинтами. Одобряйте, помечайте, блокируйте, банните, закрывайте и проверяйте, с автоматической фильтрацией спама.

API социальных лент

Создавайте ленты активности и социальные ленты с публикациями, медиа, реакциями и подписками, а затем отправляйте новые публикации каждому клиенту в реальном времени.

Вызывайте API из любого стека

cURL и типизированные SDK для Node, Python, PHP, Ruby, Go, Java, Rust, Swift и C++. Более 200 эндпоинтов охватывают комментарии, голоса, страницы, SSO-пользователей, публикации в лентах, модерацию и уведомления, и все это за одним ключом API.

Установкаnpm install fastcomments-sdk
import { createFastCommentsSDK } from 'fastcomments-sdk/server';

const sdk = createFastCommentsSDK({
  apiKey: 'your-api-key',               // server-side only
  basePath: 'https://fastcomments.com'  // optional (default)
});

// Fetch comments for a page
const { comments } = await sdk.publicApi.getCommentsPublic({
  tenantId: 'your-tenant-id',
  urlId: 'page-url-id'
});

// Post a comment
await sdk.publicApi.createCommentPublic({
  tenantId: 'your-tenant-id',
  broadcastId: crypto.randomUUID(),
  createComment: {
    urlId: 'page-url-id',
    url: 'https://example.com/post',
    comment: 'Hello from the API!',
    commenterName: 'Alice'
  }
});
# Fetch comments for a page
curl -s 'https://fastcomments.com/api/v1/comments?tenantId=your-tenant-id&urlId=page-url-id' \
  -H 'x-api-key: YOUR_API_KEY'
Установкаpip install fastcomments
import client
from client.api.public_api import GetCommentsPublicOptions

configuration = client.Configuration(host="https://fastcomments.com")
with client.ApiClient(configuration) as api_client:
    api = client.PublicApi(api_client)
    response = api.get_comments_public(
        "your-tenant-id",
        "page-url-id",
        GetCommentsPublicOptions(page=0, limit=30),
    )
    for comment in response.comments:
        print(comment.commenter_name, comment.comment)
Установкаcomposer require fastcomments/fastcomments-php
<?php
require_once(__DIR__ . '/vendor/autoload.php');

$api = new FastComments\Client\Api\PublicApi(new GuzzleHttp\Client());

$result = $api->getCommentsPublic('your-tenant-id', 'page-url-id', [
    'page'  => 0,
    'limit' => 30,
]);

foreach ($result->getComments() as $comment) {
    echo $comment->getCommenterName() . ': ' . $comment->getComment() . PHP_EOL;
}
Установкаgem install fastcomments
require 'fastcomments-client'

api = FastCommentsClient::PublicApi.new
result = api.get_comments_public('your-tenant-id', 'page-url-id', { page: 0, limit: 30 })

result.comments.each do |comment|
  puts "#{comment.commenter_name}: #{comment.comment}"
end
Установкаgo get github.com/fastcomments/fastcomments-go
package main

import (
	"context"
	"fmt"
	openapiclient "github.com/fastcomments/fastcomments-go/client"
)

func main() {
	client := openapiclient.NewAPIClient(openapiclient.NewConfiguration())

	resp, _, err := client.PublicAPI.
		GetCommentsPublic(context.Background(), "your-tenant-id").
		UrlId("page-url-id").Page(0).Limit(30).Execute()
	if err != nil {
		panic(err)
	}
	for _, c := range resp.Comments {
		fmt.Printf("%s: %s\n", c.GetCommenterName(), c.GetComment())
	}
}
import com.fastcomments.invoker.ApiClient;
import com.fastcomments.invoker.Configuration;
import com.fastcomments.api.PublicApi;

ApiClient client = Configuration.getDefaultApiClient();
client.setBasePath("https://fastcomments.com");

PublicApi api = new PublicApi(client);
var result = api.getCommentsPublic("your-tenant-id", "page-url-id")
                .page(0)
                .limit(30)
                .execute();
System.out.println(result.getComments());
use fastcomments_sdk::client::apis::configuration::Configuration;
use fastcomments_sdk::client::apis::public_api::{get_comments_public, GetCommentsPublicParams};

let config = Configuration::new();
let params = GetCommentsPublicParams {
    tenant_id: "your-tenant-id".to_string(),
    url_id: "page-url-id".to_string(),
    page: Some(0),
    limit: Some(30),
    ..Default::default()
};
let result = get_comments_public(&config, params).await.unwrap();
for comment in result.comments {
    println!("{:?}: {:?}", comment.commenter_name, comment.comment);
}
import FastCommentsSwift

var options = PublicAPI.GetCommentsPublicOptions()
options.page = 0
options.limit = 30

let result = try await PublicAPI.getCommentsPublic(
    tenantId: "your-tenant-id",
    urlId: "page-url-id",
    options: options
)
print(result.comments ?? [])
#include "FastCommentsClient/api/PublicApi.h"
#include "FastCommentsClient/ApiClient.h"
#include "FastCommentsClient/ApiConfiguration.h"

using namespace org::openapitools::client::api;

auto config = std::make_shared<ApiConfiguration>();
config->setBaseUrl(utility::conversions::to_string_t("https://fastcomments.com"));

PublicApi publicApi(std::make_shared<ApiClient>(config));

auto resp = publicApi.getCommentsPublic(
    utility::conversions::to_string_t("your-tenant-id"),
    utility::conversions::to_string_t("page-url-id")
).get();

Подпишитесь на живую ленту

Откройте одно соединение и получайте каждый новый комментарий, правку, голос и обновление присутствия в момент, когда они происходят. Ни одно событие не теряется: при переподключении event log перезапрашивается, чтобы воспроизвести все, что было отправлено, пока клиент был офлайн. Нативные подписчики WebSocket доступны для Node, React Native, Java, Swift и C++. Любой другой язык остается в реальном времени за счет опроса event log.

Установкаnpm install fastcomments-sdk
import { subscribeToChanges, LiveEventType } from 'fastcomments-sdk/browser';

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

const subscription = subscribeToChanges(
  config,
  'your-tenant-id',   // tenantIdWS
  'page-url-id',      // urlIdWS
  'user-session-id',  // userIdWS (from the getComments response)
  (event) => {
    if (event.type === LiveEventType.new_comment) {
      console.log('New comment:', event.comment?.comment);
    }
    return true;      // event handled
  },
  (isConnected) => console.log(isConnected ? 'connected' : 'disconnected')
);

// later: subscription.close();
Установкаnpm install fastcomments-react-native-sdk
import React, { useState } from 'react';
import { FastCommentsLiveCommenting } from 'fastcomments-react-native-sdk';
import { FastCommentsCommentWidgetConfig } from 'fastcomments-typescript';

export default function Comments() {
  // <FastCommentsLiveCommenting> subscribes to the live feed automatically.
  const [config] = useState<FastCommentsCommentWidgetConfig>({
    tenantId: 'your-tenant-id',
    urlId: 'page-url-id',
    showLiveRightAway: true,
    countAll: true,
  });

  return <FastCommentsLiveCommenting config={config} />;
}
import com.fastcomments.pubsub.LiveEventSubscriber;
import com.fastcomments.pubsub.SubscribeToChangesResult;
import com.fastcomments.core.CommentWidgetConfig;
import com.fastcomments.model.LiveEventType;

CommentWidgetConfig config = new CommentWidgetConfig();
config.tenant = "your-tenant-id";
config.urlId = "page-url-id";

LiveEventSubscriber subscriber = new LiveEventSubscriber();
SubscribeToChangesResult result = subscriber.subscribeToChanges(
    config,
    "your-tenant-id",   // tenantIdWS
    "page-url-id",      // urlId
    "page-url-id",      // urlIdWS
    "my-presence-id",   // userIdWS
    null,               // canSeeCommentsCallback (optional)
    (event) -> {
        if (event.getType() == LiveEventType.NEW_COMMENT) {
            System.out.println("New comment: " + event.getComment().getId());
        }
    }
);
// later: result.close();
import FastCommentsSwift

let config = LiveEventConfig(
    tenantId: "your-tenant-id",
    urlId: "page-url-id",
    urlIdWS: "page-url-id",   // URL-safe id for the WS server
    userIdWS: "my-presence-id"
)

let subscriber = LiveEventSubscriber()
let result = subscriber.subscribeToChanges(config: config) { event in
    if event.type == .newComment, let comment = event.comment {
        print("New comment: \(comment.id ?? "")")
    }
}
// later: result?.close()
#include <fastcomments/live/live_stream.hpp>
#include <iostream>

using namespace fastcomments::live;

LiveStreamConfig cfg;
cfg.wsBaseUrl = "wss://fastcomments.com";   // no trailing slash

LiveStream stream(cfg);
stream.onEvent([](const LiveEvent& ev) {
    if (ev.type == EventType::NewComment) {
        std::cout << "New comment at " << ev.timestamp << std::endl;
    }
});

stream.subscribe("your-tenant-id", "page-url-id", "my-presence-id").wait();
// later: stream.close().wait();
Установкаpip install fastcomments
import time
import client

configuration = client.Configuration(host="https://fastcomments.com")
with client.ApiClient(configuration) as api_client:
    api = client.PublicApi(api_client)
    start_time = int(time.time() * 1000)  # ms epoch
    while True:
        result = api.get_event_log(
            "your-tenant-id", "page-url-id", "my-user-id", start_time
        )
        for event in result.events:
            print("event:", event.data)
            start_time = int(event.created_at.timestamp() * 1000) + 1
        time.sleep(2)
# startTime = epoch millis to replay from; advance it past the last event you saw
curl -s 'https://fastcomments.com/api/v1/event-log/your-tenant-id?urlId=page-url-id&userIdWS=my-user-id&startTime=1720560000000' \
  -H 'x-api-key: YOUR_API_KEY'

Нативные мобильные SDK, готовые к внедрению

Не тратьте время на создание и поддержку собственного интерфейса комментариев. Наши отдельные, поддерживаемые SDK для React Native, Android и iOS содержат нативные UI-компоненты для древовидных комментариев, живого чата и лент. Добавьте представление, передайте конфигурацию, и готово.

React Native

npm: fastcomments-react-native-sdk

Нативные компоненты, без webview. Добавьте FastCommentsLiveCommenting, FastCommentsLiveChat или FastCommentsFeed и передайте конфигурацию.

Посмотреть живое демо

Android

com.fastcomments:sdk

Нативные UI-компоненты Android. Добавьте FastCommentsView в свою разметку для древовидных комментариев, голосования, уведомлений и лент. Android 8.0+.

Смотреть на GitHub

iOS

Swift Package: FastCommentsUI

Нативная библиотека SwiftUI для древовидных комментариев, социальных лент и живого чата. iOS 16+ и macOS 14+.

Смотреть на GitHub

То, что иначе пришлось бы создавать самому

200+ REST-эндпоинтов

Один ключ API, один базовый URL. Все, что делает панель управления, может делать и ваш код.

SDK для 10+ языков

Типизированные клиенты для Node, Python, PHP, Ruby, Go, Java, Rust, Swift, C++ и других, чтобы вы разрабатывали в своем стеке, а не в нашем.

Реальное время через WebSockets

Новые комментарии доходят до каждого читателя в момент публикации, без обновления страницы и без опроса. Если читатель переподключается, пропущенные события воспроизводятся из журнала.

Модерация, SSO и защита от спама

Единый вход, модерация комментариев и фильтрация спама встроены изначально, поэтому сложные задачи решены еще до того, как вы напишете первую строку.

Хостинг и масштабирование за вас

Мы обеспечиваем хранилище и инфраструктуру реального времени в глобальной сети. Вы вызываете API и выпускаете продукт.

Что вы можете создать

Один набор API и SDK за комментариями, чатом и живой активностью в веб-, мобильных и серверных приложениях.

Комнаты живого чата

Передавайте сообщения всем в комнате в реальном времени, со счетчиками присутствия и индикацией набора текста.

Ветки комментариев

Добавляйте вложенные разделы комментариев с голосованием к статьям, товарам и публикациям всего несколькими вызовами API.

Ленты активности

Публикуйте в ленту и отправляйте новые элементы и реакции подключенным клиентам по мере их поступления.

Вопросы-ответы и опросы

Собирайте вопросы, ответы, голоса и результаты опросов, а затем ранжируйте и отображайте их в реальном времени.

Запуск в три шага

1

Получите ключ API

Начните бесплатный пробный период и возьмите ID тенанта и ключ API из панели управления.

2

Установите SDK

Добавьте SDK для своего языка или вызывайте REST API напрямую через cURL с заголовком x-api-key.

3

Получайте, публикуйте и запускайте

Загружайте комментарии, публикуйте с вашего бэкенда и подписывайтесь на изменения, чтобы передавать обновления каждому читателю.

Глобальное распределение и высокая доступность

FastComments работает в нескольких регионах на нашей собственной инфраструктуре. Записи реплицируются между регионами, узлы автоматически переключаются при сбоях, а читатели обслуживаются из ближайшего к ним расположения.

Мультимастер, мультирегион

Записи принимаются более чем в одном регионе и реплицируются между ними, поэтому нет единой точки отказа.

Наша собственная edge-сеть

Комментарии и медиа обслуживаются нашими собственными глобальными CDN и DNS, доставляясь из ближайшего к вашим пользователям расположения. Без сторонних CDN.

Автоматическое переключение при сбоях

Резервные узлы переключаются самостоятельно, поэтому трафик продолжает идти даже во время сбоя. С показателем аптайма 99.99%.

Региональное хранение данных

Работайте в US или EU. Регион EU на eu.fastcomments.com хранит данные внутри региона для соответствия требованиям.

Присоединяйтесь к нашим довольным клиентам!

Тысячи довольных клиентов доверяют нам благодаря исключительному сервису, надежности и инновационным решениям. Присоединяйтесь к нашему растущему сообществу и почувствуйте разницу уже сегодня!

Начать

Частые вопросы об API комментариев

Обязательно ли использовать виджет FastComments?

Нет. Виджет опционален. Вы можете построить весь ваш опыт комментирования на REST API и SDK и отрисовывать все самостоятельно.

Для каких языков есть SDK?

Node, Python, PHP, Ruby, Go, Java, Rust, Swift, C++ и Nim, а также SDK для React Native для мобильных устройств. Любой язык также может вызывать REST API напрямую.

Как работает реальное время?

Клиенты открывают WebSocket и получают новые комментарии, правки, голоса и обновления присутствия в виде событий, поэтому нет ни обновления страницы, ни опроса. Ни одно событие не теряется: если клиент отключается, при переподключении он перезапрашивает event log, чтобы воспроизвести все, что было отправлено во время офлайна.

Нужно ли мне запускать собственный сервер WebSocket?

Нет. FastComments размещает инфраструктуру реального времени. Ваш клиент подписывается через SDK, а мы доставляем события.

Как остаются в реальном времени языки без нативного подписчика?

Они опрашивают эндпоинт event log, который возвращает каждое изменение с определенной временной метки. SDK для Node, React Native, Java, Swift и C++ вместо этого включают нативный подписчик WebSocket.

Как работает пагинация?

Именно для комментариев FastComments предварительно рассчитывает пагинацию при каждой записи для оптимального времени загрузки, поэтому даже очень большие ветки разбиваются на страницы быстро.

Есть ли бесплатный пробный период?

Да. Начните бесплатный пробный период с полным доступом к API и SDK, без банковской карты. После пробного периода платные тарифы масштабируются вместе с вашим трафиком.

Где находится документация API?

Полный справочник по REST API и SDK находится на docs.fastcomments.com, где задокументированы каждый эндпоинт, параметр и ответ.

Могу ли я хранить данные в EU?

Да. FastComments обслуживает регион EU на eu.fastcomments.com, и SDK поддерживают маршрутизацию к нему.

Начните разработку за считанные минуты

Начните бесплатный пробный период, получите ключ API и добавьте живые обсуждения в свое приложение уже сегодня.