@productcraft/social 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.cts +1771 -802
  2. package/dist/index.d.ts +1771 -802
  3. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ interface paths {
13
13
  path?: never;
14
14
  cookie?: never;
15
15
  };
16
- /** List actors in a community. 50 per page by default (max 200) — paginate with the cursor returned in `pagination.next_cursor` while `pagination.has_more` is true. */
16
+ /** List actors in a community. 50 per page by default (max 200) — paginate with the cursor returned in `pagination.next_cursor` while `pagination.has_more` is true. Pass `?ids=<uuid,uuid,…>` (max 100) to batch-fetch specific actors instead — one hydration call for a screenful of ids; unknown ids are silently omitted and `pagination` is the exhausted shape (`next_cursor: null`). */
17
17
  get: operations["ActorController_list"];
18
18
  put?: never;
19
19
  /** Upsert an actor by external_id. Creates on first call, updates on subsequent calls with the same external_id. Idempotent on `(community, external_id)`. Note: omitted fields on a follow-up call are overwritten with the new body — pass every field you want to keep on each call. */
@@ -24,6 +24,40 @@ interface paths {
24
24
  patch?: never;
25
25
  trace?: never;
26
26
  };
27
+ "/v1/communities/{communityId}/actors/batch": {
28
+ parameters: {
29
+ query?: never;
30
+ header?: never;
31
+ path?: never;
32
+ cookie?: never;
33
+ };
34
+ get?: never;
35
+ put?: never;
36
+ /** Bulk actor upsert (max 200 per call) — the import lane. Each item runs the exact single-upsert path; results come back per item with partial success (`201` even when some items fail — inspect `success` / `error` per entry). No wrapping transaction. */
37
+ post: operations["ActorController_batchUpsert"];
38
+ delete?: never;
39
+ options?: never;
40
+ head?: never;
41
+ patch?: never;
42
+ trace?: never;
43
+ };
44
+ "/v1/communities/{communityId}/actors/by-external/batch": {
45
+ parameters: {
46
+ query?: never;
47
+ header?: never;
48
+ path?: never;
49
+ cookie?: never;
50
+ };
51
+ get?: never;
52
+ put?: never;
53
+ /** Batch-resolve external_ids to actors (max 200 per call). POST-only — external_ids are up to 256 chars and can't ride a querystring. Unknown ids come back in `missing[]` instead of failing the call. */
54
+ post: operations["ActorController_batchGetByExternal"];
55
+ delete?: never;
56
+ options?: never;
57
+ head?: never;
58
+ patch?: never;
59
+ trace?: never;
60
+ };
27
61
  "/v1/communities/{communityId}/actors/by-external/{externalId}": {
28
62
  parameters: {
29
63
  query?: never;
@@ -67,7 +101,7 @@ interface paths {
67
101
  path?: never;
68
102
  cookie?: never;
69
103
  };
70
- /** List actors this actor has blocked. */
104
+ /** List actors this actor has blocked. Pass `?expand=dst_actor` to nest each blocked actor's full row on the edge. */
71
105
  get: operations["EdgeController_listBlocks"];
72
106
  put?: never;
73
107
  post?: never;
@@ -178,7 +212,7 @@ interface paths {
178
212
  path?: never;
179
213
  cookie?: never;
180
214
  };
181
- /** List the actors who follow this actor. */
215
+ /** List the actors who follow this actor. Pass `?expand=src_actor` to nest each follower's full actor row on the edge — a followers screen renders from this one call. */
182
216
  get: operations["EdgeController_listFollowers"];
183
217
  put?: never;
184
218
  post?: never;
@@ -195,7 +229,7 @@ interface paths {
195
229
  path?: never;
196
230
  cookie?: never;
197
231
  };
198
- /** List the actors this actor follows. */
232
+ /** List the actors this actor follows. Pass `?expand=dst_actor` to nest each followee's full actor row on the edge (no N+1 hydration). */
199
233
  get: operations["EdgeController_listFollowing"];
200
234
  put?: never;
201
235
  post?: never;
@@ -322,7 +356,7 @@ interface paths {
322
356
  path?: never;
323
357
  cookie?: never;
324
358
  };
325
- /** List actors this actor has muted. */
359
+ /** List actors this actor has muted. Pass `?expand=dst_actor` to nest each muted actor's full row on the edge. */
326
360
  get: operations["EdgeController_listMutes"];
327
361
  put?: never;
328
362
  post?: never;
@@ -452,6 +486,26 @@ interface paths {
452
486
  patch: operations["NotificationController_markRead"];
453
487
  trace?: never;
454
488
  };
489
+ "/v1/communities/{communityId}/actors/{actorId}/post-state": {
490
+ parameters: {
491
+ query?: never;
492
+ header?: never;
493
+ path?: never;
494
+ cookie?: never;
495
+ };
496
+ get?: never;
497
+ put?: never;
498
+ /**
499
+ * Batch viewer-state hydration: the actor's reactions, bookmark, repost, and poll-vote state for up to 200 posts in one call.
500
+ * @description Read-over-POST (the id list is too large for a query string) — no side effects, no Idempotency-Key needed. Renders a whole feed page's "liked by you" / saved / reposted / voted state with one request on top of the feed call.
501
+ */
502
+ post: operations["ViewerStateController_postState"];
503
+ delete?: never;
504
+ options?: never;
505
+ head?: never;
506
+ patch?: never;
507
+ trace?: never;
508
+ };
455
509
  "/v1/communities/{communityId}/actors/{actorId}/restricts": {
456
510
  parameters: {
457
511
  query?: never;
@@ -459,7 +513,7 @@ interface paths {
459
513
  path?: never;
460
514
  cookie?: never;
461
515
  };
462
- /** List actors this actor has restricted. */
516
+ /** List actors this actor has restricted. Pass `?expand=dst_actor` to nest each restricted actor's full row on the edge. */
463
517
  get: operations["EdgeController_listRestricts"];
464
518
  put?: never;
465
519
  post?: never;
@@ -529,6 +583,26 @@ interface paths {
529
583
  patch?: never;
530
584
  trace?: never;
531
585
  };
586
+ "/v1/communities/{communityId}/actors/{srcActorId}/relationships": {
587
+ parameters: {
588
+ query?: never;
589
+ header?: never;
590
+ path?: never;
591
+ cookie?: never;
592
+ };
593
+ /**
594
+ * Batched pairwise relationship lookup: does this actor follow / mute / block / restrict each of up to 100 others (and is it followed / blocked back)?
595
+ * @description One query resolves the seven pairwise flags for a whole profile header or member list — no paging of full edge lists, and `blocked_by` is visible without attempting a write and handling the 409. Unknown or cross-community ids resolve to all-false flags; the id list is de-duplicated preserving request order. Bounded input (max 100 ids), so the response has no pagination envelope.
596
+ */
597
+ get: operations["EdgeController_relationships"];
598
+ put?: never;
599
+ post?: never;
600
+ delete?: never;
601
+ options?: never;
602
+ head?: never;
603
+ patch?: never;
604
+ trace?: never;
605
+ };
532
606
  "/v1/communities/{communityId}/blocks": {
533
607
  parameters: {
534
608
  query?: never;
@@ -613,7 +687,7 @@ interface paths {
613
687
  /** List the caller's conversations in this community, most-recent-activity first. */
614
688
  get: operations["ConversationController_list"];
615
689
  put?: never;
616
- /** Open a conversation. Default `kind="direct"` is the idempotent 1-on-1 path. Pass `kind="group"` with `actor_ids` for a multi-participant chat (always creates a new row; no idempotency for groups). */
690
+ /** Open a conversation. Default `kind="direct"` is the naturally-idempotent 1-on-1 path (get-or-create by participant pair). Pass `kind="group"` with `actor_ids` for a multi-participant chat — group creates always insert a new row, so pass an `Idempotency-Key` header to make group-create retries safe. */
617
691
  post: operations["ConversationController_create"];
618
692
  delete?: never;
619
693
  options?: never;
@@ -702,7 +776,7 @@ interface paths {
702
776
  /** List messages in the conversation. Default newest-first cursor. Pass `since` (encoded cursor of the last-seen message) to poll for newer messages instead. */
703
777
  get: operations["ConversationController_listMessages"];
704
778
  put?: never;
705
- /** Send a message in the conversation. */
779
+ /** Send a message in the conversation. Pass an `Idempotency-Key` header to make retries safe — a retried send never delivers the message twice. */
706
780
  post: operations["ConversationController_send"];
707
781
  delete?: never;
708
782
  options?: never;
@@ -797,6 +871,23 @@ interface paths {
797
871
  patch?: never;
798
872
  trace?: never;
799
873
  };
874
+ "/v1/communities/{communityId}/counters": {
875
+ parameters: {
876
+ query?: never;
877
+ header?: never;
878
+ path?: never;
879
+ cookie?: never;
880
+ };
881
+ /** Batch counters (max 100 actors per call) — render a member list with follower badges from ONE call instead of one per actor. Unknown actor_ids come back in `missing[]` instead of failing the read. */
882
+ get: operations["CounterController_getBatchCounters"];
883
+ put?: never;
884
+ post?: never;
885
+ delete?: never;
886
+ options?: never;
887
+ head?: never;
888
+ patch?: never;
889
+ trace?: never;
890
+ };
800
891
  "/v1/communities/{communityId}/discover-feed": {
801
892
  parameters: {
802
893
  query?: never;
@@ -848,6 +939,23 @@ interface paths {
848
939
  patch?: never;
849
940
  trace?: never;
850
941
  };
942
+ "/v1/communities/{communityId}/follows/batch": {
943
+ parameters: {
944
+ query?: never;
945
+ header?: never;
946
+ path?: never;
947
+ cookie?: never;
948
+ };
949
+ get?: never;
950
+ put?: never;
951
+ /** Bulk follow creation (max 200 per call) — the graph-import lane. Each item runs the exact single-follow path (block checks, counters, idempotency), so a blocked pair fails ITS item with a 409 in `error` while the rest of the batch proceeds. `201` even with failures — inspect per-item results. Set `suppress_notifications: true` when importing an existing graph. */
952
+ post: operations["EdgeController_batchFollows"];
953
+ delete?: never;
954
+ options?: never;
955
+ head?: never;
956
+ patch?: never;
957
+ trace?: never;
958
+ };
851
959
  "/v1/communities/{communityId}/follows/{srcActorId}/{dstActorId}": {
852
960
  parameters: {
853
961
  query?: never;
@@ -926,7 +1034,7 @@ interface paths {
926
1034
  /** List discoverable lists in this community. Public lists are visible to anyone; private lists surface only when `viewer_actor_id` is their owner. */
927
1035
  get: operations["ActorListController_list"];
928
1036
  put?: never;
929
- /** Create a new list. Default visibility `private`. */
1037
+ /** Create a new list. Default visibility `private`. List creation has no natural key (an owner can hold many same-named lists), so pass an `Idempotency-Key` header to make retries safe. */
930
1038
  post: operations["ActorListController_create"];
931
1039
  delete?: never;
932
1040
  options?: never;
@@ -1049,7 +1157,7 @@ interface paths {
1049
1157
  /** List posts. Pass `author_id` to filter to a single author. 50/page (max 200), cursor-paginated. */
1050
1158
  get: operations["PostController_list"];
1051
1159
  put?: never;
1052
- /** Create a post on behalf of an actor. */
1160
+ /** Create a post on behalf of an actor. Pass an `Idempotency-Key` header to make retries safe — replays return the original response with `Idempotent-Replay: true` for 24h. */
1053
1161
  post: operations["PostController_create"];
1054
1162
  delete?: never;
1055
1163
  options?: never;
@@ -1127,7 +1235,7 @@ interface paths {
1127
1235
  /** List comments on a post. Default returns top-level comments newest-first; pass `parent_id` to expand a thread (oldest-first). Pass `requester_id` so DM-style `author_only` replies surface only to the post-author and the comment-author pair. */
1128
1236
  get: operations["CommentController_list"];
1129
1237
  put?: never;
1130
- /** Add a comment on a post. Pass `parent_id` to reply; the depth is computed and capped by the community config. */
1238
+ /** Add a comment on a post. Pass `parent_id` to reply; the depth is computed and capped by the community config. Pass an `Idempotency-Key` header to make retries safe. */
1131
1239
  post: operations["CommentController_create"];
1132
1240
  delete?: never;
1133
1241
  options?: never;
@@ -1253,7 +1361,8 @@ interface paths {
1253
1361
  path?: never;
1254
1362
  cookie?: never;
1255
1363
  };
1256
- get?: never;
1364
+ /** List reactions on a post, newest-first. Cursor encodes `(created_at, actor_id, type)` so multi-reaction-from-same-actor stays stable. Pass `type` to narrow to one reaction type. */
1365
+ get: operations["PostReactionController_list"];
1257
1366
  put?: never;
1258
1367
  /** React to a post. Idempotent: re-posting the same (actor, type) returns the existing edge with `created: false`. */
1259
1368
  post: operations["PostReactionController_react"];
@@ -1499,10 +1608,10 @@ interface paths {
1499
1608
  path?: never;
1500
1609
  cookie?: never;
1501
1610
  };
1502
- /** Read the community's active webhook (or null). */
1503
- get: operations["WebhookController_getActive"];
1611
+ /** List the community's webhooks — disabled rows included, so an auto-disabled subscriber stays discoverable. */
1612
+ get: operations["WebhookController_list"];
1504
1613
  put?: never;
1505
- /** Create the community webhook. One active subscriber per community. Returns the signing secret ONCE — store it. */
1614
+ /** Create a community webhook. Multiple subscribers per community are supported (cap 10). Returns the signing secret ONCE — store it. Pass an `Idempotency-Key` header so a retried create replays the SAME secret instead of minting a duplicate subscriber. */
1506
1615
  post: operations["WebhookController_create"];
1507
1616
  delete?: never;
1508
1617
  options?: never;
@@ -1525,7 +1634,7 @@ interface paths {
1525
1634
  delete: operations["WebhookController_delete"];
1526
1635
  options?: never;
1527
1636
  head?: never;
1528
- /** Update webhook url + subscribed event types. */
1637
+ /** Update webhook url, subscribed event types, or disabled state. `{ "disabled": false }` is the re-enable path after an auto-disable — no secret rotation required. */
1529
1638
  patch: operations["WebhookController_update"];
1530
1639
  trace?: never;
1531
1640
  };
@@ -1546,6 +1655,23 @@ interface paths {
1546
1655
  patch?: never;
1547
1656
  trace?: never;
1548
1657
  };
1658
+ "/v1/communities/{communityId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver": {
1659
+ parameters: {
1660
+ query?: never;
1661
+ header?: never;
1662
+ path?: never;
1663
+ cookie?: never;
1664
+ };
1665
+ get?: never;
1666
+ put?: never;
1667
+ /** Re-publish a past delivery from its stored request body. Async (202). The payload is byte-identical to the original (same event id), so subscriber-side event-id dedupe treats it as a redelivery. */
1668
+ post: operations["WebhookController_redeliver"];
1669
+ delete?: never;
1670
+ options?: never;
1671
+ head?: never;
1672
+ patch?: never;
1673
+ trace?: never;
1674
+ };
1549
1675
  "/v1/communities/{communityId}/webhooks/{webhookId}/rotate-secret": {
1550
1676
  parameters: {
1551
1677
  query?: never;
@@ -1555,7 +1681,7 @@ interface paths {
1555
1681
  };
1556
1682
  get?: never;
1557
1683
  put?: never;
1558
- /** Rotate the signing secret. Also clears any auto-disable flag. Returns the new secret ONCE. */
1684
+ /** Rotate the signing secret. Also clears any auto-disable flag. Returns the new secret ONCE. Pass an `Idempotency-Key` header so a retried rotate replays the SAME new secret instead of rotating twice. */
1559
1685
  post: operations["WebhookController_rotateSecret"];
1560
1686
  delete?: never;
1561
1687
  options?: never;
@@ -1563,6 +1689,40 @@ interface paths {
1563
1689
  patch?: never;
1564
1690
  trace?: never;
1565
1691
  };
1692
+ "/v1/communities/{communityId}/webhooks/{webhookId}/test": {
1693
+ parameters: {
1694
+ query?: never;
1695
+ header?: never;
1696
+ path?: never;
1697
+ cookie?: never;
1698
+ };
1699
+ get?: never;
1700
+ put?: never;
1701
+ /** Enqueue a `ping` test delivery. Async (202): the dispatch worker signs and POSTs it exactly like a real event — SSRF guard, TLS, HMAC signature and all. Watch the deliveries list for the outcome. */
1702
+ post: operations["WebhookController_testPing"];
1703
+ delete?: never;
1704
+ options?: never;
1705
+ head?: never;
1706
+ patch?: never;
1707
+ trace?: never;
1708
+ };
1709
+ "/v1/webhook-event-types": {
1710
+ parameters: {
1711
+ query?: never;
1712
+ header?: never;
1713
+ path?: never;
1714
+ cookie?: never;
1715
+ };
1716
+ /** List the webhook event-type catalog. Static metadata, no auth required. Create/update webhooks reject anything not in this list with a 400. */
1717
+ get: operations["WebhookEventTypesController_list"];
1718
+ put?: never;
1719
+ post?: never;
1720
+ delete?: never;
1721
+ options?: never;
1722
+ head?: never;
1723
+ patch?: never;
1724
+ trace?: never;
1725
+ };
1566
1726
  "/v1/workspaces/{workspaceId}/communities": {
1567
1727
  parameters: {
1568
1728
  query?: never;
@@ -1573,7 +1733,7 @@ interface paths {
1573
1733
  /** List communities in a workspace */
1574
1734
  get: operations["CommunityController_list"];
1575
1735
  put?: never;
1576
- /** Create an social community. `app_id` is optional — when supplied Social connects the community to an Auth app and refuses if the app belongs to a different workspace (cross-tenant gate) or is already connected. Omit `app_id` for a standalone community (no Auth integration; the customer manages actor identity). */
1736
+ /** Create an social community. `app_id` is optional — when supplied Social connects the community to an Auth app and refuses if the app belongs to a different workspace (cross-tenant gate) or is already connected. Omit `app_id` for a standalone community (no Auth integration; the customer manages actor identity). Pass an `Idempotency-Key` header to make retries safe. */
1577
1737
  post: operations["CommunityController_create"];
1578
1738
  delete?: never;
1579
1739
  options?: never;
@@ -1626,7 +1786,7 @@ interface paths {
1626
1786
  };
1627
1787
  get?: never;
1628
1788
  put?: never;
1629
- /** Apply a shadow ban to an actor. The actor sees their own content normally; everyone else sees nothing from them. Pass `duration_hours` for a timed ban or omit for indefinite. */
1789
+ /** Apply a shadow ban to an actor. The actor sees their own content normally; everyone else sees nothing from them. Pass `duration_hours` for a timed ban or omit for indefinite. Pass an `Idempotency-Key` header so a retried timed ban doesn't restart the clock. */
1630
1790
  post: operations["ModerationAdminController_shadowBan"];
1631
1791
  /** Remove a shadow ban. No-op if not currently shadow-banned. */
1632
1792
  delete: operations["ModerationAdminController_unshadow"];
@@ -1712,7 +1872,7 @@ interface paths {
1712
1872
  };
1713
1873
  get?: never;
1714
1874
  put?: never;
1715
- /** Apply a moderation action to a flag. Records an audit entry and updates the target post/comment status. */
1875
+ /** Apply a moderation action to a flag. Records an audit entry and updates the target post/comment status. Pass an `Idempotency-Key` header so a retried request records ONE audit entry, not two. */
1716
1876
  post: operations["ModerationAdminController_act"];
1717
1877
  delete?: never;
1718
1878
  options?: never;
@@ -1740,6 +1900,12 @@ interface paths {
1740
1900
  }
1741
1901
  interface components {
1742
1902
  schemas: {
1903
+ ActOnFlagResponseDto: {
1904
+ /** @description The flag after the action (status flipped to actioned/dismissed for punitive/dismiss actions; reversals re-resolve it too). */
1905
+ flag: components["schemas"]["FlagResponseDto"];
1906
+ /** @description The audit row this action recorded. */
1907
+ moderation_action: components["schemas"]["ModerationActionResponseDto"];
1908
+ };
1743
1909
  ActorCountersResponseDto: {
1744
1910
  /**
1745
1911
  * @description Actor UUID.
@@ -1827,11 +1993,62 @@ interface components {
1827
1993
  list_id: string;
1828
1994
  };
1829
1995
  ActorListResponseDto: {
1996
+ /**
1997
+ * @description Owning community UUID.
1998
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
1999
+ */
2000
+ community_id: string;
2001
+ /**
2002
+ * @description ISO timestamp.
2003
+ * @example 2026-05-01T12:00:00.000Z
2004
+ */
2005
+ created_at: string;
2006
+ /**
2007
+ * @description Optional description.
2008
+ * @example Curated tech accounts I follow.
2009
+ */
2010
+ description: string | null;
2011
+ /**
2012
+ * @description List UUID.
2013
+ * @example llllllll-0000-0000-0000-000000000001
2014
+ */
2015
+ id: string;
2016
+ /**
2017
+ * @description Current member count.
2018
+ * @example 12
2019
+ */
2020
+ member_count: number;
2021
+ /**
2022
+ * @description List display name.
2023
+ * @example Tech news
2024
+ */
2025
+ name: string;
2026
+ /**
2027
+ * @description List owner — social actor UUID.
2028
+ * @example aaaaaaaa-0000-0000-0000-000000000001
2029
+ */
2030
+ owner_id: string;
2031
+ /**
2032
+ * @description ISO timestamp.
2033
+ * @example 2026-05-01T12:00:00.000Z
2034
+ */
2035
+ updated_at: string;
2036
+ /**
2037
+ * @description public = discoverable; private = owner-only.
2038
+ * @example public
2039
+ * @enum {string}
2040
+ */
2041
+ visibility: "public" | "private";
2042
+ };
2043
+ ActorPageResponseDto: {
1830
2044
  data: components["schemas"]["ActorResponseDto"][];
1831
2045
  pagination: components["schemas"]["PaginationResponseDto"];
1832
2046
  };
1833
2047
  ActorResponseDto: {
1834
- /** @description Avatar URL. */
2048
+ /**
2049
+ * @description Avatar URL.
2050
+ * @example https://cdn.example.com/avatars/ada.png
2051
+ */
1835
2052
  avatar_url: string | null;
1836
2053
  /**
1837
2054
  * @description Owning community UUID.
@@ -1839,43 +2056,46 @@ interface components {
1839
2056
  */
1840
2057
  community_id: string;
1841
2058
  /**
1842
- * @description ISO timestamp.
2059
+ * @description ISO timestamp the row was inserted.
1843
2060
  * @example 2026-05-01T12:00:00.000Z
1844
2061
  */
1845
2062
  created_at: string;
1846
2063
  /**
1847
2064
  * @description Display name.
1848
- * @example Alice
2065
+ * @example Ada Lovelace
1849
2066
  */
1850
2067
  display_name: string | null;
1851
2068
  /**
1852
- * @description Customer-supplied stable id.
1853
- * @example user-42
2069
+ * @description Customer-supplied stable identifier (your user id).
2070
+ * @example user_abc123
1854
2071
  */
1855
2072
  external_id: string;
1856
2073
  /**
1857
- * @description Actor UUID.
1858
- * @example aaaaaaaa-0000-0000-0000-000000000001
2074
+ * @description Social actor UUID.
2075
+ * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
1859
2076
  */
1860
2077
  id: string;
1861
- /** @description Free-form metadata. */
2078
+ /**
2079
+ * @description Free-form metadata blob.
2080
+ * @example {
2081
+ * "tier": "pro"
2082
+ * }
2083
+ */
1862
2084
  metadata: Record<string, never>;
1863
- /** @description ISO timestamp the shadow ban was applied, or null. */
1864
- shadow_banned_at: string | null;
1865
- /** @description Moderator note attached to the ban. */
1866
- shadow_banned_reason: string | null;
1867
- /** @description ISO timestamp the shadow ban auto-expires, or null for indefinite. */
1868
- shadow_banned_until: string | null;
1869
- /** @enum {string} */
2085
+ /**
2086
+ * @description Lifecycle status. `suspended` is moderator-applied via PATCH `status=suspended`; `deleted` is soft-deletion. Shadow-banning is a separate moderation mechanism that does not change `status`.
2087
+ * @example active
2088
+ * @enum {string}
2089
+ */
1870
2090
  status: "active" | "suspended" | "deleted";
1871
2091
  /**
1872
- * @description ISO timestamp.
2092
+ * @description ISO timestamp of the last update.
1873
2093
  * @example 2026-05-01T12:00:00.000Z
1874
2094
  */
1875
2095
  updated_at: string;
1876
2096
  };
1877
2097
  ActorSearchHitDto: {
1878
- actor: components["schemas"]["SearchActorResponseDto"];
2098
+ actor: components["schemas"]["ActorResponseDto"];
1879
2099
  /**
1880
2100
  * @description PG `ts_rank` score on the (display_name A, external_id B, bio C) tsvector. Higher = more relevant.
1881
2101
  * @example 0.6079
@@ -1886,6 +2106,17 @@ interface components {
1886
2106
  /** @description Up to `limit` (default 20, max 50) ranked hits. Not paginated in v1; results are bounded by `limit`. */
1887
2107
  data: components["schemas"]["ActorSearchHitDto"][];
1888
2108
  };
2109
+ ActorsByExternalBatchResponseDto: {
2110
+ /** @description Actors found, in request order (after de-duplication). */
2111
+ data: components["schemas"]["ActorResponseDto"][];
2112
+ /**
2113
+ * @description external_ids with no actor in this community.
2114
+ * @example [
2115
+ * "user_ghost"
2116
+ * ]
2117
+ */
2118
+ missing: string[];
2119
+ };
1889
2120
  AddCommentReactionResponseDto: {
1890
2121
  /**
1891
2122
  * @description `true` on first call; `false` on idempotent retry.
@@ -1901,6 +2132,18 @@ interface components {
1901
2132
  */
1902
2133
  reaction_counts: Record<string, never>;
1903
2134
  };
2135
+ AddListMemberDto: {
2136
+ /**
2137
+ * @description New member — social actor UUID.
2138
+ * @example aaaaaaaa-0000-0000-0000-000000000002
2139
+ */
2140
+ actor_id: string;
2141
+ /**
2142
+ * @description Caller — social actor UUID. Must equal the list owner.
2143
+ * @example aaaaaaaa-0000-0000-0000-000000000001
2144
+ */
2145
+ caller_actor_id: string;
2146
+ };
1904
2147
  AddMemberDto: {
1905
2148
  /**
1906
2149
  * @description The new member — social actor UUID.
@@ -1939,48 +2182,151 @@ interface components {
1939
2182
  data: components["schemas"]["ModerationActionResponseDto"][];
1940
2183
  pagination: components["schemas"]["PaginationResponseDto"];
1941
2184
  };
1942
- BookmarkListResponseDto: {
1943
- data: components["schemas"]["BookmarkResponseDto"][];
1944
- pagination: components["schemas"]["PaginationResponseDto"];
1945
- };
1946
- BookmarkResponseDto: {
2185
+ BatchActorResultDto: {
2186
+ /** @description The upserted actor — present on success. */
2187
+ actor?: components["schemas"]["ActorResponseDto"];
1947
2188
  /**
1948
- * @description Social actor UUID who saved the post.
1949
- * @example aaaaaaaa-0000-0000-0000-000000000001
2189
+ * @description `true` if this item inserted a new row, `false` on an update of an existing external_id. Present on success.
2190
+ * @example true
1950
2191
  */
1951
- actor_id: string;
2192
+ created?: boolean;
2193
+ /** @description The error this item would have returned as a standalone call — present on failure. */
2194
+ error?: components["schemas"]["ErrorResponseDto"];
1952
2195
  /**
1953
- * @description Owning community UUID.
1954
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
2196
+ * @description Position of this result in the request array.
2197
+ * @example 0
1955
2198
  */
1956
- community_id: string;
2199
+ index: number;
1957
2200
  /**
1958
- * @description ISO timestamp the bookmark was created.
1959
- * @example 2026-05-01T12:00:00.000Z
2201
+ * @description `true` when this item was upserted; `false` when it failed (see `error`).
2202
+ * @example true
1960
2203
  */
1961
- created_at: string;
2204
+ success: boolean;
2205
+ };
2206
+ BatchActorsResponseDto: {
2207
+ /** @description One result per input item, same order. */
2208
+ data: components["schemas"]["BatchActorResultDto"][];
1962
2209
  /**
1963
- * @description Saved post UUID.
1964
- * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
2210
+ * @description Count of failed items.
2211
+ * @example 1
1965
2212
  */
1966
- post_id: string;
1967
- };
1968
- BookmarkToggleResponseDto: {
1969
- bookmark: components["schemas"]["BookmarkResponseDto"];
2213
+ failed: number;
1970
2214
  /**
1971
- * @description `true` on first call (row inserted); `false` on idempotent retry of an existing bookmark.
1972
- * @example true
2215
+ * @description Count of successful items.
2216
+ * @example 199
1973
2217
  */
1974
- created: boolean;
2218
+ succeeded: number;
1975
2219
  };
1976
- CastVoteDto: {
2220
+ BatchCountersResponseDto: {
2221
+ /** @description Counters for each actor found, in `actor_ids` order (after de-duplication). */
2222
+ data: components["schemas"]["ActorCountersResponseDto"][];
1977
2223
  /**
1978
- * @description Voter social actor UUID.
1979
- * @example aaaaaaaa-0000-0000-0000-000000000002
2224
+ * @description actor_ids with no actor in this community.
2225
+ * @example []
1980
2226
  */
1981
- actor_id: string;
2227
+ missing: string[];
2228
+ };
2229
+ BatchExternalIdsDto: {
1982
2230
  /**
1983
- * @description Zero-based index into post.attributes.poll.options.
2231
+ * @description external_ids to resolve, 1–200 items (POST body — 256-char ids can't ride a querystring). Duplicates are de-duplicated.
2232
+ * @example [
2233
+ * "user_abc123",
2234
+ * "user_def456"
2235
+ * ]
2236
+ */
2237
+ external_ids: string[];
2238
+ };
2239
+ BatchFollowResultDto: {
2240
+ /**
2241
+ * @description `true` if this item created a new edge, `false` on an idempotent retry of an existing follow. Present on success.
2242
+ * @example true
2243
+ */
2244
+ created?: boolean;
2245
+ /** @description The follow edge — present on success. */
2246
+ edge?: components["schemas"]["EdgeResponseDto"];
2247
+ /** @description The error this item would have returned as a standalone call (e.g. 409 block in place, 422 self-follow, 404 unknown actor) — present on failure. */
2248
+ error?: components["schemas"]["ErrorResponseDto"];
2249
+ /**
2250
+ * @description Position of this result in the request array.
2251
+ * @example 0
2252
+ */
2253
+ index: number;
2254
+ /**
2255
+ * @description `true` when this follow was created (or already existed); `false` when it failed (see `error`).
2256
+ * @example true
2257
+ */
2258
+ success: boolean;
2259
+ };
2260
+ BatchFollowsDto: {
2261
+ /** @description Follow edges to create, in order. 1–200 items; each item follows the single-follow body exactly. */
2262
+ follows: components["schemas"]["ActorEdgeDto"][];
2263
+ /**
2264
+ * @description Import lane: when `true`, the per-item `edge.follow.created` fan-out (follow notifications AND webhooks) is skipped for this batch. Follower/following counters still update. Use when importing an existing graph so long-standing followers don't get "X followed you" notifications.
2265
+ * @default false
2266
+ * @example true
2267
+ */
2268
+ suppress_notifications: boolean;
2269
+ };
2270
+ BatchFollowsResponseDto: {
2271
+ /** @description One result per input item, same order. */
2272
+ data: components["schemas"]["BatchFollowResultDto"][];
2273
+ /**
2274
+ * @description Count of failed items.
2275
+ * @example 1
2276
+ */
2277
+ failed: number;
2278
+ /**
2279
+ * @description Count of successful items.
2280
+ * @example 4999
2281
+ */
2282
+ succeeded: number;
2283
+ };
2284
+ BatchUpsertActorsDto: {
2285
+ /** @description Actors to upsert, in order. 1–200 items; each item follows the single-upsert body exactly. */
2286
+ actors: components["schemas"]["UpsertActorDto"][];
2287
+ };
2288
+ BookmarkListResponseDto: {
2289
+ data: components["schemas"]["BookmarkResponseDto"][];
2290
+ pagination: components["schemas"]["PaginationResponseDto"];
2291
+ };
2292
+ BookmarkResponseDto: {
2293
+ /**
2294
+ * @description Social actor UUID who saved the post.
2295
+ * @example aaaaaaaa-0000-0000-0000-000000000001
2296
+ */
2297
+ actor_id: string;
2298
+ /**
2299
+ * @description Owning community UUID.
2300
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
2301
+ */
2302
+ community_id: string;
2303
+ /**
2304
+ * @description ISO timestamp the bookmark was created.
2305
+ * @example 2026-05-01T12:00:00.000Z
2306
+ */
2307
+ created_at: string;
2308
+ /**
2309
+ * @description Saved post UUID.
2310
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
2311
+ */
2312
+ post_id: string;
2313
+ };
2314
+ BookmarkToggleResponseDto: {
2315
+ bookmark: components["schemas"]["BookmarkResponseDto"];
2316
+ /**
2317
+ * @description `true` on first call (row inserted); `false` on idempotent retry of an existing bookmark.
2318
+ * @example true
2319
+ */
2320
+ created: boolean;
2321
+ };
2322
+ CastVoteDto: {
2323
+ /**
2324
+ * @description Voter social actor UUID.
2325
+ * @example aaaaaaaa-0000-0000-0000-000000000002
2326
+ */
2327
+ actor_id: string;
2328
+ /**
2329
+ * @description Zero-based index into post.attributes.poll.options.
1984
2330
  * @example 1
1985
2331
  */
1986
2332
  option_index: number;
@@ -2019,7 +2365,7 @@ interface components {
2019
2365
  };
2020
2366
  CloseFriendsListResponse: {
2021
2367
  data: components["schemas"]["CloseFriendResponse"][];
2022
- pagination: components["schemas"]["CursorPagination"];
2368
+ pagination: components["schemas"]["PaginationResponseDto"];
2023
2369
  };
2024
2370
  CommentListResponseDto: {
2025
2371
  data: components["schemas"]["CommentResponseDto"][];
@@ -2107,11 +2453,18 @@ interface components {
2107
2453
  */
2108
2454
  post_id: string;
2109
2455
  /**
2110
- * @description Lifecycle status. `removed` rows are hidden from public reads.
2456
+ * @description Map of reaction type to count, denormalised on the comment row in lock-step with the comment-reaction writes.
2457
+ * @example {
2458
+ * "like": 2
2459
+ * }
2460
+ */
2461
+ reaction_counts: Record<string, never>;
2462
+ /**
2463
+ * @description Lifecycle status. `pending_approval` = held by restricted-commenter pre-moderation; list endpoints surface these rows only to the comment author and the post-author (who publishes them via POST :commentId/approve). `removed` rows are hidden from public reads.
2111
2464
  * @example published
2112
2465
  * @enum {string}
2113
2466
  */
2114
- status: "published" | "hidden" | "removed";
2467
+ status: "published" | "hidden" | "removed" | "pending_approval";
2115
2468
  /**
2116
2469
  * @description ISO timestamp of the last update.
2117
2470
  * @example 2026-05-01T12:00:00.000Z
@@ -2171,6 +2524,48 @@ interface components {
2171
2524
  */
2172
2525
  total_posts: number;
2173
2526
  };
2527
+ CommunityRankingSettingsDto: {
2528
+ /**
2529
+ * @description Ranked-feed candidate window in days — posts older than this are not scored. Strictly positive finite number.
2530
+ * @default 30
2531
+ * @example 30
2532
+ */
2533
+ candidate_window_days: number;
2534
+ /**
2535
+ * @description Recency half-life in hours for the ranked feed. Strictly positive finite number.
2536
+ * @default 24
2537
+ * @example 24
2538
+ */
2539
+ half_life_hours: number;
2540
+ /** @description Per-signal weights for the ranked feed. Each key falls back to its default independently. */
2541
+ weights?: components["schemas"]["CommunityRankingWeightsDto"];
2542
+ };
2543
+ CommunityRankingWeightsDto: {
2544
+ /**
2545
+ * @description Engagement signal weight (log-scaled comments + reactions). Non-negative finite number.
2546
+ * @default 0.6
2547
+ * @example 0.6
2548
+ */
2549
+ engagement: number;
2550
+ /**
2551
+ * @description Follow-graph bias weight. Non-negative finite number.
2552
+ * @default 0.4
2553
+ * @example 0.4
2554
+ */
2555
+ follow_bias: number;
2556
+ /**
2557
+ * @description Recency signal weight (exponential decay). Non-negative finite number; anything else falls back to the default.
2558
+ * @default 1
2559
+ * @example 1
2560
+ */
2561
+ recency: number;
2562
+ /**
2563
+ * @description Self-author boost weight (keeps the viewer's own posts visible). Non-negative finite number.
2564
+ * @default 0.2
2565
+ * @example 0.2
2566
+ */
2567
+ self_boost: number;
2568
+ };
2174
2569
  CommunityResponseDto: {
2175
2570
  /**
2176
2571
  * @description Auth app UUID this community wraps; `null` for standalone communities.
@@ -2203,12 +2598,12 @@ interface components {
2203
2598
  */
2204
2599
  id: string;
2205
2600
  /**
2206
- * @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold, reaction_types).
2601
+ * @description Per-community settings blob. See CommunitySettingsDto for every key the service reads; unrecognized keys are stored and returned unchanged but not consumed.
2207
2602
  * @example {
2208
2603
  * "max_comment_depth": 3
2209
2604
  * }
2210
2605
  */
2211
- settings: Record<string, never>;
2606
+ settings: components["schemas"]["CommunitySettingsDto"];
2212
2607
  /**
2213
2608
  * @description URL-friendly community slug.
2214
2609
  * @example my-product-community
@@ -2231,6 +2626,34 @@ interface components {
2231
2626
  */
2232
2627
  workspace_id: string;
2233
2628
  };
2629
+ CommunitySettingsDto: {
2630
+ /**
2631
+ * @description Distinct-reporter count at which a flagged post/comment is auto-hidden. Integer 0..1000; floored. Read by the moderation flag pipeline.
2632
+ * @default 3
2633
+ * @example 3
2634
+ */
2635
+ auto_hide_flag_threshold: number;
2636
+ /**
2637
+ * @description Minutes after publication during which a post body/title may still be edited (`EDIT_WINDOW_EXPIRED` afterwards). Strictly positive finite number. Drafts edit freely.
2638
+ * @default 30
2639
+ * @example 30
2640
+ */
2641
+ edit_window_minutes: number;
2642
+ /**
2643
+ * @description Maximum comment thread depth (0 = flat). Integer 0..10; floored; out-of-bounds falls back to the default. Replying past the cap returns 409.
2644
+ * @default 3
2645
+ * @example 3
2646
+ */
2647
+ max_comment_depth: number;
2648
+ /**
2649
+ * @description Maximum participants in a group conversation. Integer 2..200; floored. Exceeding it returns 409 on create / member add.
2650
+ * @default 50
2651
+ * @example 50
2652
+ */
2653
+ max_group_conversation_size: number;
2654
+ /** @description Ranked-feed tuning (weights, half-life, candidate window). Read at query time by the actor feed, list feeds, and the discover feed. */
2655
+ ranking?: components["schemas"]["CommunityRankingSettingsDto"];
2656
+ };
2234
2657
  ConversationAdminListResponseDto: {
2235
2658
  data: components["schemas"]["ConversationAdminResponseDto"][];
2236
2659
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -2435,8 +2858,8 @@ interface components {
2435
2858
  * @example My Product Community
2436
2859
  */
2437
2860
  display_name: string;
2438
- /** @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold). */
2439
- settings?: Record<string, never>;
2861
+ /** @description Per-community settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
2862
+ settings?: components["schemas"]["CommunitySettingsDto"];
2440
2863
  /**
2441
2864
  * @description URL-friendly community slug. Lowercase letters, digits, and hyphens (3-64 chars).
2442
2865
  * @example my-product-community
@@ -2514,6 +2937,20 @@ interface components {
2514
2937
  */
2515
2938
  target_kind: "post" | "comment";
2516
2939
  };
2940
+ CreateFlagResponseDto: {
2941
+ /**
2942
+ * @description `true` when this flag pushed the target over the community's `auto_hide_flag_threshold` and the target was auto-hidden as a side effect.
2943
+ * @example false
2944
+ */
2945
+ auto_hidden: boolean;
2946
+ /**
2947
+ * @description `true` when this call inserted a new flag; `false` when de-duplicated to an existing open flag from the same reporter on the same target.
2948
+ * @example true
2949
+ */
2950
+ created: boolean;
2951
+ /** @description The flag row (existing open flag on de-duplicated retry). */
2952
+ flag: components["schemas"]["FlagResponseDto"];
2953
+ };
2517
2954
  CreateHashtagFollowDto: {
2518
2955
  /**
2519
2956
  * @description Lowercase tag (without `#`). Must already exist in the community directory.
@@ -2618,19 +3055,19 @@ interface components {
2618
3055
  */
2619
3056
  created: boolean;
2620
3057
  /** @description The newly-created (or existing) repost post row. */
2621
- repost: components["schemas"]["RepostPostResponseDto"];
3058
+ repost: components["schemas"]["PostResponseDto"];
2622
3059
  /** @description The source post, with refreshed `repost_count`. */
2623
- source: components["schemas"]["RepostPostResponseDto"];
3060
+ source: components["schemas"]["PostResponseDto"];
2624
3061
  };
2625
3062
  CreateWebhookDto: {
2626
3063
  /**
2627
- * @description Event types to subscribe to. Currently supported: `post.created`, `post.updated`, `post.reaction.created`, `repost.created`, `comment.created`, `comment.updated`, `comment.reaction.created`, `edge.follow.created`.
3064
+ * @description Event types to subscribe to. Unknown values are rejected with a 400 naming the valid set — see GET /v1/webhook-event-types.
2628
3065
  * @example [
2629
3066
  * "post.created",
2630
3067
  * "comment.created"
2631
3068
  * ]
2632
3069
  */
2633
- event_types: string[];
3070
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
2634
3071
  /**
2635
3072
  * @description Subscriber URL. Must be `https://`.
2636
3073
  * @example https://example.com/webhooks/social
@@ -2664,13 +3101,13 @@ interface components {
2664
3101
  */
2665
3102
  disabled_reason: string | null;
2666
3103
  /**
2667
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
3104
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
2668
3105
  * @example [
2669
3106
  * "post.created",
2670
3107
  * "comment.created"
2671
3108
  * ]
2672
3109
  */
2673
- event_types: string[];
3110
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
2674
3111
  /**
2675
3112
  * @description Webhook UUID.
2676
3113
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -2707,18 +3144,6 @@ interface components {
2707
3144
  */
2708
3145
  url: string;
2709
3146
  };
2710
- CursorPagination: {
2711
- /**
2712
- * @description Whether more pages exist after this one.
2713
- * @example false
2714
- */
2715
- has_more: boolean;
2716
- /**
2717
- * @description Opaque base64url cursor; null when no further pages.
2718
- * @example null
2719
- */
2720
- next_cursor: string | null;
2721
- };
2722
3147
  DeleteActorListDto: {
2723
3148
  /**
2724
3149
  * @description Caller — social actor UUID. Must equal the list owner.
@@ -2733,13 +3158,60 @@ interface components {
2733
3158
  */
2734
3159
  sender_id: string;
2735
3160
  };
3161
+ DeliveryJobResponseDto: {
3162
+ /**
3163
+ * @description Delivery attempts made so far.
3164
+ * @example 0
3165
+ */
3166
+ attempt_count: number;
3167
+ /**
3168
+ * @description ISO timestamp.
3169
+ * @example 2026-05-01T12:00:00.000Z
3170
+ */
3171
+ created_at: string;
3172
+ /**
3173
+ * @description Stable event id (carried in the request body as `id`; stable across retries and redelivers).
3174
+ * @example evt_…
3175
+ */
3176
+ event_id: string;
3177
+ /**
3178
+ * @description Event type. `ping` for test deliveries.
3179
+ * @example post.created
3180
+ */
3181
+ event_type: string;
3182
+ /** @description Delivery job UUID. */
3183
+ id: string;
3184
+ /**
3185
+ * @description Error from the most recent failed attempt. Null before the first failure.
3186
+ * @example null
3187
+ */
3188
+ last_error: string | null;
3189
+ /**
3190
+ * @description ISO timestamp of the next scheduled attempt (backoff: 1m, 5m, 30m, 2h, 6h, 24h).
3191
+ * @example 2026-05-01T12:00:00.000Z
3192
+ */
3193
+ next_attempt_at: string;
3194
+ /**
3195
+ * @description Job state.
3196
+ * @example pending
3197
+ * @enum {string}
3198
+ */
3199
+ status: "pending" | "delivering" | "succeeded" | "exhausted" | "canceled";
3200
+ /**
3201
+ * @description ISO timestamp.
3202
+ * @example 2026-05-01T12:00:00.000Z
3203
+ */
3204
+ updated_at: string;
3205
+ /** @description Webhook UUID the job targets. */
3206
+ webhook_id: string;
3207
+ };
2736
3208
  DeliveryListResponseDto: {
2737
3209
  data: components["schemas"]["DeliveryResponseDto"][];
2738
3210
  pagination: components["schemas"]["PaginationResponseDto"];
2739
3211
  };
2740
3212
  DeliveryResponseDto: {
2741
3213
  /**
2742
- * @description Attempt number. Always 1 in v1 (no retry).
3214
+ * @description Attempt number, 1-based. Increments per retry along the backoff schedule (1m, 5m, 30m, 2h, 6h, 24h — 7 attempts total).
2743
3215
  * @example 1
2744
3216
  */
2745
3217
  attempt_number: number;
@@ -2766,10 +3238,10 @@ interface components {
2766
3238
  /** @description Delivery row UUID. */
2767
3239
  id: string;
2768
3240
  /**
2769
- * @description Total round-trip time in ms.
3241
+ * @description Total round-trip time in ms. Null on transport-level failure.
2770
3242
  * @example 67
2771
3243
  */
2772
- latency_ms: number;
3244
+ latency_ms: number | null;
2773
3245
  /**
2774
3246
  * @description Signed request body that was sent.
2775
3247
  * @example {}
@@ -2843,6 +3315,13 @@ interface components {
2843
3315
  * @enum {string}
2844
3316
  */
2845
3317
  kind: "text" | "image" | "video" | "audio" | "system";
3318
+ /**
3319
+ * @description Map of reaction type to count, denormalised on the message row in lock-step with the DM-reaction writes.
3320
+ * @example {
3321
+ * "like": 1
3322
+ * }
3323
+ */
3324
+ reaction_counts: Record<string, never>;
2846
3325
  /**
2847
3326
  * @description Threaded inline reply target.
2848
3327
  * @example null
@@ -2968,6 +3447,13 @@ interface components {
2968
3447
  * @enum {string}
2969
3448
  */
2970
3449
  kind: "text" | "image" | "video" | "audio" | "system";
3450
+ /**
3451
+ * @description Map of reaction type to count, denormalised on the message row in lock-step with the DM-reaction writes.
3452
+ * @example {
3453
+ * "like": 1
3454
+ * }
3455
+ */
3456
+ reaction_counts: Record<string, never>;
2971
3457
  /**
2972
3458
  * @description Threaded inline reply target.
2973
3459
  * @example null
@@ -2980,95 +3466,8 @@ interface components {
2980
3466
  sender_id: string;
2981
3467
  };
2982
3468
  DraftListResponseDto: {
2983
- data: components["schemas"]["DraftPostResponseDto"][];
2984
- pagination: components["schemas"]["PaginationResponseDto"];
2985
- };
2986
- DraftPostResponseDto: {
2987
- /**
2988
- * @description Author actor UUID.
2989
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
2990
- */
2991
- actor_id: string;
2992
- /**
2993
- * @description Free-form attributes blob.
2994
- * @example {}
2995
- */
2996
- attributes: Record<string, never>;
2997
- /**
2998
- * @description Body draft text.
2999
- * @example WIP — half a thought…
3000
- */
3001
- body: string | null;
3002
- /**
3003
- * @description Always 0 for drafts.
3004
- * @example 0
3005
- */
3006
- comment_count: number;
3007
- /**
3008
- * @description Owning community UUID.
3009
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3010
- */
3011
- community_id: string;
3012
- /**
3013
- * @description ISO timestamp the draft was created.
3014
- * @example 2026-05-01T12:00:00.000Z
3015
- */
3016
- created_at: string;
3017
- /**
3018
- * @description Optional expires_at carried into the published post.
3019
- * @example null
3020
- */
3021
- expires_at: string | null;
3022
- /**
3023
- * @description Draft post UUID.
3024
- * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
3025
- */
3026
- id: string;
3027
- /**
3028
- * @description Free-form post kind.
3029
- * @example text
3030
- */
3031
- kind: string;
3032
- /**
3033
- * @description Pinned flag carried into the published post.
3034
- * @example false
3035
- */
3036
- pinned: boolean;
3037
- /**
3038
- * @description Empty for drafts (engagement begins at publish).
3039
- * @example {}
3040
- */
3041
- reaction_counts: Record<string, never>;
3042
- /**
3043
- * @description Always 'draft' for this endpoint.
3044
- * @example draft
3045
- * @enum {string}
3046
- */
3047
- status: "draft";
3048
- /**
3049
- * @description Optional title.
3050
- * @example null
3051
- */
3052
- title: string | null;
3053
- /**
3054
- * @description ISO timestamp of the last update.
3055
- * @example 2026-05-01T12:00:00.000Z
3056
- */
3057
- updated_at: string;
3058
- /**
3059
- * @description Optional URL.
3060
- * @example null
3061
- */
3062
- url: string | null;
3063
- /**
3064
- * @description Visibility scope chosen at draft time. Applies once promoted to published.
3065
- * @example public
3066
- * @enum {string}
3067
- */
3068
- visibility: "public" | "followers" | "close_friends" | "private";
3069
- };
3070
- EdgeListResponseDto: {
3071
- data: components["schemas"]["EdgeResponseDto"][];
3469
+ /** @description Draft post rows — status is always 'draft' on this endpoint. */
3470
+ data: components["schemas"]["PostResponseDto"][];
3072
3471
  pagination: components["schemas"]["PaginationResponseDto"];
3073
3472
  };
3074
3473
  EdgeResponseDto: {
@@ -3098,10 +3497,11 @@ interface components {
3098
3497
  */
3099
3498
  id: string;
3100
3499
  /**
3101
- * @description Edge kind. `follow`, `mute`, `block`, `save`, or `reaction:<type>` for post reactions.
3500
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
3102
3501
  * @example follow
3502
+ * @enum {string}
3103
3503
  */
3104
- kind: string;
3504
+ kind: "follow" | "mute" | "block" | "restrict";
3105
3505
  /**
3106
3506
  * @description Free-form payload stored on the edge (e.g. mute reason).
3107
3507
  * @example {}
@@ -3113,23 +3513,6 @@ interface components {
3113
3513
  */
3114
3514
  src_actor_id: string;
3115
3515
  };
3116
- ErrorResponse: {
3117
- /**
3118
- * @description Stable error code.
3119
- * @example NOT_FOUND
3120
- */
3121
- code?: string;
3122
- /**
3123
- * @description Human-readable error message.
3124
- * @example Post not found
3125
- */
3126
- message: Record<string, never>;
3127
- /**
3128
- * @description HTTP status code echoed in the body.
3129
- * @example 404
3130
- */
3131
- statusCode: number;
3132
- };
3133
3516
  ErrorResponseDto: {
3134
3517
  /**
3135
3518
  * @description Stable error code for programmatic handling. Optional — newer routes set it where the message alone is ambiguous.
@@ -3147,94 +3530,8 @@ interface components {
3147
3530
  */
3148
3531
  statusCode: number;
3149
3532
  };
3150
- FeedPostResponseDto: {
3151
- /**
3152
- * @description Author actor UUID.
3153
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
3154
- */
3155
- actor_id: string;
3156
- /**
3157
- * @description Free-form attributes blob.
3158
- * @example {}
3159
- */
3160
- attributes: Record<string, never>;
3161
- /**
3162
- * @description Body text/markdown.
3163
- * @example Stories are live!
3164
- */
3165
- body: string | null;
3166
- /**
3167
- * @description Live denormalised comment count.
3168
- * @example 4
3169
- */
3170
- comment_count: number;
3171
- /**
3172
- * @description Owning community UUID.
3173
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3174
- */
3175
- community_id: string;
3176
- /**
3177
- * @description ISO timestamp the post was created.
3178
- * @example 2026-05-01T12:00:00.000Z
3179
- */
3180
- created_at: string;
3181
- /**
3182
- * @description ISO timestamp; null = no expiry.
3183
- * @example null
3184
- */
3185
- expires_at: string | null;
3186
- /**
3187
- * @description Post UUID.
3188
- * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
3189
- */
3190
- id: string;
3191
- /**
3192
- * @description Free-form post kind.
3193
- * @example text
3194
- */
3195
- kind: string;
3196
- /**
3197
- * @description Pinned for highlights.
3198
- * @example false
3199
- */
3200
- pinned: boolean;
3201
- /**
3202
- * @description Live denormalised reaction counts.
3203
- * @example {
3204
- * "like": 12
3205
- * }
3206
- */
3207
- reaction_counts: Record<string, never>;
3208
- /**
3209
- * @description Lifecycle status. Feed only returns `published`.
3210
- * @example published
3211
- * @enum {string}
3212
- */
3213
- status: "published" | "hidden" | "removed";
3214
- /**
3215
- * @description Optional title.
3216
- * @example null
3217
- */
3218
- title: string | null;
3219
- /**
3220
- * @description ISO timestamp of the last update.
3221
- * @example 2026-05-01T12:00:00.000Z
3222
- */
3223
- updated_at: string;
3224
- /**
3225
- * @description Optional URL.
3226
- * @example null
3227
- */
3228
- url: string | null;
3229
- /**
3230
- * @description Visibility scope; the feed is already filtered to what the requester can see.
3231
- * @example public
3232
- * @enum {string}
3233
- */
3234
- visibility: "public" | "followers" | "close_friends" | "private";
3235
- };
3236
3533
  FeedResponseDto: {
3237
- data: components["schemas"]["FeedPostResponseDto"][];
3534
+ data: components["schemas"]["PostResponseDto"][];
3238
3535
  /** @description Cursor encodes `(score, id)` for `ranked` feeds and `(created_at, id)` for `chronological` feeds. Cursors are NOT interchangeable between modes. */
3239
3536
  pagination: components["schemas"]["PaginationResponseDto"];
3240
3537
  };
@@ -3291,6 +3588,55 @@ interface components {
3291
3588
  */
3292
3589
  updated_at: string;
3293
3590
  };
3591
+ FollowerEdgeListResponseDto: {
3592
+ data: components["schemas"]["FollowerEdgeResponseDto"][];
3593
+ pagination: components["schemas"]["PaginationResponseDto"];
3594
+ };
3595
+ FollowerEdgeResponseDto: {
3596
+ /**
3597
+ * @description Owning community UUID.
3598
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3599
+ */
3600
+ community_id: string;
3601
+ /**
3602
+ * @description ISO timestamp the edge was created.
3603
+ * @example 2026-05-01T12:00:00.000Z
3604
+ */
3605
+ created_at: string;
3606
+ /**
3607
+ * @description Destination actor UUID (for actor edges).
3608
+ * @example aaaaaaaa-0000-0000-0000-000000000002
3609
+ */
3610
+ dst_actor_id: string | null;
3611
+ /**
3612
+ * @description Destination post UUID (for reaction / save edges).
3613
+ * @example null
3614
+ */
3615
+ dst_post_id: string | null;
3616
+ /**
3617
+ * @description Edge UUID.
3618
+ * @example eeeeeeee-0000-0000-0000-000000000001
3619
+ */
3620
+ id: string;
3621
+ /**
3622
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
3623
+ * @example follow
3624
+ * @enum {string}
3625
+ */
3626
+ kind: "follow" | "mute" | "block" | "restrict";
3627
+ /**
3628
+ * @description Free-form payload stored on the edge (e.g. mute reason).
3629
+ * @example {}
3630
+ */
3631
+ payload: Record<string, never>;
3632
+ /** @description The follower's full actor row. Present only when requested via `?expand=src_actor`. */
3633
+ src_actor?: components["schemas"]["ActorResponseDto"];
3634
+ /**
3635
+ * @description Source actor UUID.
3636
+ * @example aaaaaaaa-0000-0000-0000-000000000001
3637
+ */
3638
+ src_actor_id: string;
3639
+ };
3294
3640
  HashtagAutocompleteResponseDto: {
3295
3641
  data: components["schemas"]["HashtagResponseDto"][];
3296
3642
  };
@@ -3368,12 +3714,9 @@ interface components {
3368
3714
  tag: string;
3369
3715
  };
3370
3716
  HighlightsResponse: {
3371
- /**
3372
- * @description Page of pinned posts.
3373
- * @example []
3374
- */
3375
- data: string[];
3376
- pagination: components["schemas"]["CursorPagination"];
3717
+ /** @description Page of pinned posts (full post rows; expiry is bypassed for pinned rows). */
3718
+ data: components["schemas"]["PostResponseDto"][];
3719
+ pagination: components["schemas"]["PaginationResponseDto"];
3377
3720
  };
3378
3721
  LeaveConversationDto: {
3379
3722
  /**
@@ -3443,7 +3786,7 @@ interface components {
3443
3786
  };
3444
3787
  ModerationActionDto: {
3445
3788
  /**
3446
- * @description Action to apply. `hide`/`remove` transition target status; `unhide`/`restore` reverse them. `warn`/`ban` are audit-only. `dismiss` closes the flag with no target change.
3789
+ * @description Action to apply. `hide`/`remove` transition target status; `unhide`/`restore` reverse them. `warn`/`ban` are audit-only — they record the decision without touching the target; for actor-level enforcement use PATCH `/actors/:actorId` with `status=suspended` or the shadow-ban endpoints on this controller. `dismiss` closes the flag with no target change.
3447
3790
  * @example hide
3448
3791
  * @enum {string}
3449
3792
  */
@@ -3472,7 +3815,7 @@ interface components {
3472
3815
  */
3473
3816
  created_at: string;
3474
3817
  /**
3475
- * @description Flag UUID this action closed; `null` for unsolicited mod actions.
3818
+ * @description Flag UUID this action was applied to.
3476
3819
  * @example ffffffff-0000-0000-0000-000000000001
3477
3820
  */
3478
3821
  flag_id: string | null;
@@ -3502,6 +3845,66 @@ interface components {
3502
3845
  */
3503
3846
  target_kind: "post" | "comment";
3504
3847
  };
3848
+ ModerationActorListResponseDto: {
3849
+ data: components["schemas"]["ModerationActorResponseDto"][];
3850
+ pagination: components["schemas"]["PaginationResponseDto"];
3851
+ };
3852
+ ModerationActorResponseDto: {
3853
+ /**
3854
+ * @description Avatar URL.
3855
+ * @example https://cdn.example.com/avatars/ada.png
3856
+ */
3857
+ avatar_url: string | null;
3858
+ /**
3859
+ * @description Owning community UUID.
3860
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3861
+ */
3862
+ community_id: string;
3863
+ /**
3864
+ * @description ISO timestamp the row was inserted.
3865
+ * @example 2026-05-01T12:00:00.000Z
3866
+ */
3867
+ created_at: string;
3868
+ /**
3869
+ * @description Display name.
3870
+ * @example Ada Lovelace
3871
+ */
3872
+ display_name: string | null;
3873
+ /**
3874
+ * @description Customer-supplied stable identifier (your user id).
3875
+ * @example user_abc123
3876
+ */
3877
+ external_id: string;
3878
+ /**
3879
+ * @description Social actor UUID.
3880
+ * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
3881
+ */
3882
+ id: string;
3883
+ /**
3884
+ * @description Free-form metadata blob.
3885
+ * @example {
3886
+ * "tier": "pro"
3887
+ * }
3888
+ */
3889
+ metadata: Record<string, never>;
3890
+ /** @description ISO timestamp the shadow ban was applied, or null. */
3891
+ shadow_banned_at: string | null;
3892
+ /** @description Moderator note attached to the ban. */
3893
+ shadow_banned_reason: string | null;
3894
+ /** @description ISO timestamp the shadow ban auto-expires, or null for indefinite. */
3895
+ shadow_banned_until: string | null;
3896
+ /**
3897
+ * @description Lifecycle status. `suspended` is moderator-applied via PATCH `status=suspended`; `deleted` is soft-deletion. Shadow-banning is a separate moderation mechanism that does not change `status`.
3898
+ * @example active
3899
+ * @enum {string}
3900
+ */
3901
+ status: "active" | "suspended" | "deleted";
3902
+ /**
3903
+ * @description ISO timestamp of the last update.
3904
+ * @example 2026-05-01T12:00:00.000Z
3905
+ */
3906
+ updated_at: string;
3907
+ };
3505
3908
  MutedTermResponseDto: {
3506
3909
  /**
3507
3910
  * @description Owning actor UUID.
@@ -3535,22 +3938,10 @@ interface components {
3535
3938
  */
3536
3939
  term: string;
3537
3940
  };
3538
- NotificationListPagination: {
3539
- /**
3540
- * @description Whether more pages exist after this one.
3541
- * @example false
3542
- */
3543
- has_more: boolean;
3544
- /**
3545
- * @description Opaque base64url cursor for the next page; `null` when no further pages.
3546
- * @example eyJjcmVhdGVkX2F0IjoiMjAyNi0wNS0wMVQxMjowMDowMC4wMDBaIiwiaWQiOiIxMTExMSJ9
3547
- */
3548
- next_cursor: string | null;
3549
- };
3550
3941
  NotificationListResponse: {
3551
3942
  /** @description Page of notifications, newest first. */
3552
3943
  data: components["schemas"]["NotificationResponse"][];
3553
- pagination: components["schemas"]["NotificationListPagination"];
3944
+ pagination: components["schemas"]["PaginationResponseDto"];
3554
3945
  };
3555
3946
  NotificationPrefListResponseDto: {
3556
3947
  /** @description One row per known NotificationKind. Kinds the actor has not explicitly toggled report `enabled=true` and an epoch `updated_at`, so the client always sees the full catalogue with effective state. */
@@ -3572,7 +3963,7 @@ interface components {
3572
3963
  * @example follow
3573
3964
  * @enum {string}
3574
3965
  */
3575
- kind: "follow" | "reaction" | "comment_on_post" | "reply_to_comment" | "mention" | "vote" | "repost" | "quote_post";
3966
+ kind: "follow" | "reaction" | "comment_on_post" | "reply_to_comment" | "mention" | "vote" | "repost" | "quote_post" | "dm_new_message" | "dm_added_to_group" | "dm_role_changed" | "dm_reaction";
3576
3967
  /**
3577
3968
  * @description ISO timestamp of the last update. Synthesised entries (no explicit row) report epoch.
3578
3969
  * @example 2026-05-01T12:00:00.000Z
@@ -3601,13 +3992,13 @@ interface components {
3601
3992
  */
3602
3993
  id: string;
3603
3994
  /**
3604
- * @description What happened. `follow` / `reaction` / `comment_on_post` / `reply_to_comment`. `mention` is reserved.
3995
+ * @description What happened. Content kinds (`follow`, `reaction`, `comment_on_post`, `reply_to_comment`, `mention`, `vote`, `repost`, `quote_post`) plus the DM kinds (`dm_new_message`, `dm_added_to_group`, `dm_role_changed`, `dm_reaction`).
3605
3996
  * @example reaction
3606
3997
  * @enum {string}
3607
3998
  */
3608
- kind: "follow" | "reaction" | "comment_on_post" | "reply_to_comment" | "mention";
3999
+ kind: "follow" | "reaction" | "comment_on_post" | "reply_to_comment" | "mention" | "vote" | "repost" | "quote_post" | "dm_new_message" | "dm_added_to_group" | "dm_role_changed" | "dm_reaction";
3609
4000
  /**
3610
- * @description Kind-specific extras. `reaction`: `{type}`. `comment_on_post` / `reply_to_comment`: `{comment_id}`.
4001
+ * @description Kind-specific extras. `reaction`: `{type}` (+ `{post_id}` when the target is a comment). `comment_on_post` / `reply_to_comment`: `{comment_id}`. `mention`: `{post_id}` (+ `{comment_id}` for comment mentions).
3611
4002
  * @example {
3612
4003
  * "type": "like"
3613
4004
  * }
@@ -3623,17 +4014,71 @@ interface components {
3623
4014
  * @example aaaaaaaa-0000-0000-0000-000000000001
3624
4015
  */
3625
4016
  recipient_actor_id: string;
4017
+ /**
4018
+ * @description When `true`, the recipient has restricted the triggering actor — the row is hidden from the default `inbox` slice and surfaces on `?status=requests` (or `all`).
4019
+ * @example false
4020
+ */
4021
+ suppressed: boolean;
3626
4022
  /**
3627
4023
  * @description id of the actor / post / comment the event happened on.
3628
4024
  * @example bbbbbbbb-0000-0000-0000-000000000001
3629
4025
  */
3630
4026
  target_id: string;
3631
4027
  /**
3632
- * @description Switches what `target_id` references. `actor` for follow; `post` for reaction / comment_on_post; `comment` for reply_to_comment.
4028
+ * @description Switches what `target_id` references. `actor` for follow; `post` for vote / repost / quote_post / comment_on_post and post-targeted reactions/mentions; `comment` for reply_to_comment and comment-targeted reactions/mentions; `direct_message` for the dm_* kinds.
3633
4029
  * @example post
3634
4030
  * @enum {string}
3635
4031
  */
3636
- target_kind: "actor" | "post" | "comment";
4032
+ target_kind: "actor" | "post" | "comment" | "direct_message";
4033
+ };
4034
+ OutboundEdgeListResponseDto: {
4035
+ data: components["schemas"]["OutboundEdgeResponseDto"][];
4036
+ pagination: components["schemas"]["PaginationResponseDto"];
4037
+ };
4038
+ OutboundEdgeResponseDto: {
4039
+ /**
4040
+ * @description Owning community UUID.
4041
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4042
+ */
4043
+ community_id: string;
4044
+ /**
4045
+ * @description ISO timestamp the edge was created.
4046
+ * @example 2026-05-01T12:00:00.000Z
4047
+ */
4048
+ created_at: string;
4049
+ /** @description The destination actor's full row. Present only when requested via `?expand=dst_actor`. */
4050
+ dst_actor?: components["schemas"]["ActorResponseDto"];
4051
+ /**
4052
+ * @description Destination actor UUID (for actor edges).
4053
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4054
+ */
4055
+ dst_actor_id: string | null;
4056
+ /**
4057
+ * @description Destination post UUID (for reaction / save edges).
4058
+ * @example null
4059
+ */
4060
+ dst_post_id: string | null;
4061
+ /**
4062
+ * @description Edge UUID.
4063
+ * @example eeeeeeee-0000-0000-0000-000000000001
4064
+ */
4065
+ id: string;
4066
+ /**
4067
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
4068
+ * @example follow
4069
+ * @enum {string}
4070
+ */
4071
+ kind: "follow" | "mute" | "block" | "restrict";
4072
+ /**
4073
+ * @description Free-form payload stored on the edge (e.g. mute reason).
4074
+ * @example {}
4075
+ */
4076
+ payload: Record<string, never>;
4077
+ /**
4078
+ * @description Source actor UUID.
4079
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4080
+ */
4081
+ src_actor_id: string;
3637
4082
  };
3638
4083
  PaginationResponseDto: {
3639
4084
  /**
@@ -3708,6 +4153,37 @@ interface components {
3708
4153
  data: components["schemas"]["PostResponseDto"][];
3709
4154
  pagination: components["schemas"]["PaginationResponseDto"];
3710
4155
  };
4156
+ PostReactionEntryDto: {
4157
+ /**
4158
+ * @description Reactor actor UUID.
4159
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4160
+ */
4161
+ actor_id: string;
4162
+ /**
4163
+ * @description Owning community UUID.
4164
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4165
+ */
4166
+ community_id: string;
4167
+ /**
4168
+ * @description ISO timestamp.
4169
+ * @example 2026-05-01T12:00:00.000Z
4170
+ */
4171
+ created_at: string;
4172
+ /**
4173
+ * @description Post UUID.
4174
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4175
+ */
4176
+ post_id: string;
4177
+ /**
4178
+ * @description Reaction type label.
4179
+ * @example like
4180
+ */
4181
+ type: string;
4182
+ };
4183
+ PostReactionListResponseDto: {
4184
+ data: components["schemas"]["PostReactionEntryDto"][];
4185
+ pagination: components["schemas"]["PaginationResponseDto"];
4186
+ };
3711
4187
  PostResponseDto: {
3712
4188
  /**
3713
4189
  * @description Author actor UUID.
@@ -3760,7 +4236,7 @@ interface components {
3760
4236
  */
3761
4237
  id: string;
3762
4238
  /**
3763
- * @description Free-form post kind. Common: text, link, image, story.
4239
+ * @description Free-form post kind. Common: text, link, image, story, repost, quote.
3764
4240
  * @example text
3765
4241
  */
3766
4242
  kind: string;
@@ -3787,17 +4263,22 @@ interface components {
3787
4263
  * @example 0
3788
4264
  */
3789
4265
  repost_count: number;
4266
+ /**
4267
+ * @description ISO publish-at timestamp, set while status='scheduled'. The scheduler cron promotes the post to published and clears this field; a manual PATCH promotion leaves the last value in place unless the caller also passes scheduled_for: null.
4268
+ * @example null
4269
+ */
4270
+ scheduled_for: string | null;
3790
4271
  /**
3791
4272
  * @description For kind='repost' / 'quote': the source post UUID.
3792
4273
  * @example null
3793
4274
  */
3794
4275
  source_post_id: string | null;
3795
4276
  /**
3796
- * @description Lifecycle status. `removed` rows are hidden from public reads.
4277
+ * @description Lifecycle status. Public list/feed surfaces only return `published`; `draft` and `scheduled` rows surface exclusively on the author-scoped drafts / scheduled-posts listings and author reads. `removed` rows are hidden from reads.
3797
4278
  * @example published
3798
4279
  * @enum {string}
3799
4280
  */
3800
- status: "published" | "hidden" | "removed";
4281
+ status: "published" | "hidden" | "removed" | "draft" | "scheduled";
3801
4282
  /**
3802
4283
  * @description Optional title (1-240 chars).
3803
4284
  * @example Shipping Phase 8
@@ -3814,7 +4295,7 @@ interface components {
3814
4295
  */
3815
4296
  url: string | null;
3816
4297
  /**
3817
- * @description Denormalised impression count, bumped via POST /posts/views.
4298
+ * @description Denormalised impression count, bumped via the batch POST /posts/views endpoint.
3818
4299
  * @example 0
3819
4300
  */
3820
4301
  view_count: number;
@@ -3862,7 +4343,7 @@ interface components {
3862
4343
  title: string | null;
3863
4344
  };
3864
4345
  PostSearchHitDto: {
3865
- post: components["schemas"]["SearchPostResponseDto"];
4346
+ post: components["schemas"]["PostResponseDto"];
3866
4347
  /**
3867
4348
  * @description PG ts_rank score on the (title A, body B) tsvector. Higher = more relevant. Returned even when order='recent' so clients can render a relevance badge.
3868
4349
  * @example 0.6079
@@ -3873,41 +4354,9 @@ interface components {
3873
4354
  /** @description Up to `limit` (default 20, max 50) hits. Not paginated in v1. */
3874
4355
  data: components["schemas"]["PostSearchHitDto"][];
3875
4356
  };
3876
- ReactionCountsResponseDto: {
4357
+ PostStateRequestDto: {
3877
4358
  /**
3878
- * @description Denormalised reaction counts after the write.
3879
- * @example {
3880
- * "like": 12
3881
- * }
3882
- */
3883
- reaction_counts: Record<string, never>;
3884
- };
3885
- ReactionResponseDto: {
3886
- /**
3887
- * @description `true` on first call; `false` on idempotent retry.
3888
- * @example true
3889
- */
3890
- created: boolean;
3891
- edge: components["schemas"]["EdgeResponseDto"];
3892
- /**
3893
- * @description Denormalised reaction counts after the write.
3894
- * @example {
3895
- * "fire": 3,
3896
- * "like": 13
3897
- * }
3898
- */
3899
- reaction_counts: Record<string, never>;
3900
- };
3901
- RecordViewDto: {
3902
- /**
3903
- * @description Viewer social actor UUID.
3904
- * @example aaaaaaaa-0000-0000-0000-000000000002
3905
- */
3906
- viewer_actor_id: string;
3907
- };
3908
- RecordViewsDto: {
3909
- /**
3910
- * @description UUIDs of posts that became visible to the viewer in this batch. Capped at 200 to keep the payload sensible — the server will silently skip ids that aren't in the community or have been removed.
4359
+ * @description UUIDs of the posts to hydrate viewer state for. Capped at 200 (matches the batch-views precedent); ids that are unknown, removed, or from another community resolve to the empty state instead of failing the batch.
3911
4360
  * @example [
3912
4361
  * "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
3913
4362
  * "cccccccc-cccc-cccc-cccc-cccccccccccc"
@@ -3915,127 +4364,50 @@ interface components {
3915
4364
  */
3916
4365
  post_ids: string[];
3917
4366
  };
3918
- RemoveMemberDto: {
3919
- /**
3920
- * @description Social actor UUID of the acting party. Equal to the target for self-leave.
3921
- * @example aaaaaaaa-0000-0000-0000-000000000001
3922
- */
3923
- caller_actor_id: string;
3924
- };
3925
- RenameGroupDto: {
3926
- /**
3927
- * @description Social actor UUID of the renaming admin.
3928
- * @example aaaaaaaa-0000-0000-0000-000000000001
3929
- */
3930
- caller_actor_id: string;
3931
- /** @description New display name. Pass null or empty to clear. */
3932
- name: string | null;
3933
- };
3934
- RepostListResponseDto: {
3935
- /** @description Page of repost post rows, each carrying the reposting actor_id. */
3936
- data: components["schemas"]["RepostPostResponseDto"][];
3937
- pagination: components["schemas"]["PaginationResponseDto"];
4367
+ PostStateResponseDto: {
4368
+ /** @description One entry per requested post id (de-duplicated, request order). Unknown / cross-community ids resolve to the empty state. */
4369
+ data: components["schemas"]["PostViewerStateEntryDto"][];
3938
4370
  };
3939
- RepostPostResponseDto: {
3940
- /**
3941
- * @description Author actor UUID.
3942
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
3943
- */
3944
- actor_id: string;
3945
- /**
3946
- * @description Free-form attributes blob.
3947
- * @example {}
3948
- */
3949
- attributes: Record<string, never>;
4371
+ PostViewerStateEntryDto: {
3950
4372
  /**
3951
- * @description Body. Always null for reposts.
3952
- * @example null
3953
- */
3954
- body: string | null;
3955
- /**
3956
- * @description Live denormalised comment count.
3957
- * @example 0
3958
- */
3959
- comment_count: number;
3960
- /**
3961
- * @description Owning community UUID.
3962
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3963
- */
3964
- community_id: string;
3965
- /**
3966
- * @description ISO timestamp.
3967
- * @example 2026-05-01T12:00:00.000Z
3968
- */
3969
- created_at: string;
3970
- /**
3971
- * @description ISO timestamp; null = no expiry.
3972
- * @example null
4373
+ * @description The viewer has bookmarked the post.
4374
+ * @example true
3973
4375
  */
3974
- expires_at: string | null;
4376
+ bookmarked: boolean;
3975
4377
  /**
3976
- * @description Post UUID.
4378
+ * @description Post UUID this entry describes.
3977
4379
  * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
3978
4380
  */
3979
- id: string;
4381
+ post_id: string;
3980
4382
  /**
3981
- * @description Post kind. 'repost' for repost rows.
3982
- * @example repost
4383
+ * @description Reaction types the viewer currently has on the post, sorted ascending. Empty when the viewer has not reacted.
4384
+ * @example [
4385
+ * "fire",
4386
+ * "like"
4387
+ * ]
3983
4388
  */
3984
- kind: string;
4389
+ reacted_types: string[];
3985
4390
  /**
3986
- * @description Pinned for highlights.
4391
+ * @description The viewer has a currently-published repost of the post.
3987
4392
  * @example false
3988
4393
  */
3989
- pinned: boolean;
3990
- /**
3991
- * @description Live denormalised reaction counts.
3992
- * @example {}
3993
- */
3994
- reaction_counts: Record<string, never>;
3995
- /**
3996
- * @description Reposts of this post (always 0 for the repost row itself).
3997
- * @example 0
3998
- */
3999
- repost_count: number;
4394
+ reposted: boolean;
4000
4395
  /**
4001
- * @description For reposts: source post UUID.
4002
- * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4003
- */
4004
- source_post_id: string | null;
4005
- /**
4006
- * @description Lifecycle status.
4007
- * @example published
4008
- * @enum {string}
4009
- */
4010
- status: "published" | "hidden" | "removed" | "draft";
4011
- /**
4012
- * @description Optional title.
4396
+ * @description Poll option index the viewer voted for; `null` when the viewer has not voted (or the post has no poll).
4013
4397
  * @example null
4014
4398
  */
4015
- title: string | null;
4016
- /**
4017
- * @description ISO timestamp.
4018
- * @example 2026-05-01T12:00:00.000Z
4019
- */
4020
- updated_at: string;
4021
- /**
4022
- * @description Optional URL.
4023
- * @example null
4024
- */
4025
- url: string | null;
4026
- /**
4027
- * @description Visibility scope (inherited from the source).
4028
- * @example public
4029
- * @enum {string}
4030
- */
4031
- visibility: "public" | "followers" | "close_friends" | "private";
4399
+ voted_option: number | null;
4032
4400
  };
4033
- SearchActorResponseDto: {
4401
+ ReactionCountsResponseDto: {
4034
4402
  /**
4035
- * @description Avatar URL.
4036
- * @example https://...
4403
+ * @description Denormalised reaction counts after the write.
4404
+ * @example {
4405
+ * "like": 12
4406
+ * }
4037
4407
  */
4038
- avatar_url: string | null;
4408
+ reaction_counts: Record<string, never>;
4409
+ };
4410
+ ReactionEdgeResponseDto: {
4039
4411
  /**
4040
4412
  * @description Owning community UUID.
4041
4413
  * @example cccccccc-cccc-cccc-cccc-cccccccccccc
@@ -4047,120 +4419,142 @@ interface components {
4047
4419
  */
4048
4420
  created_at: string;
4049
4421
  /**
4050
- * @description Display name.
4051
- * @example Ada Lovelace
4422
+ * @description Destination actor UUID — always `null` for post reactions (the target is `dst_post_id`).
4423
+ * @example null
4052
4424
  */
4053
- display_name: string | null;
4425
+ dst_actor_id: string | null;
4054
4426
  /**
4055
- * @description Customer-supplied stable identifier.
4056
- * @example ada
4427
+ * @description Target post UUID.
4428
+ * @example pppppppp-pppp-pppp-pppp-pppppppppppp
4057
4429
  */
4058
- external_id: string;
4430
+ dst_post_id: string;
4059
4431
  /**
4060
- * @description Social actor UUID.
4061
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
4432
+ * @description Edge UUID.
4433
+ * @example eeeeeeee-0000-0000-0000-000000000001
4062
4434
  */
4063
4435
  id: string;
4064
4436
  /**
4065
- * @description Free-form metadata.
4066
- * @example {}
4437
+ * @description Edge kind (`reaction:<type>`).
4438
+ * @example reaction:like
4067
4439
  */
4068
- metadata: Record<string, never>;
4440
+ kind: string;
4069
4441
  /**
4070
- * @description Lifecycle status. Search only surfaces `active` actors.
4071
- * @example active
4072
- * @enum {string}
4442
+ * @description Free-form payload.
4443
+ * @example {}
4073
4444
  */
4074
- status: "active" | "suspended" | "deleted";
4445
+ payload: Record<string, never>;
4075
4446
  /**
4076
- * @description ISO timestamp.
4077
- * @example 2026-05-01T12:00:00.000Z
4447
+ * @description Reactor actor UUID.
4448
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4078
4449
  */
4079
- updated_at: string;
4450
+ src_actor_id: string;
4080
4451
  };
4081
- SearchPostResponseDto: {
4082
- /**
4083
- * @description Author actor UUID.
4084
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
4085
- */
4086
- actor_id: string;
4452
+ ReactionResponseDto: {
4087
4453
  /**
4088
- * @description Free-form attributes blob.
4089
- * @example {}
4454
+ * @description `true` on first call; `false` on idempotent retry.
4455
+ * @example true
4090
4456
  */
4091
- attributes: Record<string, never>;
4457
+ created: boolean;
4458
+ edge: components["schemas"]["ReactionEdgeResponseDto"];
4092
4459
  /**
4093
- * @description Body text.
4094
- * @example shipping today.
4460
+ * @description Denormalised reaction counts after the write.
4461
+ * @example {
4462
+ * "fire": 3,
4463
+ * "like": 13
4464
+ * }
4095
4465
  */
4096
- body: string | null;
4466
+ reaction_counts: Record<string, never>;
4467
+ };
4468
+ RecordViewDto: {
4097
4469
  /**
4098
- * @description Live denormalised comment count.
4099
- * @example 0
4470
+ * @description Viewer social actor UUID.
4471
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4100
4472
  */
4101
- comment_count: number;
4473
+ viewer_actor_id: string;
4474
+ };
4475
+ RecordViewsDto: {
4102
4476
  /**
4103
- * @description Owning community UUID.
4104
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4477
+ * @description UUIDs of posts that became visible to the viewer in this batch. Capped at 200 to keep the payload sensible — the server will silently skip ids that aren't in the community or have been removed.
4478
+ * @example [
4479
+ * "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
4480
+ * "cccccccc-cccc-cccc-cccc-cccccccccccc"
4481
+ * ]
4105
4482
  */
4106
- community_id: string;
4483
+ post_ids: string[];
4484
+ };
4485
+ RelationshipEntryDto: {
4107
4486
  /**
4108
- * @description ISO timestamp.
4109
- * @example 2026-05-01T12:00:00.000Z
4487
+ * @description This actor has blocked the source actor — surface it BEFORE attempting a follow/react write instead of handling the 409.
4488
+ * @example false
4110
4489
  */
4111
- created_at: string;
4490
+ blocked_by: boolean;
4112
4491
  /**
4113
- * @description ISO timestamp; null = no expiry.
4114
- * @example null
4492
+ * @description The source actor has blocked this actor.
4493
+ * @example false
4115
4494
  */
4116
- expires_at: string | null;
4495
+ blocking: boolean;
4117
4496
  /**
4118
- * @description Post UUID.
4119
- * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4497
+ * @description This actor is on the source actor's close-friend list.
4498
+ * @example false
4120
4499
  */
4121
- id: string;
4500
+ close_friend: boolean;
4122
4501
  /**
4123
- * @description Free-form post kind.
4124
- * @example text
4502
+ * @description Destination actor UUID this entry describes.
4503
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4125
4504
  */
4126
- kind: string;
4505
+ dst_actor_id: string;
4127
4506
  /**
4128
- * @description Pinned for highlights.
4507
+ * @description This actor follows the source actor.
4129
4508
  * @example false
4130
4509
  */
4131
- pinned: boolean;
4510
+ followed_by: boolean;
4132
4511
  /**
4133
- * @description Live denormalised reaction counts.
4134
- * @example {}
4512
+ * @description The source actor follows this actor.
4513
+ * @example true
4135
4514
  */
4136
- reaction_counts: Record<string, never>;
4515
+ following: boolean;
4137
4516
  /**
4138
- * @description Lifecycle status. Search only surfaces 'published'.
4139
- * @example published
4140
- * @enum {string}
4517
+ * @description The source actor has muted this actor.
4518
+ * @example false
4141
4519
  */
4142
- status: "published" | "hidden" | "removed" | "draft";
4520
+ muting: boolean;
4143
4521
  /**
4144
- * @description Optional title.
4145
- * @example null
4522
+ * @description The source actor has restricted this actor.
4523
+ * @example false
4146
4524
  */
4147
- title: string | null;
4525
+ restricting: boolean;
4526
+ };
4527
+ RelationshipListResponseDto: {
4528
+ /** @description One entry per requested id (de-duplicated, request order). Unknown ids resolve to all-false flags. */
4529
+ data: components["schemas"]["RelationshipEntryDto"][];
4530
+ };
4531
+ RemoveListMemberDto: {
4148
4532
  /**
4149
- * @description ISO timestamp.
4150
- * @example 2026-05-01T12:00:00.000Z
4533
+ * @description Caller — social actor UUID. Must equal the list owner.
4534
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4151
4535
  */
4152
- updated_at: string;
4536
+ caller_actor_id: string;
4537
+ };
4538
+ RemoveMemberDto: {
4153
4539
  /**
4154
- * @description Optional URL.
4155
- * @example null
4540
+ * @description Social actor UUID of the acting party. Equal to the target for self-leave.
4541
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4156
4542
  */
4157
- url: string | null;
4543
+ caller_actor_id: string;
4544
+ };
4545
+ RenameGroupDto: {
4158
4546
  /**
4159
- * @description Visibility scope.
4160
- * @example public
4161
- * @enum {string}
4547
+ * @description Social actor UUID of the renaming admin.
4548
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4162
4549
  */
4163
- visibility: "public" | "followers" | "close_friends" | "private";
4550
+ caller_actor_id: string;
4551
+ /** @description New display name. Pass null or empty to clear. */
4552
+ name: string | null;
4553
+ };
4554
+ RepostListResponseDto: {
4555
+ /** @description Page of repost post rows, each carrying the reposting actor_id. */
4556
+ data: components["schemas"]["PostResponseDto"][];
4557
+ pagination: components["schemas"]["PaginationResponseDto"];
4164
4558
  };
4165
4559
  SendMessageDto: {
4166
4560
  attachments?: components["schemas"]["DirectMessageAttachmentDto"][];
@@ -4251,60 +4645,10 @@ interface components {
4251
4645
  };
4252
4646
  StoryViewersResponse: {
4253
4647
  data: components["schemas"]["StoryViewerResponse"][];
4254
- pagination: components["schemas"]["CursorPagination"];
4255
- };
4256
- SuggestedActorResponseDto: {
4257
- /**
4258
- * @description Avatar URL.
4259
- * @example https://cdn.example.com/avatars/ada.png
4260
- */
4261
- avatar_url: string | null;
4262
- /**
4263
- * @description Owning community UUID.
4264
- * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4265
- */
4266
- community_id: string;
4267
- /**
4268
- * @description ISO timestamp.
4269
- * @example 2026-05-01T12:00:00.000Z
4270
- */
4271
- created_at: string;
4272
- /**
4273
- * @description Display name.
4274
- * @example Ada Lovelace
4275
- */
4276
- display_name: string | null;
4277
- /**
4278
- * @description Customer-supplied stable identifier.
4279
- * @example user_abc123
4280
- */
4281
- external_id: string;
4282
- /**
4283
- * @description Social actor UUID.
4284
- * @example aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
4285
- */
4286
- id: string;
4287
- /**
4288
- * @description Free-form metadata blob.
4289
- * @example {
4290
- * "tier": "pro"
4291
- * }
4292
- */
4293
- metadata: Record<string, never>;
4294
- /**
4295
- * @description Lifecycle status. Suggestions only surface `active` actors.
4296
- * @example active
4297
- * @enum {string}
4298
- */
4299
- status: "active" | "suspended" | "deleted";
4300
- /**
4301
- * @description ISO timestamp.
4302
- * @example 2026-05-01T12:00:00.000Z
4303
- */
4304
- updated_at: string;
4648
+ pagination: components["schemas"]["PaginationResponseDto"];
4305
4649
  };
4306
4650
  SuggestedFollowResponseDto: {
4307
- actor: components["schemas"]["SuggestedActorResponseDto"];
4651
+ actor: components["schemas"]["ActorResponseDto"];
4308
4652
  /**
4309
4653
  * @description Why this candidate surfaced. `followed_by_friends` is the friend-of-a-friend signal; `top_in_community` is the cold-start fallback used when FoF doesn't fill the requested limit.
4310
4654
  * @example followed_by_friends
@@ -4372,7 +4716,8 @@ interface components {
4372
4716
  UpdateCommunityDto: {
4373
4717
  description?: string | null;
4374
4718
  display_name?: string;
4375
- settings?: Record<string, never>;
4719
+ /** @description Replaces the settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
4720
+ settings?: components["schemas"]["CommunitySettingsDto"];
4376
4721
  /** @enum {string} */
4377
4722
  status?: "active" | "suspended" | "archived";
4378
4723
  };
@@ -4439,7 +4784,7 @@ interface components {
4439
4784
  /** @description ISO-8601 publish-at timestamp. Updating only valid while the post is `status="scheduled"`. Pass null to clear (typically only the scheduler does this on promotion). */
4440
4785
  scheduled_for?: string | null;
4441
4786
  /**
4442
- * @description Direct status transition. Pass `published` to promote a `draft` or `scheduled`. Prefer the moderation lane for `hidden`/`removed`. Transitions to/from `draft`/`scheduled` other than to `published` are 422.
4787
+ * @description Direct status transition. Pass `published` to promote a `draft` or `scheduled`. Prefer the moderation lane for `hidden`/`removed`.
4443
4788
  * @enum {string}
4444
4789
  */
4445
4790
  status?: "published" | "hidden" | "removed" | "draft" | "scheduled";
@@ -4451,8 +4796,13 @@ interface components {
4451
4796
  visibility?: "public" | "followers" | "close_friends" | "private";
4452
4797
  };
4453
4798
  UpdateWebhookDto: {
4454
- /** @description New subscription set. */
4455
- event_types?: string[];
4799
+ /**
4800
+ * @description Set `false` to re-enable a disabled webhook (clears the auto-disable state and resets the failure streak — no secret rotation required). Set `true` to disable it manually.
4801
+ * @example false
4802
+ */
4803
+ disabled?: boolean;
4804
+ /** @description New subscription set. Unknown values are rejected with a 400 naming the valid set. */
4805
+ event_types?: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4456
4806
  /** @description New subscriber URL. */
4457
4807
  url?: string;
4458
4808
  };
@@ -4488,6 +4838,21 @@ interface components {
4488
4838
  */
4489
4839
  created: boolean;
4490
4840
  };
4841
+ WebhookEventTypesResponseDto: {
4842
+ /**
4843
+ * @description Every event type a webhook can subscribe to, in catalog order.
4844
+ * @example [
4845
+ * "post.created",
4846
+ * "post.deleted",
4847
+ * "comment.created"
4848
+ * ]
4849
+ */
4850
+ data: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4851
+ };
4852
+ WebhookListResponseDto: {
4853
+ /** @description Every webhook on the community — disabled rows included, so auto-disabled subscribers stay discoverable. */
4854
+ data: components["schemas"]["WebhookResponseDto"][];
4855
+ };
4491
4856
  WebhookResponseDto: {
4492
4857
  /**
4493
4858
  * @description Owning community UUID.
@@ -4515,13 +4880,13 @@ interface components {
4515
4880
  */
4516
4881
  disabled_reason: string | null;
4517
4882
  /**
4518
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
4883
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
4519
4884
  * @example [
4520
4885
  * "post.created",
4521
4886
  * "comment.created"
4522
4887
  * ]
4523
4888
  */
4524
- event_types: string[];
4889
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4525
4890
  /**
4526
4891
  * @description Webhook UUID.
4527
4892
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -4564,10 +4929,12 @@ interface operations {
4564
4929
  ActorController_list: {
4565
4930
  parameters: {
4566
4931
  query?: {
4567
- /** @description Page size; capped at 200. */
4932
+ /** @description Page size; capped at 200. Ignored when `ids` is passed. */
4568
4933
  limit?: number;
4569
- /** @description Opaque cursor from the previous page's `pagination.next_cursor`. */
4934
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Ignored when `ids` is passed. */
4570
4935
  cursor?: string;
4936
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated) to batch-fetch. Returns matching actors in request order; unknown ids are silently omitted. */
4937
+ ids?: string;
4571
4938
  };
4572
4939
  header?: never;
4573
4940
  path: {
@@ -4578,16 +4945,25 @@ interface operations {
4578
4945
  };
4579
4946
  requestBody?: never;
4580
4947
  responses: {
4581
- /** @description Page of actors with `next_cursor` + `has_more`. */
4948
+ /** @description Page of actors with `next_cursor` + `has_more` (batch-fetch responses always report `has_more: false`). */
4582
4949
  200: {
4583
4950
  headers: {
4584
4951
  [name: string]: unknown;
4585
4952
  };
4586
4953
  content: {
4587
- "application/json": components["schemas"]["ActorListResponseDto"];
4954
+ "application/json": components["schemas"]["ActorPageResponseDto"];
4588
4955
  };
4589
4956
  };
4590
- /** @description PAK lacks `social.read`. */
4957
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or invalid `ids` (`INVALID_ID_LIST` — empty / non-UUID entry; `TOO_MANY_IDS` — over 100). */
4958
+ 400: {
4959
+ headers: {
4960
+ [name: string]: unknown;
4961
+ };
4962
+ content: {
4963
+ "application/json": components["schemas"]["ErrorResponseDto"];
4964
+ };
4965
+ };
4966
+ /** @description PAK lacks `social.list`. */
4591
4967
  403: {
4592
4968
  headers: {
4593
4969
  [name: string]: unknown;
@@ -4661,6 +5037,114 @@ interface operations {
4661
5037
  };
4662
5038
  };
4663
5039
  };
5040
+ ActorController_batchUpsert: {
5041
+ parameters: {
5042
+ query?: never;
5043
+ header?: never;
5044
+ path: {
5045
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5046
+ communityId: string;
5047
+ };
5048
+ cookie?: never;
5049
+ };
5050
+ requestBody: {
5051
+ content: {
5052
+ "application/json": components["schemas"]["BatchUpsertActorsDto"];
5053
+ };
5054
+ };
5055
+ responses: {
5056
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
5057
+ 201: {
5058
+ headers: {
5059
+ [name: string]: unknown;
5060
+ };
5061
+ content: {
5062
+ "application/json": components["schemas"]["BatchActorsResponseDto"];
5063
+ };
5064
+ };
5065
+ /** @description Envelope validation failure: `actors` missing, empty, over 200 items, or an item shape invalid. */
5066
+ 400: {
5067
+ headers: {
5068
+ [name: string]: unknown;
5069
+ };
5070
+ content: {
5071
+ "application/json": components["schemas"]["ErrorResponseDto"];
5072
+ };
5073
+ };
5074
+ /** @description PAK lacks `social.create` for this community. */
5075
+ 403: {
5076
+ headers: {
5077
+ [name: string]: unknown;
5078
+ };
5079
+ content: {
5080
+ "application/json": components["schemas"]["ErrorResponseDto"];
5081
+ };
5082
+ };
5083
+ /** @description Community not found in the PAK's workspace. */
5084
+ 404: {
5085
+ headers: {
5086
+ [name: string]: unknown;
5087
+ };
5088
+ content: {
5089
+ "application/json": components["schemas"]["ErrorResponseDto"];
5090
+ };
5091
+ };
5092
+ };
5093
+ };
5094
+ ActorController_batchGetByExternal: {
5095
+ parameters: {
5096
+ query?: never;
5097
+ header?: never;
5098
+ path: {
5099
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5100
+ communityId: string;
5101
+ };
5102
+ cookie?: never;
5103
+ };
5104
+ requestBody: {
5105
+ content: {
5106
+ "application/json": components["schemas"]["BatchExternalIdsDto"];
5107
+ };
5108
+ };
5109
+ responses: {
5110
+ /** @description Actors found (request order, de-duplicated) plus the `missing[]` external_ids. */
5111
+ 200: {
5112
+ headers: {
5113
+ [name: string]: unknown;
5114
+ };
5115
+ content: {
5116
+ "application/json": components["schemas"]["ActorsByExternalBatchResponseDto"];
5117
+ };
5118
+ };
5119
+ /** @description `external_ids` missing, empty, over 200 items, or an entry exceeding 256 chars. */
5120
+ 400: {
5121
+ headers: {
5122
+ [name: string]: unknown;
5123
+ };
5124
+ content: {
5125
+ "application/json": components["schemas"]["ErrorResponseDto"];
5126
+ };
5127
+ };
5128
+ /** @description PAK lacks `social.read`. */
5129
+ 403: {
5130
+ headers: {
5131
+ [name: string]: unknown;
5132
+ };
5133
+ content: {
5134
+ "application/json": components["schemas"]["ErrorResponseDto"];
5135
+ };
5136
+ };
5137
+ /** @description Community not found in the PAK's workspace. */
5138
+ 404: {
5139
+ headers: {
5140
+ [name: string]: unknown;
5141
+ };
5142
+ content: {
5143
+ "application/json": components["schemas"]["ErrorResponseDto"];
5144
+ };
5145
+ };
5146
+ };
5147
+ };
4664
5148
  ActorController_getByExternal: {
4665
5149
  parameters: {
4666
5150
  query?: never;
@@ -4840,6 +5324,8 @@ interface operations {
4840
5324
  query?: {
4841
5325
  limit?: number;
4842
5326
  cursor?: string;
5327
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5328
+ expand?: "dst_actor";
4843
5329
  };
4844
5330
  header?: never;
4845
5331
  path: {
@@ -4858,10 +5344,19 @@ interface operations {
4858
5344
  [name: string]: unknown;
4859
5345
  };
4860
5346
  content: {
4861
- "application/json": components["schemas"]["EdgeListResponseDto"];
5347
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
4862
5348
  };
4863
5349
  };
4864
- /** @description PAK lacks `social.read`. */
5350
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
5351
+ 400: {
5352
+ headers: {
5353
+ [name: string]: unknown;
5354
+ };
5355
+ content: {
5356
+ "application/json": components["schemas"]["ErrorResponseDto"];
5357
+ };
5358
+ };
5359
+ /** @description PAK lacks `social.list`. */
4865
5360
  403: {
4866
5361
  headers: {
4867
5362
  [name: string]: unknown;
@@ -4954,13 +5449,13 @@ interface operations {
4954
5449
  "application/json": components["schemas"]["CloseFriendsListResponse"];
4955
5450
  };
4956
5451
  };
4957
- /** @description Missing or invalid PAK. */
4958
- 401: {
5452
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5453
+ 400: {
4959
5454
  headers: {
4960
5455
  [name: string]: unknown;
4961
5456
  };
4962
5457
  content: {
4963
- "application/json": components["schemas"]["ErrorResponse"];
5458
+ "application/json": components["schemas"]["ErrorResponseDto"];
4964
5459
  };
4965
5460
  };
4966
5461
  /** @description PAK lacks `social.close-friend.read`. */
@@ -4969,7 +5464,7 @@ interface operations {
4969
5464
  [name: string]: unknown;
4970
5465
  };
4971
5466
  content: {
4972
- "application/json": components["schemas"]["ErrorResponse"];
5467
+ "application/json": components["schemas"]["ErrorResponseDto"];
4973
5468
  };
4974
5469
  };
4975
5470
  /** @description Community or actor not found. */
@@ -4978,7 +5473,7 @@ interface operations {
4978
5473
  [name: string]: unknown;
4979
5474
  };
4980
5475
  content: {
4981
- "application/json": components["schemas"]["ErrorResponse"];
5476
+ "application/json": components["schemas"]["ErrorResponseDto"];
4982
5477
  };
4983
5478
  };
4984
5479
  };
@@ -5110,7 +5605,7 @@ interface operations {
5110
5605
  "application/json": components["schemas"]["ErrorResponseDto"];
5111
5606
  };
5112
5607
  };
5113
- /** @description PAK lacks `social.read`. */
5608
+ /** @description PAK lacks `social.list`. */
5114
5609
  403: {
5115
5610
  headers: {
5116
5611
  [name: string]: unknown;
@@ -5135,6 +5630,8 @@ interface operations {
5135
5630
  query?: {
5136
5631
  limit?: number;
5137
5632
  cursor?: string;
5633
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `src_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5634
+ expand?: "src_actor";
5138
5635
  };
5139
5636
  header?: never;
5140
5637
  path: {
@@ -5153,10 +5650,19 @@ interface operations {
5153
5650
  [name: string]: unknown;
5154
5651
  };
5155
5652
  content: {
5156
- "application/json": components["schemas"]["EdgeListResponseDto"];
5653
+ "application/json": components["schemas"]["FollowerEdgeListResponseDto"];
5157
5654
  };
5158
5655
  };
5159
- /** @description PAK lacks `social.read`. */
5656
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
5657
+ 400: {
5658
+ headers: {
5659
+ [name: string]: unknown;
5660
+ };
5661
+ content: {
5662
+ "application/json": components["schemas"]["ErrorResponseDto"];
5663
+ };
5664
+ };
5665
+ /** @description PAK lacks `social.list`. */
5160
5666
  403: {
5161
5667
  headers: {
5162
5668
  [name: string]: unknown;
@@ -5181,6 +5687,8 @@ interface operations {
5181
5687
  query?: {
5182
5688
  limit?: number;
5183
5689
  cursor?: string;
5690
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5691
+ expand?: "dst_actor";
5184
5692
  };
5185
5693
  header?: never;
5186
5694
  path: {
@@ -5199,10 +5707,19 @@ interface operations {
5199
5707
  [name: string]: unknown;
5200
5708
  };
5201
5709
  content: {
5202
- "application/json": components["schemas"]["EdgeListResponseDto"];
5710
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5203
5711
  };
5204
5712
  };
5205
- /** @description PAK lacks `social.read`. */
5713
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
5714
+ 400: {
5715
+ headers: {
5716
+ [name: string]: unknown;
5717
+ };
5718
+ content: {
5719
+ "application/json": components["schemas"]["ErrorResponseDto"];
5720
+ };
5721
+ };
5722
+ /** @description PAK lacks `social.list`. */
5206
5723
  403: {
5207
5724
  headers: {
5208
5725
  [name: string]: unknown;
@@ -5383,7 +5900,7 @@ interface operations {
5383
5900
  limit?: number;
5384
5901
  /** @description Cursor from the prior page. */
5385
5902
  cursor?: string;
5386
- /** @description Requester's external_id. Without it, only public pinned posts surface. */
5903
+ /** @description Requester social actor UUID. Without it, only public pinned posts surface. */
5387
5904
  requester_id?: string;
5388
5905
  };
5389
5906
  header?: never;
@@ -5406,22 +5923,13 @@ interface operations {
5406
5923
  "application/json": components["schemas"]["HighlightsResponse"];
5407
5924
  };
5408
5925
  };
5409
- /** @description Missing or invalid PAK. */
5410
- 401: {
5411
- headers: {
5412
- [name: string]: unknown;
5413
- };
5414
- content: {
5415
- "application/json": components["schemas"]["ErrorResponse"];
5416
- };
5417
- };
5418
- /** @description PAK lacks `social.read`. */
5926
+ /** @description PAK lacks `social.list`. */
5419
5927
  403: {
5420
5928
  headers: {
5421
5929
  [name: string]: unknown;
5422
5930
  };
5423
5931
  content: {
5424
- "application/json": components["schemas"]["ErrorResponse"];
5932
+ "application/json": components["schemas"]["ErrorResponseDto"];
5425
5933
  };
5426
5934
  };
5427
5935
  /** @description Community or actor not found. */
@@ -5430,7 +5938,7 @@ interface operations {
5430
5938
  [name: string]: unknown;
5431
5939
  };
5432
5940
  content: {
5433
- "application/json": components["schemas"]["ErrorResponse"];
5941
+ "application/json": components["schemas"]["ErrorResponseDto"];
5434
5942
  };
5435
5943
  };
5436
5944
  };
@@ -5629,6 +6137,8 @@ interface operations {
5629
6137
  query?: {
5630
6138
  limit?: number;
5631
6139
  cursor?: string;
6140
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
6141
+ expand?: "dst_actor";
5632
6142
  };
5633
6143
  header?: never;
5634
6144
  path: {
@@ -5647,10 +6157,19 @@ interface operations {
5647
6157
  [name: string]: unknown;
5648
6158
  };
5649
6159
  content: {
5650
- "application/json": components["schemas"]["EdgeListResponseDto"];
6160
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5651
6161
  };
5652
6162
  };
5653
- /** @description PAK lacks `social.read`. */
6163
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
6164
+ 400: {
6165
+ headers: {
6166
+ [name: string]: unknown;
6167
+ };
6168
+ content: {
6169
+ "application/json": components["schemas"]["ErrorResponseDto"];
6170
+ };
6171
+ };
6172
+ /** @description PAK lacks `social.list`. */
5654
6173
  403: {
5655
6174
  headers: {
5656
6175
  [name: string]: unknown;
@@ -5722,8 +6241,8 @@ interface operations {
5722
6241
  communityId: string;
5723
6242
  /** @description Social actor UUID. */
5724
6243
  actorId: string;
5725
- /** @description NotificationKind label (`follow` | `reaction` | `comment_on_post` | `reply_to_comment` | `mention` | `vote`). */
5726
- kind: string;
6244
+ /** @description NotificationKind label. */
6245
+ kind: "follow" | "reaction" | "comment_on_post" | "reply_to_comment" | "mention" | "vote" | "repost" | "quote_post" | "dm_new_message" | "dm_added_to_group" | "dm_role_changed" | "dm_reaction";
5727
6246
  };
5728
6247
  cookie?: never;
5729
6248
  };
@@ -5803,22 +6322,13 @@ interface operations {
5803
6322
  "application/json": components["schemas"]["NotificationListResponse"];
5804
6323
  };
5805
6324
  };
5806
- /** @description Missing or invalid PAK. */
5807
- 401: {
5808
- headers: {
5809
- [name: string]: unknown;
5810
- };
5811
- content: {
5812
- "application/json": components["schemas"]["ErrorResponse"];
5813
- };
5814
- };
5815
6325
  /** @description PAK lacks `social.notify.read` for this community. */
5816
6326
  403: {
5817
6327
  headers: {
5818
6328
  [name: string]: unknown;
5819
6329
  };
5820
6330
  content: {
5821
- "application/json": components["schemas"]["ErrorResponse"];
6331
+ "application/json": components["schemas"]["ErrorResponseDto"];
5822
6332
  };
5823
6333
  };
5824
6334
  /** @description Community or actor not found (also returned for cross-workspace probes). */
@@ -5827,7 +6337,7 @@ interface operations {
5827
6337
  [name: string]: unknown;
5828
6338
  };
5829
6339
  content: {
5830
- "application/json": components["schemas"]["ErrorResponse"];
6340
+ "application/json": components["schemas"]["ErrorResponseDto"];
5831
6341
  };
5832
6342
  };
5833
6343
  };
@@ -5865,16 +6375,7 @@ interface operations {
5865
6375
  [name: string]: unknown;
5866
6376
  };
5867
6377
  content: {
5868
- "application/json": components["schemas"]["ErrorResponse"];
5869
- };
5870
- };
5871
- /** @description Missing or invalid PAK. */
5872
- 401: {
5873
- headers: {
5874
- [name: string]: unknown;
5875
- };
5876
- content: {
5877
- "application/json": components["schemas"]["ErrorResponse"];
6378
+ "application/json": components["schemas"]["ErrorResponseDto"];
5878
6379
  };
5879
6380
  };
5880
6381
  /** @description PAK lacks `social.notify.update` for this community. */
@@ -5883,7 +6384,7 @@ interface operations {
5883
6384
  [name: string]: unknown;
5884
6385
  };
5885
6386
  content: {
5886
- "application/json": components["schemas"]["ErrorResponse"];
6387
+ "application/json": components["schemas"]["ErrorResponseDto"];
5887
6388
  };
5888
6389
  };
5889
6390
  /** @description Community or actor not found. */
@@ -5892,7 +6393,7 @@ interface operations {
5892
6393
  [name: string]: unknown;
5893
6394
  };
5894
6395
  content: {
5895
- "application/json": components["schemas"]["ErrorResponse"];
6396
+ "application/json": components["schemas"]["ErrorResponseDto"];
5896
6397
  };
5897
6398
  };
5898
6399
  };
@@ -5920,22 +6421,13 @@ interface operations {
5920
6421
  "application/json": components["schemas"]["UnreadCountResponse"];
5921
6422
  };
5922
6423
  };
5923
- /** @description Missing or invalid PAK. */
5924
- 401: {
5925
- headers: {
5926
- [name: string]: unknown;
5927
- };
5928
- content: {
5929
- "application/json": components["schemas"]["ErrorResponse"];
5930
- };
5931
- };
5932
6424
  /** @description PAK lacks `social.notify.read` for this community. */
5933
6425
  403: {
5934
6426
  headers: {
5935
6427
  [name: string]: unknown;
5936
6428
  };
5937
6429
  content: {
5938
- "application/json": components["schemas"]["ErrorResponse"];
6430
+ "application/json": components["schemas"]["ErrorResponseDto"];
5939
6431
  };
5940
6432
  };
5941
6433
  /** @description Community or actor not found. */
@@ -5944,7 +6436,7 @@ interface operations {
5944
6436
  [name: string]: unknown;
5945
6437
  };
5946
6438
  content: {
5947
- "application/json": components["schemas"]["ErrorResponse"];
6439
+ "application/json": components["schemas"]["ErrorResponseDto"];
5948
6440
  };
5949
6441
  };
5950
6442
  };
@@ -5982,34 +6474,81 @@ interface operations {
5982
6474
  [name: string]: unknown;
5983
6475
  };
5984
6476
  content: {
5985
- "application/json": components["schemas"]["ErrorResponse"];
6477
+ "application/json": components["schemas"]["ErrorResponseDto"];
5986
6478
  };
5987
6479
  };
5988
- /** @description Missing or invalid PAK. */
5989
- 401: {
6480
+ /** @description PAK lacks `social.notify.update` for this community. */
6481
+ 403: {
5990
6482
  headers: {
5991
6483
  [name: string]: unknown;
5992
6484
  };
5993
6485
  content: {
5994
- "application/json": components["schemas"]["ErrorResponse"];
6486
+ "application/json": components["schemas"]["ErrorResponseDto"];
5995
6487
  };
5996
6488
  };
5997
- /** @description PAK lacks `social.notify.update` for this community. */
6489
+ /** @description Notification not found, or belongs to a different actor. */
6490
+ 404: {
6491
+ headers: {
6492
+ [name: string]: unknown;
6493
+ };
6494
+ content: {
6495
+ "application/json": components["schemas"]["ErrorResponseDto"];
6496
+ };
6497
+ };
6498
+ };
6499
+ };
6500
+ ViewerStateController_postState: {
6501
+ parameters: {
6502
+ query?: never;
6503
+ header?: never;
6504
+ path: {
6505
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6506
+ communityId: string;
6507
+ /** @description Viewer actor UUID — the perspective all state is computed from. */
6508
+ actorId: string;
6509
+ };
6510
+ cookie?: never;
6511
+ };
6512
+ requestBody: {
6513
+ content: {
6514
+ "application/json": components["schemas"]["PostStateRequestDto"];
6515
+ };
6516
+ };
6517
+ responses: {
6518
+ /** @description One state entry per requested post id. */
6519
+ 200: {
6520
+ headers: {
6521
+ [name: string]: unknown;
6522
+ };
6523
+ content: {
6524
+ "application/json": components["schemas"]["PostStateResponseDto"];
6525
+ };
6526
+ };
6527
+ /** @description Empty `post_ids`, more than 200 ids, or a non-UUID in the list. */
6528
+ 400: {
6529
+ headers: {
6530
+ [name: string]: unknown;
6531
+ };
6532
+ content: {
6533
+ "application/json": components["schemas"]["ErrorResponseDto"];
6534
+ };
6535
+ };
6536
+ /** @description PAK lacks `social.list`. */
5998
6537
  403: {
5999
6538
  headers: {
6000
6539
  [name: string]: unknown;
6001
6540
  };
6002
6541
  content: {
6003
- "application/json": components["schemas"]["ErrorResponse"];
6542
+ "application/json": components["schemas"]["ErrorResponseDto"];
6004
6543
  };
6005
6544
  };
6006
- /** @description Notification not found, or belongs to a different actor. */
6545
+ /** @description Community or actor not found. */
6007
6546
  404: {
6008
6547
  headers: {
6009
6548
  [name: string]: unknown;
6010
6549
  };
6011
6550
  content: {
6012
- "application/json": components["schemas"]["ErrorResponse"];
6551
+ "application/json": components["schemas"]["ErrorResponseDto"];
6013
6552
  };
6014
6553
  };
6015
6554
  };
@@ -6019,6 +6558,8 @@ interface operations {
6019
6558
  query?: {
6020
6559
  limit?: number;
6021
6560
  cursor?: string;
6561
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
6562
+ expand?: "dst_actor";
6022
6563
  };
6023
6564
  header?: never;
6024
6565
  path: {
@@ -6037,10 +6578,19 @@ interface operations {
6037
6578
  [name: string]: unknown;
6038
6579
  };
6039
6580
  content: {
6040
- "application/json": components["schemas"]["EdgeListResponseDto"];
6581
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
6582
+ };
6583
+ };
6584
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
6585
+ 400: {
6586
+ headers: {
6587
+ [name: string]: unknown;
6588
+ };
6589
+ content: {
6590
+ "application/json": components["schemas"]["ErrorResponseDto"];
6041
6591
  };
6042
6592
  };
6043
- /** @description PAK lacks `social.read`. */
6593
+ /** @description PAK lacks `social.list`. */
6044
6594
  403: {
6045
6595
  headers: {
6046
6596
  [name: string]: unknown;
@@ -6129,22 +6679,13 @@ interface operations {
6129
6679
  "application/json": components["schemas"]["StoryTrayResponse"];
6130
6680
  };
6131
6681
  };
6132
- /** @description Missing or invalid PAK. */
6133
- 401: {
6134
- headers: {
6135
- [name: string]: unknown;
6136
- };
6137
- content: {
6138
- "application/json": components["schemas"]["ErrorResponse"];
6139
- };
6140
- };
6141
- /** @description PAK lacks `social.read`. */
6682
+ /** @description PAK lacks `social.list`. */
6142
6683
  403: {
6143
6684
  headers: {
6144
6685
  [name: string]: unknown;
6145
6686
  };
6146
6687
  content: {
6147
- "application/json": components["schemas"]["ErrorResponse"];
6688
+ "application/json": components["schemas"]["ErrorResponseDto"];
6148
6689
  };
6149
6690
  };
6150
6691
  /** @description Community or actor not found. */
@@ -6153,7 +6694,7 @@ interface operations {
6153
6694
  [name: string]: unknown;
6154
6695
  };
6155
6696
  content: {
6156
- "application/json": components["schemas"]["ErrorResponse"];
6697
+ "application/json": components["schemas"]["ErrorResponseDto"];
6157
6698
  };
6158
6699
  };
6159
6700
  };
@@ -6204,6 +6745,61 @@ interface operations {
6204
6745
  };
6205
6746
  };
6206
6747
  };
6748
+ EdgeController_relationships: {
6749
+ parameters: {
6750
+ query: {
6751
+ /** @description Comma-separated destination actor UUIDs (1-100). */
6752
+ with: string;
6753
+ };
6754
+ header?: never;
6755
+ path: {
6756
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6757
+ communityId: string;
6758
+ /** @description Source actor UUID — the perspective all flags are computed from. */
6759
+ srcActorId: string;
6760
+ };
6761
+ cookie?: never;
6762
+ };
6763
+ requestBody?: never;
6764
+ responses: {
6765
+ /** @description One relationship entry per requested id. */
6766
+ 200: {
6767
+ headers: {
6768
+ [name: string]: unknown;
6769
+ };
6770
+ content: {
6771
+ "application/json": components["schemas"]["RelationshipListResponseDto"];
6772
+ };
6773
+ };
6774
+ /** @description Missing `with`, more than 100 ids, or a non-UUID value in the list. */
6775
+ 400: {
6776
+ headers: {
6777
+ [name: string]: unknown;
6778
+ };
6779
+ content: {
6780
+ "application/json": components["schemas"]["ErrorResponseDto"];
6781
+ };
6782
+ };
6783
+ /** @description PAK lacks `social.list`. */
6784
+ 403: {
6785
+ headers: {
6786
+ [name: string]: unknown;
6787
+ };
6788
+ content: {
6789
+ "application/json": components["schemas"]["ErrorResponseDto"];
6790
+ };
6791
+ };
6792
+ /** @description Community or source actor not found. */
6793
+ 404: {
6794
+ headers: {
6795
+ [name: string]: unknown;
6796
+ };
6797
+ content: {
6798
+ "application/json": components["schemas"]["ErrorResponseDto"];
6799
+ };
6800
+ };
6801
+ };
6802
+ };
6207
6803
  EdgeController_block: {
6208
6804
  parameters: {
6209
6805
  query?: never;
@@ -6256,6 +6852,15 @@ interface operations {
6256
6852
  "application/json": components["schemas"]["ErrorResponseDto"];
6257
6853
  };
6258
6854
  };
6855
+ /** @description Cannot block yourself. */
6856
+ 422: {
6857
+ headers: {
6858
+ [name: string]: unknown;
6859
+ };
6860
+ content: {
6861
+ "application/json": components["schemas"]["ErrorResponseDto"];
6862
+ };
6863
+ };
6259
6864
  };
6260
6865
  };
6261
6866
  EdgeController_unblock: {
@@ -6274,7 +6879,7 @@ interface operations {
6274
6879
  };
6275
6880
  requestBody?: never;
6276
6881
  responses: {
6277
- /** @description Unblocked. */
6882
+ /** @description Unblocked (or no edge to remove). */
6278
6883
  204: {
6279
6884
  headers: {
6280
6885
  [name: string]: unknown;
@@ -6290,7 +6895,7 @@ interface operations {
6290
6895
  "application/json": components["schemas"]["ErrorResponseDto"];
6291
6896
  };
6292
6897
  };
6293
- /** @description Community not found. */
6898
+ /** @description Community or actor not found. */
6294
6899
  404: {
6295
6900
  headers: {
6296
6901
  [name: string]: unknown;
@@ -6330,16 +6935,7 @@ interface operations {
6330
6935
  [name: string]: unknown;
6331
6936
  };
6332
6937
  content: {
6333
- "application/json": components["schemas"]["ErrorResponse"];
6334
- };
6335
- };
6336
- /** @description Missing or invalid PAK. */
6337
- 401: {
6338
- headers: {
6339
- [name: string]: unknown;
6340
- };
6341
- content: {
6342
- "application/json": components["schemas"]["ErrorResponse"];
6938
+ "application/json": components["schemas"]["ErrorResponseDto"];
6343
6939
  };
6344
6940
  };
6345
6941
  /** @description PAK lacks `social.close-friend.manage`. */
@@ -6348,7 +6944,7 @@ interface operations {
6348
6944
  [name: string]: unknown;
6349
6945
  };
6350
6946
  content: {
6351
- "application/json": components["schemas"]["ErrorResponse"];
6947
+ "application/json": components["schemas"]["ErrorResponseDto"];
6352
6948
  };
6353
6949
  };
6354
6950
  /** @description Community / owner / member not found. */
@@ -6357,7 +6953,7 @@ interface operations {
6357
6953
  [name: string]: unknown;
6358
6954
  };
6359
6955
  content: {
6360
- "application/json": components["schemas"]["ErrorResponse"];
6956
+ "application/json": components["schemas"]["ErrorResponseDto"];
6361
6957
  };
6362
6958
  };
6363
6959
  /** @description Block in place between owner and member. */
@@ -6366,7 +6962,7 @@ interface operations {
6366
6962
  [name: string]: unknown;
6367
6963
  };
6368
6964
  content: {
6369
- "application/json": components["schemas"]["ErrorResponse"];
6965
+ "application/json": components["schemas"]["ErrorResponseDto"];
6370
6966
  };
6371
6967
  };
6372
6968
  /** @description Cannot add yourself as a close friend. */
@@ -6375,7 +6971,7 @@ interface operations {
6375
6971
  [name: string]: unknown;
6376
6972
  };
6377
6973
  content: {
6378
- "application/json": components["schemas"]["ErrorResponse"];
6974
+ "application/json": components["schemas"]["ErrorResponseDto"];
6379
6975
  };
6380
6976
  };
6381
6977
  };
@@ -6403,22 +6999,13 @@ interface operations {
6403
6999
  };
6404
7000
  content?: never;
6405
7001
  };
6406
- /** @description Missing or invalid PAK. */
6407
- 401: {
6408
- headers: {
6409
- [name: string]: unknown;
6410
- };
6411
- content: {
6412
- "application/json": components["schemas"]["ErrorResponse"];
6413
- };
6414
- };
6415
7002
  /** @description PAK lacks `social.close-friend.manage`. */
6416
7003
  403: {
6417
7004
  headers: {
6418
7005
  [name: string]: unknown;
6419
7006
  };
6420
7007
  content: {
6421
- "application/json": components["schemas"]["ErrorResponse"];
7008
+ "application/json": components["schemas"]["ErrorResponseDto"];
6422
7009
  };
6423
7010
  };
6424
7011
  /** @description Community not found. */
@@ -6427,7 +7014,7 @@ interface operations {
6427
7014
  [name: string]: unknown;
6428
7015
  };
6429
7016
  content: {
6430
- "application/json": components["schemas"]["ErrorResponse"];
7017
+ "application/json": components["schemas"]["ErrorResponseDto"];
6431
7018
  };
6432
7019
  };
6433
7020
  };
@@ -6483,7 +7070,10 @@ interface operations {
6483
7070
  ConversationController_create: {
6484
7071
  parameters: {
6485
7072
  query?: never;
6486
- header?: never;
7073
+ header?: {
7074
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Mostly useful for `kind="group"` (direct conversations are get-or-create by participant pair anyway). Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
7075
+ "Idempotency-Key"?: string;
7076
+ };
6487
7077
  path: {
6488
7078
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6489
7079
  communityId: string;
@@ -6505,7 +7095,7 @@ interface operations {
6505
7095
  "application/json": components["schemas"]["ConversationResponseDto"];
6506
7096
  };
6507
7097
  };
6508
- /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids). */
7098
+ /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids, malformed Idempotency-Key). */
6509
7099
  400: {
6510
7100
  headers: {
6511
7101
  [name: string]: unknown;
@@ -6532,7 +7122,7 @@ interface operations {
6532
7122
  "application/json": components["schemas"]["ErrorResponseDto"];
6533
7123
  };
6534
7124
  };
6535
- /** @description A block exists, or the group exceeds `community.settings.max_group_conversation_size`. */
7125
+ /** @description A block exists, the group exceeds `community.settings.max_group_conversation_size`, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
6536
7126
  409: {
6537
7127
  headers: {
6538
7128
  [name: string]: unknown;
@@ -6966,7 +7556,10 @@ interface operations {
6966
7556
  ConversationController_send: {
6967
7557
  parameters: {
6968
7558
  query?: never;
6969
- header?: never;
7559
+ header?: {
7560
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
7561
+ "Idempotency-Key"?: string;
7562
+ };
6970
7563
  path: {
6971
7564
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6972
7565
  communityId: string;
@@ -6990,7 +7583,7 @@ interface operations {
6990
7583
  "application/json": components["schemas"]["DirectMessageResponseDto"];
6991
7584
  };
6992
7585
  };
6993
- /** @description Validation failure (empty body for text, body too long). */
7586
+ /** @description Validation failure (empty body for text, body too long, malformed Idempotency-Key). */
6994
7587
  400: {
6995
7588
  headers: {
6996
7589
  [name: string]: unknown;
@@ -7017,7 +7610,7 @@ interface operations {
7017
7610
  "application/json": components["schemas"]["ErrorResponseDto"];
7018
7611
  };
7019
7612
  };
7020
- /** @description A block exists between the sender and another participant. */
7613
+ /** @description A block exists between the sender and another participant, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
7021
7614
  409: {
7022
7615
  headers: {
7023
7616
  [name: string]: unknown;
@@ -7427,6 +8020,59 @@ interface operations {
7427
8020
  };
7428
8021
  };
7429
8022
  };
8023
+ CounterController_getBatchCounters: {
8024
+ parameters: {
8025
+ query: {
8026
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated). */
8027
+ actor_ids: string;
8028
+ };
8029
+ header?: never;
8030
+ path: {
8031
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8032
+ communityId: string;
8033
+ };
8034
+ cookie?: never;
8035
+ };
8036
+ requestBody?: never;
8037
+ responses: {
8038
+ /** @description Counters for each actor found plus the `missing[]` ids. */
8039
+ 200: {
8040
+ headers: {
8041
+ [name: string]: unknown;
8042
+ };
8043
+ content: {
8044
+ "application/json": components["schemas"]["BatchCountersResponseDto"];
8045
+ };
8046
+ };
8047
+ /** @description `actor_ids` missing or empty, a non-UUID entry (`INVALID_ID_LIST`), or over 100 ids (`TOO_MANY_IDS`). */
8048
+ 400: {
8049
+ headers: {
8050
+ [name: string]: unknown;
8051
+ };
8052
+ content: {
8053
+ "application/json": components["schemas"]["ErrorResponseDto"];
8054
+ };
8055
+ };
8056
+ /** @description PAK lacks `social.read`. */
8057
+ 403: {
8058
+ headers: {
8059
+ [name: string]: unknown;
8060
+ };
8061
+ content: {
8062
+ "application/json": components["schemas"]["ErrorResponseDto"];
8063
+ };
8064
+ };
8065
+ /** @description Community not found in the PAK's workspace. (Unknown actors land in `missing[]`, not a 404.) */
8066
+ 404: {
8067
+ headers: {
8068
+ [name: string]: unknown;
8069
+ };
8070
+ content: {
8071
+ "application/json": components["schemas"]["ErrorResponseDto"];
8072
+ };
8073
+ };
8074
+ };
8075
+ };
7430
8076
  FeedController_getDiscoverFeed: {
7431
8077
  parameters: {
7432
8078
  query?: {
@@ -7489,13 +8135,13 @@ interface operations {
7489
8135
  };
7490
8136
  };
7491
8137
  responses: {
7492
- /** @description Flag created (or de-duplicated to existing open flag). */
8138
+ /** @description Flag created (or de-duplicated to existing open flag). `auto_hidden` reports whether the auto-hide threshold tripped. */
7493
8139
  201: {
7494
8140
  headers: {
7495
8141
  [name: string]: unknown;
7496
8142
  };
7497
8143
  content: {
7498
- "application/json": components["schemas"]["FlagResponseDto"];
8144
+ "application/json": components["schemas"]["CreateFlagResponseDto"];
7499
8145
  };
7500
8146
  };
7501
8147
  /** @description Validation failure (bad reporter / target / reason). */
@@ -7525,7 +8171,16 @@ interface operations {
7525
8171
  "application/json": components["schemas"]["ErrorResponseDto"];
7526
8172
  };
7527
8173
  };
7528
- /** @description Cannot flag your own content, or the target post/comment is already removed. */
8174
+ /** @description The target post/comment is already removed; nothing to flag. */
8175
+ 409: {
8176
+ headers: {
8177
+ [name: string]: unknown;
8178
+ };
8179
+ content: {
8180
+ "application/json": components["schemas"]["ErrorResponseDto"];
8181
+ };
8182
+ };
8183
+ /** @description Cannot flag your own content. */
7529
8184
  422: {
7530
8185
  headers: {
7531
8186
  [name: string]: unknown;
@@ -7597,6 +8252,69 @@ interface operations {
7597
8252
  "application/json": components["schemas"]["ErrorResponseDto"];
7598
8253
  };
7599
8254
  };
8255
+ /** @description Cannot follow yourself. */
8256
+ 422: {
8257
+ headers: {
8258
+ [name: string]: unknown;
8259
+ };
8260
+ content: {
8261
+ "application/json": components["schemas"]["ErrorResponseDto"];
8262
+ };
8263
+ };
8264
+ };
8265
+ };
8266
+ EdgeController_batchFollows: {
8267
+ parameters: {
8268
+ query?: never;
8269
+ header?: never;
8270
+ path: {
8271
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8272
+ communityId: string;
8273
+ };
8274
+ cookie?: never;
8275
+ };
8276
+ requestBody: {
8277
+ content: {
8278
+ "application/json": components["schemas"]["BatchFollowsDto"];
8279
+ };
8280
+ };
8281
+ responses: {
8282
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
8283
+ 201: {
8284
+ headers: {
8285
+ [name: string]: unknown;
8286
+ };
8287
+ content: {
8288
+ "application/json": components["schemas"]["BatchFollowsResponseDto"];
8289
+ };
8290
+ };
8291
+ /** @description Envelope validation failure: `follows` missing, empty, over 200 items, or an item shape invalid. */
8292
+ 400: {
8293
+ headers: {
8294
+ [name: string]: unknown;
8295
+ };
8296
+ content: {
8297
+ "application/json": components["schemas"]["ErrorResponseDto"];
8298
+ };
8299
+ };
8300
+ /** @description PAK lacks `social.create`. */
8301
+ 403: {
8302
+ headers: {
8303
+ [name: string]: unknown;
8304
+ };
8305
+ content: {
8306
+ "application/json": components["schemas"]["ErrorResponseDto"];
8307
+ };
8308
+ };
8309
+ /** @description Community not found in the PAK's workspace. (Unknown actors fail per item, not the whole call.) */
8310
+ 404: {
8311
+ headers: {
8312
+ [name: string]: unknown;
8313
+ };
8314
+ content: {
8315
+ "application/json": components["schemas"]["ErrorResponseDto"];
8316
+ };
8317
+ };
7600
8318
  };
7601
8319
  };
7602
8320
  EdgeController_unfollow: {
@@ -7631,7 +8349,7 @@ interface operations {
7631
8349
  "application/json": components["schemas"]["ErrorResponseDto"];
7632
8350
  };
7633
8351
  };
7634
- /** @description Community not found. */
8352
+ /** @description Community or actor not found. */
7635
8353
  404: {
7636
8354
  headers: {
7637
8355
  [name: string]: unknown;
@@ -7764,6 +8482,15 @@ interface operations {
7764
8482
  "application/json": components["schemas"]["HashtagPostListResponseDto"];
7765
8483
  };
7766
8484
  };
8485
+ /** @description Invalid tag (empty after normalisation, or longer than 32 chars). */
8486
+ 400: {
8487
+ headers: {
8488
+ [name: string]: unknown;
8489
+ };
8490
+ content: {
8491
+ "application/json": components["schemas"]["ErrorResponseDto"];
8492
+ };
8493
+ };
7767
8494
  /** @description PAK lacks `social.list`. */
7768
8495
  403: {
7769
8496
  headers: {
@@ -7826,7 +8553,10 @@ interface operations {
7826
8553
  ActorListController_create: {
7827
8554
  parameters: {
7828
8555
  query?: never;
7829
- header?: never;
8556
+ header?: {
8557
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
8558
+ "Idempotency-Key"?: string;
8559
+ };
7830
8560
  path: {
7831
8561
  /** @description Social community UUID. */
7832
8562
  communityId: string;
@@ -7848,7 +8578,7 @@ interface operations {
7848
8578
  "application/json": components["schemas"]["ActorListResponseDto"];
7849
8579
  };
7850
8580
  };
7851
- /** @description Validation failure. */
8581
+ /** @description Validation failure (including malformed Idempotency-Key). */
7852
8582
  400: {
7853
8583
  headers: {
7854
8584
  [name: string]: unknown;
@@ -7875,6 +8605,15 @@ interface operations {
7875
8605
  "application/json": components["schemas"]["ErrorResponseDto"];
7876
8606
  };
7877
8607
  };
8608
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
8609
+ 409: {
8610
+ headers: {
8611
+ [name: string]: unknown;
8612
+ };
8613
+ content: {
8614
+ "application/json": components["schemas"]["ErrorResponseDto"];
8615
+ };
8616
+ };
7878
8617
  };
7879
8618
  };
7880
8619
  ActorListController_getById: {
@@ -8144,7 +8883,7 @@ interface operations {
8144
8883
  };
8145
8884
  requestBody: {
8146
8885
  content: {
8147
- "application/json": components["schemas"]["AddMemberDto"];
8886
+ "application/json": components["schemas"]["AddListMemberDto"];
8148
8887
  };
8149
8888
  };
8150
8889
  responses: {
@@ -8202,7 +8941,7 @@ interface operations {
8202
8941
  };
8203
8942
  requestBody: {
8204
8943
  content: {
8205
- "application/json": components["schemas"]["RemoveMemberDto"];
8944
+ "application/json": components["schemas"]["RemoveListMemberDto"];
8206
8945
  };
8207
8946
  };
8208
8947
  responses: {
@@ -8294,6 +9033,15 @@ interface operations {
8294
9033
  "application/json": components["schemas"]["ErrorResponseDto"];
8295
9034
  };
8296
9035
  };
9036
+ /** @description Cannot mute yourself. */
9037
+ 422: {
9038
+ headers: {
9039
+ [name: string]: unknown;
9040
+ };
9041
+ content: {
9042
+ "application/json": components["schemas"]["ErrorResponseDto"];
9043
+ };
9044
+ };
8297
9045
  };
8298
9046
  };
8299
9047
  EdgeController_unmute: {
@@ -8312,7 +9060,7 @@ interface operations {
8312
9060
  };
8313
9061
  requestBody?: never;
8314
9062
  responses: {
8315
- /** @description Unmuted. */
9063
+ /** @description Unmuted (or no edge to remove). */
8316
9064
  204: {
8317
9065
  headers: {
8318
9066
  [name: string]: unknown;
@@ -8328,7 +9076,7 @@ interface operations {
8328
9076
  "application/json": components["schemas"]["ErrorResponseDto"];
8329
9077
  };
8330
9078
  };
8331
- /** @description Community not found. */
9079
+ /** @description Community or actor not found. */
8332
9080
  404: {
8333
9081
  headers: {
8334
9082
  [name: string]: unknown;
@@ -8365,7 +9113,7 @@ interface operations {
8365
9113
  "application/json": components["schemas"]["PostListResponseDto"];
8366
9114
  };
8367
9115
  };
8368
- /** @description PAK lacks `social.read`. */
9116
+ /** @description PAK lacks `social.list`. */
8369
9117
  403: {
8370
9118
  headers: {
8371
9119
  [name: string]: unknown;
@@ -8388,7 +9136,10 @@ interface operations {
8388
9136
  PostController_create: {
8389
9137
  parameters: {
8390
9138
  query?: never;
8391
- header?: never;
9139
+ header?: {
9140
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
9141
+ "Idempotency-Key"?: string;
9142
+ };
8392
9143
  path: {
8393
9144
  communityId: string;
8394
9145
  };
@@ -8409,7 +9160,7 @@ interface operations {
8409
9160
  "application/json": components["schemas"]["PostResponseDto"];
8410
9161
  };
8411
9162
  };
8412
- /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp). */
9163
+ /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp; malformed Idempotency-Key). */
8413
9164
  400: {
8414
9165
  headers: {
8415
9166
  [name: string]: unknown;
@@ -8427,8 +9178,26 @@ interface operations {
8427
9178
  "application/json": components["schemas"]["ErrorResponseDto"];
8428
9179
  };
8429
9180
  };
8430
- /** @description Community or actor not found in the PAK's workspace. */
8431
- 404: {
9181
+ /** @description Community, actor, or quote source post not found in the PAK's workspace. */
9182
+ 404: {
9183
+ headers: {
9184
+ [name: string]: unknown;
9185
+ };
9186
+ content: {
9187
+ "application/json": components["schemas"]["ErrorResponseDto"];
9188
+ };
9189
+ };
9190
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
9191
+ 409: {
9192
+ headers: {
9193
+ [name: string]: unknown;
9194
+ };
9195
+ content: {
9196
+ "application/json": components["schemas"]["ErrorResponseDto"];
9197
+ };
9198
+ };
9199
+ /** @description Quote rules: `CANNOT_QUOTE_SELF` (kind='quote' with your own post as source) or `CANNOT_QUOTE_PRIVATE` (source post is private). */
9200
+ 422: {
8432
9201
  headers: {
8433
9202
  [name: string]: unknown;
8434
9203
  };
@@ -8618,6 +9387,15 @@ interface operations {
8618
9387
  "application/json": components["schemas"]["ErrorResponseDto"];
8619
9388
  };
8620
9389
  };
9390
+ /** @description `EDIT_WINDOW_EXPIRED` (content edit after the community's edit window), or `scheduled_for` passed while the post is not `status='scheduled'`. */
9391
+ 422: {
9392
+ headers: {
9393
+ [name: string]: unknown;
9394
+ };
9395
+ content: {
9396
+ "application/json": components["schemas"]["ErrorResponseDto"];
9397
+ };
9398
+ };
8621
9399
  };
8622
9400
  };
8623
9401
  BookmarkController_create: {
@@ -8760,7 +9538,7 @@ interface operations {
8760
9538
  "application/json": components["schemas"]["CommentListResponseDto"];
8761
9539
  };
8762
9540
  };
8763
- /** @description PAK lacks `social.read`. */
9541
+ /** @description PAK lacks `social.list`. */
8764
9542
  403: {
8765
9543
  headers: {
8766
9544
  [name: string]: unknown;
@@ -8783,7 +9561,10 @@ interface operations {
8783
9561
  CommentController_create: {
8784
9562
  parameters: {
8785
9563
  query?: never;
8786
- header?: never;
9564
+ header?: {
9565
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
9566
+ "Idempotency-Key"?: string;
9567
+ };
8787
9568
  path: {
8788
9569
  /** @description Social community UUID. Must belong to the PAK's workspace. */
8789
9570
  communityId: string;
@@ -8807,7 +9588,7 @@ interface operations {
8807
9588
  "application/json": components["schemas"]["CommentResponseDto"];
8808
9589
  };
8809
9590
  };
8810
- /** @description Validation failure (missing actor_id, empty body, body too long). */
9591
+ /** @description Validation failure (missing actor_id, empty body, body too long, malformed Idempotency-Key). */
8811
9592
  400: {
8812
9593
  headers: {
8813
9594
  [name: string]: unknown;
@@ -8834,7 +9615,7 @@ interface operations {
8834
9615
  "application/json": components["schemas"]["ErrorResponseDto"];
8835
9616
  };
8836
9617
  };
8837
- /** @description Block exists between commenter and post author, or depth exceeds community.settings.max_comment_depth. */
9618
+ /** @description Block exists between commenter and post author, depth exceeds community.settings.max_comment_depth, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
8838
9619
  409: {
8839
9620
  headers: {
8840
9621
  [name: string]: unknown;
@@ -9256,22 +10037,13 @@ interface operations {
9256
10037
  "application/json": components["schemas"]["PollResultsResponse"];
9257
10038
  };
9258
10039
  };
9259
- /** @description Missing or invalid PAK. */
9260
- 401: {
9261
- headers: {
9262
- [name: string]: unknown;
9263
- };
9264
- content: {
9265
- "application/json": components["schemas"]["ErrorResponse"];
9266
- };
9267
- };
9268
10040
  /** @description PAK lacks `social.read`. */
9269
10041
  403: {
9270
10042
  headers: {
9271
10043
  [name: string]: unknown;
9272
10044
  };
9273
10045
  content: {
9274
- "application/json": components["schemas"]["ErrorResponse"];
10046
+ "application/json": components["schemas"]["ErrorResponseDto"];
9275
10047
  };
9276
10048
  };
9277
10049
  /** @description Community or post not found. */
@@ -9280,7 +10052,7 @@ interface operations {
9280
10052
  [name: string]: unknown;
9281
10053
  };
9282
10054
  content: {
9283
- "application/json": components["schemas"]["ErrorResponse"];
10055
+ "application/json": components["schemas"]["ErrorResponseDto"];
9284
10056
  };
9285
10057
  };
9286
10058
  /** @description Post does not contain a poll. */
@@ -9289,7 +10061,7 @@ interface operations {
9289
10061
  [name: string]: unknown;
9290
10062
  };
9291
10063
  content: {
9292
- "application/json": components["schemas"]["ErrorResponse"];
10064
+ "application/json": components["schemas"]["ErrorResponseDto"];
9293
10065
  };
9294
10066
  };
9295
10067
  };
@@ -9339,6 +10111,63 @@ interface operations {
9339
10111
  };
9340
10112
  };
9341
10113
  };
10114
+ PostReactionController_list: {
10115
+ parameters: {
10116
+ query?: {
10117
+ /** @description Filter to a single reaction type label. */
10118
+ type?: string;
10119
+ limit?: number;
10120
+ cursor?: string;
10121
+ };
10122
+ header?: never;
10123
+ path: {
10124
+ /** @description Social community UUID. */
10125
+ communityId: string;
10126
+ /** @description Social post UUID. */
10127
+ postId: string;
10128
+ };
10129
+ cookie?: never;
10130
+ };
10131
+ requestBody?: never;
10132
+ responses: {
10133
+ /** @description Page of reactions. */
10134
+ 200: {
10135
+ headers: {
10136
+ [name: string]: unknown;
10137
+ };
10138
+ content: {
10139
+ "application/json": components["schemas"]["PostReactionListResponseDto"];
10140
+ };
10141
+ };
10142
+ /** @description Overlong `type` filter (max 64 chars). */
10143
+ 400: {
10144
+ headers: {
10145
+ [name: string]: unknown;
10146
+ };
10147
+ content: {
10148
+ "application/json": components["schemas"]["ErrorResponseDto"];
10149
+ };
10150
+ };
10151
+ /** @description PAK lacks `social.list`. */
10152
+ 403: {
10153
+ headers: {
10154
+ [name: string]: unknown;
10155
+ };
10156
+ content: {
10157
+ "application/json": components["schemas"]["ErrorResponseDto"];
10158
+ };
10159
+ };
10160
+ /** @description Community or post not found (or post removed). */
10161
+ 404: {
10162
+ headers: {
10163
+ [name: string]: unknown;
10164
+ };
10165
+ content: {
10166
+ "application/json": components["schemas"]["ErrorResponseDto"];
10167
+ };
10168
+ };
10169
+ };
10170
+ };
9342
10171
  PostReactionController_react: {
9343
10172
  parameters: {
9344
10173
  query?: never;
@@ -9673,7 +10502,7 @@ interface operations {
9673
10502
  StoryController_listViewers: {
9674
10503
  parameters: {
9675
10504
  query: {
9676
- /** @description Must resolve to the post author. */
10505
+ /** @description Requester social actor UUID — must resolve to the post author. */
9677
10506
  requester_id: string;
9678
10507
  limit?: number;
9679
10508
  /** @description Cursor from the prior page. */
@@ -9699,22 +10528,13 @@ interface operations {
9699
10528
  "application/json": components["schemas"]["StoryViewersResponse"];
9700
10529
  };
9701
10530
  };
9702
- /** @description Missing or invalid PAK. */
9703
- 401: {
9704
- headers: {
9705
- [name: string]: unknown;
9706
- };
9707
- content: {
9708
- "application/json": components["schemas"]["ErrorResponse"];
9709
- };
9710
- };
9711
- /** @description PAK lacks `social.read` OR requester is not the post author. */
10531
+ /** @description PAK lacks `social.list` OR requester is not the post author. */
9712
10532
  403: {
9713
10533
  headers: {
9714
10534
  [name: string]: unknown;
9715
10535
  };
9716
10536
  content: {
9717
- "application/json": components["schemas"]["ErrorResponse"];
10537
+ "application/json": components["schemas"]["ErrorResponseDto"];
9718
10538
  };
9719
10539
  };
9720
10540
  /** @description Community or post not found. */
@@ -9723,7 +10543,7 @@ interface operations {
9723
10543
  [name: string]: unknown;
9724
10544
  };
9725
10545
  content: {
9726
- "application/json": components["schemas"]["ErrorResponse"];
10546
+ "application/json": components["schemas"]["ErrorResponseDto"];
9727
10547
  };
9728
10548
  };
9729
10549
  };
@@ -9759,16 +10579,7 @@ interface operations {
9759
10579
  [name: string]: unknown;
9760
10580
  };
9761
10581
  content: {
9762
- "application/json": components["schemas"]["ErrorResponse"];
9763
- };
9764
- };
9765
- /** @description Missing or invalid PAK. */
9766
- 401: {
9767
- headers: {
9768
- [name: string]: unknown;
9769
- };
9770
- content: {
9771
- "application/json": components["schemas"]["ErrorResponse"];
10582
+ "application/json": components["schemas"]["ErrorResponseDto"];
9772
10583
  };
9773
10584
  };
9774
10585
  /** @description PAK lacks `social.view`. */
@@ -9777,7 +10588,7 @@ interface operations {
9777
10588
  [name: string]: unknown;
9778
10589
  };
9779
10590
  content: {
9780
- "application/json": components["schemas"]["ErrorResponse"];
10591
+ "application/json": components["schemas"]["ErrorResponseDto"];
9781
10592
  };
9782
10593
  };
9783
10594
  /** @description Community / post / viewer not found, or the post is invisible to the viewer. */
@@ -9786,7 +10597,7 @@ interface operations {
9786
10597
  [name: string]: unknown;
9787
10598
  };
9788
10599
  content: {
9789
- "application/json": components["schemas"]["ErrorResponse"];
10600
+ "application/json": components["schemas"]["ErrorResponseDto"];
9790
10601
  };
9791
10602
  };
9792
10603
  /** @description Cannot view your own story. */
@@ -9795,7 +10606,7 @@ interface operations {
9795
10606
  [name: string]: unknown;
9796
10607
  };
9797
10608
  content: {
9798
- "application/json": components["schemas"]["ErrorResponse"];
10609
+ "application/json": components["schemas"]["ErrorResponseDto"];
9799
10610
  };
9800
10611
  };
9801
10612
  };
@@ -9831,16 +10642,7 @@ interface operations {
9831
10642
  [name: string]: unknown;
9832
10643
  };
9833
10644
  content: {
9834
- "application/json": components["schemas"]["ErrorResponse"];
9835
- };
9836
- };
9837
- /** @description Missing or invalid PAK. */
9838
- 401: {
9839
- headers: {
9840
- [name: string]: unknown;
9841
- };
9842
- content: {
9843
- "application/json": components["schemas"]["ErrorResponse"];
10645
+ "application/json": components["schemas"]["ErrorResponseDto"];
9844
10646
  };
9845
10647
  };
9846
10648
  /** @description PAK lacks `social.vote`. */
@@ -9849,7 +10651,7 @@ interface operations {
9849
10651
  [name: string]: unknown;
9850
10652
  };
9851
10653
  content: {
9852
- "application/json": components["schemas"]["ErrorResponse"];
10654
+ "application/json": components["schemas"]["ErrorResponseDto"];
9853
10655
  };
9854
10656
  };
9855
10657
  /** @description Community / post / voter not found, or post invisible. */
@@ -9858,7 +10660,7 @@ interface operations {
9858
10660
  [name: string]: unknown;
9859
10661
  };
9860
10662
  content: {
9861
- "application/json": components["schemas"]["ErrorResponse"];
10663
+ "application/json": components["schemas"]["ErrorResponseDto"];
9862
10664
  };
9863
10665
  };
9864
10666
  /** @description Block in place between voter and poll author. */
@@ -9867,7 +10669,7 @@ interface operations {
9867
10669
  [name: string]: unknown;
9868
10670
  };
9869
10671
  content: {
9870
- "application/json": components["schemas"]["ErrorResponse"];
10672
+ "application/json": components["schemas"]["ErrorResponseDto"];
9871
10673
  };
9872
10674
  };
9873
10675
  /** @description Self-vote / no poll / option_index out of range. */
@@ -9876,7 +10678,7 @@ interface operations {
9876
10678
  [name: string]: unknown;
9877
10679
  };
9878
10680
  content: {
9879
- "application/json": components["schemas"]["ErrorResponse"];
10681
+ "application/json": components["schemas"]["ErrorResponseDto"];
9880
10682
  };
9881
10683
  };
9882
10684
  };
@@ -9933,6 +10735,24 @@ interface operations {
9933
10735
  "application/json": components["schemas"]["ErrorResponseDto"];
9934
10736
  };
9935
10737
  };
10738
+ /** @description Block exists between the pair. */
10739
+ 409: {
10740
+ headers: {
10741
+ [name: string]: unknown;
10742
+ };
10743
+ content: {
10744
+ "application/json": components["schemas"]["ErrorResponseDto"];
10745
+ };
10746
+ };
10747
+ /** @description Cannot restrict yourself. */
10748
+ 422: {
10749
+ headers: {
10750
+ [name: string]: unknown;
10751
+ };
10752
+ content: {
10753
+ "application/json": components["schemas"]["ErrorResponseDto"];
10754
+ };
10755
+ };
9936
10756
  };
9937
10757
  };
9938
10758
  EdgeController_unrestrict: {
@@ -9951,7 +10771,7 @@ interface operations {
9951
10771
  };
9952
10772
  requestBody?: never;
9953
10773
  responses: {
9954
- /** @description Unrestricted. */
10774
+ /** @description Unrestricted (or no edge to remove). */
9955
10775
  204: {
9956
10776
  headers: {
9957
10777
  [name: string]: unknown;
@@ -9967,7 +10787,7 @@ interface operations {
9967
10787
  "application/json": components["schemas"]["ErrorResponseDto"];
9968
10788
  };
9969
10789
  };
9970
- /** @description Community not found. */
10790
+ /** @description Community or actor not found. */
9971
10791
  404: {
9972
10792
  headers: {
9973
10793
  [name: string]: unknown;
@@ -10144,7 +10964,7 @@ interface operations {
10144
10964
  };
10145
10965
  };
10146
10966
  };
10147
- WebhookController_getActive: {
10967
+ WebhookController_list: {
10148
10968
  parameters: {
10149
10969
  query?: never;
10150
10970
  header?: never;
@@ -10156,13 +10976,13 @@ interface operations {
10156
10976
  };
10157
10977
  requestBody?: never;
10158
10978
  responses: {
10159
- /** @description Webhook or null. */
10979
+ /** @description All webhooks on the community (no pagination — capped at 10 rows). */
10160
10980
  200: {
10161
10981
  headers: {
10162
10982
  [name: string]: unknown;
10163
10983
  };
10164
10984
  content: {
10165
- "application/json": components["schemas"]["WebhookResponseDto"];
10985
+ "application/json": components["schemas"]["WebhookListResponseDto"];
10166
10986
  };
10167
10987
  };
10168
10988
  /** @description Community not found. */
@@ -10179,7 +10999,10 @@ interface operations {
10179
10999
  WebhookController_create: {
10180
11000
  parameters: {
10181
11001
  query?: never;
10182
- header?: never;
11002
+ header?: {
11003
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. The signing secret is returned exactly once; a replay returns the original response (including the secret) with `Idempotent-Replay: true`. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11004
+ "Idempotency-Key"?: string;
11005
+ };
10183
11006
  path: {
10184
11007
  /** @description Social community UUID. */
10185
11008
  communityId: string;
@@ -10201,7 +11024,7 @@ interface operations {
10201
11024
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
10202
11025
  };
10203
11026
  };
10204
- /** @description Validation failure (bad url, empty event_types). */
11027
+ /** @description Validation failure (bad url, empty or unknown event_types — the message names the valid set; malformed Idempotency-Key). */
10205
11028
  400: {
10206
11029
  headers: {
10207
11030
  [name: string]: unknown;
@@ -10228,7 +11051,7 @@ interface operations {
10228
11051
  "application/json": components["schemas"]["ErrorResponseDto"];
10229
11052
  };
10230
11053
  };
10231
- /** @description Community already has an active webhook. */
11054
+ /** @description Webhook cap reached (10 per community), or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
10232
11055
  409: {
10233
11056
  headers: {
10234
11057
  [name: string]: unknown;
@@ -10389,10 +11212,58 @@ interface operations {
10389
11212
  };
10390
11213
  };
10391
11214
  };
10392
- WebhookController_rotateSecret: {
11215
+ WebhookController_redeliver: {
10393
11216
  parameters: {
10394
11217
  query?: never;
10395
11218
  header?: never;
11219
+ path: {
11220
+ /** @description Social community UUID. */
11221
+ communityId: string;
11222
+ /** @description Webhook UUID. */
11223
+ webhookId: string;
11224
+ /** @description Delivery row UUID (from GET …/deliveries). */
11225
+ deliveryId: string;
11226
+ };
11227
+ cookie?: never;
11228
+ };
11229
+ requestBody?: never;
11230
+ responses: {
11231
+ /** @description Redelivery enqueued. */
11232
+ 202: {
11233
+ headers: {
11234
+ [name: string]: unknown;
11235
+ };
11236
+ content: {
11237
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11238
+ };
11239
+ };
11240
+ /** @description Webhook or delivery not found. */
11241
+ 404: {
11242
+ headers: {
11243
+ [name: string]: unknown;
11244
+ };
11245
+ content: {
11246
+ "application/json": components["schemas"]["ErrorResponseDto"];
11247
+ };
11248
+ };
11249
+ /** @description Webhook is disabled — re-enable it first. */
11250
+ 409: {
11251
+ headers: {
11252
+ [name: string]: unknown;
11253
+ };
11254
+ content: {
11255
+ "application/json": components["schemas"]["ErrorResponseDto"];
11256
+ };
11257
+ };
11258
+ };
11259
+ };
11260
+ WebhookController_rotateSecret: {
11261
+ parameters: {
11262
+ query?: never;
11263
+ header?: {
11264
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. A replay returns the original response (including the new secret) with `Idempotent-Replay: true`; a retry WITHOUT the header rotates the secret again, invalidating the previous one. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11265
+ "Idempotency-Key"?: string;
11266
+ };
10396
11267
  path: {
10397
11268
  /** @description Social community UUID. */
10398
11269
  communityId: string;
@@ -10412,6 +11283,58 @@ interface operations {
10412
11283
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
10413
11284
  };
10414
11285
  };
11286
+ /** @description Malformed Idempotency-Key header. */
11287
+ 400: {
11288
+ headers: {
11289
+ [name: string]: unknown;
11290
+ };
11291
+ content: {
11292
+ "application/json": components["schemas"]["ErrorResponseDto"];
11293
+ };
11294
+ };
11295
+ /** @description Webhook not found. */
11296
+ 404: {
11297
+ headers: {
11298
+ [name: string]: unknown;
11299
+ };
11300
+ content: {
11301
+ "application/json": components["schemas"]["ErrorResponseDto"];
11302
+ };
11303
+ };
11304
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
11305
+ 409: {
11306
+ headers: {
11307
+ [name: string]: unknown;
11308
+ };
11309
+ content: {
11310
+ "application/json": components["schemas"]["ErrorResponseDto"];
11311
+ };
11312
+ };
11313
+ };
11314
+ };
11315
+ WebhookController_testPing: {
11316
+ parameters: {
11317
+ query?: never;
11318
+ header?: never;
11319
+ path: {
11320
+ /** @description Social community UUID. */
11321
+ communityId: string;
11322
+ /** @description Webhook UUID. */
11323
+ webhookId: string;
11324
+ };
11325
+ cookie?: never;
11326
+ };
11327
+ requestBody?: never;
11328
+ responses: {
11329
+ /** @description Ping enqueued. */
11330
+ 202: {
11331
+ headers: {
11332
+ [name: string]: unknown;
11333
+ };
11334
+ content: {
11335
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11336
+ };
11337
+ };
10415
11338
  /** @description Webhook not found. */
10416
11339
  404: {
10417
11340
  headers: {
@@ -10421,6 +11344,35 @@ interface operations {
10421
11344
  "application/json": components["schemas"]["ErrorResponseDto"];
10422
11345
  };
10423
11346
  };
11347
+ /** @description Webhook is disabled — re-enable it first. */
11348
+ 409: {
11349
+ headers: {
11350
+ [name: string]: unknown;
11351
+ };
11352
+ content: {
11353
+ "application/json": components["schemas"]["ErrorResponseDto"];
11354
+ };
11355
+ };
11356
+ };
11357
+ };
11358
+ WebhookEventTypesController_list: {
11359
+ parameters: {
11360
+ query?: never;
11361
+ header?: never;
11362
+ path?: never;
11363
+ cookie?: never;
11364
+ };
11365
+ requestBody?: never;
11366
+ responses: {
11367
+ /** @description The full event-type catalog. */
11368
+ 200: {
11369
+ headers: {
11370
+ [name: string]: unknown;
11371
+ };
11372
+ content: {
11373
+ "application/json": components["schemas"]["WebhookEventTypesResponseDto"];
11374
+ };
11375
+ };
10424
11376
  };
10425
11377
  };
10426
11378
  CommunityController_list: {
@@ -10444,7 +11396,7 @@ interface operations {
10444
11396
  "application/json": components["schemas"]["CommunityResponseDto"][];
10445
11397
  };
10446
11398
  };
10447
- /** @description Caller lacks `social.read`, or the workspace has not enabled the `social` service. */
11399
+ /** @description Caller lacks `social.list`, or the workspace has not enabled the `social` service. */
10448
11400
  403: {
10449
11401
  headers: {
10450
11402
  [name: string]: unknown;
@@ -10460,6 +11412,8 @@ interface operations {
10460
11412
  query?: never;
10461
11413
  header: {
10462
11414
  authorization: string;
11415
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11416
+ "Idempotency-Key"?: string;
10463
11417
  };
10464
11418
  path: {
10465
11419
  /** @description ProductCraft workspace UUID owning the community. */
@@ -10482,7 +11436,7 @@ interface operations {
10482
11436
  "application/json": components["schemas"]["CommunityResponseDto"];
10483
11437
  };
10484
11438
  };
10485
- /** @description Validation failure (slug shape, display_name length). */
11439
+ /** @description Validation failure (slug shape, display_name length, malformed Idempotency-Key). */
10486
11440
  400: {
10487
11441
  headers: {
10488
11442
  [name: string]: unknown;
@@ -10518,7 +11472,7 @@ interface operations {
10518
11472
  "application/json": components["schemas"]["ErrorResponseDto"];
10519
11473
  };
10520
11474
  };
10521
- /** @description Community slug already taken in this workspace, or the supplied `app_id` is already connected to a community. */
11475
+ /** @description Community slug already taken in this workspace, the supplied `app_id` is already connected to a community, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
10522
11476
  409: {
10523
11477
  headers: {
10524
11478
  [name: string]: unknown;
@@ -10715,7 +11669,10 @@ interface operations {
10715
11669
  ModerationAdminController_shadowBan: {
10716
11670
  parameters: {
10717
11671
  query?: never;
10718
- header?: never;
11672
+ header?: {
11673
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11674
+ "Idempotency-Key"?: string;
11675
+ };
10719
11676
  path: {
10720
11677
  workspaceId: string;
10721
11678
  communityId: string;
@@ -10735,10 +11692,10 @@ interface operations {
10735
11692
  [name: string]: unknown;
10736
11693
  };
10737
11694
  content: {
10738
- "application/json": components["schemas"]["ActorResponseDto"];
11695
+ "application/json": components["schemas"]["ModerationActorResponseDto"];
10739
11696
  };
10740
11697
  };
10741
- /** @description Invalid duration_hours or reason. */
11698
+ /** @description Invalid duration_hours or reason, or malformed Idempotency-Key. */
10742
11699
  400: {
10743
11700
  headers: {
10744
11701
  [name: string]: unknown;
@@ -10765,6 +11722,15 @@ interface operations {
10765
11722
  "application/json": components["schemas"]["ErrorResponseDto"];
10766
11723
  };
10767
11724
  };
11725
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
11726
+ 409: {
11727
+ headers: {
11728
+ [name: string]: unknown;
11729
+ };
11730
+ content: {
11731
+ "application/json": components["schemas"]["ErrorResponseDto"];
11732
+ };
11733
+ };
10768
11734
  };
10769
11735
  };
10770
11736
  ModerationAdminController_unshadow: {
@@ -10786,7 +11752,7 @@ interface operations {
10786
11752
  [name: string]: unknown;
10787
11753
  };
10788
11754
  content: {
10789
- "application/json": components["schemas"]["ActorResponseDto"];
11755
+ "application/json": components["schemas"]["ModerationActorResponseDto"];
10790
11756
  };
10791
11757
  };
10792
11758
  /** @description Caller lacks `social.moderate`. */
@@ -11000,7 +11966,10 @@ interface operations {
11000
11966
  ModerationAdminController_act: {
11001
11967
  parameters: {
11002
11968
  query?: never;
11003
- header?: never;
11969
+ header?: {
11970
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11971
+ "Idempotency-Key"?: string;
11972
+ };
11004
11973
  path: {
11005
11974
  workspaceId: string;
11006
11975
  communityId: string;
@@ -11014,16 +11983,16 @@ interface operations {
11014
11983
  };
11015
11984
  };
11016
11985
  responses: {
11017
- /** @description Action recorded; target status updated where applicable. */
11986
+ /** @description Action recorded; target status updated where applicable. Returns the updated flag and the audit row. */
11018
11987
  201: {
11019
11988
  headers: {
11020
11989
  [name: string]: unknown;
11021
11990
  };
11022
11991
  content: {
11023
- "application/json": components["schemas"]["ModerationActionResponseDto"];
11992
+ "application/json": components["schemas"]["ActOnFlagResponseDto"];
11024
11993
  };
11025
11994
  };
11026
- /** @description Invalid action or notes. */
11995
+ /** @description Invalid action or notes, or malformed Idempotency-Key. */
11027
11996
  400: {
11028
11997
  headers: {
11029
11998
  [name: string]: unknown;
@@ -11050,7 +12019,7 @@ interface operations {
11050
12019
  "application/json": components["schemas"]["ErrorResponseDto"];
11051
12020
  };
11052
12021
  };
11053
- /** @description Flag already actioned/dismissed and the requested action would be a no-op. */
12022
+ /** @description FLAG_ALREADY_CLOSED — the flag is already actioned/dismissed and the requested action is punitive (hide/remove/warn/ban); reversals (unhide/restore/dismiss) stay legal on a closed flag. Also `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
11054
12023
  409: {
11055
12024
  headers: {
11056
12025
  [name: string]: unknown;
@@ -11082,7 +12051,7 @@ interface operations {
11082
12051
  [name: string]: unknown;
11083
12052
  };
11084
12053
  content: {
11085
- "application/json": components["schemas"]["ActorListResponseDto"];
12054
+ "application/json": components["schemas"]["ModerationActorListResponseDto"];
11086
12055
  };
11087
12056
  };
11088
12057
  /** @description Caller lacks `social.audit.read`. */