@rathnasgala2/schemas 3.30.0 → 3.32.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 (45) hide show
  1. package/THIRD_PARTY_LICENSES.json +1 -1
  2. package/diagnostics/diagnostic-map.json +119 -0
  3. package/docs/catalogs/schema-inventory.json +7 -7
  4. package/examples/valid/build-input/rules.json +126 -0
  5. package/examples/valid/interactions-config/rules.json +10 -0
  6. package/examples/valid/publication/rules.json +86 -0
  7. package/fixtures/boundary/build-input/rules.json +176 -0
  8. package/fixtures/boundary/interactions-config/rules.json +10 -0
  9. package/fixtures/boundary/publication/rules.json +132 -0
  10. package/fixtures/invalid/build-input/GRAPHEME_LENGTH_INVALID/cases.json +33 -0
  11. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +30 -0
  12. package/fixtures/invalid/build-input/SCHEMA_ARRAY_DUPLICATE/cases.json +11 -0
  13. package/fixtures/invalid/build-input/SCHEMA_ARRAY_TOO_LONG/cases.json +15 -0
  14. package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +11 -0
  15. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_LARGE/cases.json +11 -0
  16. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +22 -0
  17. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +51 -0
  18. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +53 -0
  19. package/fixtures/invalid/interactions-config/SCHEMA_TYPE_INVALID/cases.json +11 -0
  20. package/fixtures/invalid/publication/GRAPHEME_LENGTH_INVALID/cases.json +33 -0
  21. package/fixtures/invalid/publication/REQUEST_FIELD_UNKNOWN/cases.json +30 -0
  22. package/fixtures/invalid/publication/SCHEMA_ARRAY_DUPLICATE/cases.json +9 -0
  23. package/fixtures/invalid/publication/SCHEMA_ARRAY_TOO_LONG/cases.json +13 -0
  24. package/fixtures/invalid/publication/SCHEMA_PATTERN_INVALID/cases.json +22 -0
  25. package/fixtures/invalid/publication/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +40 -0
  26. package/fixtures/invalid/publication/SCHEMA_TYPE_INVALID/cases.json +40 -0
  27. package/fixtures/manifest.json +943 -8
  28. package/fixtures/unknown-field/build-input/rules.json +50 -0
  29. package/fixtures/unknown-field/interactions-config/rules.json +1 -0
  30. package/fixtures/unknown-field/publication/rules.json +46 -0
  31. package/generated/browser/validator-core.mjs +3 -3
  32. package/generated/typescript/contracts/artifact-manifest.d.ts +4 -2
  33. package/generated/typescript/contracts/build-input.d.ts +16 -1
  34. package/generated/typescript/contracts/build-provenance.d.ts +4 -2
  35. package/generated/typescript/contracts/interactions-config.d.ts +1 -0
  36. package/generated/typescript/contracts/publication.d.ts +13 -0
  37. package/openapi/http-catalog.json +80 -2
  38. package/openapi/openapi.yaml +1721 -253
  39. package/package.json +1 -1
  40. package/sbom.cdx.json +23 -23
  41. package/schemas/artifact-manifest.schema.json +4 -2
  42. package/schemas/build-input.schema.json +64 -3
  43. package/schemas/build-provenance.schema.json +4 -2
  44. package/schemas/interactions-config.schema.json +6 -1
  45. package/schemas/publication.schema.json +48 -0
@@ -927,6 +927,14 @@ components:
927
927
  format: uuid
928
928
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
929
929
  type: string
930
+ likeCount:
931
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
932
+ format: int64
933
+ minimum: 0
934
+ type: integer
935
+ likedByMe:
936
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
937
+ type: boolean
930
938
  moreReplies:
931
939
  type: boolean
932
940
  own:
@@ -937,6 +945,9 @@ components:
937
945
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
938
946
  type: string
939
947
  - type: "null"
948
+ pinned:
949
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
950
+ type: boolean
940
951
  replies:
941
952
  items:
942
953
  $ref: "#/components/schemas/CommentViewLevel1"
@@ -990,6 +1001,14 @@ components:
990
1001
  format: uuid
991
1002
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
992
1003
  type: string
1004
+ likeCount:
1005
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1006
+ format: int64
1007
+ minimum: 0
1008
+ type: integer
1009
+ likedByMe:
1010
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1011
+ type: boolean
993
1012
  moreReplies:
994
1013
  type: boolean
995
1014
  own:
@@ -1000,6 +1019,9 @@ components:
1000
1019
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1001
1020
  type: string
1002
1021
  - type: "null"
1022
+ pinned:
1023
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1024
+ type: boolean
1003
1025
  replies:
1004
1026
  items:
1005
1027
  $ref: "#/components/schemas/CommentViewLevel2"
@@ -1053,6 +1075,14 @@ components:
1053
1075
  format: uuid
1054
1076
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1055
1077
  type: string
1078
+ likeCount:
1079
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1080
+ format: int64
1081
+ minimum: 0
1082
+ type: integer
1083
+ likedByMe:
1084
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1085
+ type: boolean
1056
1086
  moreReplies:
1057
1087
  type: boolean
1058
1088
  own:
@@ -1063,6 +1093,9 @@ components:
1063
1093
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1064
1094
  type: string
1065
1095
  - type: "null"
1096
+ pinned:
1097
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1098
+ type: boolean
1066
1099
  replies:
1067
1100
  items:
1068
1101
  $ref: "#/components/schemas/CommentViewLevel3"
@@ -1116,6 +1149,14 @@ components:
1116
1149
  format: uuid
1117
1150
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1118
1151
  type: string
1152
+ likeCount:
1153
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1154
+ format: int64
1155
+ minimum: 0
1156
+ type: integer
1157
+ likedByMe:
1158
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1159
+ type: boolean
1119
1160
  moreReplies:
1120
1161
  type: boolean
1121
1162
  own:
@@ -1126,6 +1167,9 @@ components:
1126
1167
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1127
1168
  type: string
1128
1169
  - type: "null"
1170
+ pinned:
1171
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1172
+ type: boolean
1129
1173
  replies:
1130
1174
  maxItems: 0
1131
1175
  type: array
@@ -1494,7 +1538,10 @@ components:
1494
1538
  keeps the stored value, an object replaces it whole, `null` clears it.
1495
1539
  `title`, `defaultLanguage` and `socialLinks` cannot be cleared.
