@productcraft/social 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.cts +1296 -92
  2. package/dist/index.d.ts +1296 -92
  3. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ interface paths {
13
13
  path?: never;
14
14
  cookie?: never;
15
15
  };
16
- /** List actors in a community. 50 per page by default (max 200) — paginate with the cursor returned in `pagination.next_cursor` while `pagination.has_more` is true. */
16
+ /** List actors in a community. 50 per page by default (max 200) — paginate with the cursor returned in `pagination.next_cursor` while `pagination.has_more` is true. Pass `?ids=<uuid,uuid,…>` (max 100) to batch-fetch specific actors instead — one hydration call for a screenful of ids; unknown ids are silently omitted and `pagination` is the exhausted shape (`next_cursor: null`). */
17
17
  get: operations["ActorController_list"];
18
18
  put?: never;
19
19
  /** Upsert an actor by external_id. Creates on first call, updates on subsequent calls with the same external_id. Idempotent on `(community, external_id)`. Note: omitted fields on a follow-up call are overwritten with the new body — pass every field you want to keep on each call. */
@@ -24,6 +24,40 @@ interface paths {
24
24
  patch?: never;
25
25
  trace?: never;
26
26
  };
27
+ "/v1/communities/{communityId}/actors/batch": {
28
+ parameters: {
29
+ query?: never;
30
+ header?: never;
31
+ path?: never;
32
+ cookie?: never;
33
+ };
34
+ get?: never;
35
+ put?: never;
36
+ /** Bulk actor upsert (max 200 per call) — the import lane. Each item runs the exact single-upsert path; results come back per item with partial success (`201` even when some items fail — inspect `success` / `error` per entry). No wrapping transaction. */
37
+ post: operations["ActorController_batchUpsert"];
38
+ delete?: never;
39
+ options?: never;
40
+ head?: never;
41
+ patch?: never;
42
+ trace?: never;
43
+ };
44
+ "/v1/communities/{communityId}/actors/by-external/batch": {
45
+ parameters: {
46
+ query?: never;
47
+ header?: never;
48
+ path?: never;
49
+ cookie?: never;
50
+ };
51
+ get?: never;
52
+ put?: never;
53
+ /** Batch-resolve external_ids to actors (max 200 per call). POST-only — external_ids are up to 256 chars and can't ride a querystring. Unknown ids come back in `missing[]` instead of failing the call. */
54
+ post: operations["ActorController_batchGetByExternal"];
55
+ delete?: never;
56
+ options?: never;
57
+ head?: never;
58
+ patch?: never;
59
+ trace?: never;
60
+ };
27
61
  "/v1/communities/{communityId}/actors/by-external/{externalId}": {
28
62
  parameters: {
29
63
  query?: never;
@@ -67,7 +101,7 @@ interface paths {
67
101
  path?: never;
68
102
  cookie?: never;
69
103
  };
70
- /** List actors this actor has blocked. */
104
+ /** List actors this actor has blocked. Pass `?expand=dst_actor` to nest each blocked actor's full row on the edge. */
71
105
  get: operations["EdgeController_listBlocks"];
72
106
  put?: never;
73
107
  post?: never;
@@ -178,7 +212,7 @@ interface paths {
178
212
  path?: never;
179
213
  cookie?: never;
180
214
  };
181
- /** List the actors who follow this actor. */
215
+ /** List the actors who follow this actor. Pass `?expand=src_actor` to nest each follower's full actor row on the edge — a followers screen renders from this one call. */
182
216
  get: operations["EdgeController_listFollowers"];
183
217
  put?: never;
184
218
  post?: never;
@@ -195,7 +229,7 @@ interface paths {
195
229
  path?: never;
196
230
  cookie?: never;
197
231
  };
198
- /** List the actors this actor follows. */
232
+ /** List the actors this actor follows. Pass `?expand=dst_actor` to nest each followee's full actor row on the edge (no N+1 hydration). */
199
233
  get: operations["EdgeController_listFollowing"];
200
234
  put?: never;
201
235
  post?: never;
@@ -322,7 +356,7 @@ interface paths {
322
356
  path?: never;
323
357
  cookie?: never;
324
358
  };
325
- /** List actors this actor has muted. */
359
+ /** List actors this actor has muted. Pass `?expand=dst_actor` to nest each muted actor's full row on the edge. */
326
360
  get: operations["EdgeController_listMutes"];
327
361
  put?: never;
328
362
  post?: never;
@@ -452,6 +486,26 @@ interface paths {
452
486
  patch: operations["NotificationController_markRead"];
453
487
  trace?: never;
454
488
  };
489
+ "/v1/communities/{communityId}/actors/{actorId}/post-state": {
490
+ parameters: {
491
+ query?: never;
492
+ header?: never;
493
+ path?: never;
494
+ cookie?: never;
495
+ };
496
+ get?: never;
497
+ put?: never;
498
+ /**
499
+ * Batch viewer-state hydration: the actor's reactions, bookmark, repost, and poll-vote state for up to 200 posts in one call.
500
+ * @description Read-over-POST (the id list is too large for a query string) — no side effects, no Idempotency-Key needed. Renders a whole feed page's "liked by you" / saved / reposted / voted state with one request on top of the feed call.
501
+ */
502
+ post: operations["ViewerStateController_postState"];
503
+ delete?: never;
504
+ options?: never;
505
+ head?: never;
506
+ patch?: never;
507
+ trace?: never;
508
+ };
455
509
  "/v1/communities/{communityId}/actors/{actorId}/restricts": {
456
510
  parameters: {
457
511
  query?: never;
@@ -459,7 +513,7 @@ interface paths {
459
513
  path?: never;
460
514
  cookie?: never;
461
515
  };
462
- /** List actors this actor has restricted. */
516
+ /** List actors this actor has restricted. Pass `?expand=dst_actor` to nest each restricted actor's full row on the edge. */
463
517
  get: operations["EdgeController_listRestricts"];
464
518
  put?: never;
465
519
  post?: never;
@@ -529,6 +583,26 @@ interface paths {
529
583
  patch?: never;
530
584
  trace?: never;
531
585
  };
586
+ "/v1/communities/{communityId}/actors/{srcActorId}/relationships": {
587
+ parameters: {
588
+ query?: never;
589
+ header?: never;
590
+ path?: never;
591
+ cookie?: never;
592
+ };
593
+ /**
594
+ * Batched pairwise relationship lookup: does this actor follow / mute / block / restrict each of up to 100 others (and is it followed / blocked back)?
595
+ * @description One query resolves the seven pairwise flags for a whole profile header or member list — no paging of full edge lists, and `blocked_by` is visible without attempting a write and handling the 409. Unknown or cross-community ids resolve to all-false flags; the id list is de-duplicated preserving request order. Bounded input (max 100 ids), so the response has no pagination envelope.
596
+ */
597
+ get: operations["EdgeController_relationships"];
598
+ put?: never;
599
+ post?: never;
600
+ delete?: never;
601
+ options?: never;
602
+ head?: never;
603
+ patch?: never;
604
+ trace?: never;
605
+ };
532
606
  "/v1/communities/{communityId}/blocks": {
533
607
  parameters: {
534
608
  query?: never;
@@ -613,7 +687,7 @@ interface paths {
613
687
  /** List the caller's conversations in this community, most-recent-activity first. */
614
688
  get: operations["ConversationController_list"];
615
689
  put?: never;
616
- /** Open a conversation. Default `kind="direct"` is the idempotent 1-on-1 path. Pass `kind="group"` with `actor_ids` for a multi-participant chat (always creates a new row; no idempotency for groups). */
690
+ /** Open a conversation. Default `kind="direct"` is the naturally-idempotent 1-on-1 path (get-or-create by participant pair). Pass `kind="group"` with `actor_ids` for a multi-participant chat — group creates always insert a new row, so pass an `Idempotency-Key` header to make group-create retries safe. */
617
691
  post: operations["ConversationController_create"];
618
692
  delete?: never;
619
693
  options?: never;
@@ -702,7 +776,7 @@ interface paths {
702
776
  /** List messages in the conversation. Default newest-first cursor. Pass `since` (encoded cursor of the last-seen message) to poll for newer messages instead. */
703
777
  get: operations["ConversationController_listMessages"];
704
778
  put?: never;
705
- /** Send a message in the conversation. */
779
+ /** Send a message in the conversation. Pass an `Idempotency-Key` header to make retries safe — a retried send never delivers the message twice. */
706
780
  post: operations["ConversationController_send"];
707
781
  delete?: never;
708
782
  options?: never;
@@ -797,6 +871,23 @@ interface paths {
797
871
  patch?: never;
798
872
  trace?: never;
799
873
  };
874
+ "/v1/communities/{communityId}/counters": {
875
+ parameters: {
876
+ query?: never;
877
+ header?: never;
878
+ path?: never;
879
+ cookie?: never;
880
+ };
881
+ /** Batch counters (max 100 actors per call) — render a member list with follower badges from ONE call instead of one per actor. Unknown actor_ids come back in `missing[]` instead of failing the read. */
882
+ get: operations["CounterController_getBatchCounters"];
883
+ put?: never;
884
+ post?: never;
885
+ delete?: never;
886
+ options?: never;
887
+ head?: never;
888
+ patch?: never;
889
+ trace?: never;
890
+ };
800
891
  "/v1/communities/{communityId}/discover-feed": {
801
892
  parameters: {
802
893
  query?: never;
@@ -848,6 +939,23 @@ interface paths {
848
939
  patch?: never;
849
940
  trace?: never;
850
941
  };
942
+ "/v1/communities/{communityId}/follows/batch": {
943
+ parameters: {
944
+ query?: never;
945
+ header?: never;
946
+ path?: never;
947
+ cookie?: never;
948
+ };
949
+ get?: never;
950
+ put?: never;
951
+ /** Bulk follow creation (max 200 per call) — the graph-import lane. Each item runs the exact single-follow path (block checks, counters, idempotency), so a blocked pair fails ITS item with a 409 in `error` while the rest of the batch proceeds. `201` even with failures — inspect per-item results. Set `suppress_notifications: true` when importing an existing graph. */
952
+ post: operations["EdgeController_batchFollows"];
953
+ delete?: never;
954
+ options?: never;
955
+ head?: never;
956
+ patch?: never;
957
+ trace?: never;
958
+ };
851
959
  "/v1/communities/{communityId}/follows/{srcActorId}/{dstActorId}": {
852
960
  parameters: {
853
961
  query?: never;
@@ -926,7 +1034,7 @@ interface paths {
926
1034
  /** List discoverable lists in this community. Public lists are visible to anyone; private lists surface only when `viewer_actor_id` is their owner. */
927
1035
  get: operations["ActorListController_list"];
928
1036
  put?: never;
929
- /** Create a new list. Default visibility `private`. */
1037
+ /** Create a new list. Default visibility `private`. List creation has no natural key (an owner can hold many same-named lists), so pass an `Idempotency-Key` header to make retries safe. */
930
1038
  post: operations["ActorListController_create"];
931
1039
  delete?: never;
932
1040
  options?: never;
@@ -1049,7 +1157,7 @@ interface paths {
1049
1157
  /** List posts. Pass `author_id` to filter to a single author. 50/page (max 200), cursor-paginated. */
1050
1158
  get: operations["PostController_list"];
1051
1159
  put?: never;
1052
- /** Create a post on behalf of an actor. */
1160
+ /** Create a post on behalf of an actor. Pass an `Idempotency-Key` header to make retries safe — replays return the original response with `Idempotent-Replay: true` for 24h. */
1053
1161
  post: operations["PostController_create"];
1054
1162
  delete?: never;
1055
1163
  options?: never;
@@ -1127,7 +1235,7 @@ interface paths {
1127
1235
  /** List comments on a post. Default returns top-level comments newest-first; pass `parent_id` to expand a thread (oldest-first). Pass `requester_id` so DM-style `author_only` replies surface only to the post-author and the comment-author pair. */
1128
1236
  get: operations["CommentController_list"];
1129
1237
  put?: never;
1130
- /** Add a comment on a post. Pass `parent_id` to reply; the depth is computed and capped by the community config. */
1238
+ /** Add a comment on a post. Pass `parent_id` to reply; the depth is computed and capped by the community config. Pass an `Idempotency-Key` header to make retries safe. */
1131
1239
  post: operations["CommentController_create"];
1132
1240
  delete?: never;
1133
1241
  options?: never;
@@ -1253,7 +1361,8 @@ interface paths {
1253
1361
  path?: never;
1254
1362
  cookie?: never;
1255
1363
  };
1256
- get?: never;
1364
+ /** List reactions on a post, newest-first. Cursor encodes `(created_at, actor_id, type)` so multi-reaction-from-same-actor stays stable. Pass `type` to narrow to one reaction type. */
1365
+ get: operations["PostReactionController_list"];
1257
1366
  put?: never;
1258
1367
  /** React to a post. Idempotent: re-posting the same (actor, type) returns the existing edge with `created: false`. */
1259
1368
  post: operations["PostReactionController_react"];
@@ -1499,10 +1608,10 @@ interface paths {
1499
1608
  path?: never;
1500
1609
  cookie?: never;
1501
1610
  };
1502
- /** Read the community's active webhook (or null). */
1503
- get: operations["WebhookController_getActive"];
1611
+ /** List the community's webhooks — disabled rows included, so an auto-disabled subscriber stays discoverable. */
1612
+ get: operations["WebhookController_list"];
1504
1613
  put?: never;
1505
- /** Create the community webhook. One active subscriber per community. Returns the signing secret ONCE — store it. */
1614
+ /** Create a community webhook. Multiple subscribers per community are supported (cap 10). Returns the signing secret ONCE — store it. Pass an `Idempotency-Key` header so a retried create replays the SAME secret instead of minting a duplicate subscriber. */
1506
1615
  post: operations["WebhookController_create"];
1507
1616
  delete?: never;
1508
1617
  options?: never;
@@ -1525,7 +1634,7 @@ interface paths {
1525
1634
  delete: operations["WebhookController_delete"];
1526
1635
  options?: never;
1527
1636
  head?: never;
1528
- /** Update webhook url + subscribed event types. */
1637
+ /** Update webhook url, subscribed event types, or disabled state. `{ "disabled": false }` is the re-enable path after an auto-disable — no secret rotation required. */
1529
1638
  patch: operations["WebhookController_update"];
1530
1639
  trace?: never;
1531
1640
  };
@@ -1546,6 +1655,23 @@ interface paths {
1546
1655
  patch?: never;
1547
1656
  trace?: never;
1548
1657
  };
1658
+ "/v1/communities/{communityId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver": {
1659
+ parameters: {
1660
+ query?: never;
1661
+ header?: never;
1662
+ path?: never;
1663
+ cookie?: never;
1664
+ };
1665
+ get?: never;
1666
+ put?: never;
1667
+ /** Re-publish a past delivery from its stored request body. Async (202). The payload is byte-identical to the original (same event id), so subscriber-side event-id dedupe treats it as a redelivery. */
1668
+ post: operations["WebhookController_redeliver"];
1669
+ delete?: never;
1670
+ options?: never;
1671
+ head?: never;
1672
+ patch?: never;
1673
+ trace?: never;
1674
+ };
1549
1675
  "/v1/communities/{communityId}/webhooks/{webhookId}/rotate-secret": {
1550
1676
  parameters: {
1551
1677
  query?: never;
@@ -1555,7 +1681,7 @@ interface paths {
1555
1681
  };
1556
1682
  get?: never;
1557
1683
  put?: never;
1558
- /** Rotate the signing secret. Also clears any auto-disable flag. Returns the new secret ONCE. */
1684
+ /** Rotate the signing secret. Also clears any auto-disable flag. Returns the new secret ONCE. Pass an `Idempotency-Key` header so a retried rotate replays the SAME new secret instead of rotating twice. */
1559
1685
  post: operations["WebhookController_rotateSecret"];
1560
1686
  delete?: never;
1561
1687
  options?: never;
@@ -1563,6 +1689,40 @@ interface paths {
1563
1689
  patch?: never;
1564
1690
  trace?: never;
1565
1691
  };
1692
+ "/v1/communities/{communityId}/webhooks/{webhookId}/test": {
1693
+ parameters: {
1694
+ query?: never;
1695
+ header?: never;
1696
+ path?: never;
1697
+ cookie?: never;
1698
+ };
1699
+ get?: never;
1700
+ put?: never;
1701
+ /** Enqueue a `ping` test delivery. Async (202): the dispatch worker signs and POSTs it exactly like a real event — SSRF guard, TLS, HMAC signature and all. Watch the deliveries list for the outcome. */
1702
+ post: operations["WebhookController_testPing"];
1703
+ delete?: never;
1704
+ options?: never;
1705
+ head?: never;
1706
+ patch?: never;
1707
+ trace?: never;
1708
+ };
1709
+ "/v1/webhook-event-types": {
1710
+ parameters: {
1711
+ query?: never;
1712
+ header?: never;
1713
+ path?: never;
1714
+ cookie?: never;
1715
+ };
1716
+ /** List the webhook event-type catalog. Static metadata, no auth required. Create/update webhooks reject anything not in this list with a 400. */
1717
+ get: operations["WebhookEventTypesController_list"];
1718
+ put?: never;
1719
+ post?: never;
1720
+ delete?: never;
1721
+ options?: never;
1722
+ head?: never;
1723
+ patch?: never;
1724
+ trace?: never;
1725
+ };
1566
1726
  "/v1/workspaces/{workspaceId}/communities": {
1567
1727
  parameters: {
1568
1728
  query?: never;
@@ -1573,7 +1733,7 @@ interface paths {
1573
1733
  /** List communities in a workspace */
1574
1734
  get: operations["CommunityController_list"];
1575
1735
  put?: never;
1576
- /** Create an social community. `app_id` is optional — when supplied Social connects the community to an Auth app and refuses if the app belongs to a different workspace (cross-tenant gate) or is already connected. Omit `app_id` for a standalone community (no Auth integration; the customer manages actor identity). */
1736
+ /** Create an social community. `app_id` is optional — when supplied Social connects the community to an Auth app and refuses if the app belongs to a different workspace (cross-tenant gate) or is already connected. Omit `app_id` for a standalone community (no Auth integration; the customer manages actor identity). Pass an `Idempotency-Key` header to make retries safe. */
1577
1737
  post: operations["CommunityController_create"];
1578
1738
  delete?: never;
1579
1739
  options?: never;
@@ -1626,7 +1786,7 @@ interface paths {
1626
1786
  };
1627
1787
  get?: never;
1628
1788
  put?: never;
1629
- /** Apply a shadow ban to an actor. The actor sees their own content normally; everyone else sees nothing from them. Pass `duration_hours` for a timed ban or omit for indefinite. */
1789
+ /** Apply a shadow ban to an actor. The actor sees their own content normally; everyone else sees nothing from them. Pass `duration_hours` for a timed ban or omit for indefinite. Pass an `Idempotency-Key` header so a retried timed ban doesn't restart the clock. */
1630
1790
  post: operations["ModerationAdminController_shadowBan"];
1631
1791
  /** Remove a shadow ban. No-op if not currently shadow-banned. */
1632
1792
  delete: operations["ModerationAdminController_unshadow"];
@@ -1712,7 +1872,7 @@ interface paths {
1712
1872
  };
1713
1873
  get?: never;
1714
1874
  put?: never;
1715
- /** Apply a moderation action to a flag. Records an audit entry and updates the target post/comment status. */
1875
+ /** Apply a moderation action to a flag. Records an audit entry and updates the target post/comment status. Pass an `Idempotency-Key` header so a retried request records ONE audit entry, not two. */
1716
1876
  post: operations["ModerationAdminController_act"];
1717
1877
  delete?: never;
1718
1878
  options?: never;
@@ -1946,6 +2106,17 @@ interface components {
1946
2106
  /** @description Up to `limit` (default 20, max 50) ranked hits. Not paginated in v1; results are bounded by `limit`. */
1947
2107
  data: components["schemas"]["ActorSearchHitDto"][];
1948
2108
  };
2109
+ ActorsByExternalBatchResponseDto: {
2110
+ /** @description Actors found, in request order (after de-duplication). */
2111
+ data: components["schemas"]["ActorResponseDto"][];
2112
+ /**
2113
+ * @description external_ids with no actor in this community.
2114
+ * @example [
2115
+ * "user_ghost"
2116
+ * ]
2117
+ */
2118
+ missing: string[];
2119
+ };
1949
2120
  AddCommentReactionResponseDto: {
1950
2121
  /**
1951
2122
  * @description `true` on first call; `false` on idempotent retry.
@@ -2011,6 +2182,109 @@ interface components {
2011
2182
  data: components["schemas"]["ModerationActionResponseDto"][];
2012
2183
  pagination: components["schemas"]["PaginationResponseDto"];
2013
2184
  };
2185
+ BatchActorResultDto: {
2186
+ /** @description The upserted actor — present on success. */
2187
+ actor?: components["schemas"]["ActorResponseDto"];
2188
+ /**
2189
+ * @description `true` if this item inserted a new row, `false` on an update of an existing external_id. Present on success.
2190
+ * @example true
2191
+ */
2192
+ created?: boolean;
2193
+ /** @description The error this item would have returned as a standalone call — present on failure. */
2194
+ error?: components["schemas"]["ErrorResponseDto"];
2195
+ /**
2196
+ * @description Position of this result in the request array.
2197
+ * @example 0
2198
+ */
2199
+ index: number;
2200
+ /**
2201
+ * @description `true` when this item was upserted; `false` when it failed (see `error`).
2202
+ * @example true
2203
+ */
2204
+ success: boolean;
2205
+ };
2206
+ BatchActorsResponseDto: {
2207
+ /** @description One result per input item, same order. */
2208
+ data: components["schemas"]["BatchActorResultDto"][];
2209
+ /**
2210
+ * @description Count of failed items.
2211
+ * @example 1
2212
+ */
2213
+ failed: number;
2214
+ /**
2215
+ * @description Count of successful items.
2216
+ * @example 199
2217
+ */
2218
+ succeeded: number;
2219
+ };
2220
+ BatchCountersResponseDto: {
2221
+ /** @description Counters for each actor found, in `actor_ids` order (after de-duplication). */
2222
+ data: components["schemas"]["ActorCountersResponseDto"][];
2223
+ /**
2224
+ * @description actor_ids with no actor in this community.
2225
+ * @example []
2226
+ */
2227
+ missing: string[];
2228
+ };
2229
+ BatchExternalIdsDto: {
2230
+ /**
2231
+ * @description external_ids to resolve, 1–200 items (POST body — 256-char ids can't ride a querystring). Duplicates are de-duplicated.
2232
+ * @example [
2233
+ * "user_abc123",
2234
+ * "user_def456"
2235
+ * ]
2236
+ */
2237
+ external_ids: string[];
2238
+ };
2239
+ BatchFollowResultDto: {
2240
+ /**
2241
+ * @description `true` if this item created a new edge, `false` on an idempotent retry of an existing follow. Present on success.
2242
+ * @example true
2243
+ */
2244
+ created?: boolean;
2245
+ /** @description The follow edge — present on success. */
2246
+ edge?: components["schemas"]["EdgeResponseDto"];
2247
+ /** @description The error this item would have returned as a standalone call (e.g. 409 block in place, 422 self-follow, 404 unknown actor) — present on failure. */
2248
+ error?: components["schemas"]["ErrorResponseDto"];
2249
+ /**
2250
+ * @description Position of this result in the request array.
2251
+ * @example 0
2252
+ */
2253
+ index: number;
2254
+ /**
2255
+ * @description `true` when this follow was created (or already existed); `false` when it failed (see `error`).
2256
+ * @example true
2257
+ */
2258
+ success: boolean;
2259
+ };
2260
+ BatchFollowsDto: {
2261
+ /** @description Follow edges to create, in order. 1–200 items; each item follows the single-follow body exactly. */
2262
+ follows: components["schemas"]["ActorEdgeDto"][];
2263
+ /**
2264
+ * @description Import lane: when `true`, the per-item `edge.follow.created` fan-out (follow notifications AND webhooks) is skipped for this batch. Follower/following counters still update. Use when importing an existing graph so long-standing followers don't get "X followed you" notifications.
2265
+ * @default false
2266
+ * @example true
2267
+ */
2268
+ suppress_notifications: boolean;
2269
+ };
2270
+ BatchFollowsResponseDto: {
2271
+ /** @description One result per input item, same order. */
2272
+ data: components["schemas"]["BatchFollowResultDto"][];
2273
+ /**
2274
+ * @description Count of failed items.
2275
+ * @example 1
2276
+ */
2277
+ failed: number;
2278
+ /**
2279
+ * @description Count of successful items.
2280
+ * @example 4999
2281
+ */
2282
+ succeeded: number;
2283
+ };
2284
+ BatchUpsertActorsDto: {
2285
+ /** @description Actors to upsert, in order. 1–200 items; each item follows the single-upsert body exactly. */
2286
+ actors: components["schemas"]["UpsertActorDto"][];
2287
+ };
2014
2288
  BookmarkListResponseDto: {
2015
2289
  data: components["schemas"]["BookmarkResponseDto"][];
2016
2290
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -2250,6 +2524,48 @@ interface components {
2250
2524
  */
2251
2525
  total_posts: number;
2252
2526
  };
2527
+ CommunityRankingSettingsDto: {
2528
+ /**
2529
+ * @description Ranked-feed candidate window in days — posts older than this are not scored. Strictly positive finite number.
2530
+ * @default 30
2531
+ * @example 30
2532
+ */
2533
+ candidate_window_days: number;
2534
+ /**
2535
+ * @description Recency half-life in hours for the ranked feed. Strictly positive finite number.
2536
+ * @default 24
2537
+ * @example 24
2538
+ */
2539
+ half_life_hours: number;
2540
+ /** @description Per-signal weights for the ranked feed. Each key falls back to its default independently. */
2541
+ weights?: components["schemas"]["CommunityRankingWeightsDto"];
2542
+ };
2543
+ CommunityRankingWeightsDto: {
2544
+ /**
2545
+ * @description Engagement signal weight (log-scaled comments + reactions). Non-negative finite number.
2546
+ * @default 0.6
2547
+ * @example 0.6
2548
+ */
2549
+ engagement: number;
2550
+ /**
2551
+ * @description Follow-graph bias weight. Non-negative finite number.
2552
+ * @default 0.4
2553
+ * @example 0.4
2554
+ */
2555
+ follow_bias: number;
2556
+ /**
2557
+ * @description Recency signal weight (exponential decay). Non-negative finite number; anything else falls back to the default.
2558
+ * @default 1
2559
+ * @example 1
2560
+ */
2561
+ recency: number;
2562
+ /**
2563
+ * @description Self-author boost weight (keeps the viewer's own posts visible). Non-negative finite number.
2564
+ * @default 0.2
2565
+ * @example 0.2
2566
+ */
2567
+ self_boost: number;
2568
+ };
2253
2569
  CommunityResponseDto: {
2254
2570
  /**
2255
2571
  * @description Auth app UUID this community wraps; `null` for standalone communities.
@@ -2282,12 +2598,12 @@ interface components {
2282
2598
  */
2283
2599
  id: string;
2284
2600
  /**
2285
- * @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold, reaction_types).
2601
+ * @description Per-community settings blob. See CommunitySettingsDto for every key the service reads; unrecognized keys are stored and returned unchanged but not consumed.
2286
2602
  * @example {
2287
2603
  * "max_comment_depth": 3
2288
2604
  * }
2289
2605
  */
2290
- settings: Record<string, never>;
2606
+ settings: components["schemas"]["CommunitySettingsDto"];
2291
2607
  /**
2292
2608
  * @description URL-friendly community slug.
2293
2609
  * @example my-product-community
@@ -2310,6 +2626,34 @@ interface components {
2310
2626
  */
2311
2627
  workspace_id: string;
2312
2628
  };
2629
+ CommunitySettingsDto: {
2630
+ /**
2631
+ * @description Distinct-reporter count at which a flagged post/comment is auto-hidden. Integer 0..1000; floored. Read by the moderation flag pipeline.
2632
+ * @default 3
2633
+ * @example 3
2634
+ */
2635
+ auto_hide_flag_threshold: number;
2636
+ /**
2637
+ * @description Minutes after publication during which a post body/title may still be edited (`EDIT_WINDOW_EXPIRED` afterwards). Strictly positive finite number. Drafts edit freely.
2638
+ * @default 30
2639
+ * @example 30
2640
+ */
2641
+ edit_window_minutes: number;
2642
+ /**
2643
+ * @description Maximum comment thread depth (0 = flat). Integer 0..10; floored; out-of-bounds falls back to the default. Replying past the cap returns 409.
2644
+ * @default 3
2645
+ * @example 3
2646
+ */
2647
+ max_comment_depth: number;
2648
+ /**
2649
+ * @description Maximum participants in a group conversation. Integer 2..200; floored. Exceeding it returns 409 on create / member add.
2650
+ * @default 50
2651
+ * @example 50
2652
+ */
2653
+ max_group_conversation_size: number;
2654
+ /** @description Ranked-feed tuning (weights, half-life, candidate window). Read at query time by the actor feed, list feeds, and the discover feed. */
2655
+ ranking?: components["schemas"]["CommunityRankingSettingsDto"];
2656
+ };
2313
2657
  ConversationAdminListResponseDto: {
2314
2658
  data: components["schemas"]["ConversationAdminResponseDto"][];
2315
2659
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -2514,8 +2858,8 @@ interface components {
2514
2858
  * @example My Product Community
2515
2859
  */
2516
2860
  display_name: string;
2517
- /** @description Per-community settings blob (ranking, max_comment_depth, auto_hide_flag_threshold). */
2518
- settings?: Record<string, never>;
2861
+ /** @description Per-community settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
2862
+ settings?: components["schemas"]["CommunitySettingsDto"];
2519
2863
  /**
2520
2864
  * @description URL-friendly community slug. Lowercase letters, digits, and hyphens (3-64 chars).
2521
2865
  * @example my-product-community
@@ -2717,13 +3061,13 @@ interface components {
2717
3061
  };
2718
3062
  CreateWebhookDto: {
2719
3063
  /**
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`.
3064
+ * @description Event types to subscribe to. Unknown values are rejected with a 400 naming the valid set — see GET /v1/webhook-event-types.
2721
3065
  * @example [
2722
3066
  * "post.created",
2723
3067
  * "comment.created"
2724
3068
  * ]
2725
3069
  */
2726
- event_types: string[];
3070
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
2727
3071
  /**
2728
3072
  * @description Subscriber URL. Must be `https://`.
2729
3073
  * @example https://example.com/webhooks/social
@@ -2757,13 +3101,13 @@ interface components {
2757
3101
  */
2758
3102
  disabled_reason: string | null;
2759
3103
  /**
2760
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
3104
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
2761
3105
  * @example [
2762
3106
  * "post.created",
2763
3107
  * "comment.created"
2764
3108
  * ]
2765
3109
  */
2766
- event_types: string[];
3110
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
2767
3111
  /**
2768
3112
  * @description Webhook UUID.
2769
3113
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -2814,13 +3158,60 @@ interface components {
2814
3158
  */
2815
3159
  sender_id: string;
2816
3160
  };
3161
+ DeliveryJobResponseDto: {
3162
+ /**
3163
+ * @description Delivery attempts made so far.
3164
+ * @example 0
3165
+ */
3166
+ attempt_count: number;
3167
+ /**
3168
+ * @description ISO timestamp.
3169
+ * @example 2026-05-01T12:00:00.000Z
3170
+ */
3171
+ created_at: string;
3172
+ /**
3173
+ * @description Stable event id (carried in the request body as `id`; stable across retries and redelivers).
3174
+ * @example evt_…
3175
+ */
3176
+ event_id: string;
3177
+ /**
3178
+ * @description Event type. `ping` for test deliveries.
3179
+ * @example post.created
3180
+ */
3181
+ event_type: string;
3182
+ /** @description Delivery job UUID. */
3183
+ id: string;
3184
+ /**
3185
+ * @description Error from the most recent failed attempt. Null before the first failure.
3186
+ * @example null
3187
+ */
3188
+ last_error: string | null;
3189
+ /**
3190
+ * @description ISO timestamp of the next scheduled attempt (backoff: 1m, 5m, 30m, 2h, 6h, 24h).
3191
+ * @example 2026-05-01T12:00:00.000Z
3192
+ */
3193
+ next_attempt_at: string;
3194
+ /**
3195
+ * @description Job state.
3196
+ * @example pending
3197
+ * @enum {string}
3198
+ */
3199
+ status: "pending" | "delivering" | "succeeded" | "exhausted" | "canceled";
3200
+ /**
3201
+ * @description ISO timestamp.
3202
+ * @example 2026-05-01T12:00:00.000Z
3203
+ */
3204
+ updated_at: string;
3205
+ /** @description Webhook UUID the job targets. */
3206
+ webhook_id: string;
3207
+ };
2817
3208
  DeliveryListResponseDto: {
2818
3209
  data: components["schemas"]["DeliveryResponseDto"][];
2819
3210
  pagination: components["schemas"]["PaginationResponseDto"];
2820
3211
  };
2821
3212
  DeliveryResponseDto: {
2822
3213
  /**
2823
- * @description Attempt number. Always 1 in v1 (no retry).
3214
+ * @description Attempt number, 1-based. Increments per retry along the backoff schedule (1m, 5m, 30m, 2h, 6h, 24h — 7 attempts total).
2824
3215
  * @example 1
2825
3216
  */
2826
3217
  attempt_number: number;
@@ -3079,10 +3470,6 @@ interface components {
3079
3470
  data: components["schemas"]["PostResponseDto"][];
3080
3471
  pagination: components["schemas"]["PaginationResponseDto"];
3081
3472
  };
3082
- EdgeListResponseDto: {
3083
- data: components["schemas"]["EdgeResponseDto"][];
3084
- pagination: components["schemas"]["PaginationResponseDto"];
3085
- };
3086
3473
  EdgeResponseDto: {
3087
3474
  /**
3088
3475
  * @description Owning community UUID.
@@ -3201,23 +3588,72 @@ interface components {
3201
3588
  */
3202
3589
  updated_at: string;
3203
3590
  };
3204
- HashtagAutocompleteResponseDto: {
3205
- data: components["schemas"]["HashtagResponseDto"][];
3591
+ FollowerEdgeListResponseDto: {
3592
+ data: components["schemas"]["FollowerEdgeResponseDto"][];
3593
+ pagination: components["schemas"]["PaginationResponseDto"];
3206
3594
  };
3207
- HashtagDetailResponseDto: {
3595
+ FollowerEdgeResponseDto: {
3208
3596
  /**
3209
3597
  * @description Owning community UUID.
3210
3598
  * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3211
3599
  */
3212
3600
  community_id: string;
3213
3601
  /**
3214
- * @description ISO timestamp the tag first appeared in this community.
3602
+ * @description ISO timestamp the edge was created.
3215
3603
  * @example 2026-05-01T12:00:00.000Z
3216
3604
  */
3217
- first_used_at: string;
3605
+ created_at: string;
3218
3606
  /**
3219
- * @description Number of currently-published posts using the tag.
3220
- * @example 17
3607
+ * @description Destination actor UUID (for actor edges).
3608
+ * @example aaaaaaaa-0000-0000-0000-000000000002
3609
+ */
3610
+ dst_actor_id: string | null;
3611
+ /**
3612
+ * @description Destination post UUID (for reaction / save edges).
3613
+ * @example null
3614
+ */
3615
+ dst_post_id: string | null;
3616
+ /**
3617
+ * @description Edge UUID.
3618
+ * @example eeeeeeee-0000-0000-0000-000000000001
3619
+ */
3620
+ id: string;
3621
+ /**
3622
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
3623
+ * @example follow
3624
+ * @enum {string}
3625
+ */
3626
+ kind: "follow" | "mute" | "block" | "restrict";
3627
+ /**
3628
+ * @description Free-form payload stored on the edge (e.g. mute reason).
3629
+ * @example {}
3630
+ */
3631
+ payload: Record<string, never>;
3632
+ /** @description The follower's full actor row. Present only when requested via `?expand=src_actor`. */
3633
+ src_actor?: components["schemas"]["ActorResponseDto"];
3634
+ /**
3635
+ * @description Source actor UUID.
3636
+ * @example aaaaaaaa-0000-0000-0000-000000000001
3637
+ */
3638
+ src_actor_id: string;
3639
+ };
3640
+ HashtagAutocompleteResponseDto: {
3641
+ data: components["schemas"]["HashtagResponseDto"][];
3642
+ };
3643
+ HashtagDetailResponseDto: {
3644
+ /**
3645
+ * @description Owning community UUID.
3646
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
3647
+ */
3648
+ community_id: string;
3649
+ /**
3650
+ * @description ISO timestamp the tag first appeared in this community.
3651
+ * @example 2026-05-01T12:00:00.000Z
3652
+ */
3653
+ first_used_at: string;
3654
+ /**
3655
+ * @description Number of currently-published posts using the tag.
3656
+ * @example 17
3221
3657
  */
3222
3658
  post_count: number;
3223
3659
  /**
@@ -3595,6 +4031,55 @@ interface components {
3595
4031
  */
3596
4032
  target_kind: "actor" | "post" | "comment" | "direct_message";
3597
4033
  };
4034
+ OutboundEdgeListResponseDto: {
4035
+ data: components["schemas"]["OutboundEdgeResponseDto"][];
4036
+ pagination: components["schemas"]["PaginationResponseDto"];
4037
+ };
4038
+ OutboundEdgeResponseDto: {
4039
+ /**
4040
+ * @description Owning community UUID.
4041
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4042
+ */
4043
+ community_id: string;
4044
+ /**
4045
+ * @description ISO timestamp the edge was created.
4046
+ * @example 2026-05-01T12:00:00.000Z
4047
+ */
4048
+ created_at: string;
4049
+ /** @description The destination actor's full row. Present only when requested via `?expand=dst_actor`. */
4050
+ dst_actor?: components["schemas"]["ActorResponseDto"];
4051
+ /**
4052
+ * @description Destination actor UUID (for actor edges).
4053
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4054
+ */
4055
+ dst_actor_id: string | null;
4056
+ /**
4057
+ * @description Destination post UUID (for reaction / save edges).
4058
+ * @example null
4059
+ */
4060
+ dst_post_id: string | null;
4061
+ /**
4062
+ * @description Edge UUID.
4063
+ * @example eeeeeeee-0000-0000-0000-000000000001
4064
+ */
4065
+ id: string;
4066
+ /**
4067
+ * @description Edge kind. The actor-edge routes emit exactly these four; post reactions and bookmarks have their own response shapes.
4068
+ * @example follow
4069
+ * @enum {string}
4070
+ */
4071
+ kind: "follow" | "mute" | "block" | "restrict";
4072
+ /**
4073
+ * @description Free-form payload stored on the edge (e.g. mute reason).
4074
+ * @example {}
4075
+ */
4076
+ payload: Record<string, never>;
4077
+ /**
4078
+ * @description Source actor UUID.
4079
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4080
+ */
4081
+ src_actor_id: string;
4082
+ };
3598
4083
  PaginationResponseDto: {
3599
4084
  /**
3600
4085
  * @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.
@@ -3668,6 +4153,37 @@ interface components {
3668
4153
  data: components["schemas"]["PostResponseDto"][];
3669
4154
  pagination: components["schemas"]["PaginationResponseDto"];
3670
4155
  };
4156
+ PostReactionEntryDto: {
4157
+ /**
4158
+ * @description Reactor actor UUID.
4159
+ * @example aaaaaaaa-0000-0000-0000-000000000001
4160
+ */
4161
+ actor_id: string;
4162
+ /**
4163
+ * @description Owning community UUID.
4164
+ * @example cccccccc-cccc-cccc-cccc-cccccccccccc
4165
+ */
4166
+ community_id: string;
4167
+ /**
4168
+ * @description ISO timestamp.
4169
+ * @example 2026-05-01T12:00:00.000Z
4170
+ */
4171
+ created_at: string;
4172
+ /**
4173
+ * @description Post UUID.
4174
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4175
+ */
4176
+ post_id: string;
4177
+ /**
4178
+ * @description Reaction type label.
4179
+ * @example like
4180
+ */
4181
+ type: string;
4182
+ };
4183
+ PostReactionListResponseDto: {
4184
+ data: components["schemas"]["PostReactionEntryDto"][];
4185
+ pagination: components["schemas"]["PaginationResponseDto"];
4186
+ };
3671
4187
  PostResponseDto: {
3672
4188
  /**
3673
4189
  * @description Author actor UUID.
@@ -3838,6 +4354,50 @@ interface components {
3838
4354
  /** @description Up to `limit` (default 20, max 50) hits. Not paginated in v1. */
3839
4355
  data: components["schemas"]["PostSearchHitDto"][];
3840
4356
  };
4357
+ PostStateRequestDto: {
4358
+ /**
4359
+ * @description UUIDs of the posts to hydrate viewer state for. Capped at 200 (matches the batch-views precedent); ids that are unknown, removed, or from another community resolve to the empty state instead of failing the batch.
4360
+ * @example [
4361
+ * "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
4362
+ * "cccccccc-cccc-cccc-cccc-cccccccccccc"
4363
+ * ]
4364
+ */
4365
+ post_ids: string[];
4366
+ };
4367
+ PostStateResponseDto: {
4368
+ /** @description One entry per requested post id (de-duplicated, request order). Unknown / cross-community ids resolve to the empty state. */
4369
+ data: components["schemas"]["PostViewerStateEntryDto"][];
4370
+ };
4371
+ PostViewerStateEntryDto: {
4372
+ /**
4373
+ * @description The viewer has bookmarked the post.
4374
+ * @example true
4375
+ */
4376
+ bookmarked: boolean;
4377
+ /**
4378
+ * @description Post UUID this entry describes.
4379
+ * @example bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
4380
+ */
4381
+ post_id: string;
4382
+ /**
4383
+ * @description Reaction types the viewer currently has on the post, sorted ascending. Empty when the viewer has not reacted.
4384
+ * @example [
4385
+ * "fire",
4386
+ * "like"
4387
+ * ]
4388
+ */
4389
+ reacted_types: string[];
4390
+ /**
4391
+ * @description The viewer has a currently-published repost of the post.
4392
+ * @example false
4393
+ */
4394
+ reposted: boolean;
4395
+ /**
4396
+ * @description Poll option index the viewer voted for; `null` when the viewer has not voted (or the post has no poll).
4397
+ * @example null
4398
+ */
4399
+ voted_option: number | null;
4400
+ };
3841
4401
  ReactionCountsResponseDto: {
3842
4402
  /**
3843
4403
  * @description Denormalised reaction counts after the write.
@@ -3922,6 +4482,52 @@ interface components {
3922
4482
  */
3923
4483
  post_ids: string[];
3924
4484
  };
4485
+ RelationshipEntryDto: {
4486
+ /**
4487
+ * @description This actor has blocked the source actor — surface it BEFORE attempting a follow/react write instead of handling the 409.
4488
+ * @example false
4489
+ */
4490
+ blocked_by: boolean;
4491
+ /**
4492
+ * @description The source actor has blocked this actor.
4493
+ * @example false
4494
+ */
4495
+ blocking: boolean;
4496
+ /**
4497
+ * @description This actor is on the source actor's close-friend list.
4498
+ * @example false
4499
+ */
4500
+ close_friend: boolean;
4501
+ /**
4502
+ * @description Destination actor UUID this entry describes.
4503
+ * @example aaaaaaaa-0000-0000-0000-000000000002
4504
+ */
4505
+ dst_actor_id: string;
4506
+ /**
4507
+ * @description This actor follows the source actor.
4508
+ * @example false
4509
+ */
4510
+ followed_by: boolean;
4511
+ /**
4512
+ * @description The source actor follows this actor.
4513
+ * @example true
4514
+ */
4515
+ following: boolean;
4516
+ /**
4517
+ * @description The source actor has muted this actor.
4518
+ * @example false
4519
+ */
4520
+ muting: boolean;
4521
+ /**
4522
+ * @description The source actor has restricted this actor.
4523
+ * @example false
4524
+ */
4525
+ restricting: boolean;
4526
+ };
4527
+ RelationshipListResponseDto: {
4528
+ /** @description One entry per requested id (de-duplicated, request order). Unknown ids resolve to all-false flags. */
4529
+ data: components["schemas"]["RelationshipEntryDto"][];
4530
+ };
3925
4531
  RemoveListMemberDto: {
3926
4532
  /**
3927
4533
  * @description Caller — social actor UUID. Must equal the list owner.
@@ -4110,7 +4716,8 @@ interface components {
4110
4716
  UpdateCommunityDto: {
4111
4717
  description?: string | null;
4112
4718
  display_name?: string;
4113
- settings?: Record<string, never>;
4719
+ /** @description Replaces the settings blob. Supported keys are typed on CommunitySettingsDto; unrecognized keys are stored verbatim but not consumed. */
4720
+ settings?: components["schemas"]["CommunitySettingsDto"];
4114
4721
  /** @enum {string} */
4115
4722
  status?: "active" | "suspended" | "archived";
4116
4723
  };
@@ -4189,8 +4796,13 @@ interface components {
4189
4796
  visibility?: "public" | "followers" | "close_friends" | "private";
4190
4797
  };
4191
4798
  UpdateWebhookDto: {
4192
- /** @description New subscription set. */
4193
- event_types?: string[];
4799
+ /**
4800
+ * @description Set `false` to re-enable a disabled webhook (clears the auto-disable state and resets the failure streak — no secret rotation required). Set `true` to disable it manually.
4801
+ * @example false
4802
+ */
4803
+ disabled?: boolean;
4804
+ /** @description New subscription set. Unknown values are rejected with a 400 naming the valid set. */
4805
+ event_types?: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4194
4806
  /** @description New subscriber URL. */
4195
4807
  url?: string;
4196
4808
  };
@@ -4226,6 +4838,21 @@ interface components {
4226
4838
  */
4227
4839
  created: boolean;
4228
4840
  };
4841
+ WebhookEventTypesResponseDto: {
4842
+ /**
4843
+ * @description Every event type a webhook can subscribe to, in catalog order.
4844
+ * @example [
4845
+ * "post.created",
4846
+ * "post.deleted",
4847
+ * "comment.created"
4848
+ * ]
4849
+ */
4850
+ data: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4851
+ };
4852
+ WebhookListResponseDto: {
4853
+ /** @description Every webhook on the community — disabled rows included, so auto-disabled subscribers stay discoverable. */
4854
+ data: components["schemas"]["WebhookResponseDto"][];
4855
+ };
4229
4856
  WebhookResponseDto: {
4230
4857
  /**
4231
4858
  * @description Owning community UUID.
@@ -4253,13 +4880,13 @@ interface components {
4253
4880
  */
4254
4881
  disabled_reason: string | null;
4255
4882
  /**
4256
- * @description Subscribed event types. Each item is one of the social event names (e.g. `post.created`, `comment.created`, `edge.follow.created`).
4883
+ * @description Subscribed event types. Each item is one of the social event names — see GET /v1/webhook-event-types for the live catalog.
4257
4884
  * @example [
4258
4885
  * "post.created",
4259
4886
  * "comment.created"
4260
4887
  * ]
4261
4888
  */
4262
- event_types: string[];
4889
+ event_types: ("post.created" | "post.updated" | "post.deleted" | "post.reaction.created" | "repost.created" | "comment.created" | "comment.updated" | "comment.deleted" | "comment.reaction.created" | "edge.follow.created" | "edge.follow.deleted" | "flag.created" | "flag.updated" | "moderation.action.applied" | "actor.updated" | "dm.message.created")[];
4263
4890
  /**
4264
4891
  * @description Webhook UUID.
4265
4892
  * @example wwwwwwww-0000-0000-0000-000000000001
@@ -4302,10 +4929,12 @@ interface operations {
4302
4929
  ActorController_list: {
4303
4930
  parameters: {
4304
4931
  query?: {
4305
- /** @description Page size; capped at 200. */
4932
+ /** @description Page size; capped at 200. Ignored when `ids` is passed. */
4306
4933
  limit?: number;
4307
- /** @description Opaque cursor from the previous page's `pagination.next_cursor`. */
4934
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Ignored when `ids` is passed. */
4308
4935
  cursor?: string;
4936
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated) to batch-fetch. Returns matching actors in request order; unknown ids are silently omitted. */
4937
+ ids?: string;
4309
4938
  };
4310
4939
  header?: never;
4311
4940
  path: {
@@ -4316,7 +4945,7 @@ interface operations {
4316
4945
  };
4317
4946
  requestBody?: never;
4318
4947
  responses: {
4319
- /** @description Page of actors with `next_cursor` + `has_more`. */
4948
+ /** @description Page of actors with `next_cursor` + `has_more` (batch-fetch responses always report `has_more: false`). */
4320
4949
  200: {
4321
4950
  headers: {
4322
4951
  [name: string]: unknown;
@@ -4325,7 +4954,7 @@ interface operations {
4325
4954
  "application/json": components["schemas"]["ActorPageResponseDto"];
4326
4955
  };
4327
4956
  };
4328
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
4957
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or invalid `ids` (`INVALID_ID_LIST` — empty / non-UUID entry; `TOO_MANY_IDS` — over 100). */
4329
4958
  400: {
4330
4959
  headers: {
4331
4960
  [name: string]: unknown;
@@ -4408,6 +5037,114 @@ interface operations {
4408
5037
  };
4409
5038
  };
4410
5039
  };
5040
+ ActorController_batchUpsert: {
5041
+ parameters: {
5042
+ query?: never;
5043
+ header?: never;
5044
+ path: {
5045
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5046
+ communityId: string;
5047
+ };
5048
+ cookie?: never;
5049
+ };
5050
+ requestBody: {
5051
+ content: {
5052
+ "application/json": components["schemas"]["BatchUpsertActorsDto"];
5053
+ };
5054
+ };
5055
+ responses: {
5056
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
5057
+ 201: {
5058
+ headers: {
5059
+ [name: string]: unknown;
5060
+ };
5061
+ content: {
5062
+ "application/json": components["schemas"]["BatchActorsResponseDto"];
5063
+ };
5064
+ };
5065
+ /** @description Envelope validation failure: `actors` missing, empty, over 200 items, or an item shape invalid. */
5066
+ 400: {
5067
+ headers: {
5068
+ [name: string]: unknown;
5069
+ };
5070
+ content: {
5071
+ "application/json": components["schemas"]["ErrorResponseDto"];
5072
+ };
5073
+ };
5074
+ /** @description PAK lacks `social.create` for this community. */
5075
+ 403: {
5076
+ headers: {
5077
+ [name: string]: unknown;
5078
+ };
5079
+ content: {
5080
+ "application/json": components["schemas"]["ErrorResponseDto"];
5081
+ };
5082
+ };
5083
+ /** @description Community not found in the PAK's workspace. */
5084
+ 404: {
5085
+ headers: {
5086
+ [name: string]: unknown;
5087
+ };
5088
+ content: {
5089
+ "application/json": components["schemas"]["ErrorResponseDto"];
5090
+ };
5091
+ };
5092
+ };
5093
+ };
5094
+ ActorController_batchGetByExternal: {
5095
+ parameters: {
5096
+ query?: never;
5097
+ header?: never;
5098
+ path: {
5099
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
5100
+ communityId: string;
5101
+ };
5102
+ cookie?: never;
5103
+ };
5104
+ requestBody: {
5105
+ content: {
5106
+ "application/json": components["schemas"]["BatchExternalIdsDto"];
5107
+ };
5108
+ };
5109
+ responses: {
5110
+ /** @description Actors found (request order, de-duplicated) plus the `missing[]` external_ids. */
5111
+ 200: {
5112
+ headers: {
5113
+ [name: string]: unknown;
5114
+ };
5115
+ content: {
5116
+ "application/json": components["schemas"]["ActorsByExternalBatchResponseDto"];
5117
+ };
5118
+ };
5119
+ /** @description `external_ids` missing, empty, over 200 items, or an entry exceeding 256 chars. */
5120
+ 400: {
5121
+ headers: {
5122
+ [name: string]: unknown;
5123
+ };
5124
+ content: {
5125
+ "application/json": components["schemas"]["ErrorResponseDto"];
5126
+ };
5127
+ };
5128
+ /** @description PAK lacks `social.read`. */
5129
+ 403: {
5130
+ headers: {
5131
+ [name: string]: unknown;
5132
+ };
5133
+ content: {
5134
+ "application/json": components["schemas"]["ErrorResponseDto"];
5135
+ };
5136
+ };
5137
+ /** @description Community not found in the PAK's workspace. */
5138
+ 404: {
5139
+ headers: {
5140
+ [name: string]: unknown;
5141
+ };
5142
+ content: {
5143
+ "application/json": components["schemas"]["ErrorResponseDto"];
5144
+ };
5145
+ };
5146
+ };
5147
+ };
4411
5148
  ActorController_getByExternal: {
4412
5149
  parameters: {
4413
5150
  query?: never;
@@ -4587,6 +5324,8 @@ interface operations {
4587
5324
  query?: {
4588
5325
  limit?: number;
4589
5326
  cursor?: string;
5327
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5328
+ expand?: "dst_actor";
4590
5329
  };
4591
5330
  header?: never;
4592
5331
  path: {
@@ -4605,10 +5344,10 @@ interface operations {
4605
5344
  [name: string]: unknown;
4606
5345
  };
4607
5346
  content: {
4608
- "application/json": components["schemas"]["EdgeListResponseDto"];
5347
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
4609
5348
  };
4610
5349
  };
4611
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5350
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
4612
5351
  400: {
4613
5352
  headers: {
4614
5353
  [name: string]: unknown;
@@ -4891,6 +5630,8 @@ interface operations {
4891
5630
  query?: {
4892
5631
  limit?: number;
4893
5632
  cursor?: string;
5633
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `src_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5634
+ expand?: "src_actor";
4894
5635
  };
4895
5636
  header?: never;
4896
5637
  path: {
@@ -4909,10 +5650,10 @@ interface operations {
4909
5650
  [name: string]: unknown;
4910
5651
  };
4911
5652
  content: {
4912
- "application/json": components["schemas"]["EdgeListResponseDto"];
5653
+ "application/json": components["schemas"]["FollowerEdgeListResponseDto"];
4913
5654
  };
4914
5655
  };
4915
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5656
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
4916
5657
  400: {
4917
5658
  headers: {
4918
5659
  [name: string]: unknown;
@@ -4946,6 +5687,8 @@ interface operations {
4946
5687
  query?: {
4947
5688
  limit?: number;
4948
5689
  cursor?: string;
5690
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
5691
+ expand?: "dst_actor";
4949
5692
  };
4950
5693
  header?: never;
4951
5694
  path: {
@@ -4964,10 +5707,10 @@ interface operations {
4964
5707
  [name: string]: unknown;
4965
5708
  };
4966
5709
  content: {
4967
- "application/json": components["schemas"]["EdgeListResponseDto"];
5710
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
4968
5711
  };
4969
5712
  };
4970
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
5713
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
4971
5714
  400: {
4972
5715
  headers: {
4973
5716
  [name: string]: unknown;
@@ -5394,6 +6137,8 @@ interface operations {
5394
6137
  query?: {
5395
6138
  limit?: number;
5396
6139
  cursor?: string;
6140
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
6141
+ expand?: "dst_actor";
5397
6142
  };
5398
6143
  header?: never;
5399
6144
  path: {
@@ -5412,10 +6157,10 @@ interface operations {
5412
6157
  [name: string]: unknown;
5413
6158
  };
5414
6159
  content: {
5415
- "application/json": components["schemas"]["EdgeListResponseDto"];
6160
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5416
6161
  };
5417
6162
  };
5418
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
6163
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
5419
6164
  400: {
5420
6165
  headers: {
5421
6166
  [name: string]: unknown;
@@ -5752,11 +6497,69 @@ interface operations {
5752
6497
  };
5753
6498
  };
5754
6499
  };
6500
+ ViewerStateController_postState: {
6501
+ parameters: {
6502
+ query?: never;
6503
+ header?: never;
6504
+ path: {
6505
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6506
+ communityId: string;
6507
+ /** @description Viewer actor UUID — the perspective all state is computed from. */
6508
+ actorId: string;
6509
+ };
6510
+ cookie?: never;
6511
+ };
6512
+ requestBody: {
6513
+ content: {
6514
+ "application/json": components["schemas"]["PostStateRequestDto"];
6515
+ };
6516
+ };
6517
+ responses: {
6518
+ /** @description One state entry per requested post id. */
6519
+ 200: {
6520
+ headers: {
6521
+ [name: string]: unknown;
6522
+ };
6523
+ content: {
6524
+ "application/json": components["schemas"]["PostStateResponseDto"];
6525
+ };
6526
+ };
6527
+ /** @description Empty `post_ids`, more than 200 ids, or a non-UUID in the list. */
6528
+ 400: {
6529
+ headers: {
6530
+ [name: string]: unknown;
6531
+ };
6532
+ content: {
6533
+ "application/json": components["schemas"]["ErrorResponseDto"];
6534
+ };
6535
+ };
6536
+ /** @description PAK lacks `social.list`. */
6537
+ 403: {
6538
+ headers: {
6539
+ [name: string]: unknown;
6540
+ };
6541
+ content: {
6542
+ "application/json": components["schemas"]["ErrorResponseDto"];
6543
+ };
6544
+ };
6545
+ /** @description Community or actor not found. */
6546
+ 404: {
6547
+ headers: {
6548
+ [name: string]: unknown;
6549
+ };
6550
+ content: {
6551
+ "application/json": components["schemas"]["ErrorResponseDto"];
6552
+ };
6553
+ };
6554
+ };
6555
+ };
5755
6556
  EdgeController_listRestricts: {
5756
6557
  parameters: {
5757
6558
  query?: {
5758
6559
  limit?: number;
5759
6560
  cursor?: string;
6561
+ /** @description Stripe-style expansion. Pass the response field to expand (supported here: `dst_actor`) and the full object is nested under that field on every item. Omit for the unexpanded (default) shape. Unsupported values return 400 `INVALID_EXPAND`. */
6562
+ expand?: "dst_actor";
5760
6563
  };
5761
6564
  header?: never;
5762
6565
  path: {
@@ -5775,10 +6578,10 @@ interface operations {
5775
6578
  [name: string]: unknown;
5776
6579
  };
5777
6580
  content: {
5778
- "application/json": components["schemas"]["EdgeListResponseDto"];
6581
+ "application/json": components["schemas"]["OutboundEdgeListResponseDto"];
5779
6582
  };
5780
6583
  };
5781
- /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. */
6584
+ /** @description Invalid cursor (`INVALID_CURSOR`) — legacy raw-id cursors are rejected; restart from the first page and follow `pagination.next_cursor`. Or unsupported `expand` value (`INVALID_EXPAND`). */
5782
6585
  400: {
5783
6586
  headers: {
5784
6587
  [name: string]: unknown;
@@ -5942,6 +6745,61 @@ interface operations {
5942
6745
  };
5943
6746
  };
5944
6747
  };
6748
+ EdgeController_relationships: {
6749
+ parameters: {
6750
+ query: {
6751
+ /** @description Comma-separated destination actor UUIDs (1-100). */
6752
+ with: string;
6753
+ };
6754
+ header?: never;
6755
+ path: {
6756
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
6757
+ communityId: string;
6758
+ /** @description Source actor UUID — the perspective all flags are computed from. */
6759
+ srcActorId: string;
6760
+ };
6761
+ cookie?: never;
6762
+ };
6763
+ requestBody?: never;
6764
+ responses: {
6765
+ /** @description One relationship entry per requested id. */
6766
+ 200: {
6767
+ headers: {
6768
+ [name: string]: unknown;
6769
+ };
6770
+ content: {
6771
+ "application/json": components["schemas"]["RelationshipListResponseDto"];
6772
+ };
6773
+ };
6774
+ /** @description Missing `with`, more than 100 ids, or a non-UUID value in the list. */
6775
+ 400: {
6776
+ headers: {
6777
+ [name: string]: unknown;
6778
+ };
6779
+ content: {
6780
+ "application/json": components["schemas"]["ErrorResponseDto"];
6781
+ };
6782
+ };
6783
+ /** @description PAK lacks `social.list`. */
6784
+ 403: {
6785
+ headers: {
6786
+ [name: string]: unknown;
6787
+ };
6788
+ content: {
6789
+ "application/json": components["schemas"]["ErrorResponseDto"];
6790
+ };
6791
+ };
6792
+ /** @description Community or source actor not found. */
6793
+ 404: {
6794
+ headers: {
6795
+ [name: string]: unknown;
6796
+ };
6797
+ content: {
6798
+ "application/json": components["schemas"]["ErrorResponseDto"];
6799
+ };
6800
+ };
6801
+ };
6802
+ };
5945
6803
  EdgeController_block: {
5946
6804
  parameters: {
5947
6805
  query?: never;
@@ -6212,7 +7070,10 @@ interface operations {
6212
7070
  ConversationController_create: {
6213
7071
  parameters: {
6214
7072
  query?: never;
6215
- header?: never;
7073
+ header?: {
7074
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Mostly useful for `kind="group"` (direct conversations are get-or-create by participant pair anyway). Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
7075
+ "Idempotency-Key"?: string;
7076
+ };
6216
7077
  path: {
6217
7078
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6218
7079
  communityId: string;
@@ -6234,7 +7095,7 @@ interface operations {
6234
7095
  "application/json": components["schemas"]["ConversationResponseDto"];
6235
7096
  };
6236
7097
  };
6237
- /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids). */
7098
+ /** @description Validation failure (missing recipient for direct, missing actor_ids for group, two equal actor ids, malformed Idempotency-Key). */
6238
7099
  400: {
6239
7100
  headers: {
6240
7101
  [name: string]: unknown;
@@ -6261,7 +7122,7 @@ interface operations {
6261
7122
  "application/json": components["schemas"]["ErrorResponseDto"];
6262
7123
  };
6263
7124
  };
6264
- /** @description A block exists, or the group exceeds `community.settings.max_group_conversation_size`. */
7125
+ /** @description A block exists, the group exceeds `community.settings.max_group_conversation_size`, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
6265
7126
  409: {
6266
7127
  headers: {
6267
7128
  [name: string]: unknown;
@@ -6695,7 +7556,10 @@ interface operations {
6695
7556
  ConversationController_send: {
6696
7557
  parameters: {
6697
7558
  query?: never;
6698
- header?: never;
7559
+ header?: {
7560
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
7561
+ "Idempotency-Key"?: string;
7562
+ };
6699
7563
  path: {
6700
7564
  /** @description Social community UUID. Must belong to the PAK's workspace. */
6701
7565
  communityId: string;
@@ -6719,7 +7583,7 @@ interface operations {
6719
7583
  "application/json": components["schemas"]["DirectMessageResponseDto"];
6720
7584
  };
6721
7585
  };
6722
- /** @description Validation failure (empty body for text, body too long). */
7586
+ /** @description Validation failure (empty body for text, body too long, malformed Idempotency-Key). */
6723
7587
  400: {
6724
7588
  headers: {
6725
7589
  [name: string]: unknown;
@@ -6746,7 +7610,7 @@ interface operations {
6746
7610
  "application/json": components["schemas"]["ErrorResponseDto"];
6747
7611
  };
6748
7612
  };
6749
- /** @description A block exists between the sender and another participant. */
7613
+ /** @description A block exists between the sender and another participant, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
6750
7614
  409: {
6751
7615
  headers: {
6752
7616
  [name: string]: unknown;
@@ -7120,14 +7984,67 @@ interface operations {
7120
7984
  };
7121
7985
  };
7122
7986
  responses: {
7123
- /** @description Read marker updated. */
7124
- 204: {
7987
+ /** @description Read marker updated. */
7988
+ 204: {
7989
+ headers: {
7990
+ [name: string]: unknown;
7991
+ };
7992
+ content?: never;
7993
+ };
7994
+ /** @description Validation failure (read_through not ISO). */
7995
+ 400: {
7996
+ headers: {
7997
+ [name: string]: unknown;
7998
+ };
7999
+ content: {
8000
+ "application/json": components["schemas"]["ErrorResponseDto"];
8001
+ };
8002
+ };
8003
+ /** @description PAK lacks `social.update`. */
8004
+ 403: {
8005
+ headers: {
8006
+ [name: string]: unknown;
8007
+ };
8008
+ content: {
8009
+ "application/json": components["schemas"]["ErrorResponseDto"];
8010
+ };
8011
+ };
8012
+ /** @description Conversation not found or caller not a participant. */
8013
+ 404: {
8014
+ headers: {
8015
+ [name: string]: unknown;
8016
+ };
8017
+ content: {
8018
+ "application/json": components["schemas"]["ErrorResponseDto"];
8019
+ };
8020
+ };
8021
+ };
8022
+ };
8023
+ CounterController_getBatchCounters: {
8024
+ parameters: {
8025
+ query: {
8026
+ /** @description Comma-separated actor UUIDs (max 100, de-duplicated). */
8027
+ actor_ids: string;
8028
+ };
8029
+ header?: never;
8030
+ path: {
8031
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8032
+ communityId: string;
8033
+ };
8034
+ cookie?: never;
8035
+ };
8036
+ requestBody?: never;
8037
+ responses: {
8038
+ /** @description Counters for each actor found plus the `missing[]` ids. */
8039
+ 200: {
7125
8040
  headers: {
7126
8041
  [name: string]: unknown;
7127
8042
  };
7128
- content?: never;
8043
+ content: {
8044
+ "application/json": components["schemas"]["BatchCountersResponseDto"];
8045
+ };
7129
8046
  };
7130
- /** @description Validation failure (read_through not ISO). */
8047
+ /** @description `actor_ids` missing or empty, a non-UUID entry (`INVALID_ID_LIST`), or over 100 ids (`TOO_MANY_IDS`). */
7131
8048
  400: {
7132
8049
  headers: {
7133
8050
  [name: string]: unknown;
@@ -7136,7 +8053,7 @@ interface operations {
7136
8053
  "application/json": components["schemas"]["ErrorResponseDto"];
7137
8054
  };
7138
8055
  };
7139
- /** @description PAK lacks `social.update`. */
8056
+ /** @description PAK lacks `social.read`. */
7140
8057
  403: {
7141
8058
  headers: {
7142
8059
  [name: string]: unknown;
@@ -7145,7 +8062,7 @@ interface operations {
7145
8062
  "application/json": components["schemas"]["ErrorResponseDto"];
7146
8063
  };
7147
8064
  };
7148
- /** @description Conversation not found or caller not a participant. */
8065
+ /** @description Community not found in the PAK's workspace. (Unknown actors land in `missing[]`, not a 404.) */
7149
8066
  404: {
7150
8067
  headers: {
7151
8068
  [name: string]: unknown;
@@ -7346,6 +8263,60 @@ interface operations {
7346
8263
  };
7347
8264
  };
7348
8265
  };
8266
+ EdgeController_batchFollows: {
8267
+ parameters: {
8268
+ query?: never;
8269
+ header?: never;
8270
+ path: {
8271
+ /** @description Social community UUID. Must belong to the PAK's workspace. */
8272
+ communityId: string;
8273
+ };
8274
+ cookie?: never;
8275
+ };
8276
+ requestBody: {
8277
+ content: {
8278
+ "application/json": components["schemas"]["BatchFollowsDto"];
8279
+ };
8280
+ };
8281
+ responses: {
8282
+ /** @description Per-item results, request order. `succeeded` + `failed` summarise the batch. */
8283
+ 201: {
8284
+ headers: {
8285
+ [name: string]: unknown;
8286
+ };
8287
+ content: {
8288
+ "application/json": components["schemas"]["BatchFollowsResponseDto"];
8289
+ };
8290
+ };
8291
+ /** @description Envelope validation failure: `follows` missing, empty, over 200 items, or an item shape invalid. */
8292
+ 400: {
8293
+ headers: {
8294
+ [name: string]: unknown;
8295
+ };
8296
+ content: {
8297
+ "application/json": components["schemas"]["ErrorResponseDto"];
8298
+ };
8299
+ };
8300
+ /** @description PAK lacks `social.create`. */
8301
+ 403: {
8302
+ headers: {
8303
+ [name: string]: unknown;
8304
+ };
8305
+ content: {
8306
+ "application/json": components["schemas"]["ErrorResponseDto"];
8307
+ };
8308
+ };
8309
+ /** @description Community not found in the PAK's workspace. (Unknown actors fail per item, not the whole call.) */
8310
+ 404: {
8311
+ headers: {
8312
+ [name: string]: unknown;
8313
+ };
8314
+ content: {
8315
+ "application/json": components["schemas"]["ErrorResponseDto"];
8316
+ };
8317
+ };
8318
+ };
8319
+ };
7349
8320
  EdgeController_unfollow: {
7350
8321
  parameters: {
7351
8322
  query?: never;
@@ -7582,7 +8553,10 @@ interface operations {
7582
8553
  ActorListController_create: {
7583
8554
  parameters: {
7584
8555
  query?: never;
7585
- header?: never;
8556
+ header?: {
8557
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
8558
+ "Idempotency-Key"?: string;
8559
+ };
7586
8560
  path: {
7587
8561
  /** @description Social community UUID. */
7588
8562
  communityId: string;
@@ -7604,7 +8578,7 @@ interface operations {
7604
8578
  "application/json": components["schemas"]["ActorListResponseDto"];
7605
8579
  };
7606
8580
  };
7607
- /** @description Validation failure. */
8581
+ /** @description Validation failure (including malformed Idempotency-Key). */
7608
8582
  400: {
7609
8583
  headers: {
7610
8584
  [name: string]: unknown;
@@ -7631,6 +8605,15 @@ interface operations {
7631
8605
  "application/json": components["schemas"]["ErrorResponseDto"];
7632
8606
  };
7633
8607
  };
8608
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
8609
+ 409: {
8610
+ headers: {
8611
+ [name: string]: unknown;
8612
+ };
8613
+ content: {
8614
+ "application/json": components["schemas"]["ErrorResponseDto"];
8615
+ };
8616
+ };
7634
8617
  };
7635
8618
  };
7636
8619
  ActorListController_getById: {
@@ -8153,7 +9136,10 @@ interface operations {
8153
9136
  PostController_create: {
8154
9137
  parameters: {
8155
9138
  query?: never;
8156
- header?: never;
9139
+ header?: {
9140
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
9141
+ "Idempotency-Key"?: string;
9142
+ };
8157
9143
  path: {
8158
9144
  communityId: string;
8159
9145
  };
@@ -8174,7 +9160,7 @@ interface operations {
8174
9160
  "application/json": components["schemas"]["PostResponseDto"];
8175
9161
  };
8176
9162
  };
8177
- /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp). */
9163
+ /** @description Validation failure (missing actor_id; body/title/url all empty; bad URL; bad ISO timestamp; malformed Idempotency-Key). */
8178
9164
  400: {
8179
9165
  headers: {
8180
9166
  [name: string]: unknown;
@@ -8201,6 +9187,15 @@ interface operations {
8201
9187
  "application/json": components["schemas"]["ErrorResponseDto"];
8202
9188
  };
8203
9189
  };
9190
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
9191
+ 409: {
9192
+ headers: {
9193
+ [name: string]: unknown;
9194
+ };
9195
+ content: {
9196
+ "application/json": components["schemas"]["ErrorResponseDto"];
9197
+ };
9198
+ };
8204
9199
  /** @description Quote rules: `CANNOT_QUOTE_SELF` (kind='quote' with your own post as source) or `CANNOT_QUOTE_PRIVATE` (source post is private). */
8205
9200
  422: {
8206
9201
  headers: {
@@ -8566,7 +9561,10 @@ interface operations {
8566
9561
  CommentController_create: {
8567
9562
  parameters: {
8568
9563
  query?: never;
8569
- header?: never;
9564
+ header?: {
9565
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
9566
+ "Idempotency-Key"?: string;
9567
+ };
8570
9568
  path: {
8571
9569
  /** @description Social community UUID. Must belong to the PAK's workspace. */
8572
9570
  communityId: string;
@@ -8590,7 +9588,7 @@ interface operations {
8590
9588
  "application/json": components["schemas"]["CommentResponseDto"];
8591
9589
  };
8592
9590
  };
8593
- /** @description Validation failure (missing actor_id, empty body, body too long). */
9591
+ /** @description Validation failure (missing actor_id, empty body, body too long, malformed Idempotency-Key). */
8594
9592
  400: {
8595
9593
  headers: {
8596
9594
  [name: string]: unknown;
@@ -8617,7 +9615,7 @@ interface operations {
8617
9615
  "application/json": components["schemas"]["ErrorResponseDto"];
8618
9616
  };
8619
9617
  };
8620
- /** @description Block exists between commenter and post author, or depth exceeds community.settings.max_comment_depth. */
9618
+ /** @description Block exists between commenter and post author, depth exceeds community.settings.max_comment_depth, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
8621
9619
  409: {
8622
9620
  headers: {
8623
9621
  [name: string]: unknown;
@@ -9113,6 +10111,63 @@ interface operations {
9113
10111
  };
9114
10112
  };
9115
10113
  };
10114
+ PostReactionController_list: {
10115
+ parameters: {
10116
+ query?: {
10117
+ /** @description Filter to a single reaction type label. */
10118
+ type?: string;
10119
+ limit?: number;
10120
+ cursor?: string;
10121
+ };
10122
+ header?: never;
10123
+ path: {
10124
+ /** @description Social community UUID. */
10125
+ communityId: string;
10126
+ /** @description Social post UUID. */
10127
+ postId: string;
10128
+ };
10129
+ cookie?: never;
10130
+ };
10131
+ requestBody?: never;
10132
+ responses: {
10133
+ /** @description Page of reactions. */
10134
+ 200: {
10135
+ headers: {
10136
+ [name: string]: unknown;
10137
+ };
10138
+ content: {
10139
+ "application/json": components["schemas"]["PostReactionListResponseDto"];
10140
+ };
10141
+ };
10142
+ /** @description Overlong `type` filter (max 64 chars). */
10143
+ 400: {
10144
+ headers: {
10145
+ [name: string]: unknown;
10146
+ };
10147
+ content: {
10148
+ "application/json": components["schemas"]["ErrorResponseDto"];
10149
+ };
10150
+ };
10151
+ /** @description PAK lacks `social.list`. */
10152
+ 403: {
10153
+ headers: {
10154
+ [name: string]: unknown;
10155
+ };
10156
+ content: {
10157
+ "application/json": components["schemas"]["ErrorResponseDto"];
10158
+ };
10159
+ };
10160
+ /** @description Community or post not found (or post removed). */
10161
+ 404: {
10162
+ headers: {
10163
+ [name: string]: unknown;
10164
+ };
10165
+ content: {
10166
+ "application/json": components["schemas"]["ErrorResponseDto"];
10167
+ };
10168
+ };
10169
+ };
10170
+ };
9116
10171
  PostReactionController_react: {
9117
10172
  parameters: {
9118
10173
  query?: never;
@@ -9909,7 +10964,7 @@ interface operations {
9909
10964
  };
9910
10965
  };
9911
10966
  };
9912
- WebhookController_getActive: {
10967
+ WebhookController_list: {
9913
10968
  parameters: {
9914
10969
  query?: never;
9915
10970
  header?: never;
@@ -9921,13 +10976,13 @@ interface operations {
9921
10976
  };
9922
10977
  requestBody?: never;
9923
10978
  responses: {
9924
- /** @description The active webhook, or a literal JSON `null` body when the community has no active webhook registered. */
10979
+ /** @description All webhooks on the community (no pagination — capped at 10 rows). */
9925
10980
  200: {
9926
10981
  headers: {
9927
10982
  [name: string]: unknown;
9928
10983
  };
9929
10984
  content: {
9930
- "application/json": components["schemas"]["WebhookResponseDto"] | null;
10985
+ "application/json": components["schemas"]["WebhookListResponseDto"];
9931
10986
  };
9932
10987
  };
9933
10988
  /** @description Community not found. */
@@ -9944,7 +10999,10 @@ interface operations {
9944
10999
  WebhookController_create: {
9945
11000
  parameters: {
9946
11001
  query?: never;
9947
- header?: never;
11002
+ header?: {
11003
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. The signing secret is returned exactly once; a replay returns the original response (including the secret) with `Idempotent-Replay: true`. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11004
+ "Idempotency-Key"?: string;
11005
+ };
9948
11006
  path: {
9949
11007
  /** @description Social community UUID. */
9950
11008
  communityId: string;
@@ -9966,7 +11024,7 @@ interface operations {
9966
11024
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
9967
11025
  };
9968
11026
  };
9969
- /** @description Validation failure (bad url, empty event_types). */
11027
+ /** @description Validation failure (bad url, empty or unknown event_types — the message names the valid set; malformed Idempotency-Key). */
9970
11028
  400: {
9971
11029
  headers: {
9972
11030
  [name: string]: unknown;
@@ -9993,7 +11051,7 @@ interface operations {
9993
11051
  "application/json": components["schemas"]["ErrorResponseDto"];
9994
11052
  };
9995
11053
  };
9996
- /** @description Community already has an active webhook. */
11054
+ /** @description Webhook cap reached (10 per community), or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
9997
11055
  409: {
9998
11056
  headers: {
9999
11057
  [name: string]: unknown;
@@ -10154,10 +11212,58 @@ interface operations {
10154
11212
  };
10155
11213
  };
10156
11214
  };
10157
- WebhookController_rotateSecret: {
11215
+ WebhookController_redeliver: {
10158
11216
  parameters: {
10159
11217
  query?: never;
10160
11218
  header?: never;
11219
+ path: {
11220
+ /** @description Social community UUID. */
11221
+ communityId: string;
11222
+ /** @description Webhook UUID. */
11223
+ webhookId: string;
11224
+ /** @description Delivery row UUID (from GET …/deliveries). */
11225
+ deliveryId: string;
11226
+ };
11227
+ cookie?: never;
11228
+ };
11229
+ requestBody?: never;
11230
+ responses: {
11231
+ /** @description Redelivery enqueued. */
11232
+ 202: {
11233
+ headers: {
11234
+ [name: string]: unknown;
11235
+ };
11236
+ content: {
11237
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11238
+ };
11239
+ };
11240
+ /** @description Webhook or delivery not found. */
11241
+ 404: {
11242
+ headers: {
11243
+ [name: string]: unknown;
11244
+ };
11245
+ content: {
11246
+ "application/json": components["schemas"]["ErrorResponseDto"];
11247
+ };
11248
+ };
11249
+ /** @description Webhook is disabled — re-enable it first. */
11250
+ 409: {
11251
+ headers: {
11252
+ [name: string]: unknown;
11253
+ };
11254
+ content: {
11255
+ "application/json": components["schemas"]["ErrorResponseDto"];
11256
+ };
11257
+ };
11258
+ };
11259
+ };
11260
+ WebhookController_rotateSecret: {
11261
+ parameters: {
11262
+ query?: never;
11263
+ header?: {
11264
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. A replay returns the original response (including the new secret) with `Idempotent-Replay: true`; a retry WITHOUT the header rotates the secret again, invalidating the previous one. Same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11265
+ "Idempotency-Key"?: string;
11266
+ };
10161
11267
  path: {
10162
11268
  /** @description Social community UUID. */
10163
11269
  communityId: string;
@@ -10177,6 +11283,58 @@ interface operations {
10177
11283
  "application/json": components["schemas"]["CreatedWebhookResponseDto"];
10178
11284
  };
10179
11285
  };
11286
+ /** @description Malformed Idempotency-Key header. */
11287
+ 400: {
11288
+ headers: {
11289
+ [name: string]: unknown;
11290
+ };
11291
+ content: {
11292
+ "application/json": components["schemas"]["ErrorResponseDto"];
11293
+ };
11294
+ };
11295
+ /** @description Webhook not found. */
11296
+ 404: {
11297
+ headers: {
11298
+ [name: string]: unknown;
11299
+ };
11300
+ content: {
11301
+ "application/json": components["schemas"]["ErrorResponseDto"];
11302
+ };
11303
+ };
11304
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
11305
+ 409: {
11306
+ headers: {
11307
+ [name: string]: unknown;
11308
+ };
11309
+ content: {
11310
+ "application/json": components["schemas"]["ErrorResponseDto"];
11311
+ };
11312
+ };
11313
+ };
11314
+ };
11315
+ WebhookController_testPing: {
11316
+ parameters: {
11317
+ query?: never;
11318
+ header?: never;
11319
+ path: {
11320
+ /** @description Social community UUID. */
11321
+ communityId: string;
11322
+ /** @description Webhook UUID. */
11323
+ webhookId: string;
11324
+ };
11325
+ cookie?: never;
11326
+ };
11327
+ requestBody?: never;
11328
+ responses: {
11329
+ /** @description Ping enqueued. */
11330
+ 202: {
11331
+ headers: {
11332
+ [name: string]: unknown;
11333
+ };
11334
+ content: {
11335
+ "application/json": components["schemas"]["DeliveryJobResponseDto"];
11336
+ };
11337
+ };
10180
11338
  /** @description Webhook not found. */
10181
11339
  404: {
10182
11340
  headers: {
@@ -10186,6 +11344,35 @@ interface operations {
10186
11344
  "application/json": components["schemas"]["ErrorResponseDto"];
10187
11345
  };
10188
11346
  };
11347
+ /** @description Webhook is disabled — re-enable it first. */
11348
+ 409: {
11349
+ headers: {
11350
+ [name: string]: unknown;
11351
+ };
11352
+ content: {
11353
+ "application/json": components["schemas"]["ErrorResponseDto"];
11354
+ };
11355
+ };
11356
+ };
11357
+ };
11358
+ WebhookEventTypesController_list: {
11359
+ parameters: {
11360
+ query?: never;
11361
+ header?: never;
11362
+ path?: never;
11363
+ cookie?: never;
11364
+ };
11365
+ requestBody?: never;
11366
+ responses: {
11367
+ /** @description The full event-type catalog. */
11368
+ 200: {
11369
+ headers: {
11370
+ [name: string]: unknown;
11371
+ };
11372
+ content: {
11373
+ "application/json": components["schemas"]["WebhookEventTypesResponseDto"];
11374
+ };
11375
+ };
10189
11376
  };
10190
11377
  };
10191
11378
  CommunityController_list: {
@@ -10225,6 +11412,8 @@ interface operations {
10225
11412
  query?: never;
10226
11413
  header: {
10227
11414
  authorization: string;
11415
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11416
+ "Idempotency-Key"?: string;
10228
11417
  };
10229
11418
  path: {
10230
11419
  /** @description ProductCraft workspace UUID owning the community. */
@@ -10247,7 +11436,7 @@ interface operations {
10247
11436
  "application/json": components["schemas"]["CommunityResponseDto"];
10248
11437
  };
10249
11438
  };
10250
- /** @description Validation failure (slug shape, display_name length). */
11439
+ /** @description Validation failure (slug shape, display_name length, malformed Idempotency-Key). */
10251
11440
  400: {
10252
11441
  headers: {
10253
11442
  [name: string]: unknown;
@@ -10283,7 +11472,7 @@ interface operations {
10283
11472
  "application/json": components["schemas"]["ErrorResponseDto"];
10284
11473
  };
10285
11474
  };
10286
- /** @description Community slug already taken in this workspace, or the supplied `app_id` is already connected to a community. */
11475
+ /** @description Community slug already taken in this workspace, the supplied `app_id` is already connected to a community, or `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
10287
11476
  409: {
10288
11477
  headers: {
10289
11478
  [name: string]: unknown;
@@ -10480,7 +11669,10 @@ interface operations {
10480
11669
  ModerationAdminController_shadowBan: {
10481
11670
  parameters: {
10482
11671
  query?: never;
10483
- header?: never;
11672
+ header?: {
11673
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11674
+ "Idempotency-Key"?: string;
11675
+ };
10484
11676
  path: {
10485
11677
  workspaceId: string;
10486
11678
  communityId: string;
@@ -10503,7 +11695,7 @@ interface operations {
10503
11695
  "application/json": components["schemas"]["ModerationActorResponseDto"];
10504
11696
  };
10505
11697
  };
10506
- /** @description Invalid duration_hours or reason. */
11698
+ /** @description Invalid duration_hours or reason, or malformed Idempotency-Key. */
10507
11699
  400: {
10508
11700
  headers: {
10509
11701
  [name: string]: unknown;
@@ -10530,6 +11722,15 @@ interface operations {
10530
11722
  "application/json": components["schemas"]["ErrorResponseDto"];
10531
11723
  };
10532
11724
  };
11725
+ /** @description `IDEMPOTENCY_KEY_REUSE` — the supplied Idempotency-Key was already used with a different request body. */
11726
+ 409: {
11727
+ headers: {
11728
+ [name: string]: unknown;
11729
+ };
11730
+ content: {
11731
+ "application/json": components["schemas"]["ErrorResponseDto"];
11732
+ };
11733
+ };
10533
11734
  };
10534
11735
  };
10535
11736
  ModerationAdminController_unshadow: {
@@ -10765,7 +11966,10 @@ interface operations {
10765
11966
  ModerationAdminController_act: {
10766
11967
  parameters: {
10767
11968
  query?: never;
10768
- header?: never;
11969
+ header?: {
11970
+ /** @description Opaque client-generated string (1–256 chars, `[A-Za-z0-9_\-:]`) used to deduplicate retries within a 24h window. Replays return the original response with `Idempotent-Replay: true`; same key + different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
11971
+ "Idempotency-Key"?: string;
11972
+ };
10769
11973
  path: {
10770
11974
  workspaceId: string;
10771
11975
  communityId: string;
@@ -10788,7 +11992,7 @@ interface operations {
10788
11992
  "application/json": components["schemas"]["ActOnFlagResponseDto"];
10789
11993
  };
10790
11994
  };
10791
- /** @description Invalid action or notes. */
11995
+ /** @description Invalid action or notes, or malformed Idempotency-Key. */
10792
11996
  400: {
10793
11997
  headers: {
10794
11998
  [name: string]: unknown;
@@ -10815,7 +12019,7 @@ interface operations {
10815
12019
  "application/json": components["schemas"]["ErrorResponseDto"];
10816
12020
  };
10817
12021
  };
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. */
12022
+ /** @description FLAG_ALREADY_CLOSED — the flag is already actioned/dismissed and the requested action is punitive (hide/remove/warn/ban); reversals (unhide/restore/dismiss) stay legal on a closed flag. Also `IDEMPOTENCY_KEY_REUSE` (same Idempotency-Key, different body). */
10819
12023
  409: {
10820
12024
  headers: {
10821
12025
  [name: string]: unknown;