Generate the character's public-comment activity: a top-level comment on a post, and threaded replies to people who reply underneath it. You report the post (and any incoming reply); the API returns the words the character should say. The connector posts the returned text — FluidTalk generates the comment and tracks the relationship, it never touches the platform itself.
All routes are under the production base URL:
https://api-talk.fluidvip.com/api/v1/characters
Every response is wrapped in the standard envelope — the real payload is under data, alongside a request_id (also returned as the X-Request-Id header). The shapes below describe the inner data. See Errors for the envelope and error model.
Method
Path
Purpose
POST
/comments
Generate a top-level comment for a post
POST
/comments/reply
Generate a threaded reply to a reply
Authentication. Send your per-character connector token in the X-Connector-Token header. The token is the character — there is no character_id; you name the platform in each request body and the bound workflow is selected for you. See Authentication.
One persona everywhere
Comments are cross-surface aware. The same lead who comments and DMs is one Person, so the character stays consistent and remembers across surfaces (DM ↔ comments) and across multiple posts and threads. recognized_lead and the aware summary reflect what the character already knows about this Person from elsewhere. See Concepts.
Both endpoints take an optional post object that gives the character context about what it is commenting on. Image URLs are described via vision, so the character can reference what is actually shown.
Field
Type
Description
caption
string
The post's caption text.
image_urls
string[]
URLs of the post's images. Each is described via vision so the comment can react to the picture, not just the words.
author_handle
string
The @username of whoever authored the post.
On POST /comments the post object carries the post being commented on. On POST /comments/reply it is optional — pass it only when the thread is new and the character hasn't seen this post yet.
The comment text to post on the platform. Absent on the not-configured no-op.
aware
object
A cross-surface awareness summary — what the character already knows about this Person from DMs and other threads. Informational; treat its inner fields as illustrative, not a stable contract.
recognized_lead
boolean
true when the post author / commenter is a Person the character already knows from another surface.
thread_id
string
Present once a comment thread exists for this post. Tracked for you — you don't pass it back.
ignored
string
Present only on the no-op ("comments not configured"); no comment is returned.
json
{ "data": { "ok": true, "comment": "okay that light is unreal 😍 how was the pace today?", "aware": { "recognized": false, "known_from": [] }, "recognized_lead": false, "thread_id": "thr_3f9c20a1" }, "request_id": "req_8f3c2a1b"}
Not configured is a safe no-op. If comments aren't enabled for this character on this platform, the call returns 200 with data of { "ok": true, "ignored": "comments not configured" }. No comment is generated and nothing is billed — so you can wire the call up before you turn comments on in the dashboard.
Paused characters generate nothing. If the character is paused (e.g. the account is over its plan's character limit after a downgrade), the call returns 200 with data of { "ok": true, "paused": true, "pause_reason": "plan_limit" }. No comment is generated and nothing is billed; the character resumes automatically once the plan is upgraded. See Paused characters.
Metered. Generating a comment costs model spend and is billed to the character owner's wallet. If the wallet can't cover it you get 402 payment_requiredbefore any model call (you're never charged for a refused generation). See Billing.
from fluidtalk import FluidTalkft = FluidTalk(token="ftc_live_...")res = ft.comment( platform="instagram", post_ref="https://instagram.com/p/Cabc123", caption="sunset run done 🌅", image_urls=["https://cdn.example.com/p/abc.jpg"], author_handle="ava",)# res.comment is the text to post (None / absent when comments aren't configured)if res.comment: publish_comment_on_instagram(res.comment) # you post it on the platform
typescript
import { FluidTalk } from "fluidtalk";const ft = new FluidTalk({ token: "ftc_live_..." });const res = await ft.comment({ platform: "instagram", postRef: "https://instagram.com/p/Cabc123", caption: "sunset run done 🌅", imageUrls: ["https://cdn.example.com/p/abc.jpg"], authorHandle: "ava",});if (res.comment) { await publishCommentOnInstagram(res.comment); // you post it on the platform}
Generate a reply to a reply on the character's comment. Threaded and cross-thread aware — it can fire multiple times within a thread, to the original poster or to other commenters. The character decides whether to engage, steer the person toward DMs, or stay quiet.
Metered. Like /comments, a generated reply is billed to the owner's wallet, and a wallet that can't cover it returns 402 before any model call. A "skip" decision still runs the model to make the call, so it is billed. See Billing.
curl -X POST https://api-talk.fluidvip.com/api/v1/characters/comments/reply \ -H "X-Connector-Token: ftc_live_..." \ -H "Content-Type: application/json" \ -d '{ "platform": "instagram", "post_ref": "https://instagram.com/p/Cabc123", "replier_handle": "mark", "reply_text": "haha you always make these look easy 😂", "parent_comment_ref": "17900000000000001" }'
python
res = ft.comment_reply( platform="instagram", post_ref="https://instagram.com/p/Cabc123", replier_handle="mark", reply_text="haha you always make these look easy 😂", parent_comment_ref="17900000000000001",)if res.decision != "skip" and res.reply: publish_reply_on_instagram(res.reply) # you post it on the platform
typescript
const res = await ft.commentReply({ platform: "instagram", postRef: "https://instagram.com/p/Cabc123", replierHandle: "mark", replyText: "haha you always make these look easy 😂", parentCommentRef: "17900000000000001",});if (res.decision !== "skip" && res.reply) { await publishReplyOnInstagram(res.reply); // you post it on the platform}
The SDKs raise typed errors — AuthError (401), PaymentRequiredError (402), PermissionError (403), NotFoundError (404), ConflictError (409), ValidationError (422), RateLimitError (429), and ApiError for anything else. See Errors for the full error model and Python / TypeScript for the typed exceptions.
API Reference — Comments
Generate the character's public-comment activity: a top-level comment on a post, and threaded replies to people who reply underneath it. You report the post (and any incoming reply); the API returns the words the character should say. The connector posts the returned text — FluidTalk generates the comment and tracks the relationship, it never touches the platform itself.
All routes are under the production base URL:
Every response is wrapped in the standard envelope — the real payload is under
data, alongside arequest_id(also returned as theX-Request-Idheader). The shapes below describe the innerdata. See Errors for the envelope and error model.POST/commentsPOST/comments/replyOne persona everywhere
Comments are cross-surface aware. The same lead who comments and DMs is one Person, so the character stays consistent and remembers across surfaces (DM ↔ comments) and across multiple posts and threads.
recognized_leadand theawaresummary reflect what the character already knows about this Person from elsewhere. See Concepts.The
postobject Both endpoints take an optional
postobject that gives the character context about what it is commenting on. Image URLs are described via vision, so the character can reference what is actually shown.captionimage_urlsauthor_handle@usernameof whoever authored the post.On
POST /commentsthepostobject carries the post being commented on. OnPOST /comments/replyit is optional — pass it only when the thread is new and the character hasn't seen this post yet.POST /commentsGenerate a top-level public comment for a post. You post the returned text on the platform.
Request body
platform"instagram". Selects the bound workflow.post_refpostpostobject — caption, image URLs, and author handle.Response
oktrueon success.commentawarerecognized_leadtruewhen the post author / commenter is a Person the character already knows from another surface.thread_idignored"comments not configured"); nocommentis returned.Examples
Status codes
code200ignored: "comments not configured").400invalid_requestplatformorpost_ref.401invalid_token402payment_required422validation_errorpost.image_urlsisn't a list).429rate_limitedRetry-Afterheader.500internal_errorPOST /comments/replyGenerate a reply to a reply on the character's comment. Threaded and cross-thread aware — it can fire multiple times within a thread, to the original poster or to other commenters. The character decides whether to engage, steer the person toward DMs, or stay quiet.
Request body
platform"instagram".post_refreplier_handle@usernameof whoever replied.reply_textparent_comment_refpostpostobject — pass it only when the thread is new and the character hasn't seen this post yet.Response
oktrueon success.decision"engage","drive_to_dm", or"skip".replynullwhen the character chose not to reply (a"skip"decision).reasonawareWhen the character decides to stay quiet,
replyisnull— post nothing:Examples
Status codes
code200"skip"decision (reply: null) is still a200.400invalid_requestplatform,post_ref, orreplier_handle.401invalid_token402payment_required422validation_error429rate_limitedRetry-Afterheader.500internal_errorErrors
The SDKs raise typed errors —
AuthError(401),PaymentRequiredError(402),PermissionError(403),NotFoundError(404),ConflictError(409),ValidationError(422),RateLimitError(429), andApiErrorfor anything else. See Errors for the full error model and Python / TypeScript for the typed exceptions.Related
recognized_lead/aware.