1496
1540
  `socialLinks` (max 32, the publication file's own limit) replaces
1497
- the whole list. `canonicalBase` is never client-settable: it changes
1541
+ the whole list. SCHEMA-3.32.0: `recommendations` (the sites the author
1542
+ recommends, max 24, `url` unique within the list) follows `crawlers`
1543
+ and not `socialLinks`: absent keeps the stored list, an array replaces
1544
+ the whole list, `null` clears it. `canonicalBase` is never client-settable: it changes
1498
1545
  only through domain attach and detach. A profile that changes nothing is
1499
1546
  `422 VALIDATION_FAILED` pointed at `/publicationProfile`; member
1500
1547
  failures point at `/publicationProfile/<member>`.
@@ -1530,6 +1577,13 @@ components:
1530
1577
  oneOf:
1531
1578
  - $ref: "#/components/schemas/PortablePublicationPerformance"
1532
1579
  - type: "null"
1580
+ recommendations:
1581
+ oneOf:
1582
+ - items:
1583
+ $ref: "#/components/schemas/Recommendation"
1584
+ maxItems: 24
1585
+ type: array
1586
+ - type: "null"
1533
1587
  socialLinks:
1534
1588
  items:
1535
1589
  $ref: "#/components/schemas/PortablePublicationSocialLink"
@@ -1541,6 +1595,35 @@ components:
1541
1595
  maximum: 120
1542
1596
  minimum: 1
1543
1597
  type: object
1598
+ ContentDocumentHistoryEntry:
1599
+ additionalProperties: false
1600
+ description: "SCHEMA-3.32.0: one commit that changed a content document. `source` is `draft` (saved from the editor), `publish` (a publish of the site), `import` (an import) or `unknown` (a commit Galascribe did not make). `authorLogin` is present only when GitHub names the committer."
1601
+ properties:
1602
+ authorLogin:
1603
+ maxLength: 39
1604
+ minLength: 1
1605
+ type: string
1606
+ committedAt:
1607
+ "": ../schemas/problem.schema.json#/$defs/rfc3339
1608
+ message:
1609
+ maxLength: 200
1610
+ type: string
1611
+ revision:
1612
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
1613
+ type: string
1614
+ source:
1615
+ enum:
1616
+ - draft
1617
+ - publish
1618
+ - import
1619
+ - unknown
1620
+ type: string
1621
+ required:
1622
+ - revision
1623
+ - committedAt
1624
+ - message
1625
+ - source
1626
+ type: object
1544
1627
  ContentFrontmatter:
1545
1628
  $ref: "#/components/schemas/PortableContentFrontmatterDocument"
1546
1629
  ContentInventoryItem:
@@ -1745,7 +1828,9 @@ components:
1745
1828
  page it opened. Carries no personal data beyond what each author
1746
1829
  file itself already publishes. `listing`, `aiRights` and `performance`
1747
1830
  (SCHEMA-3.25.1, optional) are the publication file's 3.25.0 members,
1748
- absent when the file carries none.
1831
+ absent when the file carries none. `recommendations` (SCHEMA-3.32.0,
1832
+ optional) is the publication file's list of recommended sites, absent
1833
+ when the file carries none.
1749
1834
  properties:
1750
1835
  aiRights:
1751
1836
  $ref: "#/components/schemas/PortablePublicationAiRights"
@@ -1769,6 +1854,11 @@ components:
1769
1854
  $ref: "#/components/schemas/PortablePublicationListing"
1770
1855
  performance:
1771
1856
  $ref: "#/components/schemas/PortablePublicationPerformance"
1857
+ recommendations:
1858
+ items:
1859
+ $ref: "#/components/schemas/Recommendation"
1860
+ maxItems: 24
1861
+ type: array
1772
1862
  socialLinks:
1773
1863
  items:
1774
1864
  $ref: "#/components/schemas/PortablePublicationSocialLink"
@@ -3595,6 +3685,18 @@ components:
3595
3685
  - items
3596
3686
  - nextCursor
3597
3687
  type: object
3688
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistoryResponse:
3689
+ additionalProperties: false
3690
+ description: "SCHEMA-3.32.0: the commits on the linked repository's main branch that changed one path, newest first, at most 50."
3691
+ properties:
3692
+ entries:
3693
+ items:
3694
+ "": "#/components/schemas/ContentDocumentHistoryEntry"
3695
+ maxItems: 50
3696
+ type: array
3697
+ required:
3698
+ - entries
3699
+ type: object
3598
3700
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsResponse:
3599
3701
  additionalProperties: false
3600
3702
  properties:
@@ -7396,12 +7498,15 @@ components:
7396
7498
  - state
7397
7499
  type: object
7398
7500
  ModerationDecision:
7501
+ description: "SCHEMA-3.32.0: `PIN` and `UNPIN` pin a visible root comment to the top of its article's comments, or release it. They apply to a visible root comment only, and change nothing else about it."
7399
7502
  enum:
7400
7503
  - HOLD
7401
7504
  - RESTORE
7402
7505
  - REMOVE
7403
7506
  - DISMISS_REPORTS
7404
7507
  - DENY_APPEAL
7508
+ - PIN
7509
+ - UNPIN
7405
7510
  type: string
7406
7511
  ModerationQueueItem:
7407
7512
  additionalProperties: false
@@ -7551,10 +7656,17 @@ components:
7551
7656
  type: object
7552
7657
  NewsletterConfirmation:
7553
7658
  additionalProperties: false
7554
- description: "SCHEMA-3.23.0: what the confirmation page shows for one confirmation token."
7659
+ description: "SCHEMA-3.23.0: what the confirmation page shows for one confirmation token. SCHEMA-3.32.0: `afterSignupUrl` (the site's own after-signup address, when set) and `recommendations` (the sites the author recommends, when any) are present only when the site has them."
7555
7660
  properties:
7661
+ afterSignupUrl:
7662
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
7556
7663
  publication:
7557
7664
  $ref: "#/components/schemas/AudiencePublication"
7665
+ recommendations:
7666
+ items:
7667
+ $ref: "#/components/schemas/Recommendation"
7668
+ maxItems: 24
7669
+ type: array
7558
7670
  state:
7559
7671
  $ref: "#/components/schemas/NewsletterConfirmationState"
7560
7672
  required:
@@ -7578,6 +7690,13 @@ components:
7578
7690
  additionalProperties: false
7579
7691
  description: "SCHEMA-3.23.0: the send log of one post: when it went out and how many addresses it reached. `recipients` is the confirmed subscribers at send time; `sent`, `failed` and `deferred` (held back by a daily ceiling, retried later) account for them."
7580
7692
  properties:
7693
+ clicked:
7694
+ description: "SCHEMA-3.32.0: addresses that clicked a link in the issue, from the mail provider; null when not yet known."
7695
+ format: int64
7696
+ minimum: 0
7697
+ type:
7698
+ - integer
7699
+ - "null"
7581
7700
  contentId:
7582
7701
  format: uuid
7583
7702
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
@@ -7586,6 +7705,13 @@ components:
7586
7705
  format: int64
7587
7706
  minimum: 0
7588
7707
  type: integer
7708
+ delivered:
7709
+ description: "SCHEMA-3.32.0: addresses the receiving server accepted the issue for, from the mail provider; null when not yet known."
7710
+ format: int64
7711
+ minimum: 0
7712
+ type:
7713
+ - integer
7714
+ - "null"
7589
7715
  failed:
7590
7716
  format: int64
7591
7717
  minimum: 0
@@ -7594,6 +7720,13 @@ components:
7594
7720
  format: uuid
7595
7721
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
7596
7722
  type: string
7723
+ opened:
7724
+ description: "SCHEMA-3.32.0: addresses that opened the issue, from the mail provider; an estimate, because open tracking is pixel-based and mail clients can load or block the pixel for the reader. Null when not yet known."
7725
+ format: int64
7726
+ minimum: 0
7727
+ type:
7728
+ - integer
7729
+ - "null"
7597
7730
  recipients:
7598
7731
  format: int64
7599
7732
  minimum: 0
@@ -7627,8 +7760,12 @@ components:
7627
7760
  type: string
7628
7761
  NewsletterSettings:
7629
7762
  additionalProperties: false
7630
- description: "SCHEMA-3.23.0: the newsletter configuration of a site at the linked repository's main branch head, as `gala/publication.json` carries it, plus read-only status. `url` is set in `link` mode only; `emailContent` and `replyToOwner` in `galascribe` mode only; `title` and `text` in both modes; every one is null otherwise. `ownerPostalAddressSet` says whether the site owner has saved a postal address (`GET /v2/self/postal-address`); the Galascribe newsletter cannot be turned on without one. `paused` is true while sends are stopped for the site: the platform newsletter kill switch is on, or the owner has no postal address. `capacity` is the organization's subscriber allowance. `openChange` names an existing not-yet-published change of this publication that touches the file, or is null. `setUp` matches `GET .../repository/setup` `state`."
7763
+ description: "SCHEMA-3.23.0: the newsletter configuration of a site at the linked repository's main branch head, as `gala/publication.json` carries it, plus read-only status. `url` is set in `link` mode only; `emailContent` and `replyToOwner` in `galascribe` mode only; `title` and `text` in both modes; every one is null otherwise. `ownerPostalAddressSet` says whether the site owner has saved a postal address (`GET /v2/self/postal-address`); the Galascribe newsletter cannot be turned on without one. `paused` is true while sends are stopped for the site: the platform newsletter kill switch is on, or the owner has no postal address. `capacity` is the organization's subscriber allowance. `openChange` names an existing not-yet-published change of this publication that touches the file, or is null. `setUp` matches `GET .../repository/setup` `state`. SCHEMA-3.32.0: `welcome` and `afterSignupUrl` (`galascribe` mode only; null when unset or in another mode) are optional members, so a 3.31 reader ignores them."
7631
7764
  properties:
7765
+ afterSignupUrl:
7766
+ oneOf:
7767
+ - $ref: "#/components/schemas/PortablePublicationUrlHttps"
7768
+ - type: "null"
7632
7769
  capacity:
7633
7770
  $ref: "#/components/schemas/NewsletterCapacity"
7634
7771
  emailContent:
@@ -7666,6 +7803,10 @@ components:
7666
7803
  oneOf:
7667
7804
  - $ref: "#/components/schemas/PortablePublicationUrlHttps"
7668
7805
  - type: "null"
7806
+ welcome:
7807
+ oneOf:
7808
+ - $ref: "#/components/schemas/NewsletterWelcome"
7809
+ - type: "null"
7669
7810
  required:
7670
7811
  - mode
7671
7812
  - url
@@ -7729,11 +7870,12 @@ components:
7729
7870
  - confirmedAt
7730
7871
  type: object
7731
7872
  NewsletterSubscriberState:
7732
- description: "SCHEMA-3.23.0: `pending` (asked, not yet confirmed), `confirmed`, or `unsubscribed` (the address is kept only as a suppression digest, so its row has no `email`)."
7873
+ description: "SCHEMA-3.23.0: `pending` (asked, not yet confirmed), `confirmed`, or `unsubscribed` (the address is kept only as a suppression digest, so its row has no `email`). SCHEMA-3.32.0: `suppressed` is an address mail to which bounced or drew a spam complaint; it receives nothing further and cannot be re-imported or re-subscribed by the owner."
7733
7874
  enum:
7734
7875
  - pending
7735
7876
  - confirmed
7736
7877
  - unsubscribed
7878
+ - suppressed
7737
7879
  type: string
7738
7880
  NewsletterSubscription:
7739
7881
  additionalProperties: false
@@ -7758,6 +7900,25 @@ components:
7758
7900
  - subscribed
7759
7901
  - unsubscribed
7760
7902
  type: string
7903
+ NewsletterWelcome:
7904
+ additionalProperties: false
7905
+ description: "SCHEMA-3.32.0: the welcome email mailed once to a new subscriber after they confirm: a one-line subject of 1 to 120 graphemes and a plain-text body of 1 to 2000 graphemes."
7906
+ properties:
7907
+ body:
7908
+ $ref: "#/components/schemas/PortablePublicationPlainText"
7909
+ x-gala-graphemeLength:
7910
+ maximum: 2000
7911
+ minimum: 1
7912
+ subject:
7913
+ $ref: "#/components/schemas/PortablePublicationPlainText"
7914
+ pattern: ^[^\r\n\u2028\u2029]+$
7915
+ x-gala-graphemeLength:
7916
+ maximum: 120
7917
+ minimum: 1
7918
+ required:
7919
+ - subject
7920
+ - body
7921
+ type: object
7761
7922
  NotificationCadence:
7762
7923
  description: "SCHEMA-3.23.0: how often a category is emailed. `instant` sends one email per notification, `daily` one digest per day, `off` none. The inbox row exists whatever the cadence."
7763
7924
  enum:
@@ -9602,8 +9763,14 @@ components:
9602
9763
  PlatformUser:
9603
9764
  additionalProperties: false
9604
9765
  properties:
9766
+ contactEmail:
9767
+ description: SCHEMA-3.31.0, the contact email address the person agreed to share. Returned only when one is on file and the caller holds `platform.users.contact`; null otherwise.
9768
+ maxLength: 320
9769
+ type:
9770
+ - string
9771
+ - "null"
9605
9772
  contactEmailOnFile:
9606
- description: Whether a contact email the person agreed to is on file. The address itself is never returned.
9773
+ description: Whether a contact email the person agreed to is on file. True whenever an agreed address is on file, whether or not the caller may see it.
9607
9774
  type: boolean
9608
9775
  createdAt:
9609
9776
  $ref: "#/components/schemas/PortableProblemRfc3339"
@@ -9648,6 +9815,7 @@ components:
9648
9815
  - publicationCount
9649
9816
  - planTiers
9650
9817
  - contactEmailOnFile
9818
+ - contactEmail
9651
9819
  type: object
9652
9820
  PlatformWebhookEvent:
9653
9821
  additionalProperties: false
@@ -15682,6 +15850,10 @@ components:
15682
15850
  type: boolean
15683
15851
  enabled:
15684
15852
  type: boolean
15853
+ likes:
15854
+ default: false
15855
+ description: "SCHEMA-3.32.0: when true, signed-in readers can like a comment. An absent member means false, so every 3.31 configuration still validates."
15856
+ type: boolean
15685
15857
  maxDepth:
15686
15858
  maximum: 4
15687
15859
  minimum: 1
@@ -16273,6 +16445,14 @@ components:
16273
16445
  $ref: "#/components/schemas/PortablePublicationPublicationPolicies"
16274
16446
  profile:
16275
16447
  $ref: "#/components/schemas/PortablePublicationPublicationProfile"
16448
+ recommendations:
16449
+ description: "SCHEMA-3.32.0: the sites the author recommends, shown to readers after they subscribe and published as `/.well-known/recommendations.json`. At most 24; `url` is unique within the array. JSON Schema cannot express uniqueness by one member, so consumers enforce it. An absent member means no recommendations."
16450
+ items:
16451
+ $ref: "#/components/schemas/PortablePublicationRecommendation"
16452
+ maxItems: 24
16453
+ minItems: 0
16454
+ type: array
16455
+ uniqueItems: true
16276
16456
  schemaId:
16277
16457
  pattern: ^urn:gala:schema:publication:2\.0\.0$
16278
16458
  type: string
@@ -16392,6 +16572,9 @@ components:
16392
16572
  - additionalProperties: false
16393
16573
  description: "Galascribe mode: the panel is an email field and a Subscribe button. `title` and `text` are the panel heading and sentence; there is no `url`. The API refuses to turn this mode on until the site owner has a postal address in their Account."
16394
16574
  properties:
16575
+ afterSignupUrl:
16576
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16577
+ description: "SCHEMA-3.32.0: where the subscriber is sent after they confirm. It must be an https URL; the API applies its own open-redirect rules. An absent member shows the Galascribe confirmation page."
16395
16578
  emailContent:
16396
16579
  description: "`card` mails the post title, description, image and a Read the post button; the template renders no email fragment. `full` mails the whole post: for each published post the template renders an email-safe HTML fragment at `/_gala/email/<content id>.html` (`<content id>` is the post's front-matter `id`; absolute URLs and inline-safe markup only; `noindex`; absent from the sitemap, the feeds, the search index and the llms files), which the API fetches after the generation is certified live."
16397
16580
  enum:
@@ -16411,6 +16594,25 @@ components:
16411
16594
  minimum: 1
16412
16595
  title:
16413
16596
  $ref: "#/components/schemas/PortablePublicationPlainLabel"
16597
+ welcome:
16598
+ additionalProperties: false
16599
+ description: "SCHEMA-3.32.0: the welcome email mailed once to a new subscriber after they confirm. `subject` is one line (no line break) of 1 to 120 graphemes; `body` is plain text of 1 to 2000 graphemes. An absent `welcome` member means no welcome email."
16600
+ properties:
16601
+ body:
16602
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16603
+ x-gala-graphemeLength:
16604
+ maximum: 2000
16605
+ minimum: 1
16606
+ subject:
16607
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16608
+ pattern: ^[^\r\n\u2028\u2029]+$
16609
+ x-gala-graphemeLength:
16610
+ maximum: 120
16611
+ minimum: 1
16612
+ required:
16613
+ - subject
16614
+ - body
16615
+ type: object
16414
16616
  required:
16415
16617
  - mode
16416
16618
  - title
@@ -16486,6 +16688,26 @@ components:
16486
16688
  - route
16487
16689
  - body
16488
16690
  type: object
16691
+ PortablePublicationRecommendation:
16692
+ additionalProperties: false
16693
+ description: "SCHEMA-3.32.0: one site the author recommends to readers."
16694
+ properties:
16695
+ addedOn:
16696
+ description: The day the recommendation was added, YYYY-MM-DD (UTC). It feeds the `created_at` and `updated_at` members of the site's `/.well-known/recommendations.json` entry.
16697
+ pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$
16698
+ type: string
16699
+ description:
16700
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16701
+ x-gala-graphemeLength:
16702
+ maximum: 300
16703
+ title:
16704
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
16705
+ url:
16706
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16707
+ required:
16708
+ - url
16709
+ - title
16710
+ type: object
16489
16711
  PortablePublicationRepoRelativePath:
16490
16712
  description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
16491
16713
  format: gala-repository-relative-path
@@ -16842,6 +17064,28 @@ components:
16842
17064
  - organizations
16843
17065
  - capabilities
16844
17066
  type: object
17067
+ PostCallbacksBrevoRequest:
17068
+ description: Raw Brevo webhook JSON authenticated by the X-Gala-Webhook-Token header. Brevo posts one event per call; an object or an array of objects is accepted and every member is opaque to the contract.
17069
+ oneOf:
17070
+ - additionalProperties: true
17071
+ type: object
17072
+ - items:
17073
+ additionalProperties: true
17074
+ type: object
17075
+ maxItems: 1000
17076
+ type: array
17077
+ PostCallbacksBrevoResponse:
17078
+ additionalProperties: false
17079
+ properties:
17080
+ accepted:
17081
+ not:
17082
+ enum:
17083
+ - false
17084
+ type: boolean
17085
+ x-gala-const: true
17086
+ required:
17087
+ - accepted
17088
+ type: object
16845
17089
  PostCallbacksGithubAppRequest:
16846
17090
  additionalProperties: true
16847
17091
  description: Raw GitHub webhook JSON authenticated over the exact received bytes; event and delivery identities are carried in required GitHub headers.
@@ -17530,6 +17774,31 @@ components:
17530
17774
  - expectedHead
17531
17775
  - diffDigest
17532
17776
  type: object
17777
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewRequest:
17778
+ additionalProperties: false
17779
+ description: "SCHEMA-3.32.0: the page to preview. Only https addresses are fetched."
17780
+ properties:
17781
+ url:
17782
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
17783
+ required:
17784
+ - url
17785
+ type: object
17786
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewResponse:
17787
+ additionalProperties: false
17788
+ description: "SCHEMA-3.32.0: what the page says about itself. Every member is omitted when the page does not give one; there is no image."
17789
+ properties:
17790
+ canonicalUrl:
17791
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
17792
+ description:
17793
+ maxLength: 500
17794
+ type: string
17795
+ siteName:
17796
+ maxLength: 200
17797
+ type: string
17798
+ title:
17799
+ maxLength: 300
17800
+ type: string
17801
+ type: object
17533
17802
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsByGenerationIdReconcileRequest:
17534
17803
  additionalProperties: false
17535
17804
  properties:
@@ -17719,6 +17988,55 @@ components:
17719
17988
  type: object
17720
17989
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecideResponse:
17721
17990
  $ref: "#/components/schemas/ModerationQueueItem"
17991
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportRequest:
17992
+ additionalProperties: false
17993
+ description: "SCHEMA-3.32.0: the addresses to invite, already parsed from the owner's file. `attestation` must be true: the owner states that every address agreed to hear from them. Each new address becomes a `pending` subscriber and is sent the confirmation email; nobody is subscribed without confirming."
17994
+ properties:
17995
+ addresses:
17996
+ items:
17997
+ format: email
17998
+ maxLength: 320
17999
+ minLength: 3
18000
+ type: string
18001
+ maxItems: 5000
18002
+ minItems: 1
18003
+ type: array
18004
+ attestation:
18005
+ not:
18006
+ enum:
18007
+ - false
18008
+ type: boolean
18009
+ x-gala-const: true
18010
+ required:
18011
+ - addresses
18012
+ - attestation
18013
+ type: object
18014
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportResponse:
18015
+ additionalProperties: false
18016
+ description: "SCHEMA-3.32.0: what the import did. `queued` addresses were new and had a confirmation email queued; `skippedKnown` were already pending, confirmed, unsubscribed or suppressed; `invalid` were not usable addresses; `overCapacity` were left out because the organization's subscriber allowance was reached."
18017
+ properties:
18018
+ invalid:
18019
+ format: int64
18020
+ minimum: 0
18021
+ type: integer
18022
+ overCapacity:
18023
+ format: int64
18024
+ minimum: 0
18025
+ type: integer
18026
+ queued:
18027
+ format: int64
18028
+ minimum: 0
18029
+ type: integer
18030
+ skippedKnown:
18031
+ format: int64
18032
+ minimum: 0
18033
+ type: integer
18034
+ required:
18035
+ - queued
18036
+ - skippedKnown
18037
+ - invalid
18038
+ - overCapacity
18039
+ type: object
17722
18040
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewRefreshResponse:
17723
18041
  $ref: "#/components/schemas/PublicationOverview"
17724
18042
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdPreviewRetirementResponse:
@@ -20846,8 +21164,12 @@ components:
20846
21164
  - text
20847
21165
  - emailContent
20848
21166
  - replyToOwner
20849
- description: "Members by mode: `off` takes none besides `mode`; `link` takes `url`, `title` and `text` (all required); `galascribe` takes `title`, `text`, `emailContent` and `replyToOwner` (all required). A member that does not belong to the chosen mode is `422 VALIDATION_FAILED` pointed at that member."
21167
+ description: "Members by mode: `off` takes none besides `mode`; `link` takes `url`, `title` and `text` (all required); `galascribe` takes `title`, `text`, `emailContent` and `replyToOwner` (all required). A member that does not belong to the chosen mode is `422 VALIDATION_FAILED` pointed at that member. SCHEMA-3.32.0: `welcome` and `afterSignupUrl` are optional in `galascribe` mode (an absent member leaves the stored value as it is and null removes it)."
20850
21168
  properties:
21169
+ afterSignupUrl:
21170
+ oneOf:
21171
+ - $ref: "#/components/schemas/PortablePublicationUrlHttps"
21172
+ - type: "null"
20851
21173
  emailContent:
20852
21174
  $ref: "#/components/schemas/NewsletterEmailContent"
20853
21175
  mode:
@@ -20863,6 +21185,10 @@ components:
20863
21185
  $ref: "#/components/schemas/PortablePublicationPlainLabel"
20864
21186
  url:
20865
21187
  $ref: "#/components/schemas/PortablePublicationUrlHttps"
21188
+ welcome:
21189
+ oneOf:
21190
+ - $ref: "#/components/schemas/NewsletterWelcome"
21191
+ - type: "null"
20866
21192
  required:
20867
21193
  - mode
20868
21194
  type: object
@@ -21785,6 +22111,25 @@ components:
21785
22111
  required:
21786
22112
  - origin
21787
22113
  type: object
22114
+ Recommendation:
22115
+ additionalProperties: false
22116
+ description: "SCHEMA-3.32.0: one site the author recommends to readers. `addedOn` is the day it was added (YYYY-MM-DD, UTC) and feeds the `created_at` and `updated_at` of the site's `/.well-known/recommendations.json` entry."
22117
+ properties:
22118
+ addedOn:
22119
+ pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$
22120
+ type: string
22121
+ description:
22122
+ $ref: "#/components/schemas/PortablePublicationPlainText"
22123
+ x-gala-graphemeLength:
22124
+ maximum: 300
22125
+ title:
22126
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
22127
+ url:
22128
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
22129
+ required:
22130
+ - url
22131
+ - title
22132
+ type: object
21788
22133
  RecoveryCodeStatus:
21789
22134
  additionalProperties: false
21790
22135
  description: How many codes of the current recovery code set are still unused.
@@ -22809,6 +23154,10 @@ components:
22809
23154
  description: Scoped credential an operator creates; acts as that operator within its scopes. Refused for every operation without `x-gala-api-key-scope`.
22810
23155
  scheme: bearer
22811
23156
  type: http
23157
+ brevoWebhookToken:
23158
+ in: header
23159
+ name: X-Gala-Webhook-Token
23160
+ type: apiKey
22812
23161
  browserSession:
22813
23162
  in: cookie
22814
23163
  name: __Host-gala-session
@@ -23483,6 +23832,103 @@ paths:
23483
23832
  - NONE
23484
23833
  x-gala-success-category: protocol
23485
23834
  x-gala-tenant-scope: NONE
23835
+ /v2/callbacks/brevo:
23836
+ post:
23837
+ description: |
23838
+ Brevo transactional-email event webhook (delivered, opened, clicked, bounced, complaint and similar). Brevo posts one event per call; the body is an opaque JSON object or an array of such objects and the contract does not describe Brevo's own fields. The call is authenticated by the shared token in the `X-Gala-Webhook-Token` header, which the deployment configures in Brevo's webhook headers. `202` means the body was admitted for asynchronous processing, including an event the API ignores or has already seen. `400` is a malformed body, `401` is a missing or wrong token.
23839
+ operationId: postCallbacksBrevo
23840
+ parameters:
23841
+ - $ref: "#/components/parameters/XCorrelationId"
23842
+ - example: wh_0000000000000000000000000000000000000000
23843
+ in: header
23844
+ name: X-Gala-Webhook-Token
23845
+ required: true
23846
+ schema:
23847
+ maxLength: 1024
23848
+ minLength: 1
23849
+ type: string
23850
+ requestBody:
23851
+ content:
23852
+ application/json:
23853
+ examples:
23854
+ nominal:
23855
+ summary: Nominal valid request
23856
+ value: {}
23857
+ schema:
23858
+ $ref: "#/components/schemas/PostCallbacksBrevoRequest"
23859
+ required: true
23860
+ responses:
23861
+ "202":
23862
+ content:
23863
+ application/json:
23864
+ examples:
23865
+ nominal:
23866
+ summary: Nominal successful response
23867
+ value:
23868
+ accepted: true
23869
+ schema:
23870
+ $ref: "#/components/schemas/PostCallbacksBrevoResponse"
23871
+ description: admit an authenticated Brevo email event succeeded
23872
+ headers:
23873
+ Cache-Control:
23874
+ $ref: "#/components/headers/CacheControlNoStore"
23875
+ X-Correlation-Id:
23876
+ $ref: "#/components/headers/XCorrelationId"
23877
+ "400":
23878
+ $ref: "#/components/responses/ValidationFailed"
23879
+ "401":
23880
+ content:
23881
+ application/problem+json:
23882
+ examples:
23883
+ AUTHENTICATION_REQUIRED:
23884
+ summary: AUTHENTICATION_REQUIRED
23885
+ value:
23886
+ code: AUTHENTICATION_REQUIRED
23887
+ correlationId: 018f0000-0000-7000-8000-000000000001
23888
+ detail: See the operation contract.
23889
+ errors: []
23890
+ retryable: false
23891
+ schemaId: urn:gala:schema:problem:2.0.0
23892
+ schemaVersion: 2.0.0
23893
+ status: 401
23894
+ title: AUTHENTICATION_REQUIRED
23895
+ type: urn:gala:problem:authentication-required
23896
+ schema:
23897
+ $ref: "#/components/schemas/Problem"
23898
+ description: AUTHENTICATION_REQUIRED
23899
+ headers:
23900
+ Cache-Control:
23901
+ $ref: "#/components/headers/CacheControlNoStore"
23902
+ X-Correlation-Id:
23903
+ $ref: "#/components/headers/XCorrelationId"
23904
+ x-gala-problem-codes:
23905
+ - AUTHENTICATION_REQUIRED
23906
+ "413":
23907
+ $ref: "#/components/responses/RequestTooLarge"
23908
+ "415":
23909
+ $ref: "#/components/responses/UnsupportedMediaType"
23910
+ security:
23911
+ - brevoWebhookToken: []
23912
+ summary: admit an authenticated Brevo email event
23913
+ tags:
23914
+ - callbacks
23915
+ x-gala-activation-gate: MVP
23916
+ x-gala-activation-guards:
23917
+ - NONE
23918
+ x-gala-capability-key: null
23919
+ x-gala-concurrency: provider-event-idempotency-and-event-time-ordering
23920
+ x-gala-conditional-capabilities: []
23921
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
23922
+ x-gala-nullability: required-and-nullable-are-explicit
23923
+ x-gala-purpose: admit an authenticated Brevo email event
23924
+ x-gala-reachable-problems:
23925
+ - AUTHENTICATION_REQUIRED
23926
+ - VALIDATION_FAILED
23927
+ x-gala-replay-identity: brevo-message-id-and-event-time
23928
+ x-gala-state-guards:
23929
+ - NONE
23930
+ x-gala-success-category: provider-callback
23931
+ x-gala-tenant-scope: NONE
23486
23932
  /v2/callbacks/cloudflare/oauth:
23487
23933
  get:
23488
23934
  description: |
@@ -40051,6 +40497,534 @@ paths:
40051
40497
  - NONE
40052
40498
  x-gala-success-category: query
40053
40499
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40500
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/documents/history:
40501
+ get:
40502
+ description: |
40503
+ Needs `publication.view`. Lists the commits on the linked repository's
40504
+ main branch that changed `path`, newest first, at most 50. Each entry
40505
+ carries the `revision` (the commit to pass as `revision` to `GET
40506
+ .../content/documents`), when it was committed, the committer's GitHub
40507
+ login when GitHub names one, the first line of the commit message and
40508
+ `source`: `draft` (saved from the editor), `publish` (a publish of the
40509
+ site), `import` (an import) or `unknown` (a commit Galascribe did not
40510
+ make). A path with no commit on main, or an unknown path, is `404
40511
+ RESOURCE_NOT_FOUND`.
40512
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistory
40513
+ parameters:
40514
+ - $ref: "#/components/parameters/XCorrelationId"
40515
+ - example: 018f0000-0000-7000-8000-000000000001
40516
+ in: path
40517
+ name: organizationId
40518
+ required: true
40519
+ schema:
40520
+ format: uuid
40521
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40522
+ type: string
40523
+ - example: 018f0000-0000-7000-8000-000000000001
40524
+ in: path
40525
+ name: publicationId
40526
+ required: true
40527
+ schema:
40528
+ format: uuid
40529
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40530
+ type: string
40531
+ - example: content/articles/example.md
40532
+ in: query
40533
+ name: path
40534
+ required: true
40535
+ schema:
40536
+ maxLength: 512
40537
+ minLength: 1
40538
+ pattern: ^(?!/)(?!.*(?:^|/)\.)(?!gala\.lock\.json$)(?:gala/theme-pages/[^\x00-\x1f\x7f\\/]+|(?!gala(?:/|$))[^\x00-\x1f\x7f\\]+)$
40539
+ type: string
40540
+ responses:
40541
+ "200":
40542
+ content:
40543
+ application/json:
40544
+ examples:
40545
+ nominal:
40546
+ summary: Nominal successful response
40547
+ value:
40548
+ entries:
40549
+ - authorLogin: octocat
40550
+ committedAt: "2026-11-03T09:30:00.000Z"
40551
+ message: Update example
40552
+ revision: sha1:0000000000000000000000000000000000000000
40553
+ source: draft
40554
+ schema:
40555
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistoryResponse"
40556
+ description: list the history of one content document succeeded
40557
+ headers:
40558
+ Cache-Control:
40559
+ $ref: "#/components/headers/CacheControlNoStore"
40560
+ X-Correlation-Id:
40561
+ $ref: "#/components/headers/XCorrelationId"
40562
+ "400":
40563
+ content:
40564
+ application/problem+json:
40565
+ examples:
40566
+ VALIDATION_FAILED:
40567
+ summary: VALIDATION_FAILED
40568
+ value:
40569
+ code: VALIDATION_FAILED
40570
+ correlationId: 018f0000-0000-7000-8000-000000000001
40571
+ detail: See the operation contract.
40572
+ errors: []
40573
+ retryable: false
40574
+ schemaId: urn:gala:schema:problem:2.0.0
40575
+ schemaVersion: 2.0.0
40576
+ status: 400
40577
+ title: VALIDATION_FAILED
40578
+ type: urn:gala:problem:validation-failed
40579
+ schema:
40580
+ $ref: "#/components/schemas/Problem"
40581
+ description: VALIDATION_FAILED
40582
+ headers:
40583
+ Cache-Control:
40584
+ $ref: "#/components/headers/CacheControlNoStore"
40585
+ X-Correlation-Id:
40586
+ $ref: "#/components/headers/XCorrelationId"
40587
+ x-gala-problem-codes:
40588
+ - VALIDATION_FAILED
40589
+ "401":
40590
+ content:
40591
+ application/problem+json:
40592
+ examples:
40593
+ AUTHENTICATION_REQUIRED:
40594
+ summary: AUTHENTICATION_REQUIRED
40595
+ value:
40596
+ code: AUTHENTICATION_REQUIRED
40597
+ correlationId: 018f0000-0000-7000-8000-000000000001
40598
+ detail: See the operation contract.
40599
+ errors: []
40600
+ retryable: false
40601
+ schemaId: urn:gala:schema:problem:2.0.0
40602
+ schemaVersion: 2.0.0
40603
+ status: 401
40604
+ title: AUTHENTICATION_REQUIRED
40605
+ type: urn:gala:problem:authentication-required
40606
+ schema:
40607
+ $ref: "#/components/schemas/Problem"
40608
+ description: AUTHENTICATION_REQUIRED
40609
+ headers:
40610
+ Cache-Control:
40611
+ $ref: "#/components/headers/CacheControlNoStore"
40612
+ X-Correlation-Id:
40613
+ $ref: "#/components/headers/XCorrelationId"
40614
+ x-gala-problem-codes:
40615
+ - AUTHENTICATION_REQUIRED
40616
+ "403":
40617
+ content:
40618
+ application/problem+json:
40619
+ examples:
40620
+ AUTHORIZATION_DENIED:
40621
+ summary: AUTHORIZATION_DENIED
40622
+ value:
40623
+ code: AUTHORIZATION_DENIED
40624
+ correlationId: 018f0000-0000-7000-8000-000000000001
40625
+ detail: See the operation contract.
40626
+ errors: []
40627
+ retryable: false
40628
+ schemaId: urn:gala:schema:problem:2.0.0
40629
+ schemaVersion: 2.0.0
40630
+ status: 403
40631
+ title: AUTHORIZATION_DENIED
40632
+ type: urn:gala:problem:authorization-denied
40633
+ schema:
40634
+ $ref: "#/components/schemas/Problem"
40635
+ description: AUTHORIZATION_DENIED
40636
+ headers:
40637
+ Cache-Control:
40638
+ $ref: "#/components/headers/CacheControlNoStore"
40639
+ X-Correlation-Id:
40640
+ $ref: "#/components/headers/XCorrelationId"
40641
+ x-gala-problem-codes:
40642
+ - AUTHORIZATION_DENIED
40643
+ "404":
40644
+ content:
40645
+ application/problem+json:
40646
+ examples:
40647
+ RESOURCE_NOT_FOUND:
40648
+ summary: RESOURCE_NOT_FOUND
40649
+ value:
40650
+ code: RESOURCE_NOT_FOUND
40651
+ correlationId: 018f0000-0000-7000-8000-000000000001
40652
+ detail: See the operation contract.
40653
+ errors: []
40654
+ retryable: false
40655
+ schemaId: urn:gala:schema:problem:2.0.0
40656
+ schemaVersion: 2.0.0
40657
+ status: 404
40658
+ title: RESOURCE_NOT_FOUND
40659
+ type: urn:gala:problem:resource-not-found
40660
+ schema:
40661
+ $ref: "#/components/schemas/Problem"
40662
+ description: RESOURCE_NOT_FOUND
40663
+ headers:
40664
+ Cache-Control:
40665
+ $ref: "#/components/headers/CacheControlNoStore"
40666
+ X-Correlation-Id:
40667
+ $ref: "#/components/headers/XCorrelationId"
40668
+ x-gala-problem-codes:
40669
+ - RESOURCE_NOT_FOUND
40670
+ "429":
40671
+ content:
40672
+ application/problem+json:
40673
+ examples:
40674
+ RATE_LIMITED:
40675
+ summary: RATE_LIMITED
40676
+ value:
40677
+ code: RATE_LIMITED
40678
+ correlationId: 018f0000-0000-7000-8000-000000000001
40679
+ detail: See the operation contract.
40680
+ errors: []
40681
+ retryable: true
40682
+ schemaId: urn:gala:schema:problem:2.0.0
40683
+ schemaVersion: 2.0.0
40684
+ status: 429
40685
+ title: RATE_LIMITED
40686
+ type: urn:gala:problem:rate-limited
40687
+ schema:
40688
+ $ref: "#/components/schemas/Problem"
40689
+ description: RATE_LIMITED
40690
+ headers:
40691
+ Cache-Control:
40692
+ $ref: "#/components/headers/CacheControlNoStore"
40693
+ Retry-After:
40694
+ $ref: "#/components/headers/RetryAfter"
40695
+ X-Correlation-Id:
40696
+ $ref: "#/components/headers/XCorrelationId"
40697
+ x-gala-problem-codes:
40698
+ - RATE_LIMITED
40699
+ "503":
40700
+ content:
40701
+ application/problem+json:
40702
+ examples:
40703
+ CAPABILITY_UNAVAILABLE:
40704
+ summary: CAPABILITY_UNAVAILABLE
40705
+ value:
40706
+ code: CAPABILITY_UNAVAILABLE
40707
+ correlationId: 018f0000-0000-7000-8000-000000000001
40708
+ detail: See the operation contract.
40709
+ errors: []
40710
+ retryable: false
40711
+ schemaId: urn:gala:schema:problem:2.0.0
40712
+ schemaVersion: 2.0.0
40713
+ status: 503
40714
+ title: CAPABILITY_UNAVAILABLE
40715
+ type: urn:gala:problem:capability-unavailable
40716
+ DEPENDENCY_UNAVAILABLE:
40717
+ summary: DEPENDENCY_UNAVAILABLE
40718
+ value:
40719
+ code: DEPENDENCY_UNAVAILABLE
40720
+ correlationId: 018f0000-0000-7000-8000-000000000001
40721
+ detail: See the operation contract.
40722
+ errors: []
40723
+ retryable: true
40724
+ schemaId: urn:gala:schema:problem:2.0.0
40725
+ schemaVersion: 2.0.0
40726
+ status: 503
40727
+ title: DEPENDENCY_UNAVAILABLE
40728
+ type: urn:gala:problem:dependency-unavailable
40729
+ schema:
40730
+ $ref: "#/components/schemas/Problem"
40731
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
40732
+ headers:
40733
+ Cache-Control:
40734
+ $ref: "#/components/headers/CacheControlNoStore"
40735
+ X-Correlation-Id:
40736
+ $ref: "#/components/headers/XCorrelationId"
40737
+ x-gala-problem-codes:
40738
+ - CAPABILITY_UNAVAILABLE
40739
+ - DEPENDENCY_UNAVAILABLE
40740
+ security:
40741
+ - browserSession: []
40742
+ summary: list the history of one content document
40743
+ tags:
40744
+ - organizations
40745
+ x-gala-activation-gate: MVP
40746
+ x-gala-activation-guards:
40747
+ - Active repository binding and configured GitHub App identity capability
40748
+ x-gala-capability-key: publication.view
40749
+ x-gala-concurrency: binding-epoch
40750
+ x-gala-conditional-capabilities: []
40751
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
40752
+ x-gala-nullability: required-and-nullable-are-explicit
40753
+ x-gala-purpose: list the history of one content document
40754
+ x-gala-reachable-problems:
40755
+ - AUTHENTICATION_REQUIRED
40756
+ - AUTHORIZATION_DENIED
40757
+ - CAPABILITY_UNAVAILABLE
40758
+ - DEPENDENCY_UNAVAILABLE
40759
+ - RATE_LIMITED
40760
+ - RESOURCE_NOT_FOUND
40761
+ - VALIDATION_FAILED
40762
+ x-gala-replay-identity: safe-query
40763
+ x-gala-state-guards:
40764
+ - NONE
40765
+ x-gala-success-category: query
40766
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40767
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/link-preview:
40768
+ post:
40769
+ description: |
40770
+ Needs `publication.source.write`. The server fetches `url` (https only; never an address on a private or internal network, and at most a few redirects, each re-checked) and returns what the page says about itself, for the editor's bookmark card: `title`, `description`, `siteName` and `canonicalUrl`, from Open Graph or standard metadata. Each member is omitted when the page does not give one. No image is returned or fetched. A page that cannot be reached, is not HTML or is too large is `422 VALIDATION_FAILED` pointed at `/url`. Calls are rate-limited per caller (`429 RATE_LIMITED`).
40771
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreview
40772
+ parameters:
40773
+ - $ref: "#/components/parameters/XCorrelationId"
40774
+ - example: 018f0000-0000-7000-8000-000000000001
40775
+ in: path
40776
+ name: organizationId
40777
+ required: true
40778
+ schema:
40779
+ format: uuid
40780
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40781
+ type: string
40782
+ - example: 018f0000-0000-7000-8000-000000000001
40783
+ in: path
40784
+ name: publicationId
40785
+ required: true
40786
+ schema:
40787
+ format: uuid
40788
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40789
+ type: string
40790
+ - $ref: "#/components/parameters/XCsrfToken"
40791
+ requestBody:
40792
+ content:
40793
+ application/json:
40794
+ examples:
40795
+ nominal:
40796
+ summary: Nominal valid request
40797
+ value:
40798
+ url: https://example.com/article
40799
+ schema:
40800
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewRequest"
40801
+ required: true
40802
+ responses:
40803
+ "200":
40804
+ content:
40805
+ application/json:
40806
+ examples:
40807
+ nominal:
40808
+ summary: Nominal successful response
40809
+ value:
40810
+ canonicalUrl: https://example.com/article
40811
+ description: A short description of the page.
40812
+ siteName: Example
40813
+ title: Example article
40814
+ schema:
40815
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewResponse"
40816
+ description: preview one linked page succeeded
40817
+ headers:
40818
+ Cache-Control:
40819
+ $ref: "#/components/headers/CacheControlNoStore"
40820
+ X-Correlation-Id:
40821
+ $ref: "#/components/headers/XCorrelationId"
40822
+ "400":
40823
+ content:
40824
+ application/problem+json:
40825
+ examples:
40826
+ REQUEST_FIELD_UNKNOWN:
40827
+ summary: REQUEST_FIELD_UNKNOWN
40828
+ value:
40829
+ code: REQUEST_FIELD_UNKNOWN
40830
+ correlationId: 018f0000-0000-7000-8000-000000000001
40831
+ detail: See the operation contract.
40832
+ errors: []
40833
+ retryable: false
40834
+ schemaId: urn:gala:schema:problem:2.0.0
40835
+ schemaVersion: 2.0.0
40836
+ status: 400
40837
+ title: REQUEST_FIELD_UNKNOWN
40838
+ type: urn:gala:problem:request-field-unknown
40839
+ VALIDATION_FAILED:
40840
+ summary: VALIDATION_FAILED
40841
+ value:
40842
+ code: VALIDATION_FAILED
40843
+ correlationId: 018f0000-0000-7000-8000-000000000001
40844
+ detail: See the operation contract.
40845
+ errors: []
40846
+ retryable: false
40847
+ schemaId: urn:gala:schema:problem:2.0.0
40848
+ schemaVersion: 2.0.0
40849
+ status: 400
40850
+ title: VALIDATION_FAILED
40851
+ type: urn:gala:problem:validation-failed
40852
+ schema:
40853
+ $ref: "#/components/schemas/Problem"
40854
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
40855
+ headers:
40856
+ Cache-Control:
40857
+ $ref: "#/components/headers/CacheControlNoStore"
40858
+ X-Correlation-Id:
40859
+ $ref: "#/components/headers/XCorrelationId"
40860
+ x-gala-problem-codes:
40861
+ - REQUEST_FIELD_UNKNOWN
40862
+ - VALIDATION_FAILED
40863
+ "401":
40864
+ content:
40865
+ application/problem+json:
40866
+ examples:
40867
+ AUTHENTICATION_REQUIRED:
40868
+ summary: AUTHENTICATION_REQUIRED
40869
+ value:
40870
+ code: AUTHENTICATION_REQUIRED
40871
+ correlationId: 018f0000-0000-7000-8000-000000000001
40872
+ detail: See the operation contract.
40873
+ errors: []
40874
+ retryable: false
40875
+ schemaId: urn:gala:schema:problem:2.0.0
40876
+ schemaVersion: 2.0.0
40877
+ status: 401
40878
+ title: AUTHENTICATION_REQUIRED
40879
+ type: urn:gala:problem:authentication-required
40880
+ schema:
40881
+ $ref: "#/components/schemas/Problem"
40882
+ description: AUTHENTICATION_REQUIRED
40883
+ headers:
40884
+ Cache-Control:
40885
+ $ref: "#/components/headers/CacheControlNoStore"
40886
+ X-Correlation-Id:
40887
+ $ref: "#/components/headers/XCorrelationId"
40888
+ x-gala-problem-codes:
40889
+ - AUTHENTICATION_REQUIRED
40890
+ "403":
40891
+ content:
40892
+ application/problem+json:
40893
+ examples:
40894
+ AUTHORIZATION_DENIED:
40895
+ summary: AUTHORIZATION_DENIED
40896
+ value:
40897
+ code: AUTHORIZATION_DENIED
40898
+ correlationId: 018f0000-0000-7000-8000-000000000001
40899
+ detail: See the operation contract.
40900
+ errors: []
40901
+ retryable: false
40902
+ schemaId: urn:gala:schema:problem:2.0.0
40903
+ schemaVersion: 2.0.0
40904
+ status: 403
40905
+ title: AUTHORIZATION_DENIED
40906
+ type: urn:gala:problem:authorization-denied
40907
+ schema:
40908
+ $ref: "#/components/schemas/Problem"
40909
+ description: AUTHORIZATION_DENIED
40910
+ headers:
40911
+ Cache-Control:
40912
+ $ref: "#/components/headers/CacheControlNoStore"
40913
+ X-Correlation-Id:
40914
+ $ref: "#/components/headers/XCorrelationId"
40915
+ x-gala-problem-codes:
40916
+ - AUTHORIZATION_DENIED
40917
+ "404":
40918
+ content:
40919
+ application/problem+json:
40920
+ examples:
40921
+ RESOURCE_NOT_FOUND:
40922
+ summary: RESOURCE_NOT_FOUND
40923
+ value:
40924
+ code: RESOURCE_NOT_FOUND
40925
+ correlationId: 018f0000-0000-7000-8000-000000000001
40926
+ detail: See the operation contract.
40927
+ errors: []
40928
+ retryable: false
40929
+ schemaId: urn:gala:schema:problem:2.0.0
40930
+ schemaVersion: 2.0.0
40931
+ status: 404
40932
+ title: RESOURCE_NOT_FOUND
40933
+ type: urn:gala:problem:resource-not-found
40934
+ schema:
40935
+ $ref: "#/components/schemas/Problem"
40936
+ description: RESOURCE_NOT_FOUND
40937
+ headers:
40938
+ Cache-Control:
40939
+ $ref: "#/components/headers/CacheControlNoStore"
40940
+ X-Correlation-Id:
40941
+ $ref: "#/components/headers/XCorrelationId"
40942
+ x-gala-problem-codes:
40943
+ - RESOURCE_NOT_FOUND
40944
+ "422":
40945
+ content:
40946
+ application/problem+json:
40947
+ examples:
40948
+ VALIDATION_FAILED:
40949
+ summary: VALIDATION_FAILED
40950
+ value:
40951
+ code: VALIDATION_FAILED
40952
+ correlationId: 018f0000-0000-7000-8000-000000000001
40953
+ detail: The page could not be reached, is not an HTML page or is too large. See the operation contract.
40954
+ errors:
40955
+ - code: VALIDATION_FAILED
40956
+ pointer: /url
40957
+ retryable: false
40958
+ schemaId: urn:gala:schema:problem:2.0.0
40959
+ schemaVersion: 2.0.0
40960
+ status: 422
40961
+ title: VALIDATION_FAILED
40962
+ type: urn:gala:problem:validation-failed
40963
+ schema:
40964
+ $ref: "#/components/schemas/Problem"
40965
+ description: VALIDATION_FAILED
40966
+ headers:
40967
+ Cache-Control:
40968
+ $ref: "#/components/headers/CacheControlNoStore"
40969
+ X-Correlation-Id:
40970
+ $ref: "#/components/headers/XCorrelationId"
40971
+ x-gala-problem-codes:
40972
+ - VALIDATION_FAILED
40973
+ "429":
40974
+ content:
40975
+ application/problem+json:
40976
+ examples:
40977
+ RATE_LIMITED:
40978
+ summary: RATE_LIMITED
40979
+ value:
40980
+ code: RATE_LIMITED
40981
+ correlationId: 018f0000-0000-7000-8000-000000000001
40982
+ detail: See the operation contract.
40983
+ errors: []
40984
+ retryable: true
40985
+ schemaId: urn:gala:schema:problem:2.0.0
40986
+ schemaVersion: 2.0.0
40987
+ status: 429
40988
+ title: RATE_LIMITED
40989
+ type: urn:gala:problem:rate-limited
40990
+ schema:
40991
+ $ref: "#/components/schemas/Problem"
40992
+ description: RATE_LIMITED
40993
+ headers:
40994
+ Cache-Control:
40995
+ $ref: "#/components/headers/CacheControlNoStore"
40996
+ Retry-After:
40997
+ $ref: "#/components/headers/RetryAfter"
40998
+ X-Correlation-Id:
40999
+ $ref: "#/components/headers/XCorrelationId"
41000
+ x-gala-problem-codes:
41001
+ - RATE_LIMITED
41002
+ security:
41003
+ - browserSession: []
41004
+ summary: preview one linked page
41005
+ tags:
41006
+ - organizations
41007
+ x-gala-activation-gate: MVP
41008
+ x-gala-activation-guards:
41009
+ - NONE
41010
+ x-gala-capability-key: publication.source.write
41011
+ x-gala-concurrency: authorization-and-publication-epochs
41012
+ x-gala-conditional-capabilities: []
41013
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
41014
+ x-gala-nullability: required-and-nullable-are-explicit
41015
+ x-gala-purpose: preview one linked page
41016
+ x-gala-reachable-problems:
41017
+ - AUTHENTICATION_REQUIRED
41018
+ - AUTHORIZATION_DENIED
41019
+ - RATE_LIMITED
41020
+ - REQUEST_FIELD_UNKNOWN
41021
+ - RESOURCE_NOT_FOUND
41022
+ - VALIDATION_FAILED
41023
+ x-gala-replay-identity: natural-idempotent-state
41024
+ x-gala-state-guards:
41025
+ - NONE
41026
+ x-gala-success-category: query
41027
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40054
41028
  /v2/organizations/{organizationId}/publications/{publicationId}/content/preview-context:
40055
41029
  get:
40056
41030
  description: |
@@ -48721,6 +49695,11 @@ paths:
48721
49695
  removed and settles the appeal `DENIED` (`note` optional, at most 1000
48722
49696
  characters). `DENY_APPEAL` without a pending appeal is `409
48723
49697
  INVALID_DECISION`. Only a person decides an appeal.
49698
+ SCHEMA-3.32.0: `PIN` pins a visible root comment to the top of its
49699
+ article's comments (at most one pinned comment per article; pinning
49700
+ another moves the pin) and `UNPIN` releases it; on any other comment, or
49701
+ when the comment is already in the asked state, they are `409
49702
+ INVALID_DECISION`.
48724
49703
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecide
48725
49704
  parameters:
