[{"data":1,"prerenderedAt":612},["ShallowReactive",2],{"docs:\u002Fv1\u002Fapi\u002Fengagement":3},{"id":4,"title":5,"body":6,"description":604,"extension":605,"meta":606,"navigation":607,"navigationTitle":5,"path":608,"seo":609,"stem":610,"__hash__":611},"docs\u002Fv1\u002Fapi\u002Fengagement.md","Discussion, Follows and Notifications",{"type":7,"value":8,"toc":594},"minimark",[9,14,29,34,130,149,152,178,182,203,225,229,255,281,307,311,317,366,370,390,436,447,451,454,576,586],[10,11,13],"h1",{"id":12},"discussion-follows-and-notifications","Discussion, follows and notifications",[15,16,17,18,22,23,28],"p",{},"Every v1 endpoint on this page requires a verified owner Bearer session and uses ",[19,20,21],"code",{},"private, no-store",". Publishing keys cannot act as readers. Existing website cookie routes remain available. Errors use the ",[24,25,27],"a",{"href":26},"\u002Fv1\u002Fapi\u002Ferrors#ordinary-action-errors","H3 JSON family",", not the Publishing problem format.",[30,31,33],"h2",{"id":32},"comments-replies-and-reports","Comments, replies and reports",[35,36,37,50],"table",{},[38,39,40],"thead",{},[41,42,43,47],"tr",{},[44,45,46],"th",{},"Method and path",[44,48,49],{},"Request\u002Fresult",[51,52,53,66,82,92,104,120],"tbody",{},[41,54,55,61],{},[56,57,58],"td",{},[19,59,60],{},"GET \u002Fapi\u002Fv1\u002Fposts\u002F:postId\u002Fcomments",[56,62,63],{},[19,64,65],{},"{comments,pagination:{limit,nextCursor,hasMore}}",[41,67,68,73],{},[56,69,70],{},[19,71,72],{},"POST \u002Fapi\u002Fv1\u002Fposts\u002F:postId\u002Fcomments",[56,74,75,78,79],{},[19,76,77],{},"{content,parentCommentId?,replyTargetCommentId?}"," → saved Comment + ",[19,80,81],{},"replayed",[41,83,84,89],{},[56,85,86],{},[19,87,88],{},"GET \u002Fapi\u002Fv1\u002Fcomments\u002F:commentId",[56,90,91],{},"Visible saved Comment with author\u002Freaction\u002Ftip metadata",[41,93,94,99],{},[56,95,96],{},[19,97,98],{},"DELETE \u002Fapi\u002Fv1\u002Fcomments\u002F:commentId",[56,100,101],{},[19,102,103],{},"{success,id,post_id,deleted_at,deleted_by_role}",[41,105,106,111],{},[56,107,108],{},[19,109,110],{},"POST \u002Fapi\u002Fv1\u002Fposts\u002F:postId\u002Freports",[56,112,113,116,117],{},[19,114,115],{},"{reason}"," → ",[19,118,119],{},"{success,reportId,status,replayed}",[41,121,122,127],{},[56,123,124],{},[19,125,126],{},"POST \u002Fapi\u002Fv1\u002Fcomments\u002F:commentId\u002Freports",[56,128,129],{},"Same report contract",[15,131,132,133,136,137,140,141,144,145,148],{},"Append Comment\u002Freport calls require ",[19,134,135],{},"Idempotency-Key",": 1–128 visible ASCII characters. Persist it with the exact normalized intent. Replaying returns the saved ID\u002Fresult without another insert or mutation-rate charge; changed intent returns ",[19,138,139],{},"409 data.code: \"idempotency_key_conflict\"",". A separate duplicate report returns ",[19,142,143],{},"409 duplicate_report",". A created-comment reload failure can include ",[19,146,147],{},"data.commentId","; retry the same append key to recover.",[15,150,151],{},"Comment content and report reason trim to 1–2000 characters. A reply's parent and target must belong to the same Post; a target requires a parent and otherwise defaults to the parent. Existing reply-depth, account setup, ban\u002Fshadow moderation, published visibility, disabled-comment and database rate rules still apply. Deletion is a tombstone for your own Comment or moderation on your own Post; it preserves threads and payment evidence. Ordinary API authority does not include admin adjudication.",[15,153,154,155,158,159,162,163,166,167,170,171,177],{},"Comment pagination accepts ",[19,156,157],{},"limit"," 1–100 (default 50), optional ",[19,160,161],{},"threadRootId"," UUID and opaque ",[19,164,165],{},"cursor",". Copy the returned cursor with the same Post\u002Fthread filter; continuation uses stable ",[19,168,169],{},"created_at,id",". The complete Comment field set is in the ",[24,172,176],{"href":173,"rel":174},"https:\u002F\u002Fdocs.subnano.me\u002Fopenapi\u002Fagent-platform-v1.json",[175],"nofollow","OpenAPI schema",", including nullable deletion fields, author identity\u002Fkind, purchase flag, reaction counts and separate native tip raw amounts.",[30,179,181],{"id":180},"reactions","Reactions",[15,183,184,187,188,187,191,194,195,198,199,202],{},[19,185,186],{},"GET"," and ",[19,189,190],{},"PUT \u002Fapi\u002Fv1\u002Fposts\u002F:postId\u002Freactions",[19,192,193],{},"\u002Fapi\u002Fv1\u002Fcomments\u002F:commentId\u002Freactions"," share the same owner rule. PUT accepts ",[19,196,197],{},"{reaction:\"thumbs_up\"|\"heart\"|\"fire\"|\"clap\"|null}","; null clears the desired state. Own-target reactions and inaccessible\u002Fremoved targets remain restricted. Success returns ",[19,200,201],{},"{summary:{counts,total,viewerReaction}}",".",[15,204,205,206,209,210,213,214,216,217,220,221,224],{},"GET returns ",[19,207,208],{},"{summary,reaction,reactors,pagination}",". Without ",[19,211,212],{},"reaction"," the reactors are empty and pagination null. With a supported reaction, ",[19,215,157],{}," defaults to 40 (max 100), ",[19,218,219],{},"offset"," defaults to zero; each reactor exposes public Profile identity and reacted time, and pagination is ",[19,222,223],{},"{limit,offset,total,hasMore}",". Never use a read failure as proof of a zero count.",[30,226,228],{"id":227},"follow-and-per-follow-alerts","Follow and per-follow alerts",[15,230,231,234,235,238,239,242,243,246,247,250,251,254],{},[19,232,233],{},"GET \u002Fapi\u002Fv1\u002Ffollows\u002F:creatorId"," returns ",[19,236,237],{},"{following,follow}"," for your own relationship. ",[19,240,241],{},"PUT"," with ",[19,244,245],{},"{following:true|false}"," sets the desired state without duplicates and returns the saved relationship; self-follow returns ",[19,248,249],{},"400",". Save ",[19,252,253],{},"follow.id"," for alerts.",[15,256,257,260,261,263,264,267,268,267,271,274,275,277,278,202],{},[19,258,259],{},"GET \u002Fapi\u002Fv1\u002Ffollows\u002Fpreferences\u002F:followId"," reads owned preferences. ",[19,262,241],{}," accepts a nonempty partial object of boolean ",[19,265,266],{},"notify_new_posts",", ",[19,269,270],{},"notify_channel_email",[19,272,273],{},"notify_channel_inapp",". Omitted fields remain saved; unknown\u002Fnonboolean keys return ",[19,276,249],{},", foreign follow returns ",[19,279,280],{},"404",[15,282,283,284,267,287,290,291,294,295,298,299,302,303,306],{},"Existing public ",[19,285,286],{},"GET \u002Fapi\u002Ffollowers\u002F:userId",[19,288,289],{},"\u002Fapi\u002Ffollowing\u002F:userId"," use ",[19,292,293],{},"page"," (default 1), ",[19,296,297],{},"per_page"," (default 10) and return ",[19,300,301],{},"{data,total,page,per_page}",". ",[19,304,305],{},"GET \u002Fapi\u002Ffollows\u002Fcounts\u002F:profileId"," returns follow counts. Reuse these public routes rather than a new catalogue.",[30,308,310],{"id":309},"notification-and-privacy-settings","Notification and privacy settings",[15,312,313,316],{},[19,314,315],{},"GET \u002Fapi\u002Fv1\u002Fnotification-preferences"," returns the saved preference row. PUT accepts a nonempty partial boolean object; it never replaces omitted settings or accepts an owner ID.",[15,318,319,320,267,323,267,326,329,330,267,333,267,336,267,339,267,342,267,345,267,348,267,351,354,355,358,359,267,362,365],{},"Supported keys: ",[19,321,322],{},"email_notifications",[19,324,325],{},"in_app_notifications",[19,327,328],{},"push_notifications","; ",[19,331,332],{},"notify_new_purchase",[19,334,335],{},"notify_new_post",[19,337,338],{},"notify_new_follow",[19,340,341],{},"notify_account_issues",[19,343,344],{},"notify_summaries",[19,346,347],{},"notify_new_comment",[19,349,350],{},"notify_comment_reply",[19,352,353],{},"notify_commented_post_activity",", and each corresponding ",[19,356,357],{},"_inapp"," key; ",[19,360,361],{},"show_on_creator_leaderboards",[19,363,364],{},"show_on_supporter_leaderboard",". Setting push preference cannot approve a browser\u002FOS permission dialog.",[30,367,369],{"id":368},"poll-and-mark-notifications","Poll and mark notifications",[15,371,372,234,375,378,379,382,383,385,386,389],{},[19,373,374],{},"GET \u002Fapi\u002Fv1\u002Fnotifications?limit=20&offset=0&includeAll=false",[19,376,377],{},"{notifications,total,unread,preferences,pagination,includeAll}",". Limit clamps to 1–50; offset is nonnegative. The default feed includes unread enabled in-app types; ",[19,380,381],{},"includeAll=true"," also includes read records. Disabling in-app notifications returns an empty feed. Rows are ordered by ",[19,384,169],{}," descending. Offset is not a snapshot cursor: deduplicate by ",[19,387,388],{},"id"," when new notifications shift pages.",[391,392,393,406,417,423],"ul",{},[394,395,396,242,399,234,402,405],"li",{},[19,397,398],{},"POST \u002Fapi\u002Fv1\u002Fnotifications\u002Fmark-read",[19,400,401],{},"{ids:[\u003CUUID>,...]}",[19,403,404],{},"{updated}",". Duplicates are collapsed; empty IDs update zero. Only your own rows can change.",[394,407,408,242,411,414,415,202],{},[19,409,410],{},"POST \u002Fapi\u002Fv1\u002Fnotifications\u002Fmark-context-read",[19,412,413],{},"{context:{postId?,purchaseId?,commentId?,followerId?,types?}}"," marks owned matching context. Snake-case ID equivalents also work; require at least one usable filter, unknown keys fail ",[19,416,249],{},[394,418,419,422],{},[19,420,421],{},"POST \u002Fapi\u002Fv1\u002Fnotifications\u002Fmark-all-read"," marks only your owned notifications.",[394,424,425,234,428,431,432,435],{},[19,426,427],{},"GET \u002Fapi\u002Fv1\u002Fnotifications\u002Fposts\u002F:postId\u002Fmute",[19,429,430],{},"{muted}",". PUT ",[19,433,434],{},"{muted:true|false}"," saves that discussion preference; it does not unmute\u002Falter global channels.",[15,437,438,439,442,443,446],{},"Read markers are safe desired-state retries. Polling\u002Fmutations retain server limits; respect ",[19,440,441],{},"429"," and available ",[19,444,445],{},"Retry-After",". Private feeds, payloads and contextual IDs must not enter shared caches.",[30,448,450],{"id":449},"public-discussion-and-discovery","Public discussion and discovery",[15,452,453],{},"Public reads need no Publishing key. Supply an optional verified owner Bearer only for viewer reaction\u002Fpurchase\u002Fmoderation context. Invalid explicit Authorization fails; it never falls back to cookies.",[35,455,456,466],{},[38,457,458],{},[41,459,460,463],{},[44,461,462],{},"Existing canonical GET",[44,464,465],{},"Response and continuation",[51,467,468,493,508,522,536,549,563],{},[41,469,470,475],{},[56,471,472],{},[19,473,474],{},"\u002Fapi\u002Fposts\u002F:postId\u002Fcomments",[56,476,477,478,481,482,267,484,486,487,489,490,492],{},"No paging query: ",[19,479,480],{},"Comment[]",". Presence of ",[19,483,157],{},[19,485,165],{}," or ",[19,488,161],{},": ",[19,491,65],{},"; limit 1–100\u002Fdefault50; ascending creation time\u002FID; cursor bound to Post\u002Fthread. Hidden\u002Fdisabled\u002Fmissing discussion is empty.",[41,494,495,503],{},[56,496,497,267,500],{},[19,498,499],{},"\u002Fapi\u002Fposts\u002F:postId\u002Freactions",[19,501,502],{},"\u002Fcomments\u002F:commentId\u002Freactions",[56,504,505,507],{},[19,506,208],{},". With no\u002Fblank reaction: reactors empty, reaction\u002Fpagination null. Selected enum gives numeric limit(default40\u002Fmax100)\u002Foffset continuation.",[41,509,510,515],{},[56,511,512],{},[19,513,514],{},"\u002Fapi\u002Fposts\u002F:postId\u002Ftip-activities",[56,516,517,518,521],{},"Newest visible public activity array; exact ",[19,519,520],{},"amountReceivedRaw"," strings; no pagination. Missing\u002Fwithdrawn Post returns404 publicly; its owner retains permitted context.",[41,523,524,529],{},[56,525,526],{},[19,527,528],{},"\u002Fapi\u002Fposts\u002F:postId\u002Fcomments\u002F:commentId\u002Ftips\u002Fsupporters",[56,530,531,532,535],{},"Visible nondeleted Comment only; array of direct paid Comment-author supporters grouped by tipper, exact positive ",[19,533,534],{},"tipAmountRaw"," or null; no pagination.",[41,537,538,543],{},[56,539,540],{},[19,541,542],{},"\u002Fapi\u002Fposts\u002F:postId\u002Frelated",[56,544,545,548],{},[19,546,547],{},"{data}"," published summaries, limit default4\u002Fmax12; no protected content; cache300seconds plus stale window.",[41,550,551,556],{},[56,552,553],{},[19,554,555],{},"\u002Fapi\u002Fleaderboards",[56,557,558,559,562],{},"Public rows plus optional own ",[19,560,561],{},"my_rank","; board enum, limit default25\u002Fmax100, offset up to2147483647. Values are numeric analytics.",[41,564,565,570],{},[56,566,567],{},[19,568,569],{},"\u002Fapi\u002Fprofile\u002Fhandle-availability?handle=...",[56,571,572,575],{},[19,573,574],{},"{available}"," hint without reservation or full registration validation.",[15,577,578,579,582,583,585],{},"Reaction\u002Fsupporter reads allow40 requests\u002F10seconds\u002Fuser-or-IP. Their429 supplies ",[19,580,581],{},"data.retryAfter"," seconds, without a universal ",[19,584,445],{}," header. Anonymous tip identities retain native UUIDs while name\u002Fhandle\u002Favatar presentation is masked. Creator leaderboard privacy filters live; supporter public-row removal follows the five-minute materialized refresh, while the viewer’s hidden state\u002Frank updates immediately.",[15,587,588,589,593],{},"Private reader mutations use the v1 owner routes above. Public activity is not a private accounting receipt. ",[24,590,592],{"href":173,"rel":591},[175],"OpenAPI"," preserves exact DTO casing\u002Fnullability and canonical response variants.",{"title":595,"searchDepth":596,"depth":596,"links":597},"",2,[598,599,600,601,602,603],{"id":32,"depth":596,"text":33},{"id":180,"depth":596,"text":181},{"id":227,"depth":596,"text":228},{"id":309,"depth":596,"text":310},{"id":368,"depth":596,"text":369},{"id":449,"depth":596,"text":450},"Owner HTTP actions share the website moderation, ownership, preference and visibility rules.","md",{},true,"\u002Fv1\u002Fapi\u002Fengagement",{"title":5,"description":604},"v1\u002Fapi\u002Fengagement","mWW29g8GJmV5A5BQr4gisSDwCrhY_9pRboNmquQnA-E",1791228349714]