@rathnasgala2/schemas 3.27.0 → 3.29.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.
@@ -13,6 +13,14 @@ components:
13
13
  pattern: ^no-store$
14
14
  type: string
15
15
  x-gala-const: no-store
16
+ CacheControlPrivateNoCache:
17
+ description: "SCHEMA-3.29.0: `private, no-cache` -- a browser may store the body but must revalidate it (`If-None-Match`) before every use. Used by reads that carry a strong `ETag` and answer `304`."
18
+ required: true
19
+ schema:
20
+ enum:
21
+ - private, no-cache
22
+ - no-cache, private
23
+ type: string
16
24
  ContentDispositionAttachment:
17
25
  description: "The archive is a download: `attachment` with its file name."
18
26
  required: true
@@ -1491,6 +1499,12 @@ components:
1491
1499
  date. `deleteDate` (SCHEMA-3.25.1, optional and nullable) is the
1492
1500
  header's scheduled-removal date.
1493
1501
  properties:
1502
+ authorIds:
1503
+ description: "SCHEMA-3.29.0: the header's `authors` (stable ids, header order), so a card can show a byline without reading the document; absent when the header names none."
1504
+ items:
1505
+ $ref: "#/components/schemas/PortableContentFrontmatterStableId"
1506
+ maxItems: 32
1507
+ type: array
1494
1508
  contentId:
1495
1509
  $ref: "#/components/schemas/PortableContentFrontmatterStableId"
1496
1510
  createdAt:
@@ -1500,6 +1514,13 @@ components:
1500
1514
  oneOf:
1501
1515
  - $ref: "#/components/schemas/PortableContentFrontmatterDeleteDate"
1502
1516
  - type: "null"
1517
+ description:
1518
+ description: "SCHEMA-3.28.0: the post's front-matter description, so the Posts list can show an excerpt without reading each document; absent when the header carries none."
1519
+ maxLength: 320
1520
+ type: string
1521
+ heroPath:
1522
+ $ref: "#/components/schemas/PortableContentFrontmatterRepoRelativePath"
1523
+ description: "SCHEMA-3.29.0: the repository path of the header's `hero` image, for a card thumbnail; absent when the header carries no hero."
1503
1524
  language:
1504
1525
  $ref: "#/components/schemas/PortableContentFrontmatterBcp47"
1505
1526
  publishAfter:
@@ -1513,6 +1534,12 @@ components:
1513
1534
  $ref: "#/components/schemas/PortableContentFrontmatterSlug"
1514
1535
  status:
1515
1536
  $ref: "#/components/schemas/ContentItemStatus"
1537
+ tags:
1538
+ description: "SCHEMA-3.29.0: the header's `tags`, so a card can show them; absent when the header carries none."
1539
+ items:
1540
+ $ref: "#/components/schemas/PortableContentFrontmatterPlainLabel"
1541
+ maxItems: 32
1542
+ type: array
1516
1543
  title:
1517
1544
  $ref: "#/components/schemas/PortableContentFrontmatterPlainText"
1518
1545
  x-gala-graphemeLength:
@@ -1570,6 +1597,41 @@ components:
1570
1597
  - HEADER_INVALID
1571
1598
  - TOO_LARGE
1572
1599
  type: string
1600
+ ContentPreviewContext:
1601
+ additionalProperties: false
1602
+ description: |
1603
+ SCHEMA-3.29.0. The repository facts a draft preview needs besides the
1604
+ post, all read at `revision`. Every member is best-effort: a file that
1605
+ is absent, unreadable, over 256 KiB or invalid against its schema is
1606
+ `null` (`navigation`, `publication`) or left out of `authors`, and
1607
+ never fails the read. `authors` holds the author files the
1608
+ publication document declares, in the order it declares them, at most
1609
+ 200.
1610
+ properties:
1611
+ authors:
1612
+ items:
1613
+ $ref: "#/components/schemas/PortableAuthorDocument"
1614
+ maxItems: 200
1615
+ type: array
1616
+ navigation:
1617
+ description: The `gala/navigation.json` document, validated against its schema; `null` when the file is absent or invalid.
1618
+ oneOf:
1619
+ - $ref: "#/components/schemas/PortableNavigationDocument"
1620
+ - type: "null"
1621
+ publication:
1622
+ description: The `gala/publication.json` document, validated against its schema; `null` when the file is absent or invalid.
1623
+ oneOf:
1624
+ - $ref: "#/components/schemas/PortablePublicationDocument"
1625
+ - type: "null"
1626
+ revision:
1627
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
1628
+ type: string
1629
+ required:
1630
+ - revision
1631
+ - navigation
1632
+ - publication
1633
+ - authors
1634
+ type: object
1573
1635
  ContentPublicationAuthorSummary:
1574
1636
  additionalProperties: false
1575
1637
  properties:
@@ -3246,6 +3308,8 @@ components:
3246
3308
  - body
3247
3309
  - digest
3248
3310
  type: object
3311
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContextResponse:
3312
+ $ref: "#/components/schemas/ContentPreviewContext"
3249
3313
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentResponse:
3250
3314
  additionalProperties: false
3251
3315
  allOf:
@@ -3870,6 +3934,8 @@ components:
3870
3934
  - items
3871
3935
  - nextCursor
3872
3936
  type: object
3937
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewResponse:
3938
+ $ref: "#/components/schemas/PublicationOverview"
3873
3939
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdPolicySettingsResponse:
3874
3940
  additionalProperties: false
3875
3941
  properties:
@@ -9140,10 +9206,175 @@ components:
9140
9206
  type: object
9141
9207
  required: []
9142
9208
  type: object
9209
+ PortableAuthorBcp47:
9210
+ description: Structurally valid canonical BCP-47 language tag.
9211
+ format: gala-bcp47
9212
+ maxLength: 255
9213
+ minLength: 1
9214
+ pattern: ^[A-Za-z0-9-]+$
9215
+ type: string
9216
+ x-gala-utf8ByteLength:
9217
+ maximum: 255
9218
+ minimum: 1
9219
+ PortableAuthorDocument:
9220
+ additionalProperties: false
9221
+ properties:
9222
+ avatarRef:
9223
+ $ref: "#/components/schemas/PortableAuthorRepoRelativePath"
9224
+ biography:
9225
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9226
+ x-gala-graphemeLength:
9227
+ maximum: 2000
9228
+ minimum: 0
9229
+ displayName:
9230
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9231
+ x-gala-graphemeLength:
9232
+ maximum: 120
9233
+ minimum: 1
9234
+ extensions:
9235
+ $ref: "#/components/schemas/PortableAuthorExtensionMap"
9236
+ id:
9237
+ $ref: "#/components/schemas/PortableAuthorStableId"
9238
+ links:
9239
+ items:
9240
+ $ref: "#/components/schemas/PortableAuthorSocialLink"
9241
+ maxItems: 32
9242
+ minItems: 0
9243
+ type: array
9244
+ localized:
9245
+ items:
9246
+ $ref: "#/components/schemas/PortableAuthorLocalizedAuthor"
9247
+ maxItems: 32
9248
+ minItems: 0
9249
+ type: array
9250
+ pronouns:
9251
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9252
+ x-gala-graphemeLength:
9253
+ maximum: 80
9254
+ minimum: 1
9255
+ schemaId:
9256
+ pattern: ^urn:gala:schema:author:2\.0\.0$
9257
+ type: string
9258
+ x-gala-const: urn:gala:schema:author:2.0.0
9259
+ schemaVersion:
9260
+ pattern: ^2\.0\.0$
9261
+ type: string
9262
+ x-gala-const: 2.0.0
9263
+ required:
9264
+ - schemaId
9265
+ - schemaVersion
9266
+ - id
9267
+ - displayName
9268
+ - biography
9269
+ - links
9270
+ - localized
9271
+ - extensions
9272
+ title: Gala author contract
9273
+ type: object
9274
+ PortableAuthorExtensionKey:
9275
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
9276
+ format: gala-extension-key
9277
+ type: string
9278
+ PortableAuthorExtensionMap:
9279
+ additionalProperties:
9280
+ x-gala-maxCanonicalBytes: 16384
9281
+ maxProperties: 32
9282
+ propertyNames:
9283
+ $ref: "#/components/schemas/PortableAuthorExtensionKey"
9284
+ type: object
9285
+ x-gala-maxCanonicalBytes: 131072
9286
+ PortableAuthorLocalizedAuthor:
9287
+ additionalProperties: false
9288
+ properties:
9289
+ biography:
9290
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9291
+ x-gala-graphemeLength:
9292
+ maximum: 2000
9293
+ minimum: 0
9294
+ displayName:
9295
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9296
+ x-gala-graphemeLength:
9297
+ maximum: 120
9298
+ minimum: 1
9299
+ language:
9300
+ $ref: "#/components/schemas/PortableAuthorBcp47"
9301
+ required:
9302
+ - language
9303
+ - displayName
9304
+ - biography
9305
+ type: object
9306
+ PortableAuthorPlainLabel:
9307
+ description: Normalized Unicode plain text without markup, controls, or bidi overrides.
9308
+ format: gala-plain-label
9309
+ type: string
9310
+ x-gala-graphemeLength:
9311
+ maximum: 80
9312
+ minimum: 1
9143
9313
  PortableAuthorPlainText:
9144
9314
  description: NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls.
9145
9315
  format: gala-plain-text
9146
9316
  type: string
9317
+ PortableAuthorRepoRelativePath:
9318
+ description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
9319
+ format: gala-repository-relative-path
9320
+ maxLength: 512
9321
+ minLength: 1
9322
+ pattern: ^(?!/)(?!.*\\)(?!.*\u0000).+$
9323
+ type: string
9324
+ x-gala-utf8ByteLength:
9325
+ maximum: 512
9326
+ PortableAuthorSocialLink:
9327
+ additionalProperties: false
9328
+ allOf:
9329
+ - else:
9330
+ properties:
9331
+ uri:
9332
+ $ref: "#/components/schemas/PortableAuthorUrlHttps"
9333
+ if:
9334
+ properties:
9335
+ type:
9336
+ pattern: ^email$
9337
+ type: string
9338
+ x-gala-const: email
9339
+ required:
9340
+ - type
9341
+ then:
9342
+ properties:
9343
+ uri:
9344
+ format: uri
9345
+ pattern: "^mailto:"
9346
+ type: string
9347
+ properties:
9348
+ label:
9349
+ $ref: "#/components/schemas/PortableAuthorPlainLabel"
9350
+ type:
9351
+ enum:
9352
+ - website
9353
+ - email
9354
+ - github
9355
+ - linkedin
9356
+ - mastodon
9357
+ - bluesky
9358
+ - x
9359
+ - youtube
9360
+ - other
9361
+ uri:
9362
+ maxLength: 2048
9363
+ minLength: 1
9364
+ type: string
9365
+ required:
9366
+ - type
9367
+ - uri
9368
+ type: object
9369
+ PortableAuthorStableId:
9370
+ description: Lowercase canonical UUIDv7. Once published, it is immutable; its time ordering conveys neither chronology nor authority.
9371
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
9372
+ type: string
9373
+ PortableAuthorUrlHttps:
9374
+ description: Absolute HTTPS URL without embedded credentials.
9375
+ format: uri
9376
+ pattern: ^https://(?![^/?#]*@)
9377
+ type: string
9147
9378
  PortableContentFrontmatterBcp47:
9148
9379
  description: Structurally valid canonical BCP-47 language tag.
9149
9380
  format: gala-bcp47
@@ -15003,6 +15234,159 @@ components:
15003
15234
  - kind
15004
15235
  - token
15005
15236
  type: object