48726
49705
  - $ref: "#/components/parameters/XCorrelationId"
@@ -50054,6 +51033,164 @@ paths:
50054
51033
  - NONE
50055
51034
  x-gala-success-category: protocol
50056
51035
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
51036
+ /v2/organizations/{organizationId}/publications/{publicationId}/newsletter-subscribers:import:
51037
+ post:
51038
+ description: |
51039
+ Needs `publication.audience.manage`. The body is the addresses the owner's file held, already parsed by the App (at most 5000 per call), with `attestation: true`: the owner states that every address agreed to hear from them. Each address that is new becomes a `pending` subscriber and is sent the same confirmation email a reader who signs up receives; nobody is subscribed until they confirm. An address that is already known (`pending`, `confirmed`, `unsubscribed` or `suppressed`) is skipped and counted in `skippedKnown`, so repeating a call is harmless. `invalid` counts entries that are not usable addresses and `overCapacity` those left out because the organization's subscriber allowance was reached. A call without `attestation: true` is `400 VALIDATION_FAILED`.
51040
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImport
51041
+ parameters:
51042
+ - $ref: "#/components/parameters/XCorrelationId"
51043
+ - example: 018f0000-0000-7000-8000-000000000001
51044
+ in: path
51045
+ name: organizationId
51046
+ required: true
51047
+ schema:
51048
+ format: uuid
51049
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
51050
+ type: string
51051
+ - example: 018f0000-0000-7000-8000-000000000001
51052
+ in: path
51053
+ name: publicationId
51054
+ required: true
51055
+ schema:
51056
+ format: uuid
51057
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
51058
+ type: string
51059
+ - $ref: "#/components/parameters/XCsrfToken"
51060
+ requestBody:
51061
+ content:
51062
+ application/json:
51063
+ examples:
51064
+ nominal:
51065
+ summary: Nominal valid request
51066
+ value:
51067
+ addresses:
51068
+ - reader@example.com
51069
+ attestation: true
51070
+ schema:
51071
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportRequest"
51072
+ required: true
51073
+ responses:
51074
+ "202":
51075
+ content:
51076
+ application/json:
51077
+ examples:
51078
+ nominal:
51079
+ summary: Nominal successful response
51080
+ value:
51081
+ invalid: 0
51082
+ overCapacity: 0
51083
+ queued: 1
51084
+ skippedKnown: 0
51085
+ schema:
51086
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportResponse"
51087
+ description: import a site's newsletter subscribers succeeded
51088
+ headers:
51089
+ Cache-Control:
51090
+ $ref: "#/components/headers/CacheControlNoStore"
51091
+ X-Correlation-Id:
51092
+ $ref: "#/components/headers/XCorrelationId"
51093
+ "400":
51094
+ content:
51095
+ application/problem+json:
51096
+ examples:
51097
+ REQUEST_FIELD_UNKNOWN:
51098
+ summary: REQUEST_FIELD_UNKNOWN
51099
+ value:
51100
+ code: REQUEST_FIELD_UNKNOWN
51101
+ correlationId: 018f0000-0000-7000-8000-000000000001
51102
+ detail: See the operation contract.
51103
+ errors: []
51104
+ retryable: false
51105
+ schemaId: urn:gala:schema:problem:2.0.0
51106
+ schemaVersion: 2.0.0
51107
+ status: 400
51108
+ title: REQUEST_FIELD_UNKNOWN
51109
+ type: urn:gala:problem:request-field-unknown
51110
+ VALIDATION_FAILED:
51111
+ summary: VALIDATION_FAILED
51112
+ value:
51113
+ code: VALIDATION_FAILED
51114
+ correlationId: 018f0000-0000-7000-8000-000000000001
51115
+ detail: See the operation contract.
51116
+ errors: []
51117
+ retryable: false
51118
+ schemaId: urn:gala:schema:problem:2.0.0
51119
+ schemaVersion: 2.0.0
51120
+ status: 400
51121
+ title: VALIDATION_FAILED
51122
+ type: urn:gala:problem:validation-failed
51123
+ schema:
51124
+ $ref: "#/components/schemas/Problem"
51125
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
51126
+ headers:
51127
+ Cache-Control:
51128
+ $ref: "#/components/headers/CacheControlNoStore"
51129
+ X-Correlation-Id:
51130
+ $ref: "#/components/headers/XCorrelationId"
51131
+ x-gala-problem-codes:
51132
+ - REQUEST_FIELD_UNKNOWN
51133
+ - VALIDATION_FAILED
51134
+ "401":
51135
+ content:
51136
+ application/problem+json:
51137
+ examples:
51138
+ AUTHENTICATION_REQUIRED:
51139
+ summary: AUTHENTICATION_REQUIRED
51140
+ value:
51141
+ code: AUTHENTICATION_REQUIRED
51142
+ correlationId: 018f0000-0000-7000-8000-000000000001
51143
+ detail: See the operation contract.
51144
+ errors: []
51145
+ retryable: false
51146
+ schemaId: urn:gala:schema:problem:2.0.0
51147
+ schemaVersion: 2.0.0
51148
+ status: 401
51149
+ title: AUTHENTICATION_REQUIRED
51150
+ type: urn:gala:problem:authentication-required
51151
+ schema:
51152
+ $ref: "#/components/schemas/Problem"
51153
+ description: AUTHENTICATION_REQUIRED
51154
+ headers:
51155
+ Cache-Control:
51156
+ $ref: "#/components/headers/CacheControlNoStore"
51157
+ X-Correlation-Id:
51158
+ $ref: "#/components/headers/XCorrelationId"
51159
+ x-gala-problem-codes:
51160
+ - AUTHENTICATION_REQUIRED
51161
+ "403":
51162
+ $ref: "#/components/responses/AuthorizationDenied"
51163
+ "404":
51164
+ $ref: "#/components/responses/ResourceNotFound"
51165
+ "413":
51166
+ $ref: "#/components/responses/RequestTooLarge"
51167
+ "415":
51168
+ $ref: "#/components/responses/UnsupportedMediaType"
51169
+ security:
51170
+ - browserSession: []
51171
+ summary: import a site's newsletter subscribers
51172
+ tags:
51173
+ - audience
51174
+ x-gala-activation-gate: MVP
51175
+ x-gala-activation-guards:
51176
+ - NONE
51177
+ x-gala-capability-key: publication.audience.manage
51178
+ x-gala-concurrency: authorization-and-publication-epochs
51179
+ x-gala-conditional-capabilities: []
51180
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
51181
+ x-gala-nullability: required-and-nullable-are-explicit
51182
+ x-gala-purpose: import a site's newsletter subscribers
51183
+ x-gala-reachable-problems:
51184
+ - AUTHENTICATION_REQUIRED
51185
+ - AUTHORIZATION_DENIED
51186
+ - REQUEST_FIELD_UNKNOWN
51187
+ - RESOURCE_NOT_FOUND
51188
+ - VALIDATION_FAILED
51189
+ x-gala-replay-identity: natural-idempotent-state
51190
+ x-gala-state-guards:
51191
+ - NONE
51192
+ x-gala-success-category: async
51193
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
50057
51194
  /v2/organizations/{organizationId}/publications/{publicationId}/overview:
