@productcraft/social 0.2.0 → 0.4.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 +1691 -183
  2. package/dist/index.d.ts +1691 -183
  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;
@@ -287,7 +321,7 @@ interface paths {
287
321
  path?: never;
288
322
  cookie?: never;
289
323
  };
290
- /** List the actor's currently-active muted terms. */
324
+ /** List the actor's currently-active muted terms, newest-first. Cursor-paginated (task 008 / G13 — previously an unbounded bare array). */
291
325
  get: operations["MutedTermController_list"];
292
326
  put?: never;
293
327
  /** Add (or refresh) a muted term for the actor. Re-posting the same `term` updates the scope + expires_at. */
@@ -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;
@@ -649,7 +723,7 @@ interface paths {
649
723
  get: operations["ConversationController_getById"];
650
724
  put?: never;
651
725
  post?: never;
652
- /** Leave the conversation. Drops the caller's participant row; the conversation is hard-deleted when the last participant leaves. */
726
+ /** Leave the conversation. Drops the caller's participant row; the conversation is hard-deleted when the last participant leaves. Pass the actor via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
653
727
  delete: operations["ConversationController_leave"];
654
728
  options?: never;
655
729
  head?: 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;
@@ -720,7 +794,7 @@ interface paths {
720
794
  get?: never;
721
795
  put?: never;
722
796
  post?: never;
723
- /** Soft-delete a message. Reserved to the sender; the row stays so the conversation timeline doesn't orphan replies. Reads return body `"(deleted)"`. */
797
+ /** Soft-delete a message. Reserved to the sender; the row stays so the conversation timeline doesn't orphan replies. Reads return body `"(deleted)"`. Pass the sender via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
724
798
  delete: operations["ConversationController_deleteMessage"];
725
799
  options?: never;
726
800
  head?: 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;
@@ -945,7 +1053,7 @@ interface paths {
945
1053
  get: operations["ActorListController_getById"];
946
1054
  put?: never;
947
1055
  post?: never;
948
- /** Delete a list. Owner-only. */
1056
+ /** Delete a list. Owner-only. Pass the caller via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
949
1057
  delete: operations["ActorListController_delete"];
950
1058
  options?: never;
951
1059
  head?: never;
@@ -998,7 +1106,7 @@ interface paths {
998
1106
  get?: never;
999
1107
  put?: never;
1000
1108
  post?: never;
1001
- /** Remove a member from a list. Owner-only. Idempotent — 204 either way. */
1109
+ /** Remove a member from a list. Owner-only. Idempotent — 204 either way. Pass the caller via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
1002
1110
  delete: operations["ActorListController_removeMember"];
1003
1111
  options?: never;
1004
1112
  head?: 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;
@@ -1057,6 +1165,23 @@ interface paths {
1057
1165
  patch?: never;
1058
1166
  trace?: never;
1059
1167
  };
1168
+ "/v1/communities/{communityId}/posts/impressions": {
1169
+ parameters: {
1170
+ query?: never;
1171
+ header?: never;
1172
+ path?: never;
1173
+ cookie?: never;
1174
+ };
1175
+ get?: never;
1176
+ put?: never;
1177
+ /** Batch-increment impression (`view_count`) counters on a list of posts. Client-side debounced; missing post ids are silently skipped (so a deleted post mid-batch doesn’t fail the rest). Renamed from `POST /posts/views` (task 008 / G14) to disambiguate from the story-side per-post `/posts/:postId/views` route. */
1178
+ post: operations["PostController_recordImpressions"];
1179
+ delete?: never;
1180
+ options?: never;
1181
+ head?: never;
1182
+ patch?: never;
1183
+ trace?: never;
1184
+ };
1060
1185
  "/v1/communities/{communityId}/posts/views": {
1061
1186
  parameters: {
1062
1187
  query?: never;
@@ -1066,8 +1191,11 @@ interface paths {
1066
1191
  };
1067
1192
  get?: never;
1068
1193
  put?: never;
1069
- /** Batch-increment view counts on a list of posts. Client-side debounced; missing post ids are silently skipped (so a deleted post mid-batch doesn’t fail the rest). */
1070
- post: operations["PostController_recordViews"];
1194
+ /**
1195
+ * DEPRECATED — use `POST /posts/impressions`. Batch-increment impression counters. This alias will be removed in a future version.
1196
+ * @deprecated
1197
+ */
1198
+ post: operations["PostController_recordViewsDeprecated"];
1071
1199
  delete?: never;
1072
1200
  options?: never;
1073
1201
  head?: never;
@@ -1110,7 +1238,7 @@ interface paths {
1110
1238
  * @description Visibility-aware: the actor must be allowed to read the post. If they can't, returns 404 (opaque), matching the read-path opacity rule used everywhere else in Social.
1111
1239
  */
1112
1240
  post: operations["BookmarkController_create"];
1113
- /** Remove a bookmark on behalf of an actor. Idempotent — 204 either way. */
1241
+ /** Remove a bookmark on behalf of an actor. Idempotent — 204 either way. Pass the actor via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
1114
1242
  delete: operations["BookmarkController_delete"];
1115
1243
  options?: never;
1116
1244
  head?: never;
@@ -1127,7 +1255,7 @@ interface paths {
1127
1255
  /** 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
1256
  get: operations["CommentController_list"];
1129
1257
  put?: never;
1130
- /** Add a comment on a post. Pass `parent_id` to reply; the depth is computed and capped by the community config. */
1258
+ /** 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
1259
  post: operations["CommentController_create"];
1132
1260
  delete?: never;
1133
1261
  options?: never;
@@ -1253,7 +1381,8 @@ interface paths {
1253
1381
  path?: never;
1254
1382
  cookie?: never;
1255
1383
  };
1256
- get?: never;
1384
+ /** 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. */
1385
+ get: operations["PostReactionController_list"];
1257
1386
  put?: never;
1258
1387
  /** React to a post. Idempotent: re-posting the same (actor, type) returns the existing edge with `created: false`. */
1259
1388
  post: operations["PostReactionController_react"];
@@ -1294,7 +1423,7 @@ interface paths {
1294
1423
  * @description Visibility is inherited from the source. The reposter must be allowed to read the source (else 404). Self-repost 422; private-source repost 422. Bumps `source.repost_count` and the reposter's `post_count`. Fires a `repost` notification to the source author (subject to per-kind preferences from task 021).
1295
1424
  */
1296
1425
  post: operations["RepostController_create"];
1297
- /** Undo my repost of a source post. Idempotent — 204 either way. */
1426
+ /** Undo my repost of a source post. Idempotent — 204 either way. Pass the actor via `?actor_id=` (task 008 / G12 — the request body is deprecated). */
1298
1427
  delete: operations["RepostController_delete"];
1299
1428
  options?: never;
1300
1429
  head?: never;
@@ -1499,10 +1628,10 @@ interface paths {
1499
1628
  path?: never;
1500
1629
  cookie?: never;
1501
1630
  };
1502
- /** Read the community's active webhook (or null). */
1503
- get: operations["WebhookController_getActive"];
1631
+ /** List the community's webhooks — disabled rows included, so an auto-disabled subscriber stays discoverable. */
1632
+ get: operations["WebhookController_list"];
1504
1633
  put?: never;
1505
- /** Create the community webhook. One active subscriber per community. Returns the signing secret ONCE — store it. */
1634
+ /** 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
1635
  post: operations["WebhookController_create"];
1507
1636
  delete?: never;
1508
1637
  options?: never;
@@ -1525,7 +1654,7 @@ interface paths {
1525
1654
  delete: operations["WebhookController_delete"];
1526
1655
  options?: never;
1527
1656
  head?: never;
1528
- /** Update webhook url + subscribed event types. */
1657
+ /** 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
1658
  patch: operations["WebhookController_update"];
1530
1659
  trace?: never;
1531
1660
  };
@@ -1546,6 +1675,23 @@ interface paths {
1546
1675
  patch?: never;
1547
1676
  trace?: never;
1548
1677
  };
1678
+ "/v1/communities/{communityId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver": {
1679
+ parameters: {
1680
+ query?: never;
1681
+ header?: never;
1682
+ path?: never;
1683
+ cookie?: never;
1684
+ };
1685
+ get?: never;
1686
+ put?: never;
1687
+ /** 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. */
1688
+ post: operations["WebhookController_redeliver"];
1689
+ delete?: never;
1690
+ options?: never;
1691
+ head?: never;
1692
+ patch?: never;
1693
+ trace?: never;
1694
+ };
1549
1695
  "/v1/communities/{communityId}/webhooks/{webhookId}/rotate-secret": {
1550
1696
  parameters: {
1551
1697
  query?: never;
@@ -1555,7 +1701,7 @@ interface paths {
1555
1701
  };
1556
1702
  get?: never;
1557
1703
  put?: never;
1558
- /** Rotate the signing secret. Also clears any auto-disable flag. Returns the new secret ONCE. */
1704
+ /** 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
1705
  post: operations["WebhookController_rotateSecret"];
1560
1706
  delete?: never;
1561
1707
  options?: never;
@@ -1563,6 +1709,40 @@ interface paths {
1563
1709
  patch?: never;
1564
1710
  trace?: never;
1565
1711
  };
1712
+ "/v1/communities/{communityId}/webhooks/{webhookId}/test": {
1713
+ parameters: {
1714
+ query?: never;
1715
+ header?: never;
1716
+ path?: never;
1717
+ cookie?: never;
1718
+ };
1719
+ get?: never;
1720
+ put?: never;
1721
+ /** 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. */
1722
+ post: operations["WebhookController_testPing"];
1723
+ delete?: never;
1724
+ options?: never;
1725
+ head?: never;
1726
+ patch?: never;
1727
+ trace?: never;
1728
+ };
1729
+ "/v1/webhook-event-types": {
1730
+ parameters: {
1731
+ query?: never;
1732
+ header?: never;
1733
+ path?: never;
1734
+ cookie?: never;
1735
+ };
1736
+ /** List the webhook event-type catalog. Static metadata, no auth required. Create/update webhooks reject anything not in this list with a 400. */
1737
+ get: operations["WebhookEventTypesController_list"];
1738
+ put?: never;
1739
+ post?: never;
1740
+ delete?: never;
1741
+ options?: never;
1742
+ head?: never;
1743
+ patch?: never;
1744
+ trace?: never;
1745
+ };
1566
1746
  "/v1/workspaces/{workspaceId}/communities": {
1567
1747
  parameters: {
1568
1748
  query?: never;
@@ -1570,10 +1750,10 @@ interface paths {
1570
1750
  path?: never;
1571
1751
  cookie?: never;
1572
1752
  };
1573
- /** List communities in a workspace */
1753
+ /** List communities in a workspace, newest-first. Cursor-paginated as of task 008 / G13 (previously a bare array). */
1574
1754
  get: operations["CommunityController_list"];
1575
1755
  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). */
1756
+ /** 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
1757
  post: operations["CommunityController_create"];
1578
1758
  delete?: never;
1579
1759
  options?: never;
@@ -1626,7 +1806,7 @@ interface paths {
1626
1806
  };
1627
1807
  get?: never;
1628
1808
  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. */
1809
+ /** 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
1810
  post: operations["ModerationAdminController_shadowBan"];
1631
1811
  /** Remove a shadow ban. No-op if not currently shadow-banned. */
1632
1812
  delete: operations["ModerationAdminController_unshadow"];
@@ -1712,7 +1892,7 @@ interface paths {
1712
1892
  };
1713
1893
  get?: never;
1714
1894
  put?: never;
1715
- /** Apply a moderation action to a flag. Records an audit entry and updates the target post/comment status. */
1895
+ /** 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
1896
  post: operations["ModerationAdminController_act"];
1717
1897
  delete?: never;
1718
1898
  options?: never;
@@ -1789,6 +1969,11 @@ interface components {
1789
1969
  updated_at: string;
1790
1970
  };
1791
1971
  ActorEdgeDto: {
1972
+ /**
1973
+ * @description Acting social actor UUID (the one performing the follow / mute / block / restrict). Standardized name (task 008 / G11).
1974
+ * @example aaaaaaaa-0000-0000-0000-000000000001
1975
+ */
1976
+ actor_id?: string;
1792
1977
  /**
1793
1978
  * @description Destination social actor UUID (the one being followed / muted / blocked / restricted).
1794
1979
  * @example aaaaaaaa-0000-0000-0000-000000000002
@@ -1797,10 +1982,11 @@ interface components {
1797
1982
  /** @description Optional free-form payload stored on the edge (e.g. mute reason). */
1798
1983
  payload?: Record<string, never>;
1799
1984
  /**
1800
- * @description Source social actor UUID (the one performing the follow / mute / block / restrict).
1985
+ * @deprecated
1986
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11). Accepted for one more version.
1801
1987
  * @example aaaaaaaa-0000-0000-0000-000000000001
1802
1988
  */
1803
- src_actor_id: string;
1989
+ src_actor_id?: string;
1804
1990
  };
1805
1991
  ActorListListResponseDto: {
1806
1992
  data: components["schemas"]["ActorListResponseDto"][];
@@ -1945,6 +2131,19 @@ interface components {
1945
2131
  ActorSearchResponseDto: {
1946
2132
  /** @description Up to `limit` (default 20, max 50) ranked hits. Not paginated in v1; results are bounded by `limit`. */
1947
2133
  data: components["schemas"]["ActorSearchHitDto"][];
2134
+ /** @description Always `null` — this lane returns a single bounded, ranked page (no cursor in v1). Present for envelope consistency. */
2135
+ pagination: components["schemas"]["PaginationResponseDto"] | null;
2136
+ };
2137
+ ActorsByExternalBatchResponseDto: {
2138
+ /** @description Actors found, in request order (after de-duplication). */
2139
+ data: components["schemas"]["ActorResponseDto"][];
2140
+ /**
2141
+ * @description external_ids with no actor in this community.
2142
+ * @example [
2143
+ * "user_ghost"
2144
+ * ]
2145
+ */
2146
+ missing: string[];
1948
2147
  };
1949
2148
  AddCommentReactionResponseDto: {
1950
2149
  /**
@@ -2011,6 +2210,109 @@ interface components {
2011
2210
  data: components["schemas"]["ModerationActionResponseDto"][];
2012
2211
  pagination: components["schemas"]["PaginationResponseDto"];
2013
2212
  };
2213
+ BatchActorResultDto: {
2214
+ /** @description The upserted actor — present on success. */
2215
+ actor?: components["schemas"]["ActorResponseDto"];
2216
+ /**
2217
+ * @description `true` if this item inserted a new row, `false` on an update of an existing external_id. Present on success.
2218
+ * @example true
2219
+ */
2220
+ created?: boolean;
2221
+ /** @description The error this item would have returned as a standalone call — present on failure. */
2222
+ error?: components["schemas"]["ErrorResponseDto"];
2223
+ /**
2224
+ * @description Position of this result in the request array.
2225
+ * @example 0
2226
+ */
2227
+ index: number;
2228
+ /**
2229
+ * @description `true` when this item was upserted; `false` when it failed (see `error`).
2230
+ * @example true
2231
+ */
2232
+ success: boolean;
2233
+ };
2234
+ BatchActorsResponseDto: {
2235
+ /** @description One result per input item, same order. */
2236
+ data: components["schemas"]["BatchActorResultDto"][];
2237
+ /**
2238
+ * @description Count of failed items.
2239
+ * @example 1
2240
+ */
2241
+ failed: number;
2242
+ /**
2243
+ * @description Count of successful items.
2244
+ * @example 199
2245
+ */
2246
+ succeeded: number;
2247
+ };
2248
+ BatchCountersResponseDto: {
2249
+ /** @description Counters for each actor found, in `actor_ids` order (after de-duplication). */
2250
+ data: components["schemas"]["ActorCountersResponseDto"][];
2251
+ /**
2252
+ * @description actor_ids with no actor in this community.
2253
+ * @example []
2254
+ */
2255
+ missing: string[];
2256
+ };
2257
+ BatchExternalIdsDto: {
2258
+ /**
2259
+ * @description external_ids to resolve, 1–200 items (POST body — 256-char ids can't ride a querystring). Duplicates are de-duplicated.
2260
+ * @example [
2261
+ * "user_abc123",
2262
+ * "user_def456"
2263
+ * ]
2264
+ */
2265
+ external_ids: string[];
2266
+ };
2267
+ BatchFollowResultDto: {
2268
+ /**
2269
+ * @description `true` if this item created a new edge, `false` on an idempotent retry of an existing follow. Present on success.
2270
+ * @example true
2271
+ */
2272
+ created?: boolean;
2273
+ /** @description The follow edge — present on success. */
2274
+ edge?: components["schemas"]["EdgeResponseDto"];
2275
+ /** @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. */
2276
+ error?: components["schemas"]["ErrorResponseDto"];
2277
+ /**
2278
+ * @description Position of this result in the request array.
2279
+ * @example 0
2280
+ */
2281
+ index: number;
2282
+ /**
2283
+ * @description `true` when this follow was created (or already existed); `false` when it failed (see `error`).
2284
+ * @example true
2285
+ */
2286
+ success: boolean;
2287
+ };
2288
+ BatchFollowsDto: {
2289
+ /** @description Follow edges to create, in order. 1–200 items; each item follows the single-follow body exactly. */
2290
+ follows: components["schemas"]["ActorEdgeDto"][];
2291
+ /**
2292
+ * @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.
2293
+ * @default false
2294
+ * @example true
2295
+ */
2296
+ suppress_notifications: boolean;
2297
+ };
2298
+ BatchFollowsResponseDto: {
2299
+ /** @description One result per input item, same order. */
2300
+ data: components["schemas"]["BatchFollowResultDto"][];
2301
+ /**
2302
+ * @description Count of failed items.
2303
+ * @example 1
2304
+ */
2305
+ failed: number;
2306
+ /**
2307
+ * @description Count of successful items.
2308
+ * @example 4999
2309
+ */
2310
+ succeeded: number;
2311
+ };
2312
+ BatchUpsertActorsDto: {
2313
+ /** @description Actors to upsert, in order. 1–200 items; each item follows the single-upsert body exactly. */
2314
+ actors: components["schemas"]["UpsertActorDto"][];
2315
+ };
2014
2316
  BookmarkListResponseDto: {
2015
2317
  data: components["schemas"]["BookmarkResponseDto"][];
2016
2318
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -2250,6 +2552,52 @@ interface components {
2250
2552
  */
2251
2553
  total_posts: number;
2252
2554
  };
2555
+ CommunityListResponseDto: {
2556
+ data: components["schemas"]["CommunityResponseDto"][];
2557
+ pagination: components["schemas"]["PaginationResponseDto"];
2558
+ };
2559
+ CommunityRankingSettingsDto: {
2560
+ /**
2561
+ * @description Ranked-feed candidate window in days — posts older than this are not scored. Strictly positive finite number.
2562
+ * @default 30
2563
+ * @example 30
2564
+ */
2565
+ candidate_window_days: number;
2566
+ /**
2567
+ * @description Recency half-life in hours for the ranked feed. Strictly positive finite number.
2568
+ * @default 24
2569
+ * @example 24
2570
+ */
2571
+ half_life_hours: number;
2572
+ /** @description Per-signal weights for the ranked feed. Each key falls back to its default independently. */
2573
+ weights?: components["schemas"]["CommunityRankingWeightsDto"];
2574
+ };
2575
+ CommunityRankingWeightsDto: {
2576
+ /**
2577
+ * @description Engagement signal weight (log-scaled comments + reactions). Non-negative finite number.
2578
+ * @default 0.6
2579
+ * @example 0.6
2580
+ */
2581
+ engagement: number;
2582
+ /**
2583
+ * @description Follow-graph bias weight. Non-negative finite number.
2584
+ * @default 0.4
2585
+ * @example 0.4
2586
+ */
2587
+ follow_bias: number;
2588
+ /**
2589
+ * @description Recency signal weight (exponential decay). Non-negative finite number; anything else falls back to the default.
2590
+ * @default 1
2591
+ * @example 1
2592
+ */
2593
+ recency: number;
2594
+ /**
2595
+ * @description Self-author boost weight (keeps the viewer's own posts visible). Non-negative finite number.
2596
+ * @default 0.2
2597
+ * @example 0.2
2598
+ */
2599
+ self_boost: number;
2600
+ };
2253
2601
  CommunityResponseDto: {
2254
2602
  /**
2255
2603
  * @description Auth app UUID this community wraps; `null` for standalone communities.
@@ -2282,12 +2630,12 @@ interface components {
2282
2630
  */
2283
2631
  id: string;
2284
2632
  /**
2285
- * @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold, reaction_types).
2633
+ * @description Per-community settings blob. See CommunitySettingsDto for every key the service reads; unrecognized keys are stored and returned unchanged but not consumed.
2286
2634
  * @example {
2287
2635
  * "max_comment_depth": 3
2288
2636
  * }
2289
2637
  */
2290
- settings: Record<string, never>;
2638
+ settings: components["schemas"]["CommunitySettingsDto"];
2291
2639
  /**
2292
2640
  * @description URL-friendly community slug.
2293
2641
  * @example my-product-community
@@ -2310,6 +2658,34 @@ interface components {
2310
2658
  */
2311
2659
  workspace_id: string;
2312
2660
  };
2661
+ CommunitySettingsDto: {
2662
+ /**
2663
+ * @description Distinct-reporter count at which a flagged post/comment is auto-hidden. Integer 0..1000; floored. Read by the moderation flag pipeline.
2664
+ * @default 3
2665
+ * @example 3
2666
+ */
2667
+ auto_hide_flag_threshold: number;
2668
+ /**
2669
+ * @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.
2670
+ * @default 30
2671
+ * @example 30
2672
+ */
2673
+ edit_window_minutes: number;
2674
+ /**
2675
+ * @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.
2676
+ * @default 3
2677
+ * @example 3
2678
+ */
2679
+ max_comment_depth: number;
2680
+ /**
2681
+ * @description Maximum participants in a group conversation. Integer 2..200; floored. Exceeding it returns 409 on create / member add.
2682
+ * @default 50
2683
+ * @example 50
2684
+ */
2685
+ max_group_conversation_size: number;
2686
+ /** @description Ranked-feed tuning (weights, half-life, candidate window). Read at query time by the actor feed, list feeds, and the discover feed. */
2687
+ ranking?: components["schemas"]["CommunityRankingSettingsDto"];
2688
+ };
2313
2689
  ConversationAdminListResponseDto: {
2314
2690
  data: components["schemas"]["ConversationAdminResponseDto"][];
2315
2691
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -2488,10 +2864,16 @@ interface components {
2488
2864
  };
2489
2865
  CreateCommentReactionDto: {
2490
2866
  /**
2491
- * @description Reactor actor UUID.
2867
+ * @description Reactor actor UUID. Standardized name (task 008 / G11).
2492
2868
  * @example aaaaaaaa-0000-0000-0000-000000000001
2493
2869
  */
2494
- src_actor_id: string;
2870
+ actor_id?: string;
2871
+ /**
2872
+ * @deprecated
2873
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
2874
+ * @example aaaaaaaa-0000-0000-0000-000000000001
2875
+ */
2876
+ src_actor_id?: string;
2495
2877
  /**
2496
2878
  * @description Reaction type (free-form short label, e.g. `like`, `fire`, `heart`).
2497
2879
  * @example like
@@ -2514,8 +2896,8 @@ interface components {
2514
2896
  * @example My Product Community
2515
2897
  */
2516
2898
  display_name: string;
2517
- /** @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold). */
2518
- settings?: Record<string, never>;
2899
+ /** @description Per-community settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
2900
+ settings?: components["schemas"]["CommunitySettingsDto"];
2519
2901
  /**
2520
2902
  * @description URL-friendly community slug. Lowercase letters, digits, and hyphens (3-64 chars).
2521
2903
  * @example my-product-community
@@ -2552,10 +2934,16 @@ interface components {
2552
2934
  };
2553
2935
  CreateDirectMessageReactionDto: {
2554
2936
  /**
2555
- * @description The reactor — social actor UUID.
2937
+ * @description The reactor — social actor UUID. Standardized name (task 008 / G11).
2556
2938
  * @example aaaaaaaa-0000-0000-0000-000000000001
2557
2939
  */
2558
- src_actor_id: string;
2940
+ actor_id?: string;
2941
+ /**
2942
+ * @deprecated
2943
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
2944
+ * @example aaaaaaaa-0000-0000-0000-000000000001
2945
+ */
2946
+ src_actor_id?: string;
2559
2947
  /**
2560
2948
  * @description Reaction type (emoji or label, 1..64 chars).
2561
2949
  * @example heart
@@ -2687,10 +3075,16 @@ interface components {
2687
3075
  };
2688
3076
  CreateReactionDto: {
2689
3077
  /**
2690
- * @description Reactor — social actor UUID.
3078
+ * @description Reactor — social actor UUID. Standardized name (task 008 / G11).
2691
3079
  * @example aaaaaaaa-0000-0000-0000-000000000001
2692
3080
  */
2693
- src_actor_id: string;
3081
+ actor_id?: string;
3082
+ /**
3083
+ * @deprecated
3084
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
3085
+ * @example aaaaaaaa-0000-0000-0000-000000000001
3086
+ */
3087
+ src_actor_id?: string;
2694
3088
  /**
2695
3089
  * @description Reaction type (1..64 chars).
2696
3090
  * @example like
@@ -2717,13 +3111,13 @@ interface components {
2717
3111
  };
2718
3112
  CreateWebhookDto: {
2719
3113
  /**
2720
- * @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`.
3114
+ * @description Event types to subscribe to. Unknown values are rejected with a 400 naming the valid set — see GET /v1/webhook-event-types.
2721
3115
  * @example [
2722
3116
  * "post.created",
2723
3117
  * "comment.created"
2724
3118
  * ]
2725
3119
  */
2726
- event_types: string[];
3120
+ 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")[];
2727
3121
  /**
2728
3122
  * @description Subscriber URL. Must be `https://`.
2729
3123
  * @example https://example.com/webhooks/social
@@ -2757,13 +3151,13 @@ interface components {
2757
3151
  */
2758
3152
  disabled_reason: string | null;
2759
3153
  /**
2760
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
3154
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
2761
3155
  * @example [
2762
3156
  * "post.created",
2763
3157
  * "comment.created"
2764
3158
  * ]
2765
3159
  */
2766
- event_types: string[];
3160
+ 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")[];
2767
3161
  /**
2768
3162
  * @description Webhook UUID.
2769
3163
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -2802,25 +3196,84 @@ interface components {
2802
3196
  };
2803
3197
  DeleteActorListDto: {
2804
3198
  /**
2805
- * @description Caller — social actor UUID. Must equal the list owner.
3199
+ * @deprecated
3200
+ * @description DEPRECATED — use `?actor_id=`. Caller social actor UUID (must equal the list owner).
2806
3201
  * @example aaaaaaaa-0000-0000-0000-000000000001
2807
3202
  */
2808
- caller_actor_id: string;
3203
+ actor_id?: string;
3204
+ /**
3205
+ * @deprecated
3206
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
3207
+ */
3208
+ caller_actor_id?: string;
2809
3209
  };
2810
3210
  DeleteMessageDto: {
2811
3211
  /**
2812
- * @description The sender — must match the message's sender_id.
3212
+ * @deprecated
3213
+ * @description DEPRECATED — use `?actor_id=`. The sender (must match the message's sender_id).
2813
3214
  * @example aaaaaaaa-0000-0000-0000-000000000001
2814
3215
  */
2815
- sender_id: string;
3216
+ actor_id?: string;
3217
+ /**
3218
+ * @deprecated
3219
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
3220
+ */
3221
+ sender_id?: string;
2816
3222
  };
2817
- DeliveryListResponseDto: {
2818
- data: components["schemas"]["DeliveryResponseDto"][];
2819
- pagination: components["schemas"]["PaginationResponseDto"];
3223
+ DeliveryJobResponseDto: {
3224
+ /**
3225
+ * @description Delivery attempts made so far.
3226
+ * @example 0
3227
+ */
3228
+ attempt_count: number;
3229
+ /**
3230
+ * @description ISO timestamp.
3231
+ * @example 2026-05-01T12:00:00.000Z
3232
+ */
3233
+ created_at: string;
3234
+ /**
3235
+ * @description Stable event id (carried in the request body as `id`; stable across retries and redelivers).
3236
+ * @example evt_…
3237
+ */
3238
+ event_id: string;
3239
+ /**
3240
+ * @description Event type. `ping` for test deliveries.
3241
+ * @example post.created
3242
+ */
3243
+ event_type: string;
3244
+ /** @description Delivery job UUID. */
3245
+ id: string;
3246
+ /**
3247
+ * @description Error from the most recent failed attempt. Null before the first failure.
3248
+ * @example null
3249
+ */
3250
+ last_error: string | null;
3251
+ /**
3252
+ * @description ISO timestamp of the next scheduled attempt (backoff: 1m, 5m, 30m, 2h, 6h, 24h).
3253
+ * @example 2026-05-01T12:00:00.000Z
3254
+ */
3255
+ next_attempt_at: string;
3256
+ /**
3257
+ * @description Job state.
3258
+ * @example pending
3259
+ * @enum {string}
3260
+ */
3261
+ status: "pending" | "delivering" | "succeeded" | "exhausted" | "canceled";
3262
+ /**
3263
+ * @description ISO timestamp.
3264
+ * @example 2026-05-01T12:00:00.000Z
3265
+ */
3266
+ updated_at: string;
3267
+ /** @description Webhook UUID the job targets. */
3268
+ webhook_id: string;
3269
+ };
3270
+ DeliveryListResponseDto: {
3271
+ data: components["schemas"]["DeliveryResponseDto"][];
3272
+ pagination: components["schemas"]["PaginationResponseDto"];
2820
3273
  };
2821
3274
  DeliveryResponseDto: {
2822
3275
  /**
2823
- * @description Attempt number. Always 1 in v1 (no retry).
3276
+ * @description Attempt number, 1-based. Increments per retry along the backoff schedule (1m, 5m, 30m, 2h, 6h, 24h — 7 attempts total).
2824
3277
  * @example 1
2825
3278
  */
2826
3279
  attempt_number: number;
@@ -2874,6 +3327,14 @@ interface components {
2874
3327
  /** @description Webhook UUID. */
2875
3328
  webhook_id: string;
2876
3329
  };
3330
+ DeprecatedActorIdBodyDto: {
3331
+ /**
3332
+ * @deprecated
3333
+ * @description DEPRECATED — pass the actor via the `?actor_id=` query parameter instead. Accepted from the body for one more version.
3334
+ * @example aaaaaaaa-0000-0000-0000-000000000001
3335
+ */
3336
+ actor_id?: string;
3337
+ };
2877
3338
  DirectMessageAdminListResponseDto: {
2878
3339
  data: components["schemas"]["DirectMessageAdminResponseDto"][];
2879
3340
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -3079,10 +3540,6 @@ interface components {
3079
3540
  data: components["schemas"]["PostResponseDto"][];
3080
3541
  pagination: components["schemas"]["PaginationResponseDto"];
3081
3542
  };
3082
- EdgeListResponseDto: {
3083
- data: components["schemas"]["EdgeResponseDto"][];
3084
- pagination: components["schemas"]["PaginationResponseDto"];
3085
- };
3086
3543
  EdgeResponseDto: {
3087
3544
  /**
3088
3545
  * @description Owning community UUID.
@@ -3201,8 +3658,59 @@ interface components {
3201
3658
  */
3202
3659
  updated_at: string;
3203
3660
  };
3661
+ FollowerEdgeListResponseDto: {
3662
+ data: components["schemas"]["FollowerEdgeResponseDto"][];
3663
+ pagination: components["schemas"]["PaginationResponseDto"];
3664
+ };
3665
+ FollowerEdgeResponseDto: {
3666
+ /**
3667
+ * @description Owning community UUID.
3668
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3669
+ */
3670
+ community_id: string;
3671
+ /**
3672
+ * @description ISO timestamp the edge was created.
3673
+ * @example 2026-05-01T12:00:00.000Z
3674
+ */
3675
+ created_at: string;
3676
+ /**
3677
+ * @description Destination actor UUID (for actor edges).
3678
+ * @example aaaaaaaa-0000-0000-0000-000000000002
3679
+ */
3680
+ dst_actor_id: string | null;
3681
+ /**
3682
+ * @description Destination post UUID (for reaction / save edges).
3683
+ * @example null
3684
+ */
3685
+ dst_post_id: string | null;
3686
+ /**
3687
+ * @description Edge UUID.
3688
+ * @example eeeeeeee-0000-0000-0000-000000000001
3689
+ */
3690
+ id: string;
3691
+ /**
3692
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
3693
+ * @example follow
3694
+ * @enum {string}
3695
+ */
3696
+ kind: "follow" | "mute" | "block" | "restrict";
3697
+ /**
3698
+ * @description Free-form payload stored on the edge (e.g. mute reason).
3699
+ * @example {}
3700
+ */
3701
+ payload: Record<string, never>;
3702
+ /** @description The follower's full actor row. Present only when requested via `?expand=src_actor`. */
3703
+ src_actor?: components["schemas"]["ActorResponseDto"];
3704
+ /**
3705
+ * @description Source actor UUID.
3706
+ * @example aaaaaaaa-0000-0000-0000-000000000001
3707
+ */
3708
+ src_actor_id: string;
3709
+ };
3204
3710
  HashtagAutocompleteResponseDto: {
3205
3711
  data: components["schemas"]["HashtagResponseDto"][];
3712
+ /** @description Always `null` — autocomplete returns a single bounded, ranked page (no cursor). Present for envelope consistency (task 008 / G13). */
3713
+ pagination: components["schemas"]["PaginationResponseDto"] | null;
3206
3714
  };
3207
3715
  HashtagDetailResponseDto: {
3208
3716
  /**
@@ -3284,10 +3792,11 @@ interface components {
3284
3792
  };
3285
3793
  LeaveConversationDto: {
3286
3794
  /**
3287
- * @description The participant leaving.
3795
+ * @deprecated
3796
+ * @description DEPRECATED — use `?actor_id=`. The participant leaving.
3288
3797
  * @example aaaaaaaa-0000-0000-0000-000000000001
3289
3798
  */
3290
- actor_id: string;
3799
+ actor_id?: string;
3291
3800
  };
3292
3801
  MarkAllReadDto: {
3293
3802
  /**
@@ -3469,6 +3978,10 @@ interface components {
3469
3978
  */
3470
3979
  updated_at: string;
3471
3980
  };
3981
+ MutedTermListResponseDto: {
3982
+ data: components["schemas"]["MutedTermResponseDto"][];
3983
+ pagination: components["schemas"]["PaginationResponseDto"];
3984
+ };
3472
3985
  MutedTermResponseDto: {
3473
3986
  /**
3474
3987
  * @description Owning actor UUID.
@@ -3595,9 +4108,58 @@ interface components {
3595
4108
  */
3596
4109
  target_kind: "actor" | "post" | "comment" | "direct_message";
3597
4110
  };
4111
+ OutboundEdgeListResponseDto: {
4112
+ data: components["schemas"]["OutboundEdgeResponseDto"][];
4113
+ pagination: components["schemas"]["PaginationResponseDto"];
4114
+ };
4115
+ OutboundEdgeResponseDto: {
4116
+ /**
4117
+ * @description Owning community UUID.
4118
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4119
+ */
4120
+ community_id: string;
4121
+ /**
4122
+ * @description ISO timestamp the edge was created.
4123
+ * @example 2026-05-01T12:00:00.000Z
4124
+ */
4125
+ created_at: string;
4126
+ /** @description The destination actor's full row. Present only when requested via `?expand=dst_actor`. */
4127
+ dst_actor?: components["schemas"]["ActorResponseDto"];
4128
+ /**
4129
+ * @description Destination actor UUID (for actor edges).
4130
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4131
+ */
4132
+ dst_actor_id: string | null;
4133
+ /**
4134
+ * @description Destination post UUID (for reaction / save edges).
4135
+ * @example null
4136
+ */
4137
+ dst_post_id: string | null;
4138
+ /**
4139
+ * @description Edge UUID.
4140
+ * @example eeeeeeee-0000-0000-0000-000000000001
4141
+ */
4142
+ id: string;
4143
+ /**
4144
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
4145
+ * @example follow
4146
+ * @enum {string}
4147
+ */
4148
+ kind: "follow" | "mute" | "block" | "restrict";
4149
+ /**
4150
+ * @description Free-form payload stored on the edge (e.g. mute reason).
4151
+ * @example {}
4152
+ */
4153
+ payload: Record<string, never>;
4154
+ /**
4155
+ * @description Source actor UUID.
4156
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4157
+ */
4158
+ src_actor_id: string;
4159
+ };
3598
4160
  PaginationResponseDto: {
3599
4161
  /**
3600
- * @description `true` when at least one more page exists. Mirrors `next_cursor !== null`; published as a separate field so SDKs can drive a `while` loop without parsing the cursor.
4162
+ * @description `true` when at least one more page exists. Mirrors `next_cursor !== null`; published as a separate field so SDKs can drive a `while` loop without parsing the cursor. A short or empty `data` array does NOT imply the end of the list when a lane post-filters — always page until this is `false`.
3601
4163
  * @example true
3602
4164
  */
3603
4165
  has_more: boolean;
@@ -3668,6 +4230,37 @@ interface components {
3668
4230
  data: components["schemas"]["PostResponseDto"][];
3669
4231
  pagination: components["schemas"]["PaginationResponseDto"];
3670
4232
  };
4233
+ PostReactionEntryDto: {
4234
+ /**
4235
+ * @description Reactor actor UUID.
4236
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4237
+ */
4238
+ actor_id: string;
4239
+ /**
4240
+ * @description Owning community UUID.
4241
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4242
+ */
4243
+ community_id: string;
4244
+ /**
4245
+ * @description ISO timestamp.
4246
+ * @example 2026-05-01T12:00:00.000Z
4247
+ */
4248
+ created_at: string;
4249
+ /**
4250
+ * @description Post UUID.
4251
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4252
+ */
4253
+ post_id: string;
4254
+ /**
4255
+ * @description Reaction type label.
4256
+ * @example like
4257
+ */
4258
+ type: string;
4259
+ };
4260
+ PostReactionListResponseDto: {
4261
+ data: components["schemas"]["PostReactionEntryDto"][];
4262
+ pagination: components["schemas"]["PaginationResponseDto"];
4263
+ };
3671
4264
  PostResponseDto: {
3672
4265
  /**
3673
4266
  * @description Author actor UUID.
@@ -3837,6 +4430,52 @@ interface components {
3837
4430
  PostSearchResponseDto: {
3838
4431
  /** @description Up to `limit` (default 20, max 50) hits. Not paginated in v1. */
3839
4432
  data: components["schemas"]["PostSearchHitDto"][];
4433
+ /** @description Always `null` — this lane returns a single bounded, ranked page (no cursor in v1). Present for envelope consistency. */
4434
+ pagination: components["schemas"]["PaginationResponseDto"] | null;
4435
+ };
4436
+ PostStateRequestDto: {
4437
+ /**
4438
+ * @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.
4439
+ * @example [
4440
+ * "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
4441
+ * "cccccccc-cccc-cccc-cccc-cccccccccccc"
4442
+ * ]
4443
+ */
4444
+ post_ids: string[];
4445
+ };
4446
+ PostStateResponseDto: {
4447
+ /** @description One entry per requested post id (de-duplicated, request order). Unknown / cross-community ids resolve to the empty state. */
4448
+ data: components["schemas"]["PostViewerStateEntryDto"][];
4449
+ };
4450
+ PostViewerStateEntryDto: {
4451
+ /**
4452
+ * @description The viewer has bookmarked the post.
4453
+ * @example true
4454
+ */
4455
+ bookmarked: boolean;
4456
+ /**
4457
+ * @description Post UUID this entry describes.
4458
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4459
+ */
4460
+ post_id: string;
4461
+ /**
4462
+ * @description Reaction types the viewer currently has on the post, sorted ascending. Empty when the viewer has not reacted.
4463
+ * @example [
4464
+ * "fire",
4465
+ * "like"
4466
+ * ]
4467
+ */
4468
+ reacted_types: string[];
4469
+ /**
4470
+ * @description The viewer has a currently-published repost of the post.
4471
+ * @example false
4472
+ */
4473
+ reposted: boolean;
4474
+ /**
4475
+ * @description Poll option index the viewer voted for; `null` when the viewer has not voted (or the post has no poll).
4476
+ * @example null
4477
+ */
4478
+ voted_option: number | null;
3840
4479
  };
3841
4480
  ReactionCountsResponseDto: {
3842
4481
  /**
@@ -3907,10 +4546,16 @@ interface components {
3907
4546
  };
3908
4547
  RecordViewDto: {
3909
4548
  /**
3910
- * @description Viewer social actor UUID.
4549
+ * @description Viewer social actor UUID. Standardized name (task 008 / G11).
3911
4550
  * @example aaaaaaaa-0000-0000-0000-000000000002
3912
4551
  */
3913
- viewer_actor_id: string;
4552
+ actor_id?: string;
4553
+ /**
4554
+ * @deprecated
4555
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
4556
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4557
+ */
4558
+ viewer_actor_id?: string;
3914
4559
  };
3915
4560
  RecordViewsDto: {
3916
4561
  /**
@@ -3922,19 +4567,77 @@ interface components {
3922
4567
  */
3923
4568
  post_ids: string[];
3924
4569
  };
4570
+ RelationshipEntryDto: {
4571
+ /**
4572
+ * @description This actor has blocked the source actor — surface it BEFORE attempting a follow/react write instead of handling the 409.
4573
+ * @example false
4574
+ */
4575
+ blocked_by: boolean;
4576
+ /**
4577
+ * @description The source actor has blocked this actor.
4578
+ * @example false
4579
+ */
4580
+ blocking: boolean;
4581
+ /**
4582
+ * @description This actor is on the source actor's close-friend list.
4583
+ * @example false
4584
+ */
4585
+ close_friend: boolean;
4586
+ /**
4587
+ * @description Destination actor UUID this entry describes.
4588
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4589
+ */
4590
+ dst_actor_id: string;
4591
+ /**
4592
+ * @description This actor follows the source actor.
4593
+ * @example false
4594
+ */
4595
+ followed_by: boolean;
4596
+ /**
4597
+ * @description The source actor follows this actor.
4598
+ * @example true
4599
+ */
4600
+ following: boolean;
4601
+ /**
4602
+ * @description The source actor has muted this actor.
4603
+ * @example false
4604
+ */
4605
+ muting: boolean;
4606
+ /**
4607
+ * @description The source actor has restricted this actor.
4608
+ * @example false
4609
+ */
4610
+ restricting: boolean;
4611
+ };
4612
+ RelationshipListResponseDto: {
4613
+ /** @description One entry per requested id (de-duplicated, request order). Unknown ids resolve to all-false flags. */
4614
+ data: components["schemas"]["RelationshipEntryDto"][];
4615
+ };
3925
4616
  RemoveListMemberDto: {
3926
4617
  /**
3927
- * @description Caller — social actor UUID. Must equal the list owner.
4618
+ * @deprecated
4619
+ * @description DEPRECATED — use `?actor_id=`. Caller social actor UUID (must equal the list owner).
3928
4620
  * @example aaaaaaaa-0000-0000-0000-000000000001
3929
4621
  */
3930
- caller_actor_id: string;
4622
+ actor_id?: string;
4623
+ /**
4624
+ * @deprecated
4625
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
4626
+ */
4627
+ caller_actor_id?: string;
3931
4628
  };
3932
4629
  RemoveMemberDto: {
3933
4630
  /**
3934
- * @description Social actor UUID of the acting party. Equal to the target for self-leave.
4631
+ * @deprecated
4632
+ * @description DEPRECATED — use `?actor_id=`. Acting actor UUID (equal to the target for self-leave).
3935
4633
  * @example aaaaaaaa-0000-0000-0000-000000000001
3936
4634
  */
3937
- caller_actor_id: string;
4635
+ actor_id?: string;
4636
+ /**
4637
+ * @deprecated
4638
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
4639
+ */
4640
+ caller_actor_id?: string;
3938
4641
  };
3939
4642
  RenameGroupDto: {
3940
4643
  /**
@@ -3951,6 +4654,11 @@ interface components {
3951
4654
  pagination: components["schemas"]["PaginationResponseDto"];
3952
4655
  };
3953
4656
  SendMessageDto: {
4657
+ /**
4658
+ * @description The sender — social actor UUID. Standardized name (task 008 / G11); the persisted `sender_id` defaults from it.
4659
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4660
+ */
4661
+ actor_id?: string;
3954
4662
  attachments?: components["schemas"]["DirectMessageAttachmentDto"][];
3955
4663
  /**
3956
4664
  * @description Message body. Required when `kind="text"`. 1..10000 chars after trim.
@@ -3965,10 +4673,11 @@ interface components {
3965
4673
  /** @description Threaded inline reply target. */
3966
4674
  reply_to_id?: string | null;
3967
4675
  /**
3968
- * @description The sender — social actor UUID.
4676
+ * @deprecated
4677
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
3969
4678
  * @example aaaaaaaa-0000-0000-0000-000000000001
3970
4679
  */
3971
- sender_id: string;
4680
+ sender_id?: string;
3972
4681
  };
3973
4682
  StoryTrayEntryResponse: {
3974
4683
  /**
@@ -4009,6 +4718,8 @@ interface components {
4009
4718
  };
4010
4719
  StoryTrayResponse: {
4011
4720
  data: components["schemas"]["StoryTrayEntryResponse"][];
4721
+ /** @description Always `null` — the tray is a single bounded page (≤200 entries, no cursor in v1). The key is present for envelope consistency with cursor-paginated lists (task 008 / G13). */
4722
+ pagination: components["schemas"]["PaginationResponseDto"] | null;
4012
4723
  };
4013
4724
  StoryViewerResponse: {
4014
4725
  /**
@@ -4058,6 +4769,8 @@ interface components {
4058
4769
  SuggestedFollowsListResponseDto: {
4059
4770
  /** @description Ordered candidates. FoF candidates are returned first (highest count first); cold-start fallbacks fill any remaining slots up to the requested limit. */
4060
4771
  data: components["schemas"]["SuggestedFollowResponseDto"][];
4772
+ /** @description Always `null` — suggestions are a single bounded, scored page (no cursor in v1). Present for envelope consistency (task 008 / G13). */
4773
+ pagination: components["schemas"]["PaginationResponseDto"] | null;
4061
4774
  };
4062
4775
  UnreadCountResponse: {
4063
4776
  /**
@@ -4110,7 +4823,8 @@ interface components {
4110
4823
  UpdateCommunityDto: {
4111
4824
  description?: string | null;
4112
4825
  display_name?: string;
4113
- settings?: Record<string, never>;
4826
+ /** @description Replaces the settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
4827
+ settings?: components["schemas"]["CommunitySettingsDto"];
4114
4828
  /** @enum {string} */
4115
4829
  status?: "active" | "suspended" | "archived";
4116
4830
  };
@@ -4140,16 +4854,22 @@ interface components {
4140
4854
  role: "member" | "admin";
4141
4855
  };
4142
4856
  UpdateMessageDto: {
4857
+ /**
4858
+ * @description The sender — must match the message's sender_id. Standardized name (task 008 / G11).
4859
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4860
+ */
4861
+ actor_id?: string;
4143
4862
  /**
4144
4863
  * @description Updated body.
4145
4864
  * @example edited
4146
4865
  */
4147
4866
  body: string;
4148
4867
  /**
4149
- * @description The sender — must match the message's sender_id.
4868
+ * @deprecated
4869
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
4150
4870
  * @example aaaaaaaa-0000-0000-0000-000000000001
4151
4871
  */
4152
- sender_id: string;
4872
+ sender_id?: string;
4153
4873
  };
4154
4874
  UpdateNotificationDto: {
4155
4875
  /**
@@ -4189,8 +4909,13 @@ interface components {
4189
4909
  visibility?: "public" | "followers" | "close_friends" | "private";
4190
4910
  };
4191
4911
  UpdateWebhookDto: {
4192
- /** @description New subscription set. */
4193
- event_types?: string[];
4912
+ /**
4913
+ * @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.
4914
+ * @example false
4915
+ */
4916
+ disabled?: boolean;
4917
+ /** @description New subscription set. Unknown values are rejected with a 400 naming the valid set. */
4918
+ 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")[];
4194
4919
  /** @description New subscriber URL. */
4195
4920
  url?: string;
4196
4921
  };
@@ -4226,6 +4951,21 @@ interface components {
4226
4951
  */
4227
4952
  created: boolean;
4228
4953
  };
4954
+ WebhookEventTypesResponseDto: {
4955
+ /**
4956
+ * @description Every event type a webhook can subscribe to, in catalog order.
4957
+ * @example [
4958
+ * "post.created",
4959
+ * "post.deleted",
4960
+ * "comment.created"
4961
+ * ]
4962
+ */
4963
+ 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")[];
4964
+ };
4965
+ WebhookListResponseDto: {
4966
+ /** @description Every webhook on the community — disabled rows included, so auto-disabled subscribers stay discoverable. */
4967
+ data: components["schemas"]["WebhookResponseDto"][];
4968
+ };
4229
4969
  WebhookResponseDto: {
4230
4970
  /**
4231
4971
  * @description Owning community UUID.
@@ -4253,13 +4993,13 @@ interface components {
4253
4993
  */
4254
4994
  disabled_reason: string | null;
4255
4995
  /**
4256
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
4996
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
4257
4997
  * @example [
4258
4998
  * "post.created",
4259
4999
  * "comment.created"
4260
5000
  * ]
4261
5001
  */
4262
- event_types: string[];
5002
+ 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")[];
4263
5003
  /**
4264
5004
  * @description Webhook UUID.
4265
5005
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -4302,10 +5042,12 @@ interface operations {
4302
5042
  ActorController_list: {
4303
5043
  parameters: {
4304
5044
  query?: {
4305
- /** @description Page size; capped at 200. */
5045
+ /** @description Page size; capped at 200. Ignored when `ids` is passed. */
4306
5046
  limit?: number;
4307
- /** @description Opaque cursor from the previous page's `pagination.next_cursor`. */
5047
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Ignored when `ids` is passed. */
4308
5048
  cursor?: string;
5049
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated) to batch-fetch. Returns matching actors in request order; unknown ids are silently omitted. */
5050
+ ids?: string;
4309
5051
  };
4310
5052
  header?: never;
4311
5053
  path: {
@@ -4316,7 +5058,7 @@ interface operations {
4316
5058
  };
4317
5059
  requestBody?: never;
4318
5060
  responses: {
4319
- /** @description Page of actors with `next_cursor` + `has_more`. */
5061
+ /** @description Page of actors with `next_cursor` + `has_more` (batch-fetch responses always report `has_more: false`). */
4320
5062
  200: {
4321
5063
  headers: {
4322
5064
  [name: string]: unknown;
@@ -4325,7 +5067,7 @@ interface operations {
4325
5067
  "application/json": components["schemas"]["ActorPageResponseDto"];
4326
5068
  };
4327
5069
  };
4328
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5070
+ /** @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). */
4329
5071
  400: {
4330
5072
  headers: {
4331
5073
  [name: string]: unknown;
@@ -4408,6 +5150,114 @@ interface operations {
4408
5150
  };
4409
5151
  };
4410
5152
  };
5153
+ ActorController_batchUpsert: {
5154
+ parameters: {
5155
+ query?: never;
5156
+ header?: never;
5157
+ path: {
5158
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5159
+ communityId: string;
5160
+ };
5161
+ cookie?: never;
5162
+ };
5163
+ requestBody: {
5164
+ content: {
5165
+ "application/json": components["schemas"]["BatchUpsertActorsDto"];
5166
+ };
5167
+ };
5168
+ responses: {
5169
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
5170
+ 201: {
5171
+ headers: {
5172
+ [name: string]: unknown;
5173
+ };
5174
+ content: {
5175
+ "application/json": components["schemas"]["BatchActorsResponseDto"];
5176
+ };
5177
+ };
5178
+ /** @description Envelope validation failure: `actors` missing, empty, over 200 items, or an item shape invalid. */
5179
+ 400: {
5180
+ headers: {
5181
+ [name: string]: unknown;
5182
+ };
5183
+ content: {
5184
+ "application/json": components["schemas"]["ErrorResponseDto"];
5185
+ };
5186
+ };
5187
+ /** @description PAK lacks `social.create` for this community. */
5188
+ 403: {
5189
+ headers: {
5190
+ [name: string]: unknown;
5191
+ };
5192
+ content: {
5193
+ "application/json": components["schemas"]["ErrorResponseDto"];
5194
+ };
5195
+ };
5196
+ /** @description Community not found in the PAK's workspace. */
5197
+ 404: {
5198
+ headers: {
5199
+ [name: string]: unknown;
5200
+ };
5201
+ content: {
5202
+ "application/json": components["schemas"]["ErrorResponseDto"];
5203
+ };
5204
+ };
5205
+ };
5206
+ };
5207
+ ActorController_batchGetByExternal: {
5208
+ parameters: {
5209
+ query?: never;
5210
+ header?: never;
5211
+ path: {
5212
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5213
+ communityId: string;
5214
+ };
5215
+ cookie?: never;
5216
+ };
5217
+ requestBody: {
5218
+ content: {
5219
+ "application/json": components["schemas"]["BatchExternalIdsDto"];
5220
+ };
5221
+ };
5222
+ responses: {
5223
+ /** @description Actors found (request order, de-duplicated) plus the `missing[]` external_ids. */
5224
+ 200: {
5225
+ headers: {
5226
+ [name: string]: unknown;
5227
+ };
5228
+ content: {
5229
+ "application/json": components["schemas"]["ActorsByExternalBatchResponseDto"];
5230
+ };
5231
+ };
5232
+ /** @description `external_ids` missing, empty, over 200 items, or an entry exceeding 256 chars. */
5233
+ 400: {
5234
+ headers: {
5235
+ [name: string]: unknown;
5236
+ };
5237
+ content: {
5238
+ "application/json": components["schemas"]["ErrorResponseDto"];
5239
+ };
5240
+ };
5241
+ /** @description PAK lacks `social.read`. */
5242
+ 403: {
5243
+ headers: {
5244
+ [name: string]: unknown;
5245
+ };
5246
+ content: {
5247
+ "application/json": components["schemas"]["ErrorResponseDto"];
5248
+ };
5249
+ };
5250
+ /** @description Community not found in the PAK's workspace. */
5251
+ 404: {
5252
+ headers: {
5253
+ [name: string]: unknown;
5254
+ };
5255
+ content: {
5256
+ "application/json": components["schemas"]["ErrorResponseDto"];
5257
+ };
5258
+ };
5259
+ };
5260
+ };
4411
5261
  ActorController_getByExternal: {
4412
5262
  parameters: {
4413
5263
  query?: never;
@@ -4587,6 +5437,8 @@ interface operations {
4587
5437
  query?: {
4588
5438
  limit?: number;
4589
5439
  cursor?: string;
5440
+ /** @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`. */
5441
+ expand?: "dst_actor";
4590
5442
  };
4591
5443
  header?: never;
4592
5444
  path: {
@@ -4605,10 +5457,10 @@ interface operations {
4605
5457
  [name: string]: unknown;
4606
5458
  };
4607
5459
  content: {
4608
- "application/json": components["schemas"]["EdgeListResponseDto"];
5460
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
4609
5461
  };
4610
5462
  };
4611
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5463
+ /** @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`). */
4612
5464
  400: {
4613
5465
  headers: {
4614
5466
  [name: string]: unknown;
@@ -4891,6 +5743,8 @@ interface operations {
4891
5743
  query?: {
4892
5744
  limit?: number;
4893
5745
  cursor?: string;
5746
+ /** @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`. */
5747
+ expand?: "src_actor";
4894
5748
  };
4895
5749
  header?: never;
4896
5750
  path: {
@@ -4909,10 +5763,10 @@ interface operations {
4909
5763
  [name: string]: unknown;
4910
5764
  };
4911
5765
  content: {
4912
- "application/json": components["schemas"]["EdgeListResponseDto"];
5766
+ "application/json": components["schemas"]["FollowerEdgeListResponseDto"];
4913
5767
  };
4914
5768
  };
4915
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5769
+ /** @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`). */
4916
5770
  400: {
4917
5771
  headers: {
4918
5772
  [name: string]: unknown;
@@ -4946,6 +5800,8 @@ interface operations {
4946
5800
  query?: {
4947
5801
  limit?: number;
4948
5802
  cursor?: string;
5803
+ /** @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`. */
5804
+ expand?: "dst_actor";
4949
5805
  };
4950
5806
  header?: never;
4951
5807
  path: {
@@ -4964,10 +5820,10 @@ interface operations {
4964
5820
  [name: string]: unknown;
4965
5821
  };
4966
5822
  content: {
4967
- "application/json": components["schemas"]["EdgeListResponseDto"];
5823
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
4968
5824
  };
4969
5825
  };
4970
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5826
+ /** @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`). */
4971
5827
  400: {
4972
5828
  headers: {
4973
5829
  [name: string]: unknown;
@@ -5158,6 +6014,11 @@ interface operations {
5158
6014
  /** @description Cursor from the prior page. */
5159
6015
  cursor?: string;
5160
6016
  /** @description Requester social actor UUID. Without it, only public pinned posts surface. */
6017
+ actor_id?: string;
6018
+ /**
6019
+ * @deprecated
6020
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
6021
+ */
5161
6022
  requester_id?: string;
5162
6023
  };
5163
6024
  header?: never;
@@ -5249,7 +6110,12 @@ interface operations {
5249
6110
  };
5250
6111
  MutedTermController_list: {
5251
6112
  parameters: {
5252
- query?: never;
6113
+ query?: {
6114
+ /** @description Page size (default 50, max 200). */
6115
+ limit?: string;
6116
+ /** @description Opaque cursor from a prior page's `pagination.next_cursor`. */
6117
+ cursor?: string;
6118
+ };
5253
6119
  header?: never;
5254
6120
  path: {
5255
6121
  /** @description Social community UUID. */
@@ -5261,13 +6127,13 @@ interface operations {
5261
6127
  };
5262
6128
  requestBody?: never;
5263
6129
  responses: {
5264
- /** @description Active muted terms. */
6130
+ /** @description Active muted terms, paginated. */
5265
6131
  200: {
5266
6132
  headers: {
5267
6133
  [name: string]: unknown;
5268
6134
  };
5269
6135
  content: {
5270
- "application/json": components["schemas"]["MutedTermResponseDto"][];
6136
+ "application/json": components["schemas"]["MutedTermListResponseDto"];
5271
6137
  };
5272
6138
  };
5273
6139
  /** @description PAK lacks `social.list`. */
@@ -5394,6 +6260,8 @@ interface operations {
5394
6260
  query?: {
5395
6261
  limit?: number;
5396
6262
  cursor?: string;
6263
+ /** @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`. */
6264
+ expand?: "dst_actor";
5397
6265
  };
5398
6266
  header?: never;
5399
6267
  path: {
@@ -5412,10 +6280,10 @@ interface operations {
5412
6280
  [name: string]: unknown;
5413
6281
  };
5414
6282
  content: {
5415
- "application/json": components["schemas"]["EdgeListResponseDto"];
6283
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5416
6284
  };
5417
6285
  };
5418
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
6286
+ /** @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`). */
5419
6287
  400: {
5420
6288
  headers: {
5421
6289
  [name: string]: unknown;
@@ -5752,11 +6620,69 @@ interface operations {
5752
6620
  };
5753
6621
  };
5754
6622
  };
6623
+ ViewerStateController_postState: {
6624
+ parameters: {
6625
+ query?: never;
6626
+ header?: never;
6627
+ path: {
6628
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6629
+ communityId: string;
6630
+ /** @description Viewer actor UUID — the perspective all state is computed from. */
6631
+ actorId: string;
6632
+ };
6633
+ cookie?: never;
6634
+ };
6635
+ requestBody: {
6636
+ content: {
6637
+ "application/json": components["schemas"]["PostStateRequestDto"];
6638
+ };
6639
+ };
6640
+ responses: {
6641
+ /** @description One state entry per requested post id. */
6642
+ 200: {
6643
+ headers: {
6644
+ [name: string]: unknown;
6645
+ };
6646
+ content: {
6647
+ "application/json": components["schemas"]["PostStateResponseDto"];
6648
+ };
6649
+ };
6650
+ /** @description Empty `post_ids`, more than 200 ids, or a non-UUID in the list. */
6651
+ 400: {
6652
+ headers: {
6653
+ [name: string]: unknown;
6654
+ };
6655
+ content: {
6656
+ "application/json": components["schemas"]["ErrorResponseDto"];
6657
+ };
6658
+ };
6659
+ /** @description PAK lacks `social.list`. */
6660
+ 403: {
6661
+ headers: {
6662
+ [name: string]: unknown;
6663
+ };
6664
+ content: {
6665
+ "application/json": components["schemas"]["ErrorResponseDto"];
6666
+ };
6667
+ };
6668
+ /** @description Community or actor not found. */
6669
+ 404: {
6670
+ headers: {
6671
+ [name: string]: unknown;
6672
+ };
6673
+ content: {
6674
+ "application/json": components["schemas"]["ErrorResponseDto"];
6675
+ };
6676
+ };
6677
+ };
6678
+ };
5755
6679
  EdgeController_listRestricts: {
5756
6680
  parameters: {
5757
6681
  query?: {
5758
6682
  limit?: number;
5759
6683
  cursor?: string;
6684
+ /** @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`. */
6685
+ expand?: "dst_actor";
5760
6686
  };
5761
6687
  header?: never;
5762
6688
  path: {
@@ -5775,10 +6701,10 @@ interface operations {
5775
6701
  [name: string]: unknown;
5776
6702
  };
5777
6703
  content: {
5778
- "application/json": components["schemas"]["EdgeListResponseDto"];
6704
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5779
6705
  };
5780
6706
  };
5781
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
6707
+ /** @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`). */
5782
6708
  400: {
5783
6709
  headers: {
5784
6710
  [name: string]: unknown;
@@ -5913,13 +6839,68 @@ interface operations {
5913
6839
  };
5914
6840
  requestBody?: never;
5915
6841
  responses: {
5916
- /** @description Ordered candidates. */
6842
+ /** @description Ordered candidates. */
6843
+ 200: {
6844
+ headers: {
6845
+ [name: string]: unknown;
6846
+ };
6847
+ content: {
6848
+ "application/json": components["schemas"]["SuggestedFollowsListResponseDto"];
6849
+ };
6850
+ };
6851
+ /** @description PAK lacks `social.list`. */
6852
+ 403: {
6853
+ headers: {
6854
+ [name: string]: unknown;
6855
+ };
6856
+ content: {
6857
+ "application/json": components["schemas"]["ErrorResponseDto"];
6858
+ };
6859
+ };
6860
+ /** @description Community or actor not found (or belongs to a different community). */
6861
+ 404: {
6862
+ headers: {
6863
+ [name: string]: unknown;
6864
+ };
6865
+ content: {
6866
+ "application/json": components["schemas"]["ErrorResponseDto"];
6867
+ };
6868
+ };
6869
+ };
6870
+ };
6871
+ EdgeController_relationships: {
6872
+ parameters: {
6873
+ query: {
6874
+ /** @description Comma-separated destination actor UUIDs (1-100). */
6875
+ with: string;
6876
+ };
6877
+ header?: never;
6878
+ path: {
6879
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6880
+ communityId: string;
6881
+ /** @description Source actor UUID — the perspective all flags are computed from. */
6882
+ srcActorId: string;
6883
+ };
6884
+ cookie?: never;
6885
+ };
6886
+ requestBody?: never;
6887
+ responses: {
6888
+ /** @description One relationship entry per requested id. */
5917
6889
  200: {
5918
6890
  headers: {
5919
6891
  [name: string]: unknown;
5920
6892
  };
5921
6893
  content: {
5922
- "application/json": components["schemas"]["SuggestedFollowsListResponseDto"];
6894
+ "application/json": components["schemas"]["RelationshipListResponseDto"];
6895
+ };
6896
+ };
6897
+ /** @description Missing `with`, more than 100 ids, or a non-UUID value in the list. */
6898
+ 400: {
6899
+ headers: {
6900
+ [name: string]: unknown;
6901
+ };
6902
+ content: {
6903
+ "application/json": components["schemas"]["ErrorResponseDto"];
5923
6904
  };
5924
6905
  };
5925
6906
  /** @description PAK lacks `social.list`. */
@@ -5931,7 +6912,7 @@ interface operations {
5931
6912
  "application/json": components["schemas"]["ErrorResponseDto"];
5932
6913
  };
5933
6914
  };
5934
- /** @description Community or actor not found (or belongs to a different community). */
6915
+ /** @description Community or source actor not found. */
5935
6916
  404: {
5936
6917
  headers: {
5937
6918
  [name: string]: unknown;
@@ -6212,7 +7193,10 @@ interface operations {
6212
7193
  ConversationController_create: {
6213
7194
  parameters: {
6214
7195
  query?: never;
6215
- header?: never;
7196
+ header?: {
7197
+ /** @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`. */
7198
+ "Idempotency-Key"?: string;
7199
+ };
6216
7200
  path: {
6217
7201
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6218
7202
  communityId: string;
@@ -6234,7 +7218,7 @@ interface operations {
6234
7218
  "application/json": components["schemas"]["ConversationResponseDto"];
6235
7219
  };
6236
7220
  };
6237
- /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids). */
7221
+ /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids, malformed Idempotency-Key). */
6238
7222
  400: {
6239
7223
  headers: {
6240
7224
  [name: string]: unknown;
@@ -6261,7 +7245,7 @@ interface operations {
6261
7245
  "application/json": components["schemas"]["ErrorResponseDto"];
6262
7246
  };
6263
7247
  };
6264
- /** @description A block exists, or the group exceeds `community.settings.max_group_conversation_size`. */
7248
+ /** @description A block exists, the group exceeds `community.settings.max_group_conversation_size`, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
6265
7249
  409: {
6266
7250
  headers: {
6267
7251
  [name: string]: unknown;
@@ -6364,7 +7348,10 @@ interface operations {
6364
7348
  };
6365
7349
  ConversationController_leave: {
6366
7350
  parameters: {
6367
- query?: never;
7351
+ query: {
7352
+ /** @description The leaving participant — social actor UUID. */
7353
+ actor_id: string;
7354
+ };
6368
7355
  header?: never;
6369
7356
  path: {
6370
7357
  /** @description Social community UUID. Must belong to the PAK's workspace. */
@@ -6387,6 +7374,15 @@ interface operations {
6387
7374
  };
6388
7375
  content?: never;
6389
7376
  };
7377
+ /** @description Missing/invalid actor_id. */
7378
+ 400: {
7379
+ headers: {
7380
+ [name: string]: unknown;
7381
+ };
7382
+ content: {
7383
+ "application/json": components["schemas"]["ErrorResponseDto"];
7384
+ };
7385
+ };
6390
7386
  /** @description PAK lacks `social.delete`. */
6391
7387
  403: {
6392
7388
  headers: {
@@ -6530,7 +7526,10 @@ interface operations {
6530
7526
  };
6531
7527
  ConversationController_removeMember: {
6532
7528
  parameters: {
6533
- query?: never;
7529
+ query: {
7530
+ /** @description Acting actor UUID (equal to the target for self-leave). */
7531
+ actor_id: string;
7532
+ };
6534
7533
  header?: never;
6535
7534
  path: {
6536
7535
  /** @description Social community UUID. Must belong to the PAK's workspace. */
@@ -6555,6 +7554,15 @@ interface operations {
6555
7554
  };
6556
7555
  content?: never;
6557
7556
  };
7557
+ /** @description Missing/invalid actor_id. */
7558
+ 400: {
7559
+ headers: {
7560
+ [name: string]: unknown;
7561
+ };
7562
+ content: {
7563
+ "application/json": components["schemas"]["ErrorResponseDto"];
7564
+ };
7565
+ };
6558
7566
  /** @description Caller is not an admin and not the target. */
6559
7567
  403: {
6560
7568
  headers: {
@@ -6695,7 +7703,10 @@ interface operations {
6695
7703
  ConversationController_send: {
6696
7704
  parameters: {
6697
7705
  query?: never;
6698
- header?: never;
7706
+ header?: {
7707
+ /** @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`. */
7708
+ "Idempotency-Key"?: string;
7709
+ };
6699
7710
  path: {
6700
7711
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6701
7712
  communityId: string;
@@ -6719,7 +7730,7 @@ interface operations {
6719
7730
  "application/json": components["schemas"]["DirectMessageResponseDto"];
6720
7731
  };
6721
7732
  };
6722
- /** @description Validation failure (empty body for text, body too long). */
7733
+ /** @description Validation failure (empty body for text, body too long, malformed Idempotency-Key). */
6723
7734
  400: {
6724
7735
  headers: {
6725
7736
  [name: string]: unknown;
@@ -6746,7 +7757,7 @@ interface operations {
6746
7757
  "application/json": components["schemas"]["ErrorResponseDto"];
6747
7758
  };
6748
7759
  };
6749
- /** @description A block exists between the sender and another participant. */
7760
+ /** @description A block exists between the sender and another participant, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
6750
7761
  409: {
6751
7762
  headers: {
6752
7763
  [name: string]: unknown;
@@ -6759,7 +7770,10 @@ interface operations {
6759
7770
  };
6760
7771
  ConversationController_deleteMessage: {
6761
7772
  parameters: {
6762
- query?: never;
7773
+ query: {
7774
+ /** @description The sender — must match the message's sender_id. */
7775
+ actor_id: string;
7776
+ };
6763
7777
  header?: never;
6764
7778
  path: {
6765
7779
  /** @description Social community UUID. Must belong to the PAK's workspace. */
@@ -6784,6 +7798,15 @@ interface operations {
6784
7798
  };
6785
7799
  content?: never;
6786
7800
  };
7801
+ /** @description Missing/invalid actor_id. */
7802
+ 400: {
7803
+ headers: {
7804
+ [name: string]: unknown;
7805
+ };
7806
+ content: {
7807
+ "application/json": components["schemas"]["ErrorResponseDto"];
7808
+ };
7809
+ };
6787
7810
  /** @description Caller is not the sender, or PAK lacks `social.delete`. */
6788
7811
  403: {
6789
7812
  headers: {
@@ -7156,9 +8179,68 @@ interface operations {
7156
8179
  };
7157
8180
  };
7158
8181
  };
8182
+ CounterController_getBatchCounters: {
8183
+ parameters: {
8184
+ query: {
8185
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated). */
8186
+ actor_ids: string;
8187
+ };
8188
+ header?: never;
8189
+ path: {
8190
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8191
+ communityId: string;
8192
+ };
8193
+ cookie?: never;
8194
+ };
8195
+ requestBody?: never;
8196
+ responses: {
8197
+ /** @description Counters for each actor found plus the `missing[]` ids. */
8198
+ 200: {
8199
+ headers: {
8200
+ [name: string]: unknown;
8201
+ };
8202
+ content: {
8203
+ "application/json": components["schemas"]["BatchCountersResponseDto"];
8204
+ };
8205
+ };
8206
+ /** @description `actor_ids` missing or empty, a non-UUID entry (`INVALID_ID_LIST`), or over 100 ids (`TOO_MANY_IDS`). */
8207
+ 400: {
8208
+ headers: {
8209
+ [name: string]: unknown;
8210
+ };
8211
+ content: {
8212
+ "application/json": components["schemas"]["ErrorResponseDto"];
8213
+ };
8214
+ };
8215
+ /** @description PAK lacks `social.read`. */
8216
+ 403: {
8217
+ headers: {
8218
+ [name: string]: unknown;
8219
+ };
8220
+ content: {
8221
+ "application/json": components["schemas"]["ErrorResponseDto"];
8222
+ };
8223
+ };
8224
+ /** @description Community not found in the PAK's workspace. (Unknown actors land in `missing[]`, not a 404.) */
8225
+ 404: {
8226
+ headers: {
8227
+ [name: string]: unknown;
8228
+ };
8229
+ content: {
8230
+ "application/json": components["schemas"]["ErrorResponseDto"];
8231
+ };
8232
+ };
8233
+ };
8234
+ };
7159
8235
  FeedController_getDiscoverFeed: {
7160
8236
  parameters: {
7161
8237
  query?: {
8238
+ /** @description Viewer actor UUID. */
8239
+ actor_id?: string;
8240
+ /**
8241
+ * @deprecated
8242
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
8243
+ */
7162
8244
  viewer_actor_id?: string;
7163
8245
  limit?: number;
7164
8246
  /** @description Opaque ranked cursor; encodes (score, id). */
@@ -7346,6 +8428,60 @@ interface operations {
7346
8428
  };
7347
8429
  };
7348
8430
  };
8431
+ EdgeController_batchFollows: {
8432
+ parameters: {
8433
+ query?: never;
8434
+ header?: never;
8435
+ path: {
8436
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8437
+ communityId: string;
8438
+ };
8439
+ cookie?: never;
8440
+ };
8441
+ requestBody: {
8442
+ content: {
8443
+ "application/json": components["schemas"]["BatchFollowsDto"];
8444
+ };
8445
+ };
8446
+ responses: {
8447
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
8448
+ 201: {
8449
+ headers: {
8450
+ [name: string]: unknown;
8451
+ };
8452
+ content: {
8453
+ "application/json": components["schemas"]["BatchFollowsResponseDto"];
8454
+ };
8455
+ };
8456
+ /** @description Envelope validation failure: `follows` missing, empty, over 200 items, or an item shape invalid. */
8457
+ 400: {
8458
+ headers: {
8459
+ [name: string]: unknown;
8460
+ };
8461
+ content: {
8462
+ "application/json": components["schemas"]["ErrorResponseDto"];
8463
+ };
8464
+ };
8465
+ /** @description PAK lacks `social.create`. */
8466
+ 403: {
8467
+ headers: {
8468
+ [name: string]: unknown;
8469
+ };
8470
+ content: {
8471
+ "application/json": components["schemas"]["ErrorResponseDto"];
8472
+ };
8473
+ };
8474
+ /** @description Community not found in the PAK's workspace. (Unknown actors fail per item, not the whole call.) */
8475
+ 404: {
8476
+ headers: {
8477
+ [name: string]: unknown;
8478
+ };
8479
+ content: {
8480
+ "application/json": components["schemas"]["ErrorResponseDto"];
8481
+ };
8482
+ };
8483
+ };
8484
+ };
7349
8485
  EdgeController_unfollow: {
7350
8486
  parameters: {
7351
8487
  query?: never;
@@ -7543,7 +8679,12 @@ interface operations {
7543
8679
  ActorListController_list: {
7544
8680
  parameters: {
7545
8681
  query?: {
7546
- /** @description Surface the viewer's own private lists alongside the public catalog. */
8682
+ /** @description Viewer actor UUID — surfaces the viewer's own private lists alongside the public catalog. */
8683
+ actor_id?: string;
8684
+ /**
8685
+ * @deprecated
8686
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
8687
+ */
7547
8688
  viewer_actor_id?: string;
7548
8689
  /** @description Filter to lists owned by this actor. */
7549
8690
  owner_actor_id?: string;
@@ -7582,7 +8723,10 @@ interface operations {
7582
8723
  ActorListController_create: {
7583
8724
  parameters: {
7584
8725
  query?: never;
7585
- header?: never;
8726
+ header?: {
8727
+ /** @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`. */
8728
+ "Idempotency-Key"?: string;
8729
+ };
7586
8730
  path: {
7587
8731
  /** @description Social community UUID. */
7588
8732
  communityId: string;
@@ -7604,7 +8748,7 @@ interface operations {
7604
8748
  "application/json": components["schemas"]["ActorListResponseDto"];
7605
8749
  };
7606
8750
  };
7607
- /** @description Validation failure. */
8751
+ /** @description Validation failure (including malformed Idempotency-Key). */
7608
8752
  400: {
7609
8753
  headers: {
7610
8754
  [name: string]: unknown;
@@ -7631,12 +8775,26 @@ interface operations {
7631
8775
  "application/json": components["schemas"]["ErrorResponseDto"];
7632
8776
  };
7633
8777
  };
8778
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
8779
+ 409: {
8780
+ headers: {
8781
+ [name: string]: unknown;
8782
+ };
8783
+ content: {
8784
+ "application/json": components["schemas"]["ErrorResponseDto"];
8785
+ };
8786
+ };
7634
8787
  };
7635
8788
  };
7636
8789
  ActorListController_getById: {
7637
8790
  parameters: {
7638
8791
  query?: {
7639
- /** @description Required to see a private list (must equal owner). */
8792
+ /** @description Viewer actor UUID — required to see a private list (must equal owner). */
8793
+ actor_id?: string;
8794
+ /**
8795
+ * @deprecated
8796
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
8797
+ */
7640
8798
  viewer_actor_id?: string;
7641
8799
  };
7642
8800
  header?: never;
@@ -7681,7 +8839,10 @@ interface operations {
7681
8839
  };
7682
8840
  ActorListController_delete: {
7683
8841
  parameters: {
7684
- query?: never;
8842
+ query: {
8843
+ /** @description Caller social actor UUID (must equal the list owner). */
8844
+ actor_id: string;
8845
+ };
7685
8846
  header?: never;
7686
8847
  path: {
7687
8848
  /** @description Social community UUID. */
@@ -7704,6 +8865,15 @@ interface operations {
7704
8865
  };
7705
8866
  content?: never;
7706
8867
  };
8868
+ /** @description Missing/invalid actor_id. */
8869
+ 400: {
8870
+ headers: {
8871
+ [name: string]: unknown;
8872
+ };
8873
+ content: {
8874
+ "application/json": components["schemas"]["ErrorResponseDto"];
8875
+ };
8876
+ };
7707
8877
  /** @description Caller is not the owner. */
7708
8878
  403: {
7709
8879
  headers: {
@@ -7784,7 +8954,12 @@ interface operations {
7784
8954
  parameters: {
7785
8955
  query: {
7786
8956
  /** @description Viewer — required for visibility checks + block-filter. */
7787
- viewer_actor_id: string;
8957
+ actor_id: string;
8958
+ /**
8959
+ * @deprecated
8960
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
8961
+ */
8962
+ viewer_actor_id?: string;
7788
8963
  limit?: number;
7789
8964
  /** @description Opaque cursor; differs in shape between ranked and chronological. */
7790
8965
  cursor?: string;
@@ -7810,7 +8985,7 @@ interface operations {
7810
8985
  "application/json": components["schemas"]["FeedResponseDto"];
7811
8986
  };
7812
8987
  };
7813
- /** @description INVALID_ORDER or INVALID_CURSOR. */
8988
+ /** @description Missing/invalid actor_id, INVALID_ORDER, or INVALID_CURSOR. */
7814
8989
  400: {
7815
8990
  headers: {
7816
8991
  [name: string]: unknown;
@@ -7842,6 +9017,12 @@ interface operations {
7842
9017
  ActorListController_listMembers: {
7843
9018
  parameters: {
7844
9019
  query?: {
9020
+ /** @description Viewer actor UUID. */
9021
+ actor_id?: string;
9022
+ /**
9023
+ * @deprecated
9024
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
9025
+ */
7845
9026
  viewer_actor_id?: string;
7846
9027
  limit?: number;
7847
9028
  cursor?: string;
@@ -7944,7 +9125,10 @@ interface operations {
7944
9125
  };
7945
9126
  ActorListController_removeMember: {
7946
9127
  parameters: {
7947
- query?: never;
9128
+ query: {
9129
+ /** @description Caller social actor UUID (must equal the list owner). */
9130
+ actor_id: string;
9131
+ };
7948
9132
  header?: never;
7949
9133
  path: {
7950
9134
  /** @description Social community UUID. */
@@ -7969,6 +9153,15 @@ interface operations {
7969
9153
  };
7970
9154
  content?: never;
7971
9155
  };
9156
+ /** @description Missing/invalid actor_id. */
9157
+ 400: {
9158
+ headers: {
9159
+ [name: string]: unknown;
9160
+ };
9161
+ content: {
9162
+ "application/json": components["schemas"]["ErrorResponseDto"];
9163
+ };
9164
+ };
7972
9165
  /** @description Caller is not the owner. */
7973
9166
  403: {
7974
9167
  headers: {
@@ -8117,21 +9310,95 @@ interface operations {
8117
9310
  path: {
8118
9311
  communityId: string;
8119
9312
  };
8120
- cookie?: never;
8121
- };
8122
- requestBody?: never;
8123
- responses: {
8124
- /** @description Page of posts (only `published`, non-expired, public-visibility unless filtered by author). */
8125
- 200: {
9313
+ cookie?: never;
9314
+ };
9315
+ requestBody?: never;
9316
+ responses: {
9317
+ /** @description Page of posts (only `published`, non-expired, public-visibility unless filtered by author). */
9318
+ 200: {
9319
+ headers: {
9320
+ [name: string]: unknown;
9321
+ };
9322
+ content: {
9323
+ "application/json": components["schemas"]["PostListResponseDto"];
9324
+ };
9325
+ };
9326
+ /** @description PAK lacks `social.list`. */
9327
+ 403: {
9328
+ headers: {
9329
+ [name: string]: unknown;
9330
+ };
9331
+ content: {
9332
+ "application/json": components["schemas"]["ErrorResponseDto"];
9333
+ };
9334
+ };
9335
+ /** @description Community not found. */
9336
+ 404: {
9337
+ headers: {
9338
+ [name: string]: unknown;
9339
+ };
9340
+ content: {
9341
+ "application/json": components["schemas"]["ErrorResponseDto"];
9342
+ };
9343
+ };
9344
+ };
9345
+ };
9346
+ PostController_create: {
9347
+ parameters: {
9348
+ query?: never;
9349
+ header?: {
9350
+ /** @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`. */
9351
+ "Idempotency-Key"?: string;
9352
+ };
9353
+ path: {
9354
+ communityId: string;
9355
+ };
9356
+ cookie?: never;
9357
+ };
9358
+ requestBody: {
9359
+ content: {
9360
+ "application/json": components["schemas"]["CreatePostDto"];
9361
+ };
9362
+ };
9363
+ responses: {
9364
+ /** @description Post created. Defaults: `kind=text`, `visibility=public`, `status=published`. */
9365
+ 201: {
9366
+ headers: {
9367
+ [name: string]: unknown;
9368
+ };
9369
+ content: {
9370
+ "application/json": components["schemas"]["PostResponseDto"];
9371
+ };
9372
+ };
9373
+ /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp; malformed Idempotency-Key). */
9374
+ 400: {
9375
+ headers: {
9376
+ [name: string]: unknown;
9377
+ };
9378
+ content: {
9379
+ "application/json": components["schemas"]["ErrorResponseDto"];
9380
+ };
9381
+ };
9382
+ /** @description PAK lacks `social.create`, or actor is suspended. */
9383
+ 403: {
9384
+ headers: {
9385
+ [name: string]: unknown;
9386
+ };
9387
+ content: {
9388
+ "application/json": components["schemas"]["ErrorResponseDto"];
9389
+ };
9390
+ };
9391
+ /** @description Community, actor, or quote source post not found in the PAK's workspace. */
9392
+ 404: {
8126
9393
  headers: {
8127
9394
  [name: string]: unknown;
8128
9395
  };
8129
9396
  content: {
8130
- "application/json": components["schemas"]["PostListResponseDto"];
9397
+ "application/json": components["schemas"]["ErrorResponseDto"];
8131
9398
  };
8132
9399
  };
8133
- /** @description PAK lacks `social.list`. */
8134
- 403: {
9400
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
9401
+ 409: {
8135
9402
  headers: {
8136
9403
  [name: string]: unknown;
8137
9404
  };
@@ -8139,8 +9406,8 @@ interface operations {
8139
9406
  "application/json": components["schemas"]["ErrorResponseDto"];
8140
9407
  };
8141
9408
  };
8142
- /** @description Community not found. */
8143
- 404: {
9409
+ /** @description Quote rules: `CANNOT_QUOTE_SELF` (kind='quote' with your own post as source) or `CANNOT_QUOTE_PRIVATE` (source post is private). */
9410
+ 422: {
8144
9411
  headers: {
8145
9412
  [name: string]: unknown;
8146
9413
  };
@@ -8150,7 +9417,7 @@ interface operations {
8150
9417
  };
8151
9418
  };
8152
9419
  };
8153
- PostController_create: {
9420
+ PostController_recordImpressions: {
8154
9421
  parameters: {
8155
9422
  query?: never;
8156
9423
  header?: never;
@@ -8161,20 +9428,18 @@ interface operations {
8161
9428
  };
8162
9429
  requestBody: {
8163
9430
  content: {
8164
- "application/json": components["schemas"]["CreatePostDto"];
9431
+ "application/json": components["schemas"]["RecordViewsDto"];
8165
9432
  };
8166
9433
  };
8167
9434
  responses: {
8168
- /** @description Post created. Defaults: `kind=text`, `visibility=public`, `status=published`. */
8169
- 201: {
9435
+ /** @description Impressions recorded (or no-op if every id was missing). */
9436
+ 204: {
8170
9437
  headers: {
8171
9438
  [name: string]: unknown;
8172
9439
  };
8173
- content: {
8174
- "application/json": components["schemas"]["PostResponseDto"];
8175
- };
9440
+ content?: never;
8176
9441
  };
8177
- /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp). */
9442
+ /** @description Empty `post_ids`, more than 200 ids, or a non-UUID in the list. */
8178
9443
  400: {
8179
9444
  headers: {
8180
9445
  [name: string]: unknown;
@@ -8183,7 +9448,7 @@ interface operations {
8183
9448
  "application/json": components["schemas"]["ErrorResponseDto"];
8184
9449
  };
8185
9450
  };
8186
- /** @description PAK lacks `social.create`, or actor is suspended. */
9451
+ /** @description PAK lacks `social.view` on the community URN. */
8187
9452
  403: {
8188
9453
  headers: {
8189
9454
  [name: string]: unknown;
@@ -8192,27 +9457,9 @@ interface operations {
8192
9457
  "application/json": components["schemas"]["ErrorResponseDto"];
8193
9458
  };
8194
9459
  };
8195
- /** @description Community, actor, or quote source post not found in the PAK's workspace. */
8196
- 404: {
8197
- headers: {
8198
- [name: string]: unknown;
8199
- };
8200
- content: {
8201
- "application/json": components["schemas"]["ErrorResponseDto"];
8202
- };
8203
- };
8204
- /** @description Quote rules: `CANNOT_QUOTE_SELF` (kind='quote' with your own post as source) or `CANNOT_QUOTE_PRIVATE` (source post is private). */
8205
- 422: {
8206
- headers: {
8207
- [name: string]: unknown;
8208
- };
8209
- content: {
8210
- "application/json": components["schemas"]["ErrorResponseDto"];
8211
- };
8212
- };
8213
9460
  };
8214
9461
  };
8215
- PostController_recordViews: {
9462
+ PostController_recordViewsDeprecated: {
8216
9463
  parameters: {
8217
9464
  query?: never;
8218
9465
  header?: never;
@@ -8227,7 +9474,7 @@ interface operations {
8227
9474
  };
8228
9475
  };
8229
9476
  responses: {
8230
- /** @description Views recorded (or no-op if every id was missing). */
9477
+ /** @description Impressions recorded (or no-op if every id was missing). */
8231
9478
  204: {
8232
9479
  headers: {
8233
9480
  [name: string]: unknown;
@@ -8243,7 +9490,7 @@ interface operations {
8243
9490
  "application/json": components["schemas"]["ErrorResponseDto"];
8244
9491
  };
8245
9492
  };
8246
- /** @description PAK lacks `social.list` on the community URN. */
9493
+ /** @description PAK lacks `social.view` on the community URN. */
8247
9494
  403: {
8248
9495
  headers: {
8249
9496
  [name: string]: unknown;
@@ -8258,6 +9505,11 @@ interface operations {
8258
9505
  parameters: {
8259
9506
  query?: {
8260
9507
  /** @description Social actor UUID of the viewer. Surfaces non-public posts they are entitled to see. */
9508
+ actor_id?: string;
9509
+ /**
9510
+ * @deprecated
9511
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11). Removed in a future version.
9512
+ */
8261
9513
  requester_id?: string;
8262
9514
  };
8263
9515
  header?: never;
@@ -8461,7 +9713,10 @@ interface operations {
8461
9713
  };
8462
9714
  BookmarkController_delete: {
8463
9715
  parameters: {
8464
- query?: never;
9716
+ query: {
9717
+ /** @description Acting actor UUID. */
9718
+ actor_id: string;
9719
+ };
8465
9720
  header?: never;
8466
9721
  path: {
8467
9722
  /** @description Social community UUID. Must belong to the PAK's workspace. */
@@ -8471,9 +9726,9 @@ interface operations {
8471
9726
  };
8472
9727
  cookie?: never;
8473
9728
  };
8474
- requestBody: {
9729
+ requestBody?: {
8475
9730
  content: {
8476
- "application/json": components["schemas"]["CreateBookmarkDto"];
9731
+ "application/json": components["schemas"]["DeprecatedActorIdBodyDto"];
8477
9732
  };
8478
9733
  };
8479
9734
  responses: {
@@ -8484,7 +9739,7 @@ interface operations {
8484
9739
  };
8485
9740
  content?: never;
8486
9741
  };
8487
- /** @description Validation failure. */
9742
+ /** @description Validation failure (missing/invalid actor_id). */
8488
9743
  400: {
8489
9744
  headers: {
8490
9745
  [name: string]: unknown;
@@ -8521,6 +9776,11 @@ interface operations {
8521
9776
  /** @description List replies of this parent comment instead of top-level. */
8522
9777
  parent_id?: string;
8523
9778
  /** @description Viewer actor UUID — surfaces author_only replies they're entitled to see. */
9779
+ actor_id?: string;
9780
+ /**
9781
+ * @deprecated
9782
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
9783
+ */
8524
9784
  requester_id?: string;
8525
9785
  };
8526
9786
  header?: never;
@@ -8566,7 +9826,10 @@ interface operations {
8566
9826
  CommentController_create: {
8567
9827
  parameters: {
8568
9828
  query?: never;
8569
- header?: never;
9829
+ header?: {
9830
+ /** @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`. */
9831
+ "Idempotency-Key"?: string;
9832
+ };
8570
9833
  path: {
8571
9834
  /** @description Social community UUID. Must belong to the PAK's workspace. */
8572
9835
  communityId: string;
@@ -8590,7 +9853,7 @@ interface operations {
8590
9853
  "application/json": components["schemas"]["CommentResponseDto"];
8591
9854
  };
8592
9855
  };
8593
- /** @description Validation failure (missing actor_id, empty body, body too long). */
9856
+ /** @description Validation failure (missing actor_id, empty body, body too long, malformed Idempotency-Key). */
8594
9857
  400: {
8595
9858
  headers: {
8596
9859
  [name: string]: unknown;
@@ -8617,7 +9880,7 @@ interface operations {
8617
9880
  "application/json": components["schemas"]["ErrorResponseDto"];
8618
9881
  };
8619
9882
  };
8620
- /** @description Block exists between commenter and post author, or depth exceeds community.settings.max_comment_depth. */
9883
+ /** @description Block exists between commenter and post author, depth exceeds community.settings.max_comment_depth, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
8621
9884
  409: {
8622
9885
  headers: {
8623
9886
  [name: string]: unknown;
@@ -8631,6 +9894,12 @@ interface operations {
8631
9894
  CommentController_getById: {
8632
9895
  parameters: {
8633
9896
  query?: {
9897
+ /** @description Viewer actor UUID. */
9898
+ actor_id?: string;
9899
+ /**
9900
+ * @deprecated
9901
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
9902
+ */
8634
9903
  requester_id?: string;
8635
9904
  };
8636
9905
  header?: never;
@@ -9113,6 +10382,63 @@ interface operations {
9113
10382
  };
9114
10383
  };
9115
10384
  };
10385
+ PostReactionController_list: {
10386
+ parameters: {
10387
+ query?: {
10388
+ /** @description Filter to a single reaction type label. */
10389
+ type?: string;
10390
+ limit?: number;
10391
+ cursor?: string;
10392
+ };
10393
+ header?: never;
10394
+ path: {
10395
+ /** @description Social community UUID. */
10396
+ communityId: string;
10397
+ /** @description Social post UUID. */
10398
+ postId: string;
10399
+ };
10400
+ cookie?: never;
10401
+ };
10402
+ requestBody?: never;
10403
+ responses: {
10404
+ /** @description Page of reactions. */
10405
+ 200: {
10406
+ headers: {
10407
+ [name: string]: unknown;
10408
+ };
10409
+ content: {
10410
+ "application/json": components["schemas"]["PostReactionListResponseDto"];
10411
+ };
10412
+ };
10413
+ /** @description Overlong `type` filter (max 64 chars). */
10414
+ 400: {
10415
+ headers: {
10416
+ [name: string]: unknown;
10417
+ };
10418
+ content: {
10419
+ "application/json": components["schemas"]["ErrorResponseDto"];
10420
+ };
10421
+ };
10422
+ /** @description PAK lacks `social.list`. */
10423
+ 403: {
10424
+ headers: {
10425
+ [name: string]: unknown;
10426
+ };
10427
+ content: {
10428
+ "application/json": components["schemas"]["ErrorResponseDto"];
10429
+ };
10430
+ };
10431
+ /** @description Community or post not found (or post removed). */
10432
+ 404: {
10433
+ headers: {
10434
+ [name: string]: unknown;
10435
+ };
10436
+ content: {
10437
+ "application/json": components["schemas"]["ErrorResponseDto"];
10438
+ };
10439
+ };
10440
+ };
10441
+ };
9116
10442
  PostReactionController_react: {
9117
10443
  parameters: {
9118
10444
  query?: never;
@@ -9301,7 +10627,10 @@ interface operations {
9301
10627
  };
9302
10628
  RepostController_delete: {
9303
10629
  parameters: {
9304
- query?: never;
10630
+ query: {
10631
+ /** @description Acting actor UUID. */
10632
+ actor_id: string;
10633
+ };
9305
10634
  header?: never;
9306
10635
  path: {
9307
10636
  /** @description Social community UUID. Must belong to the PAK's workspace. */
@@ -9311,9 +10640,9 @@ interface operations {
9311
10640
  };
9312
10641
  cookie?: never;
9313
10642
  };
9314
- requestBody: {
10643
+ requestBody?: {
9315
10644
  content: {
9316
- "application/json": components["schemas"]["CreateRepostDto"];
10645
+ "application/json": components["schemas"]["DeprecatedActorIdBodyDto"];
9317
10646
  };
9318
10647
  };
9319
10648
  responses: {
@@ -9324,7 +10653,7 @@ interface operations {
9324
10653
  };
9325
10654
  content?: never;
9326
10655
  };
9327
- /** @description Validation failure. */
10656
+ /** @description Validation failure (missing/invalid actor_id). */
9328
10657
  400: {
9329
10658
  headers: {
9330
10659
  [name: string]: unknown;
@@ -9448,7 +10777,12 @@ interface operations {
9448
10777
  parameters: {
9449
10778
  query: {
9450
10779
  /** @description Requester social actor UUID — must resolve to the post author. */
9451
- requester_id: string;
10780
+ actor_id: string;
10781
+ /**
10782
+ * @deprecated
10783
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
10784
+ */
10785
+ requester_id?: string;
9452
10786
  limit?: number;
9453
10787
  /** @description Cursor from the prior page. */
9454
10788
  cursor?: string;
@@ -9473,6 +10807,15 @@ interface operations {
9473
10807
  "application/json": components["schemas"]["StoryViewersResponse"];
9474
10808
  };
9475
10809
  };
10810
+ /** @description Missing/invalid actor_id (author-only endpoint). */
10811
+ 400: {
10812
+ headers: {
10813
+ [name: string]: unknown;
10814
+ };
10815
+ content: {
10816
+ "application/json": components["schemas"]["ErrorResponseDto"];
10817
+ };
10818
+ };
9476
10819
  /** @description PAK lacks `social.list` OR requester is not the post author. */
9477
10820
  403: {
9478
10821
  headers: {
@@ -9751,6 +11094,11 @@ interface operations {
9751
11094
  /** @description Max hits to return. */
9752
11095
  limit?: number;
9753
11096
  /** @description Viewer social actor UUID — filters out blocked / muted actors. */
11097
+ actor_id?: string;
11098
+ /**
11099
+ * @deprecated
11100
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
11101
+ */
9754
11102
  requester_id?: string;
9755
11103
  };
9756
11104
  header?: never;
@@ -9860,6 +11208,12 @@ interface operations {
9860
11208
  q: string;
9861
11209
  limit?: number;
9862
11210
  order?: "relevance" | "recent";
11211
+ /** @description Viewer social actor UUID. */
11212
+ actor_id?: string;
11213
+ /**
11214
+ * @deprecated
11215
+ * @description DEPRECATED alias of `actor_id` (task 008 / G11).
11216
+ */
9863
11217
  requester_id?: string;
9864
11218
  };
9865
11219
  header?: never;
@@ -9909,7 +11263,7 @@ interface operations {
9909
11263
  };
9910
11264
  };
9911
11265
  };
9912
- WebhookController_getActive: {
11266
+ WebhookController_list: {
9913
11267
  parameters: {
9914
11268
  query?: never;
9915
11269
  header?: never;
@@ -9921,13 +11275,13 @@ interface operations {
9921
11275
  };
9922
11276
  requestBody?: never;
9923
11277
  responses: {
9924
- /** @description The active webhook, or a literal JSON `null` body when the community has no active webhook registered. */
11278
+ /** @description All webhooks on the community (no pagination — capped at 10 rows). */
9925
11279
  200: {
9926
11280
  headers: {
9927
11281
  [name: string]: unknown;
9928
11282
  };
9929
11283
  content: {
9930
- "application/json": components["schemas"]["WebhookResponseDto"] | null;
11284
+ "application/json": components["schemas"]["WebhookListResponseDto"];
9931
11285
  };
9932
11286
  };
9933
11287
  /** @description Community not found. */
@@ -9944,7 +11298,10 @@ interface operations {
9944
11298
  WebhookController_create: {
9945
11299
  parameters: {
9946
11300
  query?: never;
9947
- header?: never;
11301
+ header?: {
11302
+ /** @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`. */
11303
+ "Idempotency-Key"?: string;
11304
+ };
9948
11305
  path: {
9949
11306
  /** @description Social community UUID. */
9950
11307
  communityId: string;
@@ -9966,7 +11323,7 @@ interface operations {
9966
11323
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
9967
11324
  };
9968
11325
  };
9969
- /** @description Validation failure (bad url, empty event_types). */
11326
+ /** @description Validation failure (bad url, empty or unknown event_types — the message names the valid set; malformed Idempotency-Key). */
9970
11327
  400: {
9971
11328
  headers: {
9972
11329
  [name: string]: unknown;
@@ -9993,7 +11350,7 @@ interface operations {
9993
11350
  "application/json": components["schemas"]["ErrorResponseDto"];
9994
11351
  };
9995
11352
  };
9996
- /** @description Community already has an active webhook. */
11353
+ /** @description Webhook cap reached (10 per community), or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
9997
11354
  409: {
9998
11355
  headers: {
9999
11356
  [name: string]: unknown;
@@ -10154,10 +11511,58 @@ interface operations {
10154
11511
  };
10155
11512
  };
10156
11513
  };
10157
- WebhookController_rotateSecret: {
11514
+ WebhookController_redeliver: {
10158
11515
  parameters: {
10159
11516
  query?: never;
10160
11517
  header?: never;
11518
+ path: {
11519
+ /** @description Social community UUID. */
11520
+ communityId: string;
11521
+ /** @description Webhook UUID. */
11522
+ webhookId: string;
11523
+ /** @description Delivery row UUID (from GET …/deliveries). */
11524
+ deliveryId: string;
11525
+ };
11526
+ cookie?: never;
11527
+ };
11528
+ requestBody?: never;
11529
+ responses: {
11530
+ /** @description Redelivery enqueued. */
11531
+ 202: {
11532
+ headers: {
11533
+ [name: string]: unknown;
11534
+ };
11535
+ content: {
11536
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11537
+ };
11538
+ };
11539
+ /** @description Webhook or delivery not found. */
11540
+ 404: {
11541
+ headers: {
11542
+ [name: string]: unknown;
11543
+ };
11544
+ content: {
11545
+ "application/json": components["schemas"]["ErrorResponseDto"];
11546
+ };
11547
+ };
11548
+ /** @description Webhook is disabled — re-enable it first. */
11549
+ 409: {
11550
+ headers: {
11551
+ [name: string]: unknown;
11552
+ };
11553
+ content: {
11554
+ "application/json": components["schemas"]["ErrorResponseDto"];
11555
+ };
11556
+ };
11557
+ };
11558
+ };
11559
+ WebhookController_rotateSecret: {
11560
+ parameters: {
11561
+ query?: never;
11562
+ header?: {
11563
+ /** @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`. */
11564
+ "Idempotency-Key"?: string;
11565
+ };
10161
11566
  path: {
10162
11567
  /** @description Social community UUID. */
10163
11568
  communityId: string;
@@ -10177,6 +11582,15 @@ interface operations {
10177
11582
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
10178
11583
  };
10179
11584
  };
11585
+ /** @description Malformed Idempotency-Key header. */
11586
+ 400: {
11587
+ headers: {
11588
+ [name: string]: unknown;
11589
+ };
11590
+ content: {
11591
+ "application/json": components["schemas"]["ErrorResponseDto"];
11592
+ };
11593
+ };
10180
11594
  /** @description Webhook not found. */
10181
11595
  404: {
10182
11596
  headers: {
@@ -10186,12 +11600,89 @@ interface operations {
10186
11600
  "application/json": components["schemas"]["ErrorResponseDto"];
10187
11601
  };
10188
11602
  };
11603
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
11604
+ 409: {
11605
+ headers: {
11606
+ [name: string]: unknown;
11607
+ };
11608
+ content: {
11609
+ "application/json": components["schemas"]["ErrorResponseDto"];
11610
+ };
11611
+ };
10189
11612
  };
10190
11613
  };
10191
- CommunityController_list: {
11614
+ WebhookController_testPing: {
11615
+ parameters: {
11616
+ query?: never;
11617
+ header?: never;
11618
+ path: {
11619
+ /** @description Social community UUID. */
11620
+ communityId: string;
11621
+ /** @description Webhook UUID. */
11622
+ webhookId: string;
11623
+ };
11624
+ cookie?: never;
11625
+ };
11626
+ requestBody?: never;
11627
+ responses: {
11628
+ /** @description Ping enqueued. */
11629
+ 202: {
11630
+ headers: {
11631
+ [name: string]: unknown;
11632
+ };
11633
+ content: {
11634
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11635
+ };
11636
+ };
11637
+ /** @description Webhook not found. */
11638
+ 404: {
11639
+ headers: {
11640
+ [name: string]: unknown;
11641
+ };
11642
+ content: {
11643
+ "application/json": components["schemas"]["ErrorResponseDto"];
11644
+ };
11645
+ };
11646
+ /** @description Webhook is disabled — re-enable it first. */
11647
+ 409: {
11648
+ headers: {
11649
+ [name: string]: unknown;
11650
+ };
11651
+ content: {
11652
+ "application/json": components["schemas"]["ErrorResponseDto"];
11653
+ };
11654
+ };
11655
+ };
11656
+ };
11657
+ WebhookEventTypesController_list: {
10192
11658
  parameters: {
10193
11659
  query?: never;
10194
11660
  header?: never;
11661
+ path?: never;
11662
+ cookie?: never;
11663
+ };
11664
+ requestBody?: never;
11665
+ responses: {
11666
+ /** @description The full event-type catalog. */
11667
+ 200: {
11668
+ headers: {
11669
+ [name: string]: unknown;
11670
+ };
11671
+ content: {
11672
+ "application/json": components["schemas"]["WebhookEventTypesResponseDto"];
11673
+ };
11674
+ };
11675
+ };
11676
+ };
11677
+ CommunityController_list: {
11678
+ parameters: {
11679
+ query?: {
11680
+ /** @description Page size (default 50, max 200). */
11681
+ limit?: string;
11682
+ /** @description Opaque cursor from a prior page's `pagination.next_cursor`. */
11683
+ cursor?: string;
11684
+ };
11685
+ header?: never;
10195
11686
  path: {
10196
11687
  /** @description ProductCraft workspace UUID owning the community. */
10197
11688
  workspaceId: string;
@@ -10200,13 +11691,13 @@ interface operations {
10200
11691
  };
10201
11692
  requestBody?: never;
10202
11693
  responses: {
10203
- /** @description Bare array of communities; not paginated (workspaces have a small handful). */
11694
+ /** @description Paginated communities. */
10204
11695
  200: {
10205
11696
  headers: {
10206
11697
  [name: string]: unknown;
10207
11698
  };
10208
11699
  content: {
10209
- "application/json": components["schemas"]["CommunityResponseDto"][];
11700
+ "application/json": components["schemas"]["CommunityListResponseDto"];
10210
11701
  };
10211
11702
  };
10212
11703
  /** @description Caller lacks `social.list`, or the workspace has not enabled the `social` service. */
@@ -10225,6 +11716,8 @@ interface operations {
10225
11716
  query?: never;
10226
11717
  header: {
10227
11718
  authorization: string;
11719
+ /** @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`. */
11720
+ "Idempotency-Key"?: string;
10228
11721
  };
10229
11722
  path: {
10230
11723
  /** @description ProductCraft workspace UUID owning the community. */
@@ -10247,7 +11740,7 @@ interface operations {
10247
11740
  "application/json": components["schemas"]["CommunityResponseDto"];
10248
11741
  };
10249
11742
  };
10250
- /** @description Validation failure (slug shape, display_name length). */
11743
+ /** @description Validation failure (slug shape, display_name length, malformed Idempotency-Key). */
10251
11744
  400: {
10252
11745
  headers: {
10253
11746
  [name: string]: unknown;
@@ -10283,7 +11776,7 @@ interface operations {
10283
11776
  "application/json": components["schemas"]["ErrorResponseDto"];
10284
11777
  };
10285
11778
  };
10286
- /** @description Community slug already taken in this workspace, or the supplied `app_id` is already connected to a community. */
11779
+ /** @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). */
10287
11780
  409: {
10288
11781
  headers: {
10289
11782
  [name: string]: unknown;
@@ -10480,7 +11973,10 @@ interface operations {
10480
11973
  ModerationAdminController_shadowBan: {
10481
11974
  parameters: {
10482
11975
  query?: never;
10483
- header?: never;
11976
+ header?: {
11977
+ /** @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`. */
11978
+ "Idempotency-Key"?: string;
11979
+ };
10484
11980
  path: {
10485
11981
  workspaceId: string;
10486
11982
  communityId: string;
@@ -10503,7 +11999,7 @@ interface operations {
10503
11999
  "application/json": components["schemas"]["ModerationActorResponseDto"];
10504
12000
  };
10505
12001
  };
10506
- /** @description Invalid duration_hours or reason. */
12002
+ /** @description Invalid duration_hours or reason, or malformed Idempotency-Key. */
10507
12003
  400: {
10508
12004
  headers: {
10509
12005
  [name: string]: unknown;
@@ -10530,6 +12026,15 @@ interface operations {
10530
12026
  "application/json": components["schemas"]["ErrorResponseDto"];
10531
12027
  };
10532
12028
  };
12029
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
12030
+ 409: {
12031
+ headers: {
12032
+ [name: string]: unknown;
12033
+ };
12034
+ content: {
12035
+ "application/json": components["schemas"]["ErrorResponseDto"];
12036
+ };
12037
+ };
10533
12038
  };
10534
12039
  };
10535
12040
  ModerationAdminController_unshadow: {
@@ -10765,7 +12270,10 @@ interface operations {
10765
12270
  ModerationAdminController_act: {
10766
12271
  parameters: {
10767
12272
  query?: never;
10768
- header?: never;
12273
+ header?: {
12274
+ /** @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`. */
12275
+ "Idempotency-Key"?: string;
12276
+ };
10769
12277
  path: {
10770
12278
  workspaceId: string;
10771
12279
  communityId: string;
@@ -10788,7 +12296,7 @@ interface operations {
10788
12296
  "application/json": components["schemas"]["ActOnFlagResponseDto"];
10789
12297
  };
10790
12298
  };
10791
- /** @description Invalid action or notes. */
12299
+ /** @description Invalid action or notes, or malformed Idempotency-Key. */
10792
12300
  400: {
10793
12301
  headers: {
10794
12302
  [name: string]: unknown;
@@ -10815,7 +12323,7 @@ interface operations {
10815
12323
  "application/json": components["schemas"]["ErrorResponseDto"];
10816
12324
  };
10817
12325
  };
10818
- /** @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. */
12326
+ /** @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). */
10819
12327
  409: {
10820
12328
  headers: {
10821
12329
  [name: string]: unknown;