15237
+ PortableNavigationCanonicalRoute:
15238
+ description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
15239
+ format: gala-canonical-route
15240
+ minLength: 1
15241
+ pattern: ^/(?!/)(?!.*//)(?!.*[?#]).*$
15242
+ type: string
15243
+ PortableNavigationDocument:
15244
+ $comment: The navigation graph validator rejects duplicate normalized internal routes within each collection.
15245
+ additionalProperties: false
15246
+ properties:
15247
+ extensions:
15248
+ $ref: "#/components/schemas/PortableNavigationExtensionMap"
15249
+ footerItems:
15250
+ items:
15251
+ $ref: "#/components/schemas/PortableNavigationNavigationItem"
15252
+ maxItems: 50
15253
+ minItems: 0
15254
+ type: array
15255
+ items:
15256
+ items:
15257
+ $ref: "#/components/schemas/PortableNavigationNavigationItem"
15258
+ maxItems: 100
15259
+ minItems: 0
15260
+ type: array
15261
+ schemaId:
15262
+ pattern: ^urn:gala:schema:navigation:2\.0\.0$
15263
+ type: string
15264
+ x-gala-const: urn:gala:schema:navigation:2.0.0
15265
+ schemaVersion:
15266
+ pattern: ^2\.0\.0$
15267
+ type: string
15268
+ x-gala-const: 2.0.0
15269
+ required:
15270
+ - schemaId
15271
+ - schemaVersion
15272
+ - items
15273
+ - footerItems
15274
+ - extensions
15275
+ title: Gala navigation contract
15276
+ type: object
15277
+ PortableNavigationExtensionKey:
15278
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
15279
+ format: gala-extension-key
15280
+ type: string
15281
+ PortableNavigationExtensionMap:
15282
+ additionalProperties:
15283
+ x-gala-maxCanonicalBytes: 16384
15284
+ maxProperties: 32
15285
+ propertyNames:
15286
+ $ref: "#/components/schemas/PortableNavigationExtensionKey"
15287
+ type: object
15288
+ x-gala-maxCanonicalBytes: 131072
15289
+ PortableNavigationNavigationItem:
15290
+ additionalProperties: false
15291
+ allOf:
15292
+ - else:
15293
+ not:
15294
+ required:
15295
+ - route
15296
+ required:
15297
+ - url
15298
+ if:
15299
+ properties:
15300
+ type:
15301
+ pattern: ^internal$
15302
+ type: string
15303
+ x-gala-const: internal
15304
+ required:
15305
+ - type
15306
+ then:
15307
+ not:
15308
+ required:
15309
+ - url
15310
+ required:
15311
+ - route
15312
+ properties:
15313
+ children:
15314
+ items:
15315
+ $ref: "#/components/schemas/PortableNavigationNavigationLeaf"
15316
+ maxItems: 20
15317
+ minItems: 0
15318
+ type: array
15319
+ label:
15320
+ $ref: "#/components/schemas/PortableNavigationPlainLabel"
15321
+ route:
15322
+ $ref: "#/components/schemas/PortableNavigationCanonicalRoute"
15323
+ type:
15324
+ enum:
15325
+ - internal
15326
+ - external
15327
+ url:
15328
+ $ref: "#/components/schemas/PortableNavigationUrlHttps"
15329
+ required:
15330
+ - type
15331
+ - label
15332
+ - children
15333
+ type: object
15334
+ PortableNavigationNavigationLeaf:
15335
+ additionalProperties: false
15336
+ allOf:
15337
+ - else:
15338
+ not:
15339
+ required:
15340
+ - route
15341
+ required:
15342
+ - url
15343
+ if:
15344
+ properties:
15345
+ type:
15346
+ pattern: ^internal$
15347
+ type: string
15348
+ x-gala-const: internal
15349
+ required:
15350
+ - type
15351
+ then:
15352
+ not:
15353
+ required:
15354
+ - url
15355
+ required:
15356
+ - route
15357
+ properties:
15358
+ children:
15359
+ maxItems: 0
15360
+ minItems: 0
15361
+ type: array
15362
+ x-gala-const: []
15363
+ label:
15364
+ $ref: "#/components/schemas/PortableNavigationPlainLabel"
15365
+ route:
15366
+ $ref: "#/components/schemas/PortableNavigationCanonicalRoute"
15367
+ type:
15368
+ enum:
15369
+ - internal
15370
+ - external
15371
+ url:
15372
+ $ref: "#/components/schemas/PortableNavigationUrlHttps"
15373
+ required:
15374
+ - type
15375
+ - label
15376
+ - children
15377
+ type: object
15378
+ PortableNavigationPlainLabel:
15379
+ description: Normalized Unicode plain text without markup, controls, or bidi overrides.
15380
+ format: gala-plain-label
15381
+ type: string
15382
+ x-gala-graphemeLength:
15383
+ maximum: 80
15384
+ minimum: 1
15385
+ PortableNavigationUrlHttps:
15386
+ description: Absolute HTTPS URL without embedded credentials.
15387
+ format: uri
15388
+ pattern: ^https://(?![^/?#]*@)
15389
+ type: string
15006
15390
  PortableProblemCanonicalRoute:
15007
15391
  description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
15008
15392
  format: gala-canonical-route
@@ -15210,6 +15594,33 @@ components:
15210
15594
  x-gala-utf8ByteLength:
15211
15595
  maximum: 255
15212
15596
  minimum: 1
15597
+ PortablePublicationCanonicalRoute:
15598
+ description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
15599
+ format: gala-canonical-route
15600
+ minLength: 1
15601
+ pattern: ^/(?!/)(?!.*//)(?!.*[?#]).*$
15602
+ type: string
15603
+ PortablePublicationContactForm:
15604
+ additionalProperties: false
15605
+ description: "SCHEMA-3.22.0: the site's contact form. `enabled` turns the form on, and the template renders the `/contact/` page only when it is true. `fields.website` and `fields.phone` add the optional Website and Phone inputs; name, email and message are always present. The intro text is not a member: it is the optional document `gala/theme-pages/contact.md`, and the template shows a default intro when it is absent. An absent `contactForm` means no form. The API, not the schema, limits the form to the Pro and Business plans."
15606
+ properties:
15607
+ enabled:
15608
+ type: boolean
15609
+ fields:
15610
+ additionalProperties: false
15611
+ properties:
15612
+ phone:
15613
+ type: boolean
15614
+ website:
15615
+ type: boolean
15616
+ required:
15617
+ - website
15618
+ - phone
15619
+ type: object
15620
+ required:
15621
+ - enabled
15622
+ - fields
15623
+ type: object
15213
15624
  PortablePublicationCrawlers:
15214
15625
  additionalProperties: false
15215
15626
  properties:
@@ -15220,6 +15631,134 @@ components:
15220
15631
  required:
15221
15632
  - ai
15222
15633
  type: object
15634
+ PortablePublicationDocument:
15635
+ additionalProperties: false
15636
+ properties:
15637
+ aiRights:
15638
+ $ref: "#/components/schemas/PortablePublicationAiRights"
15639
+ authors:
15640
+ items:
15641
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15642
+ maxItems: 32
15643
+ minItems: 1
15644
+ type: array
15645
+ canonicalBase:
15646
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
15647
+ contactForm:
15648
+ $ref: "#/components/schemas/PortablePublicationContactForm"
15649
+ contactRef:
15650
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15651
+ crawlers:
15652
+ $ref: "#/components/schemas/PortablePublicationCrawlers"
15653
+ defaultImageRef:
15654
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15655
+ defaultLanguage:
15656
+ $ref: "#/components/schemas/PortablePublicationBcp47"
15657
+ description:
15658
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15659
+ x-gala-graphemeLength:
15660
+ maximum: 500
15661
+ minimum: 1
15662
+ extensions:
15663
+ $ref: "#/components/schemas/PortablePublicationExtensionMap"
15664
+ footerCard:
15665
+ $ref: "#/components/schemas/PortablePublicationFooterCard"
15666
+ id:
15667
+ $ref: "#/components/schemas/PortablePublicationStableId"
15668
+ listen:
15669
+ $ref: "#/components/schemas/PortablePublicationListen"
15670
+ listing:
15671
+ $ref: "#/components/schemas/PortablePublicationListing"
15672
+ newsletter:
15673
+ $ref: "#/components/schemas/PortablePublicationNewsletter"
15674
+ performance:
15675
+ $ref: "#/components/schemas/PortablePublicationPerformance"
15676
+ policies:
15677
+ $ref: "#/components/schemas/PortablePublicationPublicationPolicies"
15678
+ profile:
15679
+ $ref: "#/components/schemas/PortablePublicationPublicationProfile"
15680
+ schemaId:
15681
+ pattern: ^urn:gala:schema:publication:2\.0\.0$
15682
+ type: string
15683
+ x-gala-const: urn:gala:schema:publication:2.0.0
15684
+ schemaVersion:
15685
+ pattern: ^2\.0\.0$
15686
+ type: string
15687
+ x-gala-const: 2.0.0
15688
+ sharing:
15689
+ $ref: "#/components/schemas/PortablePublicationSharing"
15690
+ slug:
15691
+ $ref: "#/components/schemas/PortablePublicationSlug"
15692
+ socialLinks:
15693
+ items:
15694
+ $ref: "#/components/schemas/PortablePublicationSocialLink"
15695
+ maxItems: 32
15696
+ minItems: 0
15697
+ type: array
15698
+ title:
15699
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15700
+ x-gala-graphemeLength:
15701
+ maximum: 200
15702
+ minimum: 1
15703
+ required:
15704
+ - schemaId
15705
+ - schemaVersion
15706
+ - id
15707
+ - slug
15708
+ - title
15709
+ - description
15710
+ - canonicalBase
15711
+ - defaultLanguage
15712
+ - authors
15713
+ - socialLinks
15714
+ - extensions
15715
+ title: Gala publication contract
15716
+ type: object
15717
+ PortablePublicationExtensionKey:
15718
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
15719
+ format: gala-extension-key
15720
+ type: string
15721
+ PortablePublicationExtensionMap:
15722
+ additionalProperties:
15723
+ x-gala-maxCanonicalBytes: 16384
15724
+ maxProperties: 32
15725
+ propertyNames:
15726
+ $ref: "#/components/schemas/PortablePublicationExtensionKey"
15727
+ type: object
15728
+ x-gala-maxCanonicalBytes: 131072
15729
+ PortablePublicationFooterCard:
15730
+ additionalProperties: false
15731
+ properties:
15732
+ authorIds:
15733
+ items:
15734
+ $ref: "#/components/schemas/PortablePublicationStableId"
15735
+ maxItems: 32
15736
+ minItems: 1
15737
+ type: array
15738
+ body:
15739
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15740
+ enabled:
15741
+ type: boolean
15742
+ heading:
15743
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15744
+ x-gala-graphemeLength:
15745
+ maximum: 120
15746
+ minimum: 1
15747
+ required:
15748
+ - enabled
15749
+ - heading
15750
+ - body
15751
+ - authorIds
15752
+ type: object
15753
+ PortablePublicationListen:
15754
+ additionalProperties: false
15755
+ description: "SCHEMA-3.26.0: the site's Listen setting. `enabled: true` offers the audio version of the posts that have one: the template adds a Listen button to the top bar, a small invitation on each post with audio and a playlist on the home page, and ships its script only while at least one published article carries a `listen` member. An absent `listen` means off. The API, not the schema, limits turning it on to the Pro and Business plans."
15756
+ properties:
15757
+ enabled:
15758
+ type: boolean
15759
+ required:
15760
+ - enabled
15761
+ type: object
15223
15762
  PortablePublicationListing:
15224
15763
  additionalProperties: false
15225
15764
  description: "SCHEMA-3.25.0: listing settings. `pageSize` is the number of posts on each listing page (1 to 50); an absent member means 10."
@@ -15230,6 +15769,59 @@ components:
15230
15769
  type: integer
15231
15770
  required: []
15232
15771
  type: object
15772
+ PortablePublicationNewsletter:
15773
+ description: "SCHEMA-3.22.0: the newsletter panel. Link mode (`mode` absent or `link`) sends readers to the author's own newsletter at `url`; Galascribe mode (`mode: \"galascribe\"`) collects and mails subscribers itself. An absent `newsletter` member means the panel is off."
15774
+ oneOf:
15775
+ - additionalProperties: false
15776
+ description: "Link mode: the panel links to an external newsletter. `mode` is optional and `link` when present, so a 3.21 publication still validates."
15777
+ properties:
15778
+ mode:
15779
+ pattern: ^link$
15780
+ type: string
15781
+ x-gala-const: link
15782
+ text:
15783
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15784
+ x-gala-graphemeLength:
15785
+ maximum: 300
15786
+ minimum: 1
15787
+ title:
15788
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
15789
+ url:
15790
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
15791
+ required:
15792
+ - url
15793
+ - title
15794
+ - text
15795
+ type: object
15796
+ - additionalProperties: false
15797
+ 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."
15798
+ properties:
15799
+ emailContent:
15800
+ 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."
15801
+ enum:
15802
+ - card
15803
+ - full
15804
+ mode:
15805
+ pattern: ^galascribe$
15806
+ type: string
15807
+ x-gala-const: galascribe
15808
+ replyToOwner:
15809
+ description: When true, subscribers' replies go to the site owner's contact email; when false the emails carry no Reply-To.
15810
+ type: boolean
15811
+ text:
15812
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15813
+ x-gala-graphemeLength:
15814
+ maximum: 300
15815
+ minimum: 1
15816
+ title:
15817
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
15818
+ required:
15819
+ - mode
15820
+ - title
15821
+ - text
15822
+ - emailContent
15823
+ - replyToOwner
15824
+ type: object
15233
15825
  PortablePublicationPerformance:
15234
15826
  additionalProperties: false
15235
15827
  description: "SCHEMA-3.25.0: size budgets in bytes, each at least 1024 and optional. `htmlBytes` bounds a page's HTML, `cssBytes` and `jsBytes` bound the sum of the same-origin stylesheets and scripts a page links. A page over budget is reported; a budget never fails a build."
@@ -15261,6 +15853,43 @@ components:
15261
15853
  description: NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls.
15262
15854
  format: gala-plain-text
15263
15855
  type: string
15856
+ PortablePublicationPolicyPage:
15857
+ additionalProperties: false
15858
+ properties:
15859
+ body:
15860
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15861
+ pattern: ^.+\.md$
15862
+ title:
15863
+ $ref: "#/components/schemas/PortablePublicationPlainText"
15864
+ x-gala-graphemeLength:
15865
+ maximum: 80
15866
+ minimum: 1
15867
+ required:
15868
+ - title
15869
+ - body
15870
+ type: object
15871
+ PortablePublicationPublicationPolicies:
15872
+ additionalProperties: false
15873
+ properties:
15874
+ privacy:
15875
+ $ref: "#/components/schemas/PortablePublicationPolicyPage"
15876
+ terms:
15877
+ $ref: "#/components/schemas/PortablePublicationPolicyPage"
15878
+ required:
15879
+ - terms
15880
+ - privacy
15881
+ type: object
15882
+ PortablePublicationPublicationProfile:
15883
+ additionalProperties: false
15884
+ properties:
15885
+ body:
15886
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
15887
+ route:
15888
+ $ref: "#/components/schemas/PortablePublicationCanonicalRoute"
15889
+ required:
15890
+ - route
15891
+ - body
15892
+ type: object
15264
15893
  PortablePublicationRepoRelativePath:
15265
15894
  description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
15266
15895
  format: gala-repository-relative-path
@@ -15270,6 +15899,36 @@ components:
15270
15899
  type: string
15271
15900
  x-gala-utf8ByteLength:
15272
15901
  maximum: 512
15902
+ PortablePublicationSharing:
15903
+ additionalProperties: false
15904
+ description: "SCHEMA-3.22.0: the share buttons shown on each article. `targets` is the display order: 0 to 11 unique members of the closed target set. An absent `sharing` member means `[\"copy-link\"]` (the Copy link button only); an empty `targets` array means no share buttons. `native` is shown only where the browser offers the system share sheet; every other target is a plain link to that service's documented share URL. Bookmark is not a share target and is unaffected."
15905
+ properties:
15906
+ targets:
15907
+ items:
15908
+ enum:
15909
+ - copy-link
15910
+ - native
15911
+ - x
15912
+ - bluesky
15913
+ - linkedin
15914
+ - facebook
15915
+ - hacker-news
15916
+ - whatsapp
15917
+ - telegram
15918
+ - reddit
15919
+ - email
15920
+ maxItems: 11
15921
+ minItems: 0
15922
+ type: array
15923
+ uniqueItems: true
15924
+ required:
15925
+ - targets
15926
+ type: object
15927
+ PortablePublicationSlug:
15928
+ maxLength: 80
15929
+ minLength: 1
15930
+ pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
15931
+ type: string
15273
15932
  PortablePublicationSocialLink:
15274
15933
  additionalProperties: false
15275
15934
  allOf:
@@ -15313,6 +15972,10 @@ components:
15313
15972
  - type
15314
15973
  - uri
15315
15974
  type: object
15975
+ PortablePublicationStableId:
15976
+ description: Lowercase canonical UUIDv7. Once published, it is immutable; its time ordering conveys neither chronology nor authority.
15977
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
15978
+ type: string
15316
15979
  PortablePublicationUrlHttps:
15317
15980
  description: Absolute HTTPS URL without embedded credentials.
15318
15981
  format: uri
@@ -16419,6 +17082,8 @@ components:
16419
17082
  type: object
16420
17083
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecideResponse:
16421
17084
  $ref: "#/components/schemas/ModerationQueueItem"
17085
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewRefreshResponse:
17086
+ $ref: "#/components/schemas/PublicationOverview"
16422
17087
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdPreviewRetirementResponse:
16423
17088
  additionalProperties: false
16424
17089
  description: The persisted consequence preview a retirement command must quote back. A client never fabricates `consequencePreviewId` or `consequenceDigest` (LOCAL-36 G-17).
@@ -18839,6 +19504,123 @@ components:
18839
19504
  - name
18840
19505
  - slug
18841
19506
  type: object
19507
+ PublicationOverview:
19508
+ additionalProperties: false
19509
+ description: |
19510
+ SCHEMA-3.28.0: the Home page's at-a-glance numbers for one site. The
19511
+ counts are a snapshot taken at `computedAt` and valid until
19512
+ `expiresAt` (cached at least 24 hours per site); `lastPublish` and
19513
+ `reviewsWaitingOnYou` are live. When `posts.complete` is false the scan
19514
+ was truncated and the post counts are a lower bound.
19515
+ properties:
19516
+ computedAt:
19517
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
19518
+ format: date-time
19519
+ type: string
19520
+ expiresAt:
19521
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
19522
+ format: date-time
19523
+ type: string
19524
+ followers:
19525
+ format: int64
19526
+ minimum: 0
19527
+ type: integer
19528
+ interactions:
19529
+ additionalProperties: false
19530
+ properties:
19531
+ comments:
19532
+ format: int64
19533
+ minimum: 0
19534
+ type: integer
19535
+ commentsAwaitingModeration:
19536
+ format: int64
19537
+ minimum: 0
19538
+ type: integer
19539
+ reactions:
19540
+ format: int64
19541
+ minimum: 0
19542
+ type: integer
19543
+ required:
19544
+ - reactions
19545
+ - comments
19546
+ - commentsAwaitingModeration
19547
+ type: object
19548
+ lastPublish:
19549
+ oneOf:
19550
+ - additionalProperties: false
19551
+ properties:
19552
+ at:
19553
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
19554
+ format: date-time
19555
+ type: string
19556
+ outcome:
19557
+ enum:
19558
+ - SUCCEEDED
19559
+ - FAILED
19560
+ - PUBLISHING
19561
+ type: string
19562
+ required:
19563
+ - at
19564
+ - outcome
19565
+ type: object
19566
+ - type: "null"
19567
+ newsletterSubscribers:
19568
+ additionalProperties: false
19569
+ properties:
19570
+ confirmed:
19571
+ format: int64
19572
+ minimum: 0
19573
+ type: integer
19574
+ pending:
19575
+ format: int64
19576
+ minimum: 0
19577
+ type: integer
19578
+ required:
19579
+ - confirmed
19580
+ - pending
19581
+ type: object
19582
+ posts:
19583
+ additionalProperties: false
19584
+ properties:
19585
+ complete:
19586
+ type: boolean
19587
+ draft:
19588
+ format: int64
19589
+ minimum: 0
19590
+ type: integer
19591
+ published:
19592
+ format: int64
19593
+ minimum: 0
19594
+ type: integer
19595
+ scheduled:
19596
+ format: int64
19597
+ minimum: 0
19598
+ type: integer
19599
+ required:
19600
+ - published
19601
+ - draft
19602
+ - scheduled
19603
+ - complete
19604
+ type: object
19605
+ reviewsWaitingOnYou:
19606
+ format: int64
19607
+ minimum: 0
19608
+ type: integer
19609
+ unreadContactMessages:
19610
+ format: int64
19611
+ minimum: 0
19612
+ type: integer
19613
+ required:
19614
+ - computedAt
19615
+ - expiresAt
19616
+ - followers
19617
+ - newsletterSubscribers
19618
+ - unreadContactMessages
19619
+ - interactions
19620
+ - posts
19621
+ - lastPublish
19622
+ - reviewsWaitingOnYou
19623
+ type: object
18842
19624
  PublicationState:
18843
19625
  enum:
18844
19626
  - PROVISIONING
@@ -38078,6 +38860,334 @@ paths:
38078
38860
  - NONE
38079
38861
  x-gala-success-category: query
38080
38862
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38863
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/preview-context:
38864
+ get:
38865
+ description: |
38866
+ Needs `publication.view`. The facts the published page reads from the
38867
+ site's repository besides the post itself, so the App's draft preview
38868
+ can render the site's real header menu, footer and author cards:
38869
+ `navigation` (`gala/navigation.json`), `publication`
38870
+ (`gala/publication.json`) and `authors` (every `gala/authors/*.json`).
38871
+ This is the one read of those `gala/` files; `GET .../content/documents`
38872
+ still refuses them. `revision` omitted reads the linked repository's
38873
+ current main head; a supplied `revision` is checked exactly as the
38874
+ documents read checks it, and any other value is `404
38875
+ RESOURCE_NOT_FOUND`. The read is best-effort per member: a file that is
38876
+ absent, unreadable, larger than 256 KiB or invalid against its schema
38877
+ is `null` (`navigation`, `publication`) or left out (`authors`, at most
38878
+ 200, in file-name order), and never fails the read. The response
38879
+ carries a strong `ETag` and honours `If-None-Match` with `304` and no
38880
+ body; `Cache-Control` is `private, no-cache`, so a browser stores the
38881
+ body and revalidates it on every use.
38882
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContext
38883
+ parameters:
38884
+ - $ref: "#/components/parameters/XCorrelationId"
38885
+ - example: 018f0000-0000-7000-8000-000000000001
38886
+ in: path
38887
+ name: organizationId
38888
+ required: true
38889
+ schema:
38890
+ format: uuid
38891
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38892
+ type: string
38893
+ - example: 018f0000-0000-7000-8000-000000000001
38894
+ in: path
38895
+ name: publicationId
38896
+ required: true
38897
+ schema:
38898
+ format: uuid
38899
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38900
+ type: string
38901
+ - example: sha1:0000000000000000000000000000000000000000
38902
+ in: query
38903
+ name: revision
38904
+ required: false
38905
+ schema:
38906
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
38907
+ type: string
38908
+ - description: A previously returned `ETag`; a match answers `304`.
38909
+ example: '"a1b2c3d4"'
38910
+ in: header
38911
+ name: If-None-Match
38912
+ required: false
38913
+ schema:
38914
+ maxLength: 256
38915
+ type: string
38916
+ responses:
38917
+ "200":
38918
+ content:
38919
+ application/json:
38920
+ examples:
38921
+ nominal:
38922
+ summary: Nominal successful response
38923
+ value:
38924
+ authors:
38925
+ - biography: Writes about the craft of publishing.
38926
+ displayName: Example Author
38927
+ extensions: {}
38928
+ id: 018f0000-0000-7000-8000-000000000001
38929
+ links:
38930
+ - type: website
38931
+ uri: https://example.com/
38932
+ localized: []
38933
+ schemaId: urn:gala:schema:author:2.0.0
38934
+ schemaVersion: 2.0.0
38935
+ navigation:
38936
+ extensions: {}
38937
+ footerItems: []
38938
+ items:
38939
+ - children: []
38940
+ label: About
38941
+ route: /about/
38942
+ type: internal
38943
+ schemaId: urn:gala:schema:navigation:2.0.0
38944
+ schemaVersion: 2.0.0
38945
+ publication:
38946
+ authors:
38947
+ - gala/authors/example-author.json
38948
+ canonicalBase: https://example.com/
38949
+ defaultLanguage: en
38950
+ description: A site about the craft of publishing.
38951
+ extensions: {}
38952
+ id: 018f0000-0000-7000-8000-000000000001
38953
+ schemaId: urn:gala:schema:publication:2.0.0
38954
+ schemaVersion: 2.0.0
38955
+ slug: example
38956
+ socialLinks: []
38957
+ title: Example
38958
+ revision: sha1:0000000000000000000000000000000000000000
38959
+ schema:
38960
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContextResponse"
38961
+ description: read the preview context succeeded
38962
+ headers:
38963
+ Cache-Control:
38964
+ $ref: "#/components/headers/CacheControlPrivateNoCache"
38965
+ ETag:
38966
+ description: Strong validator of this response body.
38967
+ required: true
38968
+ schema:
38969
+ maxLength: 256
38970
+ type: string
38971
+ X-Correlation-Id:
38972
+ $ref: "#/components/headers/XCorrelationId"
38973
+ "304":
38974
+ description: the caller's `If-None-Match` still matches; no body
38975
+ headers:
38976
+ Cache-Control:
38977
+ $ref: "#/components/headers/CacheControlPrivateNoCache"
38978
+ ETag:
38979
+ description: Strong validator of this response body.
38980
+ required: true
38981
+ schema:
38982
+ maxLength: 256
38983
+ type: string
38984
+ X-Correlation-Id:
38985
+ $ref: "#/components/headers/XCorrelationId"
38986
+ "400":
38987
+ content:
38988
+ application/problem+json:
38989
+ examples:
38990
+ VALIDATION_FAILED:
38991
+ summary: VALIDATION_FAILED
38992
+ value:
38993
+ code: VALIDATION_FAILED
38994
+ correlationId: 018f0000-0000-7000-8000-000000000001
38995
+ detail: See the operation contract.
38996
+ errors: []
38997
+ retryable: false
38998
+ schemaId: urn:gala:schema:problem:2.0.0
38999
+ schemaVersion: 2.0.0
39000
+ status: 400
39001
+ title: VALIDATION_FAILED
39002
+ type: urn:gala:problem:validation-failed
39003
+ schema:
39004
+ $ref: "#/components/schemas/Problem"
39005
+ description: VALIDATION_FAILED
39006
+ headers:
39007
+ Cache-Control:
39008
+ $ref: "#/components/headers/CacheControlNoStore"
39009
+ X-Correlation-Id:
39010
+ $ref: "#/components/headers/XCorrelationId"
39011
+ x-gala-problem-codes:
39012
+ - VALIDATION_FAILED
39013
+ "401":
39014
+ content:
39015
+ application/problem+json:
39016
+ examples:
39017
+ AUTHENTICATION_REQUIRED:
39018
+ summary: AUTHENTICATION_REQUIRED
39019
+ value:
39020
+ code: AUTHENTICATION_REQUIRED
39021
+ correlationId: 018f0000-0000-7000-8000-000000000001
39022
+ detail: See the operation contract.
39023
+ errors: []
39024
+ retryable: false
39025
+ schemaId: urn:gala:schema:problem:2.0.0
39026
+ schemaVersion: 2.0.0
39027
+ status: 401
39028
+ title: AUTHENTICATION_REQUIRED
39029
+ type: urn:gala:problem:authentication-required
39030
+ schema:
39031
+ $ref: "#/components/schemas/Problem"
39032
+ description: AUTHENTICATION_REQUIRED
39033
+ headers:
39034
+ Cache-Control:
39035
+ $ref: "#/components/headers/CacheControlNoStore"
39036
+ X-Correlation-Id:
39037
+ $ref: "#/components/headers/XCorrelationId"
39038
+ x-gala-problem-codes:
39039
+ - AUTHENTICATION_REQUIRED
39040
+ "403":
39041
+ content:
39042
+ application/problem+json:
39043
+ examples:
39044
+ AUTHORIZATION_DENIED:
39045
+ summary: AUTHORIZATION_DENIED
39046
+ value:
39047
+ code: AUTHORIZATION_DENIED
39048
+ correlationId: 018f0000-0000-7000-8000-000000000001
39049
+ detail: See the operation contract.
39050
+ errors: []
39051
+ retryable: false
39052
+ schemaId: urn:gala:schema:problem:2.0.0
39053
+ schemaVersion: 2.0.0
39054
+ status: 403
39055
+ title: AUTHORIZATION_DENIED
39056
+ type: urn:gala:problem:authorization-denied
39057
+ schema:
39058
+ $ref: "#/components/schemas/Problem"
39059
+ description: AUTHORIZATION_DENIED
39060
+ headers:
39061
+ Cache-Control:
39062
+ $ref: "#/components/headers/CacheControlNoStore"
39063
+ X-Correlation-Id:
39064
+ $ref: "#/components/headers/XCorrelationId"
39065
+ x-gala-problem-codes:
39066
+ - AUTHORIZATION_DENIED
39067
+ "404":
39068
+ content:
39069
+ application/problem+json:
39070
+ examples:
39071
+ RESOURCE_NOT_FOUND:
39072
+ summary: RESOURCE_NOT_FOUND
39073
+ value:
39074
+ code: RESOURCE_NOT_FOUND
39075
+ correlationId: 018f0000-0000-7000-8000-000000000001
39076
+ detail: See the operation contract.
39077
+ errors: []
39078
+ retryable: false
39079
+ schemaId: urn:gala:schema:problem:2.0.0
39080
+ schemaVersion: 2.0.0
39081
+ status: 404
39082
+ title: RESOURCE_NOT_FOUND
39083
+ type: urn:gala:problem:resource-not-found
39084
+ schema:
39085
+ $ref: "#/components/schemas/Problem"
39086
+ description: RESOURCE_NOT_FOUND
39087
+ headers:
39088
+ Cache-Control:
39089
+ $ref: "#/components/headers/CacheControlNoStore"
39090
+ X-Correlation-Id:
39091
+ $ref: "#/components/headers/XCorrelationId"
39092
+ x-gala-problem-codes:
39093
+ - RESOURCE_NOT_FOUND
39094
+ "429":
39095
+ content:
39096
+ application/problem+json:
39097
+ examples:
39098
+ RATE_LIMITED:
39099
+ summary: RATE_LIMITED
39100
+ value:
39101
+ code: RATE_LIMITED
39102
+ correlationId: 018f0000-0000-7000-8000-000000000001
39103
+ detail: See the operation contract.
39104
+ errors: []
39105
+ retryable: true
39106
+ schemaId: urn:gala:schema:problem:2.0.0
39107
+ schemaVersion: 2.0.0
39108
+ status: 429
39109
+ title: RATE_LIMITED
39110
+ type: urn:gala:problem:rate-limited
39111
+ schema:
39112
+ $ref: "#/components/schemas/Problem"
39113
+ description: RATE_LIMITED
39114
+ headers:
39115
+ Cache-Control:
39116
+ $ref: "#/components/headers/CacheControlNoStore"
39117
+ Retry-After:
39118
+ $ref: "#/components/headers/RetryAfter"
39119
+ X-Correlation-Id:
39120
+ $ref: "#/components/headers/XCorrelationId"
39121
+ x-gala-problem-codes:
39122
+ - RATE_LIMITED
39123
+ "503":
39124
+ content:
39125
+ application/problem+json:
39126
+ examples:
39127
+ CAPABILITY_UNAVAILABLE:
39128
+ summary: CAPABILITY_UNAVAILABLE
39129
+ value:
39130
+ code: CAPABILITY_UNAVAILABLE
39131
+ correlationId: 018f0000-0000-7000-8000-000000000001
39132
+ detail: See the operation contract.
39133
+ errors: []
39134
+ retryable: false
39135
+ schemaId: urn:gala:schema:problem:2.0.0
39136
+ schemaVersion: 2.0.0
39137
+ status: 503
39138
+ title: CAPABILITY_UNAVAILABLE
39139
+ type: urn:gala:problem:capability-unavailable
39140
+ DEPENDENCY_UNAVAILABLE:
39141
+ summary: DEPENDENCY_UNAVAILABLE
39142
+ value:
39143
+ code: DEPENDENCY_UNAVAILABLE
39144
+ correlationId: 018f0000-0000-7000-8000-000000000001
39145
+ detail: See the operation contract.
39146
+ errors: []
39147
+ retryable: true
39148
+ schemaId: urn:gala:schema:problem:2.0.0
39149
+ schemaVersion: 2.0.0
39150
+ status: 503
39151
+ title: DEPENDENCY_UNAVAILABLE
39152
+ type: urn:gala:problem:dependency-unavailable
39153
+ schema:
39154
+ $ref: "#/components/schemas/Problem"
39155
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
39156
+ headers:
39157
+ Cache-Control:
39158
+ $ref: "#/components/headers/CacheControlNoStore"
39159
+ X-Correlation-Id:
39160
+ $ref: "#/components/headers/XCorrelationId"
39161
+ x-gala-problem-codes:
39162
+ - CAPABILITY_UNAVAILABLE
39163
+ - DEPENDENCY_UNAVAILABLE
39164
+ security:
39165
+ - browserSession: []
39166
+ summary: read the preview context
39167
+ tags:
39168
+ - organizations
39169
+ x-gala-activation-gate: MVP
39170
+ x-gala-activation-guards:
39171
+ - Active repository binding and configured GitHub App identity capability
39172
+ x-gala-capability-key: publication.view
39173
+ x-gala-concurrency: binding-epoch
39174
+ x-gala-conditional-capabilities: []
39175
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
39176
+ x-gala-nullability: required-and-nullable-are-explicit
39177
+ x-gala-purpose: read the preview context
39178
+ x-gala-reachable-problems:
39179
+ - AUTHENTICATION_REQUIRED
39180
+ - AUTHORIZATION_DENIED
39181
+ - CAPABILITY_UNAVAILABLE
39182
+ - DEPENDENCY_UNAVAILABLE
39183
+ - RATE_LIMITED
39184
+ - RESOURCE_NOT_FOUND
39185
+ - VALIDATION_FAILED
39186
+ x-gala-replay-identity: safe-query
39187
+ x-gala-state-guards:
39188
+ - NONE
39189
+ x-gala-success-category: query
39190
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38081
39191
  /v2/organizations/{organizationId}/publications/{publicationId}/deployments:
38082
39192
  get:
38083
39193
  operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdDeployments
@@ -46785,6 +47895,305 @@ paths:
46785
47895
  - NONE
46786
47896
  x-gala-success-category: protocol
46787
47897
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
47898
+ /v2/organizations/{organizationId}/publications/{publicationId}/overview:
47899
+ get:
47900
+ description: |
47901
+ Needs `publication.view`. The Home page's at-a-glance numbers for one
47902
+ site as a `PublicationOverview`. The body is a snapshot cached for at
47903
+ least 24 hours per site: `computedAt` says when it was taken and
47904
+ `expiresAt` when it may be recomputed. `lastPublish` and
47905
+ `reviewsWaitingOnYou` are live and read at request time, not from the
47906
+ snapshot. `posts.complete` is false when the scan was truncated, and
47907
+ the post counts are then a lower bound. The response carries an `ETag`
47908
+ and honours `If-None-Match` with `304` and no body. `POST
47909
+ .../overview:refresh` recomputes the snapshot on demand.
47910
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdOverview
47911
+ parameters:
47912
+ - $ref: "#/components/parameters/XCorrelationId"
47913
+ - example: 018f0000-0000-7000-8000-000000000001
47914
+ in: path
47915
+ name: organizationId
47916
+ required: true
47917
+ schema:
47918
+ format: uuid
47919
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
47920
+ type: string
47921
+ - example: 018f0000-0000-7000-8000-000000000001
47922
+ in: path
47923
+ name: publicationId
47924
+ required: true
47925
+ schema:
47926
+ format: uuid
47927
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
47928
+ type: string
47929
+ - description: A previously returned `ETag`; a match answers `304`.
47930
+ example: '"a1b2c3d4"'
47931
+ in: header
47932
+ name: If-None-Match
47933
+ required: false
47934
+ schema:
47935
+ maxLength: 256
47936
+ type: string
47937
+ responses:
47938
+ "200":
47939
+ content:
47940
+ application/json:
47941
+ examples:
47942
+ nominal:
47943
+ summary: Nominal successful response
47944
+ value:
47945
+ computedAt: "2026-10-31T06:00:00.000Z"
47946
+ expiresAt: "2026-11-01T06:00:00.000Z"
47947
+ followers: 12
47948
+ interactions:
47949
+ comments: 8
47950
+ commentsAwaitingModeration: 1
47951
+ reactions: 41
47952
+ lastPublish:
47953
+ at: "2026-10-30T18:30:00.000Z"
47954
+ outcome: SUCCEEDED
47955
+ newsletterSubscribers:
47956
+ confirmed: 120
47957
+ pending: 4
47958
+ posts:
47959
+ complete: true
47960
+ draft: 3
47961
+ published: 25
47962
+ scheduled: 2
47963
+ reviewsWaitingOnYou: 0
47964
+ unreadContactMessages: 2
47965
+ schema:
47966
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewResponse"
47967
+ description: read a site's overview succeeded
47968
+ headers:
47969
+ Cache-Control:
47970
+ $ref: "#/components/headers/CacheControlNoStore"
47971
+ ETag:
47972
+ description: Validator of this snapshot and the live fields.
47973
+ required: true
47974
+ schema:
47975
+ maxLength: 256
47976
+ type: string
47977
+ X-Correlation-Id:
47978
+ $ref: "#/components/headers/XCorrelationId"
47979
+ "304":
47980
+ description: the caller's `If-None-Match` still matches; no body
47981
+ headers:
47982
+ ETag:
47983
+ description: Validator of this snapshot and the live fields.
47984
+ required: true
47985
+ schema:
47986
+ maxLength: 256
47987
+ type: string
47988
+ X-Correlation-Id:
47989
+ $ref: "#/components/headers/XCorrelationId"
47990
+ "400":
47991
+ $ref: "#/components/responses/ValidationFailed"
47992
+ "401":
47993
+ content:
47994
+ application/problem+json:
47995
+ examples:
47996
+ AUTHENTICATION_REQUIRED:
47997
+ summary: AUTHENTICATION_REQUIRED
47998
+ value:
47999
+ code: AUTHENTICATION_REQUIRED
48000
+ correlationId: 018f0000-0000-7000-8000-000000000001
48001
+ detail: See the operation contract.
48002
+ errors: []
48003
+ retryable: false
48004
+ schemaId: urn:gala:schema:problem:2.0.0
48005
+ schemaVersion: 2.0.0
48006
+ status: 401
48007
+ title: AUTHENTICATION_REQUIRED
48008
+ type: urn:gala:problem:authentication-required
48009
+ schema:
48010
+ $ref: "#/components/schemas/Problem"
48011
+ description: AUTHENTICATION_REQUIRED
48012
+ headers:
48013
+ Cache-Control:
48014
+ $ref: "#/components/headers/CacheControlNoStore"
48015
+ X-Correlation-Id:
48016
+ $ref: "#/components/headers/XCorrelationId"
48017
+ x-gala-problem-codes:
48018
+ - AUTHENTICATION_REQUIRED
48019
+ "403":
48020
+ $ref: "#/components/responses/AuthorizationDenied"
48021
+ "404":
48022
+ $ref: "#/components/responses/ResourceNotFound"
48023
+ security:
48024
+ - browserSession: []
48025
+ summary: read a site's overview
48026
+ tags:
48027
+ - audience
48028
+ x-gala-activation-gate: MVP
48029
+ x-gala-activation-guards:
48030
+ - NONE
48031
+ x-gala-capability-key: publication.view
48032
+ x-gala-concurrency: authorization-and-publication-epochs
48033
+ x-gala-conditional-capabilities: []
48034
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48035
+ x-gala-nullability: required-and-nullable-are-explicit
48036
+ x-gala-purpose: read a site's overview
48037
+ x-gala-reachable-problems:
48038
+ - AUTHENTICATION_REQUIRED
48039
+ - AUTHORIZATION_DENIED
48040
+ - RESOURCE_NOT_FOUND
48041
+ - VALIDATION_FAILED
48042
+ x-gala-replay-identity: safe-query
48043
+ x-gala-state-guards:
48044
+ - NONE
48045
+ x-gala-success-category: query
48046
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
48047
+ /v2/organizations/{organizationId}/publications/{publicationId}/overview:refresh:
48048
+ post:
48049
+ description: |
48050
+ Needs `publication.view`. Recomputes the site's overview snapshot now
48051
+ and returns the same `PublicationOverview` as the read. At most one
48052
+ refresh per site per minute; a faster second call answers `429
48053
+ RATE_LIMITED` with `Retry-After`.
48054
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewRefresh
48055
+ parameters:
48056
+ - $ref: "#/components/parameters/XCorrelationId"
48057
+ - example: 018f0000-0000-7000-8000-000000000001
48058
+ in: path
48059
+ name: organizationId
48060
+ required: true
48061
+ schema:
48062
+ format: uuid
48063
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
48064
+ type: string
48065
+ - example: 018f0000-0000-7000-8000-000000000001
48066
+ in: path
48067
+ name: publicationId
48068
+ required: true
48069
+ schema:
48070
+ format: uuid
48071
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
48072
+ type: string
48073
+ - $ref: "#/components/parameters/XCsrfToken"
48074
+ responses:
48075
+ "200":
48076
+ content:
48077
+ application/json:
48078
+ examples:
48079
+ nominal:
48080
+ summary: Nominal successful response
48081
+ value:
48082
+ computedAt: "2026-10-31T06:00:00.000Z"
48083
+ expiresAt: "2026-11-01T06:00:00.000Z"
48084
+ followers: 12
48085
+ interactions:
48086
+ comments: 8
48087
+ commentsAwaitingModeration: 1
48088
+ reactions: 41
48089
+ lastPublish:
48090
+ at: "2026-10-30T18:30:00.000Z"
48091
+ outcome: SUCCEEDED
48092
+ newsletterSubscribers:
48093
+ confirmed: 120
48094
+ pending: 4
48095
+ posts:
48096
+ complete: true
48097
+ draft: 3
48098
+ published: 25
48099
+ scheduled: 2
48100
+ reviewsWaitingOnYou: 0
48101
+ unreadContactMessages: 2
48102
+ schema:
48103
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewRefreshResponse"
48104
+ description: refresh a site's overview succeeded
48105
+ headers:
48106
+ Cache-Control:
48107
+ $ref: "#/components/headers/CacheControlNoStore"
48108
+ X-Correlation-Id:
48109
+ $ref: "#/components/headers/XCorrelationId"
48110
+ "400":
48111
+ $ref: "#/components/responses/ValidationFailed"
48112
+ "401":
48113
+ content:
48114
+ application/problem+json:
48115
+ examples:
48116
+ AUTHENTICATION_REQUIRED:
48117
+ summary: AUTHENTICATION_REQUIRED
48118
+ value:
48119
+ code: AUTHENTICATION_REQUIRED
48120
+ correlationId: 018f0000-0000-7000-8000-000000000001
48121
+ detail: See the operation contract.
48122
+ errors: []
48123
+ retryable: false
48124
+ schemaId: urn:gala:schema:problem:2.0.0
48125
+ schemaVersion: 2.0.0
48126
+ status: 401
48127
+ title: AUTHENTICATION_REQUIRED
48128
+ type: urn:gala:problem:authentication-required
48129
+ schema:
48130
+ $ref: "#/components/schemas/Problem"
48131
+ description: AUTHENTICATION_REQUIRED
48132
+ headers:
48133
+ Cache-Control:
48134
+ $ref: "#/components/headers/CacheControlNoStore"
48135
+ X-Correlation-Id:
48136
+ $ref: "#/components/headers/XCorrelationId"
48137
+ x-gala-problem-codes:
48138
+ - AUTHENTICATION_REQUIRED
48139
+ "403":
48140
+ $ref: "#/components/responses/AuthorizationDenied"
48141
+ "404":
48142
+ $ref: "#/components/responses/ResourceNotFound"
48143
+ "429":
48144
+ content:
48145
+ application/problem+json:
48146
+ examples:
48147
+ RATE_LIMITED:
48148
+ summary: RATE_LIMITED
48149
+ value:
48150
+ code: RATE_LIMITED
48151
+ correlationId: 018f0000-0000-7000-8000-000000000001
48152
+ detail: See the operation contract.
48153
+ errors: []
48154
+ retryable: true
48155
+ schemaId: urn:gala:schema:problem:2.0.0
48156
+ schemaVersion: 2.0.0
48157
+ status: 429
48158
+ title: RATE_LIMITED
48159
+ type: urn:gala:problem:rate-limited
48160
+ schema:
48161
+ $ref: "#/components/schemas/Problem"
48162
+ description: RATE_LIMITED
48163
+ headers:
48164
+ Cache-Control:
48165
+ $ref: "#/components/headers/CacheControlNoStore"
48166
+ Retry-After:
48167
+ $ref: "#/components/headers/RetryAfter"
48168
+ X-Correlation-Id:
48169
+ $ref: "#/components/headers/XCorrelationId"
48170
+ x-gala-problem-codes:
48171
+ - RATE_LIMITED
48172
+ security:
48173
+ - browserSession: []
48174
+ summary: refresh a site's overview
48175
+ tags:
48176
+ - audience
48177
+ x-gala-activation-gate: MVP
48178
+ x-gala-activation-guards:
48179
+ - NONE
48180
+ x-gala-capability-key: publication.view
48181
+ x-gala-concurrency: authorization-and-publication-epochs
48182
+ x-gala-conditional-capabilities: []
48183
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48184
+ x-gala-nullability: required-and-nullable-are-explicit
48185
+ x-gala-purpose: refresh a site's overview
48186
+ x-gala-reachable-problems:
48187
+ - AUTHENTICATION_REQUIRED
48188
+ - AUTHORIZATION_DENIED
48189
+ - RATE_LIMITED
48190
+ - RESOURCE_NOT_FOUND
48191
+ - VALIDATION_FAILED
48192
+ x-gala-replay-identity: natural-idempotent-state
48193
+ x-gala-state-guards:
48194
+ - NONE
48195
+ x-gala-success-category: protocol
48196
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
46788
48197
  /v2/organizations/{organizationId}/publications/{publicationId}/policy-settings:
46789
48198
  get:
46790
48199
  description: Reads the site's Terms and Privacy text at the linked repository's current main branch head, meaning the `policies` member of `gala/publication.json` and the two markdown files it names. `source` is `FILE` when the repository names its own pages, and `terms` and `privacy` then carry each page's title and markdown. `source` is `DEFAULT` when `policies` is absent, and the site then shows the default text of `@rathnasgala2/schemas/site-policy-defaults`, which the API does not carry, and `terms` and `privacy` are omitted. `setUp` matches `GET .../repository/setup`'s `state`; `openChange` names an existing not-yet-published change of this publication that touches `gala/publication.json` or a policy file, or is null. SCHEMA-3.17.0 adds `422 VALIDATION_FAILED`, answered when `gala/publication.json` names a policy file that does not exist at the head; the repository is then inconsistent and no page text can be read, so the author fixes the repository (or writes both pages again with `PUT`) before the read answers.