50058
51195
  get:
50059
51196
  description: |
@@ -65946,7 +67083,7 @@ paths:
65946
67083
  required: false
65947
67084
  schema:
65948
67085
  $ref: "#/components/schemas/PlatformPersonState"
65949
- - description: Case-insensitive match against person id, display name, or login.
67086
+ - description: Case-insensitive match against person id, display name, or login. A search containing "@" also matches a person whose contact email on file equals it exactly (case-insensitive).
65950
67087
  example: ada
65951
67088
  in: query
65952
67089
  name: search
@@ -65967,7 +67104,8 @@ paths:
65967
67104
  value:
65968
67105
  hasMore: false
65969
67106
  items:
65970
- - contactEmailOnFile: true
67107
+ - contactEmail: ada@example.com
67108
+ contactEmailOnFile: true
65971
67109
  createdAt: "2026-09-01T12:00:00.000Z"
65972
67110
  displayName: Ada Reader
65973
67111
  lastSignInAt: "2026-10-10T11:30:00.000Z"
@@ -66392,10 +67530,550 @@ paths:
66392
67530
  content:
66393
67531
  application/problem+json:
66394
67532
  examples:
66395
- NOT_COMMENT_AUTHOR:
66396
- summary: NOT_COMMENT_AUTHOR
67533
+ NOT_COMMENT_AUTHOR:
67534
+ summary: NOT_COMMENT_AUTHOR
67535
+ value:
67536
+ code: NOT_COMMENT_AUTHOR
67537
+ correlationId: 018f0000-0000-7000-8000-000000000001
67538
+ detail: See the operation contract.
67539
+ errors: []
67540
+ retryable: false
67541
+ schemaId: urn:gala:schema:problem:2.0.0
67542
+ schemaVersion: 2.0.0
67543
+ status: 403
67544
+ title: NOT_COMMENT_AUTHOR
67545
+ type: urn:gala:problem:not-comment-author
67546
+ READER_TOKEN_SCOPE:
67547
+ summary: READER_TOKEN_SCOPE
67548
+ value:
67549
+ code: READER_TOKEN_SCOPE
67550
+ correlationId: 018f0000-0000-7000-8000-000000000001
67551
+ detail: See the operation contract.
67552
+ errors: []
67553
+ retryable: false
67554
+ schemaId: urn:gala:schema:problem:2.0.0
67555
+ schemaVersion: 2.0.0
67556
+ status: 403
67557
+ title: READER_TOKEN_SCOPE
67558
+ type: urn:gala:problem:reader-token-scope
67559
+ schema:
67560
+ $ref: "#/components/schemas/Problem"
67561
+ description: NOT_COMMENT_AUTHOR, READER_TOKEN_SCOPE
67562
+ headers:
67563
+ Cache-Control:
67564
+ $ref: "#/components/headers/CacheControlNoStore"
67565
+ X-Correlation-Id:
67566
+ $ref: "#/components/headers/XCorrelationId"
67567
+ x-gala-problem-codes:
67568
+ - NOT_COMMENT_AUTHOR
67569
+ - READER_TOKEN_SCOPE
67570
+ "404":
67571
+ content:
67572
+ application/problem+json:
67573
+ examples:
67574
+ COMMENT_NOT_FOUND:
67575
+ summary: COMMENT_NOT_FOUND
67576
+ value:
67577
+ code: COMMENT_NOT_FOUND
67578
+ correlationId: 018f0000-0000-7000-8000-000000000001
67579
+ detail: See the operation contract.
67580
+ errors: []
67581
+ retryable: false
67582
+ schemaId: urn:gala:schema:problem:2.0.0
67583
+ schemaVersion: 2.0.0
67584
+ status: 404
67585
+ title: COMMENT_NOT_FOUND
67586
+ type: urn:gala:problem:comment-not-found
67587
+ schema:
67588
+ $ref: "#/components/schemas/Problem"
67589
+ description: COMMENT_NOT_FOUND
67590
+ headers:
67591
+ Cache-Control:
67592
+ $ref: "#/components/headers/CacheControlNoStore"
67593
+ X-Correlation-Id:
67594
+ $ref: "#/components/headers/XCorrelationId"
67595
+ x-gala-problem-codes:
67596
+ - COMMENT_NOT_FOUND
67597
+ security:
67598
+ - readerBearer: []
67599
+ summary: delete the reader's own comment
67600
+ tags:
67601
+ - public-interactions
67602
+ x-gala-activation-gate: MVP
67603
+ x-gala-activation-guards:
67604
+ - NONE
67605
+ x-gala-capability-key: null
67606
+ x-gala-concurrency: none
67607
+ x-gala-conditional-capabilities: []
67608
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
67609
+ x-gala-nullability: required-and-nullable-are-explicit
67610
+ x-gala-purpose: delete the reader's own comment
67611
+ x-gala-reachable-problems:
67612
+ - COMMENT_NOT_FOUND
67613
+ - NOT_COMMENT_AUTHOR
67614
+ - READER_AUTHENTICATION_REQUIRED
67615
+ - READER_TOKEN_SCOPE
67616
+ - VALIDATION_FAILED
67617
+ x-gala-replay-identity: natural-idempotent-state
67618
+ x-gala-state-guards:
67619
+ - NONE
67620
+ x-gala-success-category: delete
67621
+ x-gala-tenant-scope: NONE
67622
+ /v2/public/comments/{commentId}/appeals:
67623
+ post:
67624
+ description: |
67625
+ The comment's author asks the moderators to look again at a removal or
67626
+ hold. One appeal per removal: `409 APPEAL_EXISTS` when one was already
67627
+ made against the current removal; `409 APPEAL_NOT_ALLOWED` when the
67628
+ comment is not removed or held, or the reader is not its author. At most
67629
+ 5 appeals a day per reader (`429 RATE_LIMITED`). A human decides; the
67630
+ answer shows under the comment.
67631
+ operationId: postPublicCommentsByCommentIdAppeals
67632
+ parameters:
67633
+ - $ref: "#/components/parameters/XCorrelationId"
67634
+ - example: 018f0000-0000-7000-8000-000000000001
67635
+ in: path
67636
+ name: commentId
67637
+ required: true
67638
+ schema:
67639
+ format: uuid
67640
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
67641
+ type: string
67642
+ requestBody:
67643
+ content:
67644
+ application/json:
67645
+ examples:
67646
+ nominal:
67647
+ summary: Nominal valid request
67648
+ value:
67649
+ note: The link was to my own project page, not spam.
67650
+ schema:
67651
+ $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsRequest"
67652
+ required: true
67653
+ responses:
67654
+ "202":
67655
+ content:
67656
+ application/json:
67657
+ examples:
67658
+ nominal:
67659
+ summary: Nominal successful response
67660
+ value:
67661
+ status: RECEIVED
67662
+ schema:
67663
+ $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsResponse"
67664
+ description: appeal the removal of my comment succeeded
67665
+ headers:
67666
+ Cache-Control:
67667
+ $ref: "#/components/headers/CacheControlNoStore"
67668
+ X-Correlation-Id:
67669
+ $ref: "#/components/headers/XCorrelationId"
67670
+ "400":
67671
+ content:
67672
+ application/problem+json:
67673
+ examples:
67674
+ REQUEST_FIELD_UNKNOWN:
67675
+ summary: REQUEST_FIELD_UNKNOWN
67676
+ value:
67677
+ code: REQUEST_FIELD_UNKNOWN
67678
+ correlationId: 018f0000-0000-7000-8000-000000000001
67679
+ detail: See the operation contract.
67680
+ errors: []
67681
+ retryable: false
67682
+ schemaId: urn:gala:schema:problem:2.0.0
67683
+ schemaVersion: 2.0.0
67684
+ status: 400
67685
+ title: REQUEST_FIELD_UNKNOWN
67686
+ type: urn:gala:problem:request-field-unknown
67687
+ VALIDATION_FAILED:
67688
+ summary: VALIDATION_FAILED
67689
+ value:
67690
+ code: VALIDATION_FAILED
67691
+ correlationId: 018f0000-0000-7000-8000-000000000001
67692
+ detail: See the operation contract.
67693
+ errors: []
67694
+ retryable: false
67695
+ schemaId: urn:gala:schema:problem:2.0.0
67696
+ schemaVersion: 2.0.0
67697
+ status: 400
67698
+ title: VALIDATION_FAILED
67699
+ type: urn:gala:problem:validation-failed
67700
+ schema:
67701
+ $ref: "#/components/schemas/Problem"
67702
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
67703
+ headers:
67704
+ Cache-Control:
67705
+ $ref: "#/components/headers/CacheControlNoStore"
67706
+ X-Correlation-Id:
67707
+ $ref: "#/components/headers/XCorrelationId"
67708
+ x-gala-problem-codes:
67709
+ - REQUEST_FIELD_UNKNOWN
67710
+ - VALIDATION_FAILED
67711
+ "401":
67712
+ content:
67713
+ application/problem+json:
67714
+ examples:
67715
+ READER_AUTHENTICATION_REQUIRED:
67716
+ summary: READER_AUTHENTICATION_REQUIRED
67717
+ value:
67718
+ code: READER_AUTHENTICATION_REQUIRED
67719
+ correlationId: 018f0000-0000-7000-8000-000000000001
67720
+ detail: See the operation contract.
67721
+ errors: []
67722
+ retryable: false
67723
+ schemaId: urn:gala:schema:problem:2.0.0
67724
+ schemaVersion: 2.0.0
67725
+ status: 401
67726
+ title: READER_AUTHENTICATION_REQUIRED
67727
+ type: urn:gala:problem:reader-authentication-required
67728
+ schema:
67729
+ $ref: "#/components/schemas/Problem"
67730
+ description: READER_AUTHENTICATION_REQUIRED
67731
+ headers:
67732
+ Cache-Control:
67733
+ $ref: "#/components/headers/CacheControlNoStore"
67734
+ X-Correlation-Id:
67735
+ $ref: "#/components/headers/XCorrelationId"
67736
+ x-gala-problem-codes:
67737
+ - READER_AUTHENTICATION_REQUIRED
67738
+ "403":
67739
+ content:
67740
+ application/problem+json:
67741
+ examples:
67742
+ READER_TOKEN_SCOPE:
67743
+ summary: READER_TOKEN_SCOPE
67744
+ value:
67745
+ code: READER_TOKEN_SCOPE
67746
+ correlationId: 018f0000-0000-7000-8000-000000000001
67747
+ detail: See the operation contract.
67748
+ errors: []
67749
+ retryable: false
67750
+ schemaId: urn:gala:schema:problem:2.0.0
67751
+ schemaVersion: 2.0.0
67752
+ status: 403
67753
+ title: READER_TOKEN_SCOPE
67754
+ type: urn:gala:problem:reader-token-scope
67755
+ schema:
67756
+ $ref: "#/components/schemas/Problem"
67757
+ description: READER_TOKEN_SCOPE
67758
+ headers:
67759
+ Cache-Control:
67760
+ $ref: "#/components/headers/CacheControlNoStore"
67761
+ X-Correlation-Id:
67762
+ $ref: "#/components/headers/XCorrelationId"
67763
+ x-gala-problem-codes:
67764
+ - READER_TOKEN_SCOPE
67765
+ "404":
67766
+ content:
67767
+ application/problem+json:
67768
+ examples:
67769
+ COMMENT_NOT_FOUND:
67770
+ summary: COMMENT_NOT_FOUND
67771
+ value:
67772
+ code: COMMENT_NOT_FOUND
67773
+ correlationId: 018f0000-0000-7000-8000-000000000001
67774
+ detail: See the operation contract.
67775
+ errors: []
67776
+ retryable: false
67777
+ schemaId: urn:gala:schema:problem:2.0.0
67778
+ schemaVersion: 2.0.0
67779
+ status: 404
67780
+ title: COMMENT_NOT_FOUND
67781
+ type: urn:gala:problem:comment-not-found
67782
+ schema:
67783
+ $ref: "#/components/schemas/Problem"
67784
+ description: COMMENT_NOT_FOUND
67785
+ headers:
67786
+ Cache-Control:
67787
+ $ref: "#/components/headers/CacheControlNoStore"
67788
+ X-Correlation-Id:
67789
+ $ref: "#/components/headers/XCorrelationId"
67790
+ x-gala-problem-codes:
67791
+ - COMMENT_NOT_FOUND
67792
+ "409":
67793
+ content:
67794
+ application/problem+json:
67795
+ examples:
67796
+ APPEAL_EXISTS:
67797
+ summary: APPEAL_EXISTS
67798
+ value:
67799
+ code: APPEAL_EXISTS
67800
+ correlationId: 018f0000-0000-7000-8000-000000000001
67801
+ detail: See the operation contract.
67802
+ errors: []
67803
+ retryable: false
67804
+ schemaId: urn:gala:schema:problem:2.0.0
67805
+ schemaVersion: 2.0.0
67806
+ status: 409
67807
+ title: APPEAL_EXISTS
67808
+ type: urn:gala:problem:appeal-exists
67809
+ APPEAL_NOT_ALLOWED:
67810
+ summary: APPEAL_NOT_ALLOWED
67811
+ value:
67812
+ code: APPEAL_NOT_ALLOWED
67813
+ correlationId: 018f0000-0000-7000-8000-000000000001
67814
+ detail: See the operation contract.
67815
+ errors: []
67816
+ retryable: false
67817
+ schemaId: urn:gala:schema:problem:2.0.0
67818
+ schemaVersion: 2.0.0
67819
+ status: 409
67820
+ title: APPEAL_NOT_ALLOWED
67821
+ type: urn:gala:problem:appeal-not-allowed
67822
+ schema:
67823
+ $ref: "#/components/schemas/Problem"
67824
+ description: APPEAL_EXISTS, APPEAL_NOT_ALLOWED
67825
+ headers:
67826
+ Cache-Control:
67827
+ $ref: "#/components/headers/CacheControlNoStore"
67828
+ X-Correlation-Id:
67829
+ $ref: "#/components/headers/XCorrelationId"
67830
+ x-gala-problem-codes:
67831
+ - APPEAL_EXISTS
67832
+ - APPEAL_NOT_ALLOWED
67833
+ "429":
67834
+ content:
67835
+ application/problem+json:
67836
+ examples:
67837
+ RATE_LIMITED:
67838
+ summary: RATE_LIMITED
67839
+ value:
67840
+ code: RATE_LIMITED
67841
+ correlationId: 018f0000-0000-7000-8000-000000000001
67842
+ detail: See the operation contract.
67843
+ errors: []
67844
+ retryable: true
67845
+ schemaId: urn:gala:schema:problem:2.0.0
67846
+ schemaVersion: 2.0.0
67847
+ status: 429
67848
+ title: RATE_LIMITED
67849
+ type: urn:gala:problem:rate-limited
67850
+ schema:
67851
+ $ref: "#/components/schemas/Problem"
67852
+ description: RATE_LIMITED
67853
+ headers:
67854
+ Cache-Control:
67855
+ $ref: "#/components/headers/CacheControlNoStore"
67856
+ Retry-After:
67857
+ $ref: "#/components/headers/RetryAfter"
67858
+ X-Correlation-Id:
67859
+ $ref: "#/components/headers/XCorrelationId"
67860
+ x-gala-problem-codes:
67861
+ - RATE_LIMITED
67862
+ security:
67863
+ - readerBearer: []
67864
+ summary: appeal the removal of my comment
67865
+ tags:
67866
+ - public-interactions
67867
+ x-gala-activation-gate: MVP
67868
+ x-gala-activation-guards:
67869
+ - NONE
67870
+ x-gala-capability-key: null
67871
+ x-gala-concurrency: none
67872
+ x-gala-conditional-capabilities: []
67873
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
67874
+ x-gala-nullability: required-and-nullable-are-explicit
67875
+ x-gala-purpose: appeal the removal of my comment
67876
+ x-gala-reachable-problems:
67877
+ - APPEAL_EXISTS
67878
+ - APPEAL_NOT_ALLOWED
67879
+ - COMMENT_NOT_FOUND
67880
+ - RATE_LIMITED
67881
+ - READER_AUTHENTICATION_REQUIRED
67882
+ - READER_TOKEN_SCOPE
67883
+ - REQUEST_FIELD_UNKNOWN
67884
+ - VALIDATION_FAILED
67885
+ x-gala-replay-identity: one-appeal-per-removal
67886
+ x-gala-state-guards:
67887
+ - NONE
67888
+ x-gala-success-category: async
67889
+ x-gala-tenant-scope: NONE
67890
+ /v2/public/comments/{commentId}/like:
67891
+ delete:
67892
+ description: "SCHEMA-3.32.0: the signed-in reader withdraws their like. Always allowed, even when likes have since been turned off, and harmless when there is no like (`204` both times)."
67893
+ operationId: deletePublicCommentsByCommentIdLike
67894
+ parameters:
67895
+ - $ref: "#/components/parameters/XCorrelationId"
67896
+ - example: 018f0000-0000-7000-8000-000000000001
67897
+ in: path
67898
+ name: commentId
67899
+ required: true
67900
+ schema:
67901
+ format: uuid
67902
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
67903
+ type: string
67904
+ responses:
67905
+ "204":
67906
+ description: withdraw the signed-in reader's like on one comment succeeded
67907
+ headers:
67908
+ Cache-Control:
67909
+ $ref: "#/components/headers/CacheControlNoStore"
67910
+ X-Correlation-Id:
67911
+ $ref: "#/components/headers/XCorrelationId"
67912
+ "400":
67913
+ $ref: "#/components/responses/ValidationFailed"
67914
+ "401":
67915
+ content:
67916
+ application/problem+json:
67917
+ examples:
67918
+ READER_AUTHENTICATION_REQUIRED:
67919
+ summary: READER_AUTHENTICATION_REQUIRED
67920
+ value:
67921
+ code: READER_AUTHENTICATION_REQUIRED
67922
+ correlationId: 018f0000-0000-7000-8000-000000000001
67923
+ detail: See the operation contract.
67924
+ errors: []
67925
+ retryable: false
67926
+ schemaId: urn:gala:schema:problem:2.0.0
67927
+ schemaVersion: 2.0.0
67928
+ status: 401
67929
+ title: READER_AUTHENTICATION_REQUIRED
67930
+ type: urn:gala:problem:reader-authentication-required
67931
+ schema:
67932
+ $ref: "#/components/schemas/Problem"
67933
+ description: READER_AUTHENTICATION_REQUIRED
67934
+ headers:
67935
+ Cache-Control:
67936
+ $ref: "#/components/headers/CacheControlNoStore"
67937
+ X-Correlation-Id:
67938
+ $ref: "#/components/headers/XCorrelationId"
67939
+ x-gala-problem-codes:
67940
+ - READER_AUTHENTICATION_REQUIRED
67941
+ "403":
67942
+ content:
67943
+ application/problem+json:
67944
+ examples:
67945
+ READER_TOKEN_SCOPE:
67946
+ summary: READER_TOKEN_SCOPE
67947
+ value:
67948
+ code: READER_TOKEN_SCOPE
67949
+ correlationId: 018f0000-0000-7000-8000-000000000001
67950
+ detail: See the operation contract.
67951
+ errors: []
67952
+ retryable: false
67953
+ schemaId: urn:gala:schema:problem:2.0.0
67954
+ schemaVersion: 2.0.0
67955
+ status: 403
67956
+ title: READER_TOKEN_SCOPE
67957
+ type: urn:gala:problem:reader-token-scope
67958
+ schema:
67959
+ $ref: "#/components/schemas/Problem"
67960
+ description: READER_TOKEN_SCOPE
67961
+ headers:
67962
+ Cache-Control:
67963
+ $ref: "#/components/headers/CacheControlNoStore"
67964
+ X-Correlation-Id:
67965
+ $ref: "#/components/headers/XCorrelationId"
67966
+ x-gala-problem-codes:
67967
+ - READER_TOKEN_SCOPE
67968
+ "404":
67969
+ content:
67970
+ application/problem+json:
67971
+ examples:
67972
+ COMMENT_NOT_FOUND:
67973
+ summary: COMMENT_NOT_FOUND
67974
+ value:
67975
+ code: COMMENT_NOT_FOUND
67976
+ correlationId: 018f0000-0000-7000-8000-000000000001
67977
+ detail: See the operation contract.
67978
+ errors: []
67979
+ retryable: false
67980
+ schemaId: urn:gala:schema:problem:2.0.0
67981
+ schemaVersion: 2.0.0
67982
+ status: 404
67983
+ title: COMMENT_NOT_FOUND
67984
+ type: urn:gala:problem:comment-not-found
67985
+ schema:
67986
+ $ref: "#/components/schemas/Problem"
67987
+ description: COMMENT_NOT_FOUND
67988
+ headers:
67989
+ Cache-Control:
67990
+ $ref: "#/components/headers/CacheControlNoStore"
67991
+ X-Correlation-Id:
67992
+ $ref: "#/components/headers/XCorrelationId"
67993
+ x-gala-problem-codes:
67994
+ - COMMENT_NOT_FOUND
67995
+ security:
67996
+ - readerBearer: []
67997
+ summary: withdraw the signed-in reader's like on one comment
67998
+ tags:
67999
+ - public-interactions
68000
+ x-gala-activation-gate: MVP
68001
+ x-gala-activation-guards:
68002
+ - NONE
68003
+ x-gala-capability-key: null
68004
+ x-gala-concurrency: none
68005
+ x-gala-conditional-capabilities: []
68006
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
68007
+ x-gala-nullability: required-and-nullable-are-explicit
68008
+ x-gala-purpose: withdraw the signed-in reader's like on one comment
68009
+ x-gala-reachable-problems:
68010
+ - COMMENT_NOT_FOUND
68011
+ - READER_AUTHENTICATION_REQUIRED
68012
+ - READER_TOKEN_SCOPE
68013
+ - VALIDATION_FAILED
68014
+ x-gala-replay-identity: natural-idempotent-state
68015
+ x-gala-state-guards:
68016
+ - NONE
68017
+ x-gala-success-category: delete
68018
+ x-gala-tenant-scope: NONE
68019
+ put:
68020
+ description: "SCHEMA-3.32.0: the signed-in reader likes the comment. Liking again is harmless (`204` both times). Needs `comments.likes` on in the site's interactions configuration, otherwise `404 INTERACTIONS_DISABLED`. A removed, held or deleted comment cannot be liked (`404 COMMENT_NOT_FOUND`)."
68021
+ operationId: putPublicCommentsByCommentIdLike
68022
+ parameters:
68023
+ - $ref: "#/components/parameters/XCorrelationId"
68024
+ - example: 018f0000-0000-7000-8000-000000000001
68025
+ in: path
68026
+ name: commentId
68027
+ required: true
68028
+ schema:
68029
+ format: uuid
68030
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
68031
+ type: string
68032
+ responses:
68033
+ "204":
68034
+ description: like one comment as the signed-in reader succeeded
68035
+ headers:
68036
+ Cache-Control:
68037
+ $ref: "#/components/headers/CacheControlNoStore"
68038
+ X-Correlation-Id:
68039
+ $ref: "#/components/headers/XCorrelationId"
68040
+ "400":
68041
+ $ref: "#/components/responses/ValidationFailed"
68042
+ "401":
68043
+ content:
68044
+ application/problem+json:
68045
+ examples:
68046
+ READER_AUTHENTICATION_REQUIRED:
68047
+ summary: READER_AUTHENTICATION_REQUIRED
68048
+ value:
68049
+ code: READER_AUTHENTICATION_REQUIRED
68050
+ correlationId: 018f0000-0000-7000-8000-000000000001
68051
+ detail: See the operation contract.
68052
+ errors: []
68053
+ retryable: false
68054
+ schemaId: urn:gala:schema:problem:2.0.0
68055
+ schemaVersion: 2.0.0
68056
+ status: 401
68057
+ title: READER_AUTHENTICATION_REQUIRED
68058
+ type: urn:gala:problem:reader-authentication-required
68059
+ schema:
68060
+ $ref: "#/components/schemas/Problem"
68061
+ description: READER_AUTHENTICATION_REQUIRED
68062
+ headers:
68063
+ Cache-Control:
68064
+ $ref: "#/components/headers/CacheControlNoStore"
68065
+ X-Correlation-Id:
68066
+ $ref: "#/components/headers/XCorrelationId"
68067
+ x-gala-problem-codes:
68068
+ - READER_AUTHENTICATION_REQUIRED
68069
+ "403":
68070
+ content:
68071
+ application/problem+json:
68072
+ examples:
68073
+ READER_RESTRICTED:
68074
+ summary: READER_RESTRICTED
66397
68075
  value:
