Комментарии, модерация и социальные ленты через один REST API и SDK для 10+ языков. Получайте, публикуйте и модерируйте с вашего бэкенда, а затем передавайте новую активность каждому читателю в реальном времени через WebSockets.
FastComments это больше, чем просто комментарии. Создавайте обсуждения, модерацию и социальные ленты на одном наборе API и SDK.
Древовидные комментарии и живой чат. Получайте, публикуйте, голосуйте, закрепляйте, отвечайте и ищите, со встроенными SSO и обновлениями в реальном времени.
Отдельный набор инструментов модерации с 40+ эндпоинтами. Одобряйте, помечайте, блокируйте, банните, закрывайте и проверяйте, с автоматической фильтрацией спама.
Создавайте ленты активности и социальные ленты с публикациями, медиа, реакциями и подписками, а затем отправляйте новые публикации каждому клиенту в реальном времени.
cURL и типизированные SDK для Node, Python, PHP, Ruby, Go, Java, Rust, Swift и C++. Более 200 эндпоинтов охватывают комментарии, голоса, страницы, SSO-пользователей, публикации в лентах, модерацию и уведомления, и все это за одним ключом API.
npm install fastcomments-sdkimport { 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 fastcommentsimport 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 fastcommentsrequire '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-gopackage 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-sdkimport { 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-sdkimport 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 fastcommentsimport 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 для React Native, Android и iOS содержат нативные UI-компоненты для древовидных комментариев, живого чата и лент. Добавьте представление, передайте конфигурацию, и готово.
npm: fastcomments-react-native-sdk
Нативные компоненты, без webview. Добавьте FastCommentsLiveCommenting, FastCommentsLiveChat или FastCommentsFeed и передайте конфигурацию.
Посмотреть живое демоcom.fastcomments:sdk
Нативные UI-компоненты Android. Добавьте FastCommentsView в свою разметку для древовидных комментариев, голосования, уведомлений и лент. Android 8.0+.
Смотреть на GitHubSwift Package: FastCommentsUI
Нативная библиотека SwiftUI для древовидных комментариев, социальных лент и живого чата. iOS 16+ и macOS 14+.
Смотреть на GitHubОдин ключ API, один базовый URL. Все, что делает панель управления, может делать и ваш код.
Типизированные клиенты для Node, Python, PHP, Ruby, Go, Java, Rust, Swift, C++ и других, чтобы вы разрабатывали в своем стеке, а не в нашем.
Новые комментарии доходят до каждого читателя в момент публикации, без обновления страницы и без опроса. Если читатель переподключается, пропущенные события воспроизводятся из журнала.
Единый вход, модерация комментариев и фильтрация спама встроены изначально, поэтому сложные задачи решены еще до того, как вы напишете первую строку.
Мы обеспечиваем хранилище и инфраструктуру реального времени в глобальной сети. Вы вызываете API и выпускаете продукт.
Один набор API и SDK за комментариями, чатом и живой активностью в веб-, мобильных и серверных приложениях.
Передавайте сообщения всем в комнате в реальном времени, со счетчиками присутствия и индикацией набора текста.
Добавляйте вложенные разделы комментариев с голосованием к статьям, товарам и публикациям всего несколькими вызовами API.
Публикуйте в ленту и отправляйте новые элементы и реакции подключенным клиентам по мере их поступления.
Собирайте вопросы, ответы, голоса и результаты опросов, а затем ранжируйте и отображайте их в реальном времени.
Начните бесплатный пробный период и возьмите ID тенанта и ключ API из панели управления.
Добавьте SDK для своего языка или вызывайте REST API напрямую через cURL с заголовком x-api-key.
Загружайте комментарии, публикуйте с вашего бэкенда и подписывайтесь на изменения, чтобы передавать обновления каждому читателю.
FastComments работает в нескольких регионах на нашей собственной инфраструктуре. Записи реплицируются между регионами, узлы автоматически переключаются при сбоях, а читатели обслуживаются из ближайшего к ним расположения.
Записи принимаются более чем в одном регионе и реплицируются между ними, поэтому нет единой точки отказа.
Комментарии и медиа обслуживаются нашими собственными глобальными CDN и DNS, доставляясь из ближайшего к вашим пользователям расположения. Без сторонних CDN.
Резервные узлы переключаются самостоятельно, поэтому трафик продолжает идти даже во время сбоя. С показателем аптайма 99.99%.
Работайте в US или EU. Регион EU на eu.fastcomments.com хранит данные внутри региона для соответствия требованиям.
Тысячи довольных клиентов доверяют нам благодаря исключительному сервису, надежности и инновационным решениям. Присоединяйтесь к нашему растущему сообществу и почувствуйте разницу уже сегодня!
Начать
Нет. Виджет опционален. Вы можете построить весь ваш опыт комментирования на REST API и SDK и отрисовывать все самостоятельно.
Node, Python, PHP, Ruby, Go, Java, Rust, Swift, C++ и Nim, а также SDK для React Native для мобильных устройств. Любой язык также может вызывать REST API напрямую.
Клиенты открывают WebSocket и получают новые комментарии, правки, голоса и обновления присутствия в виде событий, поэтому нет ни обновления страницы, ни опроса. Ни одно событие не теряется: если клиент отключается, при переподключении он перезапрашивает event log, чтобы воспроизвести все, что было отправлено во время офлайна.
Нет. FastComments размещает инфраструктуру реального времени. Ваш клиент подписывается через SDK, а мы доставляем события.
Они опрашивают эндпоинт event log, который возвращает каждое изменение с определенной временной метки. SDK для Node, React Native, Java, Swift и C++ вместо этого включают нативный подписчик WebSocket.
Именно для комментариев FastComments предварительно рассчитывает пагинацию при каждой записи для оптимального времени загрузки, поэтому даже очень большие ветки разбиваются на страницы быстро.
Да. Начните бесплатный пробный период с полным доступом к API и SDK, без банковской карты. После пробного периода платные тарифы масштабируются вместе с вашим трафиком.
Полный справочник по REST API и SDK находится на docs.fastcomments.com, где задокументированы каждый эндпоинт, параметр и ответ.
Да. FastComments обслуживает регион EU на eu.fastcomments.com, и SDK поддерживают маршрутизацию к нему.
Начните бесплатный пробный период, получите ключ API и добавьте живые обсуждения в свое приложение уже сегодня.