66398
- code: NOT_COMMENT_AUTHOR
68076
+ code: READER_RESTRICTED
66399
68077
  correlationId: 018f0000-0000-7000-8000-000000000001
66400
68078
  detail: See the operation contract.
66401
68079
  errors: []
@@ -66403,8 +68081,8 @@ paths:
66403
68081
  schemaId: urn:gala:schema:problem:2.0.0
66404
68082
  schemaVersion: 2.0.0
66405
68083
  status: 403
66406
- title: NOT_COMMENT_AUTHOR
66407
- type: urn:gala:problem:not-comment-author
68084
+ title: READER_RESTRICTED
68085
+ type: urn:gala:problem:reader-restricted
66408
68086
  READER_TOKEN_SCOPE:
66409
68087
  summary: READER_TOKEN_SCOPE
66410
68088
  value:
@@ -66420,14 +68098,14 @@ paths:
66420
68098
  type: urn:gala:problem:reader-token-scope
66421
68099
  schema:
66422
68100
  $ref: "#/components/schemas/Problem"
66423
- description: NOT_COMMENT_AUTHOR, READER_TOKEN_SCOPE
68101
+ description: READER_RESTRICTED, READER_TOKEN_SCOPE
66424
68102
  headers:
66425
68103
  Cache-Control:
66426
68104
  $ref: "#/components/headers/CacheControlNoStore"
66427
68105
  X-Correlation-Id:
66428
68106
  $ref: "#/components/headers/XCorrelationId"
66429
68107
  x-gala-problem-codes:
66430
- - NOT_COMMENT_AUTHOR
68108
+ - READER_RESTRICTED
66431
68109
  - READER_TOKEN_SCOPE
66432
68110
  "404":
66433
68111
  content:
@@ -66446,192 +68124,10 @@ paths:
66446
68124
  status: 404
66447
68125
  title: COMMENT_NOT_FOUND
66448
68126
  type: urn:gala:problem:comment-not-found
66449
- schema:
66450
- $ref: "#/components/schemas/Problem"
66451
- description: COMMENT_NOT_FOUND
66452
- headers:
66453
- Cache-Control:
66454
- $ref: "#/components/headers/CacheControlNoStore"
66455
- X-Correlation-Id:
66456
- $ref: "#/components/headers/XCorrelationId"
66457
- x-gala-problem-codes:
66458
- - COMMENT_NOT_FOUND
66459
- security:
66460
- - readerBearer: []
66461
- summary: delete the reader's own comment
66462
- tags:
66463
- - public-interactions
66464
- x-gala-activation-gate: MVP
66465
- x-gala-activation-guards:
66466
- - NONE
66467
- x-gala-capability-key: null
66468
- x-gala-concurrency: none
66469
- x-gala-conditional-capabilities: []
66470
- x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
66471
- x-gala-nullability: required-and-nullable-are-explicit
66472
- x-gala-purpose: delete the reader's own comment
66473
- x-gala-reachable-problems:
66474
- - COMMENT_NOT_FOUND
66475
- - NOT_COMMENT_AUTHOR
66476
- - READER_AUTHENTICATION_REQUIRED
66477
- - READER_TOKEN_SCOPE
66478
- - VALIDATION_FAILED
66479
- x-gala-replay-identity: natural-idempotent-state
66480
- x-gala-state-guards:
66481
- - NONE
66482
- x-gala-success-category: delete
66483
- x-gala-tenant-scope: NONE
66484
- /v2/public/comments/{commentId}/appeals:
66485
- post:
66486
- description: |
66487
- The comment's author asks the moderators to look again at a removal or
66488
- hold. One appeal per removal: `409 APPEAL_EXISTS` when one was already
66489
- made against the current removal; `409 APPEAL_NOT_ALLOWED` when the
66490
- comment is not removed or held, or the reader is not its author. At most
66491
- 5 appeals a day per reader (`429 RATE_LIMITED`). A human decides; the
66492
- answer shows under the comment.
66493
- operationId: postPublicCommentsByCommentIdAppeals
66494
- parameters:
66495
- - $ref: "#/components/parameters/XCorrelationId"
66496
- - example: 018f0000-0000-7000-8000-000000000001
66497
- in: path
66498
- name: commentId
66499
- required: true
66500
- schema:
66501
- format: uuid
66502
- pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
66503
- type: string
66504
- requestBody:
66505
- content:
66506
- application/json:
66507
- examples:
66508
- nominal:
66509
- summary: Nominal valid request
66510
- value:
66511
- note: The link was to my own project page, not spam.
66512
- schema:
66513
- $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsRequest"
66514
- required: true
66515
- responses:
66516
- "202":
66517
- content:
66518
- application/json:
66519
- examples:
66520
- nominal:
66521
- summary: Nominal successful response
66522
- value:
66523
- status: RECEIVED
66524
- schema:
66525
- $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsResponse"
66526
- description: appeal the removal of my comment succeeded
66527
- headers:
66528
- Cache-Control:
66529
- $ref: "#/components/headers/CacheControlNoStore"
66530
- X-Correlation-Id:
66531
- $ref: "#/components/headers/XCorrelationId"
66532
- "400":
66533
- content:
66534
- application/problem+json:
66535
- examples:
66536
- REQUEST_FIELD_UNKNOWN:
66537
- summary: REQUEST_FIELD_UNKNOWN
66538
- value:
66539
- code: REQUEST_FIELD_UNKNOWN
66540
- correlationId: 018f0000-0000-7000-8000-000000000001
66541
- detail: See the operation contract.
66542
- errors: []
66543
- retryable: false
66544
- schemaId: urn:gala:schema:problem:2.0.0
66545
- schemaVersion: 2.0.0
66546
- status: 400
66547
- title: REQUEST_FIELD_UNKNOWN
66548
- type: urn:gala:problem:request-field-unknown
66549
- VALIDATION_FAILED:
66550
- summary: VALIDATION_FAILED
66551
- value:
66552
- code: VALIDATION_FAILED
66553
- correlationId: 018f0000-0000-7000-8000-000000000001
66554
- detail: See the operation contract.
66555
- errors: []
66556
- retryable: false
66557
- schemaId: urn:gala:schema:problem:2.0.0
66558
- schemaVersion: 2.0.0
66559
- status: 400
66560
- title: VALIDATION_FAILED
66561
- type: urn:gala:problem:validation-failed
66562
- schema:
66563
- $ref: "#/components/schemas/Problem"
66564
- description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
66565
- headers:
66566
- Cache-Control:
66567
- $ref: "#/components/headers/CacheControlNoStore"
66568
- X-Correlation-Id:
66569
- $ref: "#/components/headers/XCorrelationId"
66570
- x-gala-problem-codes:
66571
- - REQUEST_FIELD_UNKNOWN
66572
- - VALIDATION_FAILED
66573
- "401":
66574
- content:
66575
- application/problem+json:
66576
- examples:
66577
- READER_AUTHENTICATION_REQUIRED:
66578
- summary: READER_AUTHENTICATION_REQUIRED
66579
- value:
66580
- code: READER_AUTHENTICATION_REQUIRED
66581
- correlationId: 018f0000-0000-7000-8000-000000000001
66582
- detail: See the operation contract.
66583
- errors: []
66584
- retryable: false
66585
- schemaId: urn:gala:schema:problem:2.0.0
66586
- schemaVersion: 2.0.0
66587
- status: 401
66588
- title: READER_AUTHENTICATION_REQUIRED
66589
- type: urn:gala:problem:reader-authentication-required
66590
- schema:
66591
- $ref: "#/components/schemas/Problem"
66592
- description: READER_AUTHENTICATION_REQUIRED
66593
- headers:
66594
- Cache-Control:
66595
- $ref: "#/components/headers/CacheControlNoStore"
66596
- X-Correlation-Id:
66597
- $ref: "#/components/headers/XCorrelationId"
66598
- x-gala-problem-codes:
66599
- - READER_AUTHENTICATION_REQUIRED
66600
- "403":
66601
- content:
66602
- application/problem+json:
66603
- examples:
66604
- READER_TOKEN_SCOPE:
66605
- summary: READER_TOKEN_SCOPE
66606
- value:
66607
- code: READER_TOKEN_SCOPE
66608
- correlationId: 018f0000-0000-7000-8000-000000000001
66609
- detail: See the operation contract.
66610
- errors: []
66611
- retryable: false
66612
- schemaId: urn:gala:schema:problem:2.0.0
66613
- schemaVersion: 2.0.0
66614
- status: 403
66615
- title: READER_TOKEN_SCOPE
66616
- type: urn:gala:problem:reader-token-scope
66617
- schema:
66618
- $ref: "#/components/schemas/Problem"
66619
- description: READER_TOKEN_SCOPE
66620
- headers:
66621
- Cache-Control:
66622
- $ref: "#/components/headers/CacheControlNoStore"
66623
- X-Correlation-Id:
66624
- $ref: "#/components/headers/XCorrelationId"
66625
- x-gala-problem-codes:
66626
- - READER_TOKEN_SCOPE
66627
- "404":
66628
- content:
66629
- application/problem+json:
66630
- examples:
66631
- COMMENT_NOT_FOUND:
66632
- summary: COMMENT_NOT_FOUND
68127
+ INTERACTIONS_DISABLED:
68128
+ summary: INTERACTIONS_DISABLED
66633
68129
  value:
66634
- code: COMMENT_NOT_FOUND
68130
+ code: INTERACTIONS_DISABLED
66635
68131
  correlationId: 018f0000-0000-7000-8000-000000000001
66636
68132
  detail: See the operation contract.
66637
68133
  errors: []
@@ -66639,11 +68135,11 @@ paths:
66639
68135
  schemaId: urn:gala:schema:problem:2.0.0
66640
68136
  schemaVersion: 2.0.0
66641
68137
  status: 404
66642
- title: COMMENT_NOT_FOUND
66643
- type: urn:gala:problem:comment-not-found
68138
+ title: INTERACTIONS_DISABLED
68139
+ type: urn:gala:problem:interactions-disabled
66644
68140
  schema:
66645
68141
  $ref: "#/components/schemas/Problem"
66646
- description: COMMENT_NOT_FOUND
68142
+ description: COMMENT_NOT_FOUND, INTERACTIONS_DISABLED
66647
68143
  headers:
66648
68144
  Cache-Control:
66649
68145
  $ref: "#/components/headers/CacheControlNoStore"
@@ -66651,47 +68147,7 @@ paths:
66651
68147
  $ref: "#/components/headers/XCorrelationId"
66652
68148
  x-gala-problem-codes:
66653
68149
  - COMMENT_NOT_FOUND
66654
- "409":
66655
- content:
66656
- application/problem+json:
66657
- examples:
66658
- APPEAL_EXISTS:
66659
- summary: APPEAL_EXISTS
66660
- value:
66661
- code: APPEAL_EXISTS
66662
- correlationId: 018f0000-0000-7000-8000-000000000001
66663
- detail: See the operation contract.
66664
- errors: []
66665
- retryable: false
66666
- schemaId: urn:gala:schema:problem:2.0.0
66667
- schemaVersion: 2.0.0
66668
- status: 409
66669
- title: APPEAL_EXISTS
66670
- type: urn:gala:problem:appeal-exists
66671
- APPEAL_NOT_ALLOWED:
66672
- summary: APPEAL_NOT_ALLOWED
66673
- value:
66674
- code: APPEAL_NOT_ALLOWED
66675
- correlationId: 018f0000-0000-7000-8000-000000000001
66676
- detail: See the operation contract.
66677
- errors: []
66678
- retryable: false
66679
- schemaId: urn:gala:schema:problem:2.0.0
66680
- schemaVersion: 2.0.0
66681
- status: 409
66682
- title: APPEAL_NOT_ALLOWED
66683
- type: urn:gala:problem:appeal-not-allowed
66684
- schema:
66685
- $ref: "#/components/schemas/Problem"
66686
- description: APPEAL_EXISTS, APPEAL_NOT_ALLOWED
66687
- headers:
66688
- Cache-Control:
66689
- $ref: "#/components/headers/CacheControlNoStore"
66690
- X-Correlation-Id:
66691
- $ref: "#/components/headers/XCorrelationId"
66692
- x-gala-problem-codes:
66693
- - APPEAL_EXISTS
66694
- - APPEAL_NOT_ALLOWED
68150
+ - INTERACTIONS_DISABLED
66695
68151
  "429":
66696
68152
  content:
66697
68153
  application/problem+json:
@@ -66723,7 +68179,7 @@ paths:
66723
68179
  - RATE_LIMITED
66724
68180
  security:
66725
68181
  - readerBearer: []
66726
- summary: appeal the removal of my comment
68182
+ summary: like one comment as the signed-in reader
66727
68183
  tags:
66728
68184
  - public-interactions
66729
68185
  x-gala-activation-gate: MVP
@@ -66734,20 +68190,19 @@ paths:
66734
68190
  x-gala-conditional-capabilities: []
66735
68191
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
66736
68192
  x-gala-nullability: required-and-nullable-are-explicit
66737
- x-gala-purpose: appeal the removal of my comment
68193
+ x-gala-purpose: like one comment as the signed-in reader
66738
68194
  x-gala-reachable-problems:
66739
- - APPEAL_EXISTS
66740
- - APPEAL_NOT_ALLOWED
66741
68195
  - COMMENT_NOT_FOUND
68196
+ - INTERACTIONS_DISABLED
66742
68197
  - RATE_LIMITED
66743
68198
  - READER_AUTHENTICATION_REQUIRED
68199
+ - READER_RESTRICTED
66744
68200
  - READER_TOKEN_SCOPE
66745
- - REQUEST_FIELD_UNKNOWN
66746
68201
  - VALIDATION_FAILED
66747
- x-gala-replay-identity: one-appeal-per-removal
68202
+ x-gala-replay-identity: natural-idempotent-state
66748
68203
  x-gala-state-guards:
66749
68204
  - NONE
66750
- x-gala-success-category: async
68205
+ x-gala-success-category: delete
66751
68206
  x-gala-tenant-scope: NONE
66752
68207
  /v2/public/comments/{commentId}/reports:
66753
68208
  post:
@@ -68611,7 +70066,7 @@ paths:
68611
70066
  x-gala-tenant-scope: NONE
68612
70067
  /v2/public/publications/{publicationId}/contents/{contentId}/comments:
68613
70068
  get:
68614
- description: "Without `parentId`: 20 roots per page, newest first, each with its descendants inline oldest first (at most 50 per root; `moreReplies` is true beyond that). With `parentId`: the children of that comment, oldest first, 50 per page. Removed and deleted comments appear as tombstones only when they have visible descendants."
70069
+ description: "Without `parentId`: 20 roots per page, newest first, each with its descendants inline oldest first (at most 50 per root; `moreReplies` is true beyond that). With `parentId`: the children of that comment, oldest first, 50 per page. Removed and deleted comments appear as tombstones only when they have visible descendants. SCHEMA-3.32.0: `sort` orders the roots, `newest` (the default) or `oldest`; replies stay oldest first. On the first page of a `newest` or `oldest` list, the one pinned root comment, if any, comes first, whatever the sort. A `cursor` is valid only with the `sort` it was issued for."
68615
70070
  operationId: getPublicPublicationsByPublicationIdContentsByContentIdComments
68616
70071
  parameters:
68617
70072
  - $ref: "#/components/parameters/XCorrelationId"
@@ -68640,6 +70095,16 @@ paths:
68640
70095
  format: uuid
68641
70096
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
68642
70097
  type: string
70098
+ - example: newest
70099
+ in: query
70100
+ name: sort
70101
+ required: false
70102
+ schema:
70103
+ default: newest
70104
+ enum:
70105
+ - newest
70106
+ - oldest
70107
+ type: string
68643
70108
  responses:
68644
70109
  "200":
68645
70110
  content:
@@ -68661,8 +70126,11 @@ paths:
68661
70126
  depth: 0
68662
70127
  editedAt: null
68663
70128
  id: 018f0000-0000-7000-8000-000000000001
70129
+ likeCount: 3
70130
+ likedByMe: false
68664
70131
  moreReplies: false
68665
70132
  parentId: null
70133
+ pinned: false
68666
70134
  replies: []
68667
70135
  state: VISIBLE
68668
70136
  viewer: