@rathnasgala2/schemas 3.28.0 → 3.30.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
@@ -621,6 +629,93 @@ components:
621
629
  - description
622
630
  - group
623
631
  type: object
632
+ AssistanceRequest:
633
+ additionalProperties: false
634
+ description: "SCHEMA-3.30.0: a request the site made to the Galascribe team."
635
+ properties:
636
+ closedAt:
637
+ $ref: "#/components/schemas/PortableProblemRfc3339"
638
+ description: When an operator closed the request. Absent while it is `OPEN`.
639
+ createdAt:
640
+ $ref: "#/components/schemas/PortableProblemRfc3339"
641
+ domainName:
642
+ description: The domain the request is about (`DOMAIN_REGISTRATION`, `DOMAIN_MOVE`). Absent for other kinds.
643
+ maxLength: 253
644
+ minLength: 1
645
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
646
+ type: string
647
+ findingCodes:
648
+ description: The hosting-check findings the request is about (`GALASCRIBE_HOSTING`). Absent for other kinds.
649
+ items:
650
+ $ref: "#/components/schemas/HostingFindingCode"
651
+ maxItems: 8
652
+ type: array
653
+ uniqueItems: true
654
+ kind:
655
+ $ref: "#/components/schemas/AssistanceRequestKind"
656
+ requestId:
657
+ format: uuid
658
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
659
+ type: string
660
+ state:
661
+ $ref: "#/components/schemas/AssistanceRequestState"
662
+ required:
663
+ - requestId
664
+ - kind
665
+ - state
666
+ - createdAt
667
+ type: object
668
+ AssistanceRequestCreate:
669
+ additionalProperties: false
670
+ description: "SCHEMA-3.30.0: a request for help with a site."
671
+ properties:
672
+ domainName:
673
+ description: The domain the request is about (`DOMAIN_REGISTRATION`, `DOMAIN_MOVE`). Absent for other kinds.
674
+ maxLength: 253
675
+ minLength: 1
676
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
677
+ type: string
678
+ findingCodes:
679
+ description: The hosting-check findings the request is about (`GALASCRIBE_HOSTING`). Absent for other kinds.
680
+ items:
681
+ $ref: "#/components/schemas/HostingFindingCode"
682
+ maxItems: 8
683
+ type: array
684
+ uniqueItems: true
685
+ kind:
686
+ $ref: "#/components/schemas/AssistanceRequestKind"
687
+ note:
688
+ description: Anything the person wants the Galascribe team to know.
689
+ maxLength: 1000
690
+ type: string
691
+ required:
692
+ - kind
693
+ type: object
694
+ AssistanceRequestKind:
695
+ description: "`GALASCRIBE_HOSTING`: host what GitHub Pages does not allow. `DOMAIN_REGISTRATION`: register the included domain by hand. `DOMAIN_MOVE`: move a registered domain to the author's own account."
696
+ enum:
697
+ - GALASCRIBE_HOSTING
698
+ - DOMAIN_REGISTRATION
699
+ - DOMAIN_MOVE
700
+ type: string
701
+ AssistanceRequestList:
702
+ additionalProperties: false
703
+ properties:
704
+ items:
705
+ items:
706
+ $ref: "#/components/schemas/AssistanceRequest"
707
+ maxItems: 100
708
+ minItems: 0
709
+ type: array
710
+ required:
711
+ - items
712
+ type: object
713
+ AssistanceRequestState:
714
+ description: "`OPEN`: waiting for the Galascribe team. `CLOSED`: an operator finished it."
715
+ enum:
716
+ - OPEN
717
+ - CLOSED
718
+ type: string
624
719
  AudienceAuthor:
625
720
  additionalProperties: false
626
721
  description: "SCHEMA-3.23.0: an author of a site as the site names it in `gala/publication.json`. `id` is the author's stable id; follows are keyed by (publication, author id)."
@@ -1491,6 +1586,12 @@ components:
1491
1586
  date. `deleteDate` (SCHEMA-3.25.1, optional and nullable) is the
1492
1587
  header's scheduled-removal date.
1493
1588
  properties:
1589
+ authorIds:
1590
+ 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."
1591
+ items:
1592
+ $ref: "#/components/schemas/PortableContentFrontmatterStableId"
1593
+ maxItems: 32
1594
+ type: array
1494
1595
  contentId:
1495
1596
  $ref: "#/components/schemas/PortableContentFrontmatterStableId"
1496
1597
  createdAt:
@@ -1504,6 +1605,9 @@ components:
1504
1605
  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."
1505
1606
  maxLength: 320
1506
1607
  type: string
1608
+ heroPath:
1609
+ $ref: "#/components/schemas/PortableContentFrontmatterRepoRelativePath"
1610
+ 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."
1507
1611
  language:
1508
1612
  $ref: "#/components/schemas/PortableContentFrontmatterBcp47"
1509
1613
  publishAfter:
@@ -1517,6 +1621,12 @@ components:
1517
1621
  $ref: "#/components/schemas/PortableContentFrontmatterSlug"
1518
1622
  status:
1519
1623
  $ref: "#/components/schemas/ContentItemStatus"
1624
+ tags:
1625
+ description: "SCHEMA-3.29.0: the header's `tags`, so a card can show them; absent when the header carries none."
1626
+ items:
1627
+ $ref: "#/components/schemas/PortableContentFrontmatterPlainLabel"
1628
+ maxItems: 32
1629
+ type: array
1520
1630
  title:
1521
1631
  $ref: "#/components/schemas/PortableContentFrontmatterPlainText"
1522
1632
  x-gala-graphemeLength:
@@ -1574,6 +1684,41 @@ components:
1574
1684
  - HEADER_INVALID
1575
1685
  - TOO_LARGE
1576
1686
  type: string
1687
+ ContentPreviewContext:
1688
+ additionalProperties: false
1689
+ description: |
1690
+ SCHEMA-3.29.0. The repository facts a draft preview needs besides the
1691
+ post, all read at `revision`. Every member is best-effort: a file that
1692
+ is absent, unreadable, over 256 KiB or invalid against its schema is
1693
+ `null` (`navigation`, `publication`) or left out of `authors`, and
1694
+ never fails the read. `authors` holds the author files the
1695
+ publication document declares, in the order it declares them, at most
1696
+ 200.
1697
+ properties:
1698
+ authors:
1699
+ items:
1700
+ $ref: "#/components/schemas/PortableAuthorDocument"
1701
+ maxItems: 200
1702
+ type: array
1703
+ navigation:
1704
+ description: The `gala/navigation.json` document, validated against its schema; `null` when the file is absent or invalid.
1705
+ oneOf:
1706
+ - $ref: "#/components/schemas/PortableNavigationDocument"
1707
+ - type: "null"
1708
+ publication:
1709
+ description: The `gala/publication.json` document, validated against its schema; `null` when the file is absent or invalid.
1710
+ oneOf:
1711
+ - $ref: "#/components/schemas/PortablePublicationDocument"
1712
+ - type: "null"
1713
+ revision:
1714
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
1715
+ type: string
1716
+ required:
1717
+ - revision
1718
+ - navigation
1719
+ - publication
1720
+ - authors
1721
+ type: object
1577
1722
  ContentPublicationAuthorSummary:
1578
1723
  additionalProperties: false
1579
1724
  properties:
@@ -2231,6 +2376,24 @@ components:
2231
2376
  type: string
2232
2377
  expiresAt:
2233
2378
  $ref: "#/components/schemas/PortableProblemRfc3339"
2379
+ galascribeManaged:
2380
+ additionalProperties: false
2381
+ description: |
2382
+ SCHEMA-3.30.0. Present when Galascribe owns the DNS records of this
2383
+ domain, so the person is never asked to add records and a client
2384
+ shows the steps as "Galascribe is setting this up". Absent for a
2385
+ domain the person brought. `GALASCRIBE_ADDRESS`: a free
2386
+ `name.galascribe.com` address (Basic and Pro). `INCLUDED_DOMAIN`: the
2387
+ domain registered for the organization with its plan (Pro).
2388
+ properties:
2389
+ kind:
2390
+ enum:
2391
+ - GALASCRIBE_ADDRESS
2392
+ - INCLUDED_DOMAIN
2393
+ type: string
2394
+ required:
2395
+ - kind
2396
+ type: object
2234
2397
  hostname:
2235
2398
  description: Lower-case ASCII (IDNA) hostname.
2236
2399
  maxLength: 253
@@ -2427,6 +2590,182 @@ components:
2427
2590
  - code
2428
2591
  - detail
2429
2592
  type: object
2593
+ DomainRegistrant:
2594
+ additionalProperties: false
2595
+ description: The person or business that will own the domain. Sent to the registrar and never stored, logged or returned by Galascribe (write-only).
2596
+ properties:
2597
+ address:
2598
+ $ref: "#/components/schemas/DomainRegistrationAddress"
2599
+ email:
2600
+ format: email
2601
+ maxLength: 254
2602
+ minLength: 3
2603
+ type: string
2604
+ name:
2605
+ maxLength: 200
2606
+ minLength: 1
2607
+ type: string
2608
+ organization:
2609
+ description: The business name, when the owner is a business.
2610
+ maxLength: 200
2611
+ minLength: 1
2612
+ type: string
2613
+ phone:
2614
+ description: Country code and number in the form `+1.5555555555`.
2615
+ pattern: ^\+[0-9]{1,3}\.[0-9]{4,14}$
2616
+ type: string
2617
+ required:
2618
+ - name
2619
+ - email
2620
+ - phone
2621
+ - address
2622
+ type: object
2623
+ DomainRegistration:
2624
+ additionalProperties: false
2625
+ description: "SCHEMA-3.30.0: the registration of an included domain. The registrant is never part of it."
2626
+ properties:
2627
+ createdAt:
2628
+ $ref: "#/components/schemas/PortableProblemRfc3339"
2629
+ domainId:
2630
+ description: The domain binding once the site uses the domain (`ATTACHED`).
2631
+ format: uuid
2632
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2633
+ type: string
2634
+ domainName:
2635
+ maxLength: 253
2636
+ minLength: 1
2637
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
2638
+ type: string
2639
+ failure:
2640
+ additionalProperties: false
2641
+ description: Present for `FAILED` and `ACTION_REQUIRED`.
2642
+ properties:
2643
+ code:
2644
+ description: A short machine-readable reason.
2645
+ maxLength: 100
2646
+ minLength: 1
2647
+ type: string
2648
+ detail:
2649
+ description: A plain sentence for the person.
2650
+ maxLength: 500
2651
+ minLength: 1
2652
+ type: string
2653
+ required:
2654
+ - code
2655
+ - detail
2656
+ type: object
2657
+ registrationId:
2658
+ format: uuid
2659
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2660
+ type: string
2661
+ state:
2662
+ $ref: "#/components/schemas/DomainRegistrationState"
2663
+ updatedAt:
2664
+ $ref: "#/components/schemas/PortableProblemRfc3339"
2665
+ required:
2666
+ - registrationId
2667
+ - domainName
2668
+ - state
2669
+ - createdAt
2670
+ - updatedAt
2671
+ type: object
2672
+ DomainRegistrationAddress:
2673
+ additionalProperties: false
2674
+ properties:
2675
+ city:
2676
+ maxLength: 100
2677
+ minLength: 1
2678
+ type: string
2679
+ countryCode:
2680
+ description: ISO 3166-1 alpha-2, upper case.
2681
+ pattern: ^[A-Z]{2}$
2682
+ type: string
2683
+ postalCode:
2684
+ maxLength: 20
2685
+ minLength: 1
2686
+ type: string
2687
+ region:
2688
+ description: State or province (the region), when the country has them.
2689
+ maxLength: 100
2690
+ minLength: 1
2691
+ type: string
2692
+ street:
2693
+ maxLength: 200
2694
+ minLength: 1
2695
+ type: string
2696
+ required:
2697
+ - street
2698
+ - city
2699
+ - postalCode
2700
+ - countryCode
2701
+ type: object
2702
+ DomainRegistrationCheck:
2703
+ additionalProperties: false
2704
+ description: "SCHEMA-3.30.0: whether a name can be registered as the included domain. It carries no price: the domain is included in the plan."
2705
+ properties:
2706
+ name:
2707
+ description: The name that was checked, as Galascribe read it.
2708
+ maxLength: 253
2709
+ minLength: 1
2710
+ type: string
2711
+ reason:
2712
+ $ref: "#/components/schemas/DomainRegistrationCheckReason"
2713
+ description: Why the name cannot be registered. Absent when `registrable` is true.
2714
+ registrable:
2715
+ type: boolean
2716
+ required:
2717
+ - name
2718
+ - registrable
2719
+ type: object
2720
+ DomainRegistrationCheckReason:
2721
+ description: "`UNAVAILABLE`: already registered. `EXTENSION_NOT_SUPPORTED`: Galascribe cannot register that ending. `PREMIUM`: a premium name. `OVER_PRICE_CAP`: the first-year price is above what the included domain covers. `INVALID_NAME`: not a usable domain name. `PLAN_REQUIRED`: the plan has no included domain. `ALREADY_USED`: the organization already used its included domain. `NOT_CONFIGURED`: registration is not set up on this deployment."
2722
+ enum:
2723
+ - UNAVAILABLE
2724
+ - EXTENSION_NOT_SUPPORTED
2725
+ - PREMIUM
2726
+ - OVER_PRICE_CAP
2727
+ - INVALID_NAME
2728
+ - PLAN_REQUIRED
2729
+ - ALREADY_USED
2730
+ - NOT_CONFIGURED
2731
+ type: string
2732
+ DomainRegistrationCreate:
2733
+ additionalProperties: false
2734
+ description: "SCHEMA-3.30.0: register the included domain."
2735
+ properties:
2736
+ domainName:
2737
+ description: The domain to register, for example `mayawrites.com`.
2738
+ maxLength: 253
2739
+ minLength: 1
2740
+ type: string
2741
+ registrant:
2742
+ $ref: "#/components/schemas/DomainRegistrant"
2743
+ required:
2744
+ - domainName
2745
+ - registrant
2746
+ type: object
2747
+ DomainRegistrationList:
2748
+ additionalProperties: false
2749
+ properties:
2750
+ items:
2751
+ items:
2752
+ $ref: "#/components/schemas/DomainRegistration"
2753
+ maxItems: 20
2754
+ minItems: 0
2755
+ type: array
2756
+ required:
2757
+ - items
2758
+ type: object
2759
+ DomainRegistrationState:
2760
+ description: "`REQUESTED`: accepted, not started. `REGISTERING`: the registrar is registering the name. `ACTION_REQUIRED`: the registrar needs something Galascribe cannot do alone; the person may ask for help. `REGISTERED`: the name is bought and the site does not use it yet. `ATTACHED`: the site uses it; `domainId` names the binding. `FAILED`: registration did not happen; `failure` says why."
2761
+ enum:
2762
+ - REQUESTED
2763
+ - REGISTERING
2764
+ - ACTION_REQUIRED
2765
+ - REGISTERED
2766
+ - ATTACHED
2767
+ - FAILED
2768
+ type: string
2430
2769
  DomainRouting:
2431
2770
  additionalProperties: false
2432
2771
  properties:
@@ -2560,6 +2899,42 @@ components:
2560
2899
  - displayName
2561
2900
  - followedAt
2562
2901
  type: object
2902
+ GalascribeAddressCheck:
2903
+ additionalProperties: false
2904
+ description: "SCHEMA-3.30.0: whether a label can become the site's Galascribe address."
2905
+ properties:
2906
+ available:
2907
+ type: boolean
2908
+ hostname:
2909
+ description: The full address, when the label is well formed.
2910
+ maxLength: 253
2911
+ minLength: 1
2912
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
2913
+ type: string
2914
+ label:
2915
+ $ref: "#/components/schemas/GalascribeAddressLabel"
2916
+ reason:
2917
+ $ref: "#/components/schemas/GalascribeAddressReason"
2918
+ description: Why the label cannot be used. Absent when `available` is true.
2919
+ required:
2920
+ - label
2921
+ - available
2922
+ type: object
2923
+ GalascribeAddressLabel:
2924
+ description: "The part before `.galascribe.com`: 3 to 63 lowercase letters, digits and hyphens, not starting or ending with a hyphen. A label that is not usable is answered by the check as `INVALID`."
2925
+ maxLength: 63
2926
+ minLength: 1
2927
+ type: string
2928
+ GalascribeAddressReason:
2929
+ description: "`INVALID`: not a usable label. `RESERVED`: a name Galascribe keeps for itself. `TAKEN`: another site has it or something already exists at that name. `PLAN_REQUIRED`: the plan has no Galascribe address. `NOT_CONFIGURED`: not set up on this deployment. `ALREADY_HAS_DOMAIN`: the site already has a domain that is not detached."
2930
+ enum:
2931
+ - INVALID
2932
+ - RESERVED
2933
+ - TAKEN
2934
+ - PLAN_REQUIRED
2935
+ - NOT_CONFIGURED
2936
+ - ALREADY_HAS_DOMAIN
2937
+ type: string
2563
2938
  GetClaimsByTokenResponse:
2564
2939
  additionalProperties: false
2565
2940
  properties:
@@ -3040,6 +3415,8 @@ components:
3040
3415
  - items
3041
3416
  - hasMore
3042
3417
  type: object
3418
+ GetOrganizationsByOrganizationIdPlanResponse:
3419
+ $ref: "#/components/schemas/OrganizationPlan"
3043
3420
  GetOrganizationsByOrganizationIdPublicationImportsByImportIdResponse:
3044
3421
  allOf:
3045
3422
  - $ref: "#/components/schemas/PublicationImport"
@@ -3193,6 +3570,8 @@ components:
3193
3570
  - catalog
3194
3571
  - openChange
3195
3572
  type: object
3573
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsResponse:
3574
+ $ref: "#/components/schemas/AssistanceRequestList"
3196
3575
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContactFormSettingsResponse:
3197
3576
  $ref: "#/components/schemas/ContactFormSettings"
3198
3577
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContactMessagesResponse:
@@ -3250,6 +3629,8 @@ components:
3250
3629
  - body
3251
3630
  - digest
3252
3631
  type: object
3632
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContextResponse:
3633
+ $ref: "#/components/schemas/ContentPreviewContext"
3253
3634
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentResponse:
3254
3635
  additionalProperties: false
3255
3636
  allOf:
@@ -3553,6 +3934,10 @@ components:
3553
3934
  - version
3554
3935
  - state
3555
3936
  type: object
3937
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsByRegistrationIdResponse:
3938
+ $ref: "#/components/schemas/DomainRegistration"
3939
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsResponse:
3940
+ $ref: "#/components/schemas/DomainRegistrationList"
3556
3941
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsByDomainIdDnsConnectionsByConnectionIdResponse:
3557
3942
  allOf:
3558
3943
  - $ref: "#/components/schemas/DnsConnection"
@@ -4146,6 +4531,8 @@ components:
4146
4531
  type: object
4147
4532
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdSharingSettingsResponse:
4148
4533
  $ref: "#/components/schemas/SharingSettings"
4534
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteHostingCheckResponse:
4535
+ $ref: "#/components/schemas/SiteHostingCheck"
4149
4536
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteResponse:
4150
4537
  additionalProperties: false
4151
4538
  allOf:
@@ -4491,6 +4878,8 @@ components:
4491
4878
  required:
4492
4879
  - items
4493
4880
  type: object
4881
+ GetPlatformAssistanceRequestsResponse:
4882
+ $ref: "#/components/schemas/PlatformAssistanceRequestPage"
4494
4883
  GetPlatformAuditEventsResponse:
4495
4884
  additionalProperties: false
4496
4885
  allOf:
@@ -5786,6 +6175,103 @@ components:
5786
6175
  - reasonCode
5787
6176
  - retryable
5788
6177
  type: object
6178
+ HostingFinding:
6179
+ additionalProperties: false
6180
+ description: "SCHEMA-3.30.0: one thing the hosting check found. There is at most one finding per `code`."
6181
+ properties:
6182
+ bytes:
6183
+ description: "The measured size in bytes for a size finding: the total for the site and media findings, the largest file for the file findings."
6184
+ format: int64
6185
+ minimum: 0
6186
+ type: integer
6187
+ code:
6188
+ $ref: "#/components/schemas/HostingFindingCode"
6189
+ items:
6190
+ description: Up to 20 of the files or pages concerned, largest or first found first. `pathCount` is the full number.
6191
+ items:
6192
+ $ref: "#/components/schemas/HostingFindingItem"
6193
+ maxItems: 20
6194
+ type: array
6195
+ limitBytes:
6196
+ description: The threshold in bytes the finding is measured against, for a size finding.
6197
+ format: int64
6198
+ minimum: 0
6199
+ type: integer
6200
+ pathCount:
6201
+ description: How many files or pages the finding concerns in all.
6202
+ format: int64
6203
+ minimum: 0
6204
+ type: integer
6205
+ severity:
6206
+ $ref: "#/components/schemas/HostingFindingSeverity"
6207
+ signals:
6208
+ description: What made a `COMMERCE_PAGE` or `SENSITIVE_FORM` finding fire. Absent for other codes.
6209
+ items:
6210
+ $ref: "#/components/schemas/HostingFindingSignal"
6211
+ maxItems: 5
6212
+ type: array
6213
+ uniqueItems: true
6214
+ required:
6215
+ - code
6216
+ - severity
6217
+ - items
6218
+ - pathCount
6219
+ type: object
6220
+ HostingFindingCode:
6221
+ description: "`SITE_OVER_SIZE_LIMIT`: the published files add up to 1 GiB or more, the most GitHub Pages serves. `SITE_NEAR_SIZE_LIMIT`: they add up to 800 MiB or more. `FILE_OVER_SIZE_LIMIT`: one file is 100 MiB or more, which GitHub refuses. `LARGE_FILE`: one file is 50 MiB or more, which GitHub warns about. `DIRECTORY_TOO_LARGE`: one folder holds more than 3,000 entries. `HEAVY_MEDIA`: images, audio, video and PDFs together are 500 MiB or more. `COMMERCE_PAGE`: a page links to a checkout and uses shop words, or is named like a shop, and GitHub does not allow sites that are mainly for selling. `SENSITIVE_FORM`: a page has a password or card-number field, and GitHub does not allow sending passwords or card numbers."
6222
+ enum:
6223
+ - SITE_OVER_SIZE_LIMIT
6224
+ - SITE_NEAR_SIZE_LIMIT
6225
+ - FILE_OVER_SIZE_LIMIT
6226
+ - LARGE_FILE
6227
+ - DIRECTORY_TOO_LARGE
6228
+ - HEAVY_MEDIA
6229
+ - COMMERCE_PAGE
6230
+ - SENSITIVE_FORM
6231
+ type: string
6232
+ HostingFindingItem:
6233
+ additionalProperties: false
6234
+ description: One file or page a finding is about.
6235
+ properties:
6236
+ bytes:
6237
+ description: The file size in bytes, for size findings.
6238
+ format: int64
6239
+ minimum: 0
6240
+ type: integer
6241
+ path:
6242
+ description: The path in the site's repository.
6243
+ maxLength: 1024
6244
+ minLength: 1
6245
+ type: string
6246
+ title:
6247
+ description: The page's title, when it has one.
6248
+ maxLength: 300
6249
+ minLength: 1
6250
+ type: string
6251
+ required:
6252
+ - path
6253
+ type: object
6254
+ HostingFindingSeverity:
6255
+ description: "`LIMIT`: GitHub will refuse the deploy or stop serving the site. `WARNING`: a risk that does not stop publishing."
6256
+ enum:
6257
+ - LIMIT
6258
+ - WARNING
6259
+ type: string
6260
+ HostingFindingSignal:
6261
+ description: 'What made a `COMMERCE_PAGE` or `SENSITIVE_FORM` finding fire. `CHECKOUT_LINK`: a link to a known checkout or payment host. `SHOP_WORDS`: words such as "add to cart" or "buy now". `SHOP_ADDRESS`: a page address or title such as shop, store, cart or checkout. `PASSWORD_FIELD`: a password input in raw HTML. `CARD_FIELD`: a card-number or security-code input in raw HTML.'
6262
+ enum:
6263
+ - CHECKOUT_LINK
6264
+ - SHOP_WORDS
6265
+ - SHOP_ADDRESS
6266
+ - PASSWORD_FIELD
6267
+ - CARD_FIELD
6268
+ type: string
6269
+ HostingOffer:
6270
+ description: "`UPGRADE`: the Free plan can move to a paid plan, which includes Galascribe hosting. `REQUEST_GALASCRIBE_HOSTING`: a paid plan can ask Galascribe to host what GitHub does not allow."
6271
+ enum:
6272
+ - UPGRADE
6273
+ - REQUEST_GALASCRIBE_HOSTING
6274
+ type: string
5789
6275
  IncomingOwnerTransfer:
5790
6276
  additionalProperties: false
5791
6277
  description: A pending ownership transfer addressed to the caller. `consequenceDigest` is what `:accept` quotes back.
@@ -7813,11 +8299,67 @@ components:
7813
8299
  - startedAt
7814
8300
  type: object
7815
8301
  OrganizationKind:
7816
- description: "`SINGLE`: a personal (Pro) organization with one owner and no other members. `COLLABORATIVE`: an Enterprise organization with members, roles and custom roles (SCHEMA-3.3.0)."
8302
+ description: "`SINGLE`: a personal organization with one owner and no other members. It becomes `COLLABORATIVE` with its first invitation, on any plan (SCHEMA-3.30.0). `COLLABORATIVE`: an organization with members, roles and custom roles (SCHEMA-3.3.0)."
7817
8303
  enum:
7818
8304
  - SINGLE
7819
8305
  - COLLABORATIVE
7820
8306
  type: string
8307
+ OrganizationPlan:
8308
+ additionalProperties: false
8309
+ description: "SCHEMA-3.30.0: an organization's plan as the App needs it. `tier` is the API tier (`FREE`, `PRO`, `BUSINESS`); the plans are named Free, Basic and Pro in billing and in the App, so `PRO` is Basic and `BUSINESS` is Pro."
8310
+ properties:
8311
+ collaborators:
8312
+ additionalProperties: false
8313
+ description: How many people besides the owners the plan lets the organization have.
8314
+ properties:
8315
+ limit:
8316
+ description: The most collaborators the plan allows, or null when the plan has no limit.
8317
+ format: int64
8318
+ minimum: 0
8319
+ type:
8320
+ - integer
8321
+ - "null"
8322
+ used:
8323
+ description: Active members other than owners plus invitations still `PENDING`. An invitation counts from the moment it is sent.
8324
+ format: int64
8325
+ minimum: 0
8326
+ type: integer
8327
+ required:
8328
+ - limit
8329
+ - used
8330
+ type: object
8331
+ entitlements:
8332
+ additionalProperties: false
8333
+ description: What the plan includes. A client hides what is false and offers the upgrade.
8334
+ properties:
8335
+ galascribeAddress:
8336
+ description: A free `name.galascribe.com` address for a site (Basic and Pro).
8337
+ type: boolean
8338
+ galascribeHosting:
8339
+ description: Galascribe can host what GitHub Pages does not allow, on request (Basic and Pro).
8340
+ type: boolean
8341
+ includedDomain:
8342
+ description: One domain registered for the organization at no charge (Pro).
8343
+ type: boolean
8344
+ required:
8345
+ - galascribeAddress
8346
+ - includedDomain
8347
+ - galascribeHosting
8348
+ type: object
8349
+ galascribeAddressZone:
8350
+ description: The zone Galascribe addresses are created in, for example `galascribe.com`. Absent when Galascribe addresses are not configured on this deployment; a client then hides the option.
8351
+ maxLength: 253
8352
+ minLength: 1
8353
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
8354
+ type: string
8355
+ tier:
8356
+ $ref: "#/components/schemas/PlatformPlanKey"
8357
+ description: The plan tier.
8358
+ required:
8359
+ - tier
8360
+ - collaborators
8361
+ - entitlements
8362
+ type: object
7821
8363
  OrganizationState:
7822
8364
  enum:
7823
8365
  - PROVISIONING
@@ -8404,6 +8946,114 @@ components:
8404
8946
  - content:write
8405
8947
  - publish
8406
8948
  type: string
8949
+ PlatformAssistanceRequest:
8950
+ additionalProperties: false
8951
+ description: "SCHEMA-3.30.0: an assistance request with the organization and site it came from, for the platform operator."
8952
+ properties:
8953
+ closedAt:
8954
+ $ref: "#/components/schemas/PortableProblemRfc3339"
8955
+ description: When an operator closed the request. Absent while it is `OPEN`.
8956
+ createdAt:
8957
+ $ref: "#/components/schemas/PortableProblemRfc3339"
8958
+ domainName:
8959
+ description: The domain the request is about (`DOMAIN_REGISTRATION`, `DOMAIN_MOVE`). Absent for other kinds.
8960
+ maxLength: 253
8961
+ minLength: 1
8962
+ pattern: ^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$
8963
+ type: string
8964
+ findingCodes:
8965
+ description: The hosting-check findings the request is about (`GALASCRIBE_HOSTING`). Absent for other kinds.
8966
+ items:
8967
+ $ref: "#/components/schemas/HostingFindingCode"
8968
+ maxItems: 8
8969
+ type: array
8970
+ uniqueItems: true
8971
+ kind:
8972
+ $ref: "#/components/schemas/AssistanceRequestKind"
8973
+ note:
8974
+ description: The person's note.
8975
+ maxLength: 1000
8976
+ type: string
8977
+ organizationId:
8978
+ format: uuid
8979
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
8980
+ type: string
8981
+ organizationName:
8982
+ maxLength: 200
8983
+ minLength: 1
8984
+ type: string
8985
+ publicationId:
8986
+ format: uuid
8987
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
8988
+ type: string
8989
+ publicationName:
8990
+ maxLength: 200
8991
+ minLength: 1
8992
+ type: string
8993
+ requestId:
8994
+ format: uuid
8995
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
8996
+ type: string
8997
+ requestedByLogin:
8998
+ description: The GitHub login of the person who asked.
8999
+ maxLength: 100
9000
+ minLength: 1
9001
+ type: string
9002
+ state:
9003
+ $ref: "#/components/schemas/AssistanceRequestState"
9004
+ required:
9005
+ - requestId
9006
+ - kind
9007
+ - state
9008
+ - createdAt
9009
+ - organizationId
9010
+ - organizationName
9011
+ - publicationId
9012
+ - publicationName
9013
+ - requestedByLogin
9014
+ type: object
9015
+ PlatformAssistanceRequestPage:
9016
+ additionalProperties: false
9017
+ allOf:
9018
+ - else:
9019
+ properties:
9020
+ nextCursor:
9021
+ type: "null"
9022
+ if:
9023
+ properties:
9024
+ hasMore:
9025
+ not:
9026
+ enum:
9027
+ - false
9028
+ type: boolean
9029
+ x-gala-const: true
9030
+ required:
9031
+ - hasMore
9032
+ then:
9033
+ properties:
9034
+ nextCursor:
9035
+ type: string
9036
+ required:
9037
+ - nextCursor
9038
+ properties:
9039
+ hasMore:
9040
+ type: boolean
9041
+ items:
9042
+ items:
9043
+ $ref: "#/components/schemas/PlatformAssistanceRequest"
9044
+ maxItems: 100
9045
+ type: array
9046
+ nextCursor:
9047
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false.
9048
+ maxLength: 2048
9049
+ minLength: 1
9050
+ type:
9051
+ - string
9052
+ - "null"
9053
+ required:
9054
+ - items
9055
+ - hasMore
9056
+ type: object
8407
9057
  PlatformAuditEvent:
8408
9058
  additionalProperties: false
8409
9059
  description: "One audit event, redacted: identifiers and codes only, never request bodies or secrets."
@@ -8709,6 +9359,11 @@ components:
8709
9359
  PlatformPlan:
8710
9360
  additionalProperties: false
8711
9361
  properties:
9362
+ collaboratorLimit:
9363
+ description: "SCHEMA-3.30.0, the collaborators (active members other than owners plus pending invitations) one organization on this plan may have; a further invitation is `409 PLAN_REQUIRED`. 0 means no limit. Defaults: FREE 1, PRO and BUSINESS no limit."
9364
+ format: int64
9365
+ minimum: 0
9366
+ type: integer
8712
9367
  contactForm:
8713
9368
  description: "SCHEMA-3.23.0, whether sites on this plan may turn on the contact form. A site on a plan without it sees the form locked, and enabling it is `409 PLAN_REQUIRED`. Defaults of the first release: FREE 50 and no contact form, PRO 500 and a contact form, BUSINESS 2000 and a contact form."
8714
9369
  type: boolean
@@ -8732,6 +9387,7 @@ components:
8732
9387
  - newsletterSubscriberLimit
8733
9388
  - contactForm
8734
9389
  - listen
9390
+ - collaboratorLimit
8735
9391
  type: object
8736
9392
  PlatformPlanCapacityRelease:
8737
9393
  additionalProperties: false
@@ -9146,10 +9802,175 @@ components:
9146
9802
  type: object
9147
9803
  required: []
9148
9804
  type: object
9805
+ PortableAuthorBcp47:
9806
+ description: Structurally valid canonical BCP-47 language tag.
9807
+ format: gala-bcp47
9808
+ maxLength: 255
9809
+ minLength: 1
9810
+ pattern: ^[A-Za-z0-9-]+$
9811
+ type: string
9812
+ x-gala-utf8ByteLength:
9813
+ maximum: 255
9814
+ minimum: 1
9815
+ PortableAuthorDocument:
9816
+ additionalProperties: false
9817
+ properties:
9818
+ avatarRef:
9819
+ $ref: "#/components/schemas/PortableAuthorRepoRelativePath"
9820
+ biography:
9821
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9822
+ x-gala-graphemeLength:
9823
+ maximum: 2000
9824
+ minimum: 0
9825
+ displayName:
9826
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9827
+ x-gala-graphemeLength:
9828
+ maximum: 120
9829
+ minimum: 1
9830
+ extensions:
9831
+ $ref: "#/components/schemas/PortableAuthorExtensionMap"
9832
+ id:
9833
+ $ref: "#/components/schemas/PortableAuthorStableId"
9834
+ links:
9835
+ items:
9836
+ $ref: "#/components/schemas/PortableAuthorSocialLink"
9837
+ maxItems: 32
9838
+ minItems: 0
9839
+ type: array
9840
+ localized:
9841
+ items:
9842
+ $ref: "#/components/schemas/PortableAuthorLocalizedAuthor"
9843
+ maxItems: 32
9844
+ minItems: 0
9845
+ type: array
9846
+ pronouns:
9847
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9848
+ x-gala-graphemeLength:
9849
+ maximum: 80
9850
+ minimum: 1
9851
+ schemaId:
9852
+ pattern: ^urn:gala:schema:author:2\.0\.0$
9853
+ type: string
9854
+ x-gala-const: urn:gala:schema:author:2.0.0
9855
+ schemaVersion:
9856
+ pattern: ^2\.0\.0$
9857
+ type: string
9858
+ x-gala-const: 2.0.0
9859
+ required:
9860
+ - schemaId
9861
+ - schemaVersion
9862
+ - id
9863
+ - displayName
9864
+ - biography
9865
+ - links
9866
+ - localized
9867
+ - extensions
9868
+ title: Gala author contract
9869
+ type: object
9870
+ PortableAuthorExtensionKey:
9871
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
9872
+ format: gala-extension-key
9873
+ type: string
9874
+ PortableAuthorExtensionMap:
9875
+ additionalProperties:
9876
+ x-gala-maxCanonicalBytes: 16384
9877
+ maxProperties: 32
9878
+ propertyNames:
9879
+ $ref: "#/components/schemas/PortableAuthorExtensionKey"
9880
+ type: object
9881
+ x-gala-maxCanonicalBytes: 131072
9882
+ PortableAuthorLocalizedAuthor:
9883
+ additionalProperties: false
9884
+ properties:
9885
+ biography:
9886
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9887
+ x-gala-graphemeLength:
9888
+ maximum: 2000
9889
+ minimum: 0
9890
+ displayName:
9891
+ $ref: "#/components/schemas/PortableAuthorPlainText"
9892
+ x-gala-graphemeLength:
9893
+ maximum: 120
9894
+ minimum: 1
9895
+ language:
9896
+ $ref: "#/components/schemas/PortableAuthorBcp47"
9897
+ required:
9898
+ - language
9899
+ - displayName
9900
+ - biography
9901
+ type: object
9902
+ PortableAuthorPlainLabel:
9903
+ description: Normalized Unicode plain text without markup, controls, or bidi overrides.
9904
+ format: gala-plain-label
9905
+ type: string
9906
+ x-gala-graphemeLength:
9907
+ maximum: 80
9908
+ minimum: 1
9149
9909
  PortableAuthorPlainText:
9150
9910
  description: NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls.
9151
9911
  format: gala-plain-text
9152
9912
  type: string
9913
+ PortableAuthorRepoRelativePath:
9914
+ description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
9915
+ format: gala-repository-relative-path
9916
+ maxLength: 512
9917
+ minLength: 1
9918
+ pattern: ^(?!/)(?!.*\\)(?!.*\u0000).+$
9919
+ type: string
9920
+ x-gala-utf8ByteLength:
9921
+ maximum: 512
9922
+ PortableAuthorSocialLink:
9923
+ additionalProperties: false
9924
+ allOf:
9925
+ - else:
9926
+ properties:
9927
+ uri:
9928
+ $ref: "#/components/schemas/PortableAuthorUrlHttps"
9929
+ if:
9930
+ properties:
9931
+ type:
9932
+ pattern: ^email$
9933
+ type: string
9934
+ x-gala-const: email
9935
+ required:
9936
+ - type
9937
+ then:
9938
+ properties:
9939
+ uri:
9940
+ format: uri
9941
+ pattern: "^mailto:"
9942
+ type: string
9943
+ properties:
9944
+ label:
9945
+ $ref: "#/components/schemas/PortableAuthorPlainLabel"
9946
+ type:
9947
+ enum:
9948
+ - website
9949
+ - email
9950
+ - github
9951
+ - linkedin
9952
+ - mastodon
9953
+ - bluesky
9954
+ - x
9955
+ - youtube
9956
+ - other
9957
+ uri:
9958
+ maxLength: 2048
9959
+ minLength: 1
9960
+ type: string
9961
+ required:
9962
+ - type
9963
+ - uri
9964
+ type: object
9965
+ PortableAuthorStableId:
9966
+ description: Lowercase canonical UUIDv7. Once published, it is immutable; its time ordering conveys neither chronology nor authority.
9967
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
9968
+ type: string
9969
+ PortableAuthorUrlHttps:
9970
+ description: Absolute HTTPS URL without embedded credentials.
9971
+ format: uri
9972
+ pattern: ^https://(?![^/?#]*@)
9973
+ type: string
9153
9974
  PortableContentFrontmatterBcp47:
9154
9975
  description: Structurally valid canonical BCP-47 language tag.
9155
9976
  format: gala-bcp47
@@ -15009,6 +15830,159 @@ components:
15009
15830
  - kind
15010
15831
  - token
15011
15832
  type: object
15833
+ PortableNavigationCanonicalRoute:
15834
+ description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
15835
+ format: gala-canonical-route
15836
+ minLength: 1
15837
+ pattern: ^/(?!/)(?!.*//)(?!.*[?#]).*$
15838
+ type: string
15839
+ PortableNavigationDocument:
15840
+ $comment: The navigation graph validator rejects duplicate normalized internal routes within each collection.
15841
+ additionalProperties: false
15842
+ properties:
15843
+ extensions:
15844
+ $ref: "#/components/schemas/PortableNavigationExtensionMap"
15845
+ footerItems:
15846
+ items:
15847
+ $ref: "#/components/schemas/PortableNavigationNavigationItem"
15848
+ maxItems: 50
15849
+ minItems: 0
15850
+ type: array
15851
+ items:
15852
+ items:
15853
+ $ref: "#/components/schemas/PortableNavigationNavigationItem"
15854
+ maxItems: 100
15855
+ minItems: 0
15856
+ type: array
15857
+ schemaId:
15858
+ pattern: ^urn:gala:schema:navigation:2\.0\.0$
15859
+ type: string
15860
+ x-gala-const: urn:gala:schema:navigation:2.0.0
15861
+ schemaVersion:
15862
+ pattern: ^2\.0\.0$
15863
+ type: string
15864
+ x-gala-const: 2.0.0
15865
+ required:
15866
+ - schemaId
15867
+ - schemaVersion
15868
+ - items
15869
+ - footerItems
15870
+ - extensions
15871
+ title: Gala navigation contract
15872
+ type: object
15873
+ PortableNavigationExtensionKey:
15874
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
15875
+ format: gala-extension-key
15876
+ type: string
15877
+ PortableNavigationExtensionMap:
15878
+ additionalProperties:
15879
+ x-gala-maxCanonicalBytes: 16384
15880
+ maxProperties: 32
15881
+ propertyNames:
15882
+ $ref: "#/components/schemas/PortableNavigationExtensionKey"
15883
+ type: object
15884
+ x-gala-maxCanonicalBytes: 131072
15885
+ PortableNavigationNavigationItem:
15886
+ additionalProperties: false
15887
+ allOf:
15888
+ - else:
15889
+ not:
15890
+ required:
15891
+ - route
15892
+ required:
15893
+ - url
15894
+ if:
15895
+ properties:
15896
+ type:
15897
+ pattern: ^internal$
15898
+ type: string
15899
+ x-gala-const: internal
15900
+ required:
15901
+ - type
15902
+ then:
15903
+ not:
15904
+ required:
15905
+ - url
15906
+ required:
15907
+ - route
15908
+ properties:
15909
+ children:
15910
+ items:
15911
+ $ref: "#/components/schemas/PortableNavigationNavigationLeaf"
15912
+ maxItems: 20
15913
+ minItems: 0
15914
+ type: array
15915
+ label:
15916
+ $ref: "#/components/schemas/PortableNavigationPlainLabel"
15917
+ route:
15918
+ $ref: "#/components/schemas/PortableNavigationCanonicalRoute"
15919
+ type:
15920
+ enum:
15921
+ - internal
15922
+ - external
15923
+ url:
15924
+ $ref: "#/components/schemas/PortableNavigationUrlHttps"
15925
+ required:
15926
+ - type
15927
+ - label
15928
+ - children
15929
+ type: object
15930
+ PortableNavigationNavigationLeaf:
15931
+ additionalProperties: false
15932
+ allOf:
15933
+ - else:
15934
+ not:
15935
+ required:
15936
+ - route
15937
+ required:
15938
+ - url
15939
+ if:
15940
+ properties:
15941
+ type:
15942
+ pattern: ^internal$
15943
+ type: string
15944
+ x-gala-const: internal
15945
+ required:
15946
+ - type
15947
+ then:
15948
+ not:
15949
+ required:
15950
+ - url
15951
+ required:
15952
+ - route
15953
+ properties:
15954
+ children:
15955
+ maxItems: 0
15956
+ minItems: 0
15957
+ type: array
15958
+ x-gala-const: []
15959
+ label:
15960
+ $ref: "#/components/schemas/PortableNavigationPlainLabel"
15961
+ route:
15962
+ $ref: "#/components/schemas/PortableNavigationCanonicalRoute"
15963
+ type:
15964
+ enum:
15965
+ - internal
15966
+ - external
15967
+ url:
15968
+ $ref: "#/components/schemas/PortableNavigationUrlHttps"
15969
+ required:
15970
+ - type
15971
+ - label
15972
+ - children
15973
+ type: object
15974
+ PortableNavigationPlainLabel:
15975
+ description: Normalized Unicode plain text without markup, controls, or bidi overrides.
15976
+ format: gala-plain-label
15977
+ type: string
15978
+ x-gala-graphemeLength:
15979
+ maximum: 80
15980
+ minimum: 1
15981
+ PortableNavigationUrlHttps:
15982
+ description: Absolute HTTPS URL without embedded credentials.
15983
+ format: uri
15984
+ pattern: ^https://(?![^/?#]*@)
15985
+ type: string
15012
15986
  PortableProblemCanonicalRoute:
15013
15987
  description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
15014
15988
  format: gala-canonical-route
@@ -15216,6 +16190,33 @@ components:
15216
16190
  x-gala-utf8ByteLength:
15217
16191
  maximum: 255
15218
16192
  minimum: 1
16193
+ PortablePublicationCanonicalRoute:
16194
+ description: Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding.
16195
+ format: gala-canonical-route
16196
+ minLength: 1
16197
+ pattern: ^/(?!/)(?!.*//)(?!.*[?#]).*$
16198
+ type: string
16199
+ PortablePublicationContactForm:
16200
+ additionalProperties: false
16201
+ 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."
16202
+ properties:
16203
+ enabled:
16204
+ type: boolean
16205
+ fields:
16206
+ additionalProperties: false
16207
+ properties:
16208
+ phone:
16209
+ type: boolean
16210
+ website:
16211
+ type: boolean
16212
+ required:
16213
+ - website
16214
+ - phone
16215
+ type: object
16216
+ required:
16217
+ - enabled
16218
+ - fields
16219
+ type: object
15219
16220
  PortablePublicationCrawlers:
15220
16221
  additionalProperties: false
15221
16222
  properties:
@@ -15226,6 +16227,134 @@ components:
15226
16227
  required:
15227
16228
  - ai
15228
16229
  type: object
16230
+ PortablePublicationDocument:
16231
+ additionalProperties: false
16232
+ properties:
16233
+ aiRights:
16234
+ $ref: "#/components/schemas/PortablePublicationAiRights"
16235
+ authors:
16236
+ items:
16237
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16238
+ maxItems: 32
16239
+ minItems: 1
16240
+ type: array
16241
+ canonicalBase:
16242
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16243
+ contactForm:
16244
+ $ref: "#/components/schemas/PortablePublicationContactForm"
16245
+ contactRef:
16246
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16247
+ crawlers:
16248
+ $ref: "#/components/schemas/PortablePublicationCrawlers"
16249
+ defaultImageRef:
16250
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16251
+ defaultLanguage:
16252
+ $ref: "#/components/schemas/PortablePublicationBcp47"
16253
+ description:
16254
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16255
+ x-gala-graphemeLength:
16256
+ maximum: 500
16257
+ minimum: 1
16258
+ extensions:
16259
+ $ref: "#/components/schemas/PortablePublicationExtensionMap"
16260
+ footerCard:
16261
+ $ref: "#/components/schemas/PortablePublicationFooterCard"
16262
+ id:
16263
+ $ref: "#/components/schemas/PortablePublicationStableId"
16264
+ listen:
16265
+ $ref: "#/components/schemas/PortablePublicationListen"
16266
+ listing:
16267
+ $ref: "#/components/schemas/PortablePublicationListing"
16268
+ newsletter:
16269
+ $ref: "#/components/schemas/PortablePublicationNewsletter"
16270
+ performance:
16271
+ $ref: "#/components/schemas/PortablePublicationPerformance"
16272
+ policies:
16273
+ $ref: "#/components/schemas/PortablePublicationPublicationPolicies"
16274
+ profile:
16275
+ $ref: "#/components/schemas/PortablePublicationPublicationProfile"
16276
+ schemaId:
16277
+ pattern: ^urn:gala:schema:publication:2\.0\.0$
16278
+ type: string
16279
+ x-gala-const: urn:gala:schema:publication:2.0.0
16280
+ schemaVersion:
16281
+ pattern: ^2\.0\.0$
16282
+ type: string
16283
+ x-gala-const: 2.0.0
16284
+ sharing:
16285
+ $ref: "#/components/schemas/PortablePublicationSharing"
16286
+ slug:
16287
+ $ref: "#/components/schemas/PortablePublicationSlug"
16288
+ socialLinks:
16289
+ items:
16290
+ $ref: "#/components/schemas/PortablePublicationSocialLink"
16291
+ maxItems: 32
16292
+ minItems: 0
16293
+ type: array
16294
+ title:
16295
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16296
+ x-gala-graphemeLength:
16297
+ maximum: 200
16298
+ minimum: 1
16299
+ required:
16300
+ - schemaId
16301
+ - schemaVersion
16302
+ - id
16303
+ - slug
16304
+ - title
16305
+ - description
16306
+ - canonicalBase
16307
+ - defaultLanguage
16308
+ - authors
16309
+ - socialLinks
16310
+ - extensions
16311
+ title: Gala publication contract
16312
+ type: object
16313
+ PortablePublicationExtensionKey:
16314
+ description: Reverse-DNS extension namespace that cannot shadow a core key.
16315
+ format: gala-extension-key
16316
+ type: string
16317
+ PortablePublicationExtensionMap:
16318
+ additionalProperties:
16319
+ x-gala-maxCanonicalBytes: 16384
16320
+ maxProperties: 32
16321
+ propertyNames:
16322
+ $ref: "#/components/schemas/PortablePublicationExtensionKey"
16323
+ type: object
16324
+ x-gala-maxCanonicalBytes: 131072
16325
+ PortablePublicationFooterCard:
16326
+ additionalProperties: false
16327
+ properties:
16328
+ authorIds:
16329
+ items:
16330
+ $ref: "#/components/schemas/PortablePublicationStableId"
16331
+ maxItems: 32
16332
+ minItems: 1
16333
+ type: array
16334
+ body:
16335
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16336
+ enabled:
16337
+ type: boolean
16338
+ heading:
16339
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16340
+ x-gala-graphemeLength:
16341
+ maximum: 120
16342
+ minimum: 1
16343
+ required:
16344
+ - enabled
16345
+ - heading
16346
+ - body
16347
+ - authorIds
16348
+ type: object
16349
+ PortablePublicationListen:
16350
+ additionalProperties: false
16351
+ 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."
16352
+ properties:
16353
+ enabled:
16354
+ type: boolean
16355
+ required:
16356
+ - enabled
16357
+ type: object
15229
16358
  PortablePublicationListing:
15230
16359
  additionalProperties: false
15231
16360
  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."
@@ -15236,6 +16365,59 @@ components:
15236
16365
  type: integer
15237
16366
  required: []
15238
16367
  type: object
16368
+ PortablePublicationNewsletter:
16369
+ 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."
16370
+ oneOf:
16371
+ - additionalProperties: false
16372
+ description: "Link mode: the panel links to an external newsletter. `mode` is optional and `link` when present, so a 3.21 publication still validates."
16373
+ properties:
16374
+ mode:
16375
+ pattern: ^link$
16376
+ type: string
16377
+ x-gala-const: link
16378
+ text:
16379
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16380
+ x-gala-graphemeLength:
16381
+ maximum: 300
16382
+ minimum: 1
16383
+ title:
16384
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
16385
+ url:
16386
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16387
+ required:
16388
+ - url
16389
+ - title
16390
+ - text
16391
+ type: object
16392
+ - additionalProperties: false
16393
+ 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
+ properties:
16395
+ emailContent:
16396
+ 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
+ enum:
16398
+ - card
16399
+ - full
16400
+ mode:
16401
+ pattern: ^galascribe$
16402
+ type: string
16403
+ x-gala-const: galascribe
16404
+ replyToOwner:
16405
+ description: When true, subscribers' replies go to the site owner's contact email; when false the emails carry no Reply-To.
16406
+ type: boolean
16407
+ text:
16408
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16409
+ x-gala-graphemeLength:
16410
+ maximum: 300
16411
+ minimum: 1
16412
+ title:
16413
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
16414
+ required:
16415
+ - mode
16416
+ - title
16417
+ - text
16418
+ - emailContent
16419
+ - replyToOwner
16420
+ type: object
15239
16421
  PortablePublicationPerformance:
15240
16422
  additionalProperties: false
15241
16423
  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."
@@ -15267,6 +16449,43 @@ components:
15267
16449
  description: NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls.
15268
16450
  format: gala-plain-text
15269
16451
  type: string
16452
+ PortablePublicationPolicyPage:
16453
+ additionalProperties: false
16454
+ properties:
16455
+ body:
16456
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16457
+ pattern: ^.+\.md$
16458
+ title:
16459
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16460
+ x-gala-graphemeLength:
16461
+ maximum: 80
16462
+ minimum: 1
16463
+ required:
16464
+ - title
16465
+ - body
16466
+ type: object
16467
+ PortablePublicationPublicationPolicies:
16468
+ additionalProperties: false
16469
+ properties:
16470
+ privacy:
16471
+ $ref: "#/components/schemas/PortablePublicationPolicyPage"
16472
+ terms:
16473
+ $ref: "#/components/schemas/PortablePublicationPolicyPage"
16474
+ required:
16475
+ - terms
16476
+ - privacy
16477
+ type: object
16478
+ PortablePublicationPublicationProfile:
16479
+ additionalProperties: false
16480
+ properties:
16481
+ body:
16482
+ $ref: "#/components/schemas/PortablePublicationRepoRelativePath"
16483
+ route:
16484
+ $ref: "#/components/schemas/PortablePublicationCanonicalRoute"
16485
+ required:
16486
+ - route
16487
+ - body
16488
+ type: object
15270
16489
  PortablePublicationRepoRelativePath:
15271
16490
  description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
15272
16491
  format: gala-repository-relative-path
@@ -15276,6 +16495,36 @@ components:
15276
16495
  type: string
15277
16496
  x-gala-utf8ByteLength:
15278
16497
  maximum: 512
16498
+ PortablePublicationSharing:
16499
+ additionalProperties: false
16500
+ 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."
16501
+ properties:
16502
+ targets:
16503
+ items:
16504
+ enum:
16505
+ - copy-link
16506
+ - native
16507
+ - x
16508
+ - bluesky
16509
+ - linkedin
16510
+ - facebook
16511
+ - hacker-news
16512
+ - whatsapp
16513
+ - telegram
16514
+ - reddit
16515
+ - email
16516
+ maxItems: 11
16517
+ minItems: 0
16518
+ type: array
16519
+ uniqueItems: true
16520
+ required:
16521
+ - targets
16522
+ type: object
16523
+ PortablePublicationSlug:
16524
+ maxLength: 80
16525
+ minLength: 1
16526
+ pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
16527
+ type: string
15279
16528
  PortablePublicationSocialLink:
15280
16529
  additionalProperties: false
15281
16530
  allOf:
@@ -15319,6 +16568,10 @@ components:
15319
16568
  - type
15320
16569
  - uri
15321
16570
  type: object
16571
+ PortablePublicationStableId:
16572
+ description: Lowercase canonical UUIDv7. Once published, it is immutable; its time ordering conveys neither chronology nor authority.
16573
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
16574
+ type: string
15322
16575
  PortablePublicationUrlHttps:
15323
16576
  description: Absolute HTTPS URL without embedded credentials.
15324
16577
  format: uri
@@ -16070,6 +17323,10 @@ components:
16070
17323
  PostOrganizationsByOrganizationIdPublicationTransfersByTransferIdDeclineResponse:
16071
17324
  allOf:
16072
17325
  - $ref: "#/components/schemas/PublicationTransfer"
17326
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsRequest:
17327
+ $ref: "#/components/schemas/AssistanceRequestCreate"
17328
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsResponse:
17329
+ $ref: "#/components/schemas/AssistanceRequest"
16073
17330
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest:
16074
17331
  additionalProperties: false
16075
17332
  properties:
@@ -16304,6 +17561,23 @@ components:
16304
17561
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsRollbackResponse:
16305
17562
  allOf:
16306
17563
  - $ref: "#/components/schemas/OperationResponse"
17564
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsCheckRequest:
17565
+ additionalProperties: false
17566
+ properties:
17567
+ name:
17568
+ description: The domain name to check, for example `mayawrites.com`.
17569
+ maxLength: 253
17570
+ minLength: 1
17571
+ type: string
17572
+ required:
17573
+ - name
17574
+ type: object
17575
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsCheckResponse:
17576
+ $ref: "#/components/schemas/DomainRegistrationCheck"
17577
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsRequest:
17578
+ $ref: "#/components/schemas/DomainRegistrationCreate"
17579
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsResponse:
17580
+ $ref: "#/components/schemas/DomainRegistration"
16307
17581
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsByDomainIdCheckResponse:
16308
17582
  allOf:
16309
17583
  - $ref: "#/components/schemas/DomainBinding"
@@ -16358,6 +17632,26 @@ components:
16358
17632
  - authorizationUrl
16359
17633
  - expiresAt
16360
17634
  type: object
17635
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsCheckGalascribeAddressRequest:
17636
+ additionalProperties: false
17637
+ properties:
17638
+ label:
17639
+ $ref: "#/components/schemas/GalascribeAddressLabel"
17640
+ required:
17641
+ - label
17642
+ type: object
17643
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsCheckGalascribeAddressResponse:
17644
+ $ref: "#/components/schemas/GalascribeAddressCheck"
17645
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsClaimGalascribeAddressRequest:
17646
+ additionalProperties: false
17647
+ properties:
17648
+ label:
17649
+ $ref: "#/components/schemas/GalascribeAddressLabel"
17650
+ required:
17651
+ - label
17652
+ type: object
17653
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsClaimGalascribeAddressResponse:
17654
+ $ref: "#/components/schemas/DomainBinding"
16361
17655
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsRequest:
16362
17656
  additionalProperties: false
16363
17657
  properties:
@@ -17346,6 +18640,8 @@ components:
17346
18640
  - expiresAt
17347
18641
  - secret
17348
18642
  type: object
18643
+ PostPlatformAssistanceRequestsByRequestIdCloseResponse:
18644
+ $ref: "#/components/schemas/PlatformAssistanceRequest"
17349
18645
  PostPlatformCachesByCacheIdEvictRequest:
17350
18646
  additionalProperties: false
17351
18647
  properties:
@@ -19616,6 +20912,11 @@ components:
19616
20912
  PutPlatformPlansByPlanKeyRequest:
19617
20913
  additionalProperties: false
19618
20914
  properties:
20915
+ collaboratorLimit:
20916
+ description: SCHEMA-3.30.0, optional; absent keeps the plan's current value. 0 means no limit.
20917
+ format: int64
20918
+ minimum: 0
20919
+ type: integer
19619
20920
  contactForm:
19620
20921
  description: SCHEMA-3.23.0, optional; absent keeps the plan's current value.
19621
20922
  type: boolean
@@ -20974,6 +22275,112 @@ components:
20974
22275
  required:
20975
22276
  - code
20976
22277
  type: object
22278
+ SiteHostingCheck:
22279
+ additionalProperties: false
22280
+ description: "SCHEMA-3.30.0: what the site's repository contains that GitHub Pages limits or does not allow. It is advice: nothing here blocks publishing. `findings` is empty and `offers` is empty when the site is fine."
22281
+ properties:
22282
+ checkedAt:
22283
+ $ref: "#/components/schemas/PortableProblemRfc3339"
22284
+ description: When the check ran.
22285
+ findings:
22286
+ items:
22287
+ $ref: "#/components/schemas/HostingFinding"
22288
+ maxItems: 8
22289
+ type: array
22290
+ host:
22291
+ description: "Where the site is hosted today. `GITHUB_PAGES`: GitHub Pages."
22292
+ enum:
22293
+ - GITHUB_PAGES
22294
+ type: string
22295
+ limits:
22296
+ additionalProperties: false
22297
+ description: The thresholds the check used, so a client can show them.
22298
+ properties:
22299
+ directoryEntries:
22300
+ description: The most entries one folder may hold before `DIRECTORY_TOO_LARGE`.
22301
+ format: int64
22302
+ minimum: 0
22303
+ type: integer
22304
+ fileMaxBytes:
22305
+ description: The file size at which `FILE_OVER_SIZE_LIMIT` fires.
22306
+ format: int64
22307
+ minimum: 0
22308
+ type: integer
22309
+ fileWarningBytes:
22310
+ description: The file size at which `LARGE_FILE` fires.
22311
+ format: int64
22312
+ minimum: 0
22313
+ type: integer
22314
+ mediaWarningBytes:
22315
+ description: The media total at which `HEAVY_MEDIA` fires.
22316
+ format: int64
22317
+ minimum: 0
22318
+ type: integer
22319
+ siteBytes:
22320
+ description: The site size at which `SITE_OVER_SIZE_LIMIT` fires.
22321
+ format: int64
22322
+ minimum: 0
22323
+ type: integer
22324
+ required:
22325
+ - siteBytes
22326
+ - fileWarningBytes
22327
+ - fileMaxBytes
22328
+ - directoryEntries
22329
+ - mediaWarningBytes
22330
+ type: object
22331
+ offers:
22332
+ description: What the person can do about the findings. Empty when there is no finding.
22333
+ items:
22334
+ $ref: "#/components/schemas/HostingOffer"
22335
+ maxItems: 2
22336
+ type: array
22337
+ uniqueItems: true
22338
+ planTier:
22339
+ $ref: "#/components/schemas/PlatformPlanKey"
22340
+ description: The organization's plan tier when the check ran.
22341
+ revision:
22342
+ description: The commit of the default branch that was checked.
22343
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
22344
+ type: string
22345
+ totals:
22346
+ additionalProperties: false
22347
+ properties:
22348
+ files:
22349
+ description: Files in the repository.
22350
+ format: int64
22351
+ minimum: 0
22352
+ type: integer
22353
+ mediaBytes:
22354
+ description: Bytes of images, audio, video and PDFs.
22355
+ format: int64
22356
+ minimum: 0
22357
+ type: integer
22358
+ mediaFiles:
22359
+ description: Number of images, audio, video and PDF files.
22360
+ format: int64
22361
+ minimum: 0
22362
+ type: integer
22363
+ siteBytes:
22364
+ description: Bytes of all files.
22365
+ format: int64
22366
+ minimum: 0
22367
+ type: integer
22368
+ required:
22369
+ - siteBytes
22370
+ - mediaBytes
22371
+ - mediaFiles
22372
+ - files
22373
+ type: object
22374
+ required:
22375
+ - checkedAt
22376
+ - revision
22377
+ - host
22378
+ - planTier
22379
+ - totals
22380
+ - limits
22381
+ - findings
22382
+ - offers
22383
+ type: object
20977
22384
  SiteLastPublished:
20978
22385
  additionalProperties: false
20979
22386
  properties:
@@ -24902,7 +26309,10 @@ paths:
24902
26309
  for the inviter's benefit and is never compared with the accepting
24903
26310
  principal's verified identity (LOCAL-34 G6). The token is single-use and
24904
26311
  non-enumerating; recipient binding is revisited when verified email
24905
- exists.
26312
+ exists. The organization's plan limits its collaborators (SCHEMA-3.30.0):
26313
+ when accepting would take it past the limit, because the plan changed
26314
+ since the invitation was sent, the answer is `409 PLAN_REQUIRED` and the
26315
+ invitation stays `PENDING`.
24906
26316
  operationId: postMembershipInvitationsByTokenAccept
24907
26317
  parameters:
24908
26318
  - $ref: "#/components/parameters/XCorrelationId"
@@ -25031,9 +26441,22 @@ paths:
25031
26441
  status: 409
25032
26442
  title: INVALID_SOURCE_STATE
25033
26443
  type: urn:gala:problem:invalid-source-state
26444
+ PLAN_REQUIRED:
26445
+ summary: PLAN_REQUIRED
26446
+ value:
26447
+ code: PLAN_REQUIRED
26448
+ correlationId: 018f0000-0000-7000-8000-000000000001
26449
+ detail: The organization's plan allows no more collaborators. See the operation contract.
26450
+ errors: []
26451
+ retryable: false
26452
+ schemaId: urn:gala:schema:problem:2.0.0
26453
+ schemaVersion: 2.0.0
26454
+ status: 409
26455
+ title: PLAN_REQUIRED
26456
+ type: urn:gala:problem:plan-required
25034
26457
  schema:
25035
26458
  $ref: "#/components/schemas/Problem"
25036
- description: INVALID_SOURCE_STATE
26459
+ description: INVALID_SOURCE_STATE, PLAN_REQUIRED
25037
26460
  headers:
25038
26461
  Cache-Control:
25039
26462
  $ref: "#/components/headers/CacheControlNoStore"
@@ -25041,6 +26464,7 @@ paths:
25041
26464
  $ref: "#/components/headers/XCorrelationId"
25042
26465
  x-gala-problem-codes:
25043
26466
  - INVALID_SOURCE_STATE
26467
+ - PLAN_REQUIRED
25044
26468
  "422":
25045
26469
  content:
25046
26470
  application/problem+json:
@@ -25086,6 +26510,7 @@ paths:
25086
26510
  x-gala-reachable-problems:
25087
26511
  - AUTHENTICATION_REQUIRED
25088
26512
  - INVALID_SOURCE_STATE
26513
+ - PLAN_REQUIRED
25089
26514
  - REQUEST_FIELD_UNKNOWN
25090
26515
  - VALIDATION_FAILED
25091
26516
  x-gala-replay-identity: invitation-capability
@@ -26229,6 +27654,13 @@ paths:
26229
27654
  the invitation, never a verified identity and never an authorization
26230
27655
  input. Hand the link only to the person it is meant for, and revoke and
26231
27656
  re-invite if it goes astray (LOCAL-34 G6).
27657
+
27658
+ Every organization may invite, on any plan (SCHEMA-3.30.0). A personal
27659
+ organization becomes collaborative with its first invitation. The plan
27660
+ limits how many collaborators the organization may have: active members
27661
+ other than owners plus invitations still `PENDING` (`GET
27662
+ .../plan` shows the count). An invitation past the limit is `409
27663
+ PLAN_REQUIRED`, and the detail names the limit.
26232
27664
  operationId: postOrganizationsByOrganizationIdMembershipInvitations
26233
27665
  parameters:
26234
27666
  - $ref: "#/components/parameters/XCorrelationId"
@@ -26444,9 +27876,22 @@ paths:
26444
27876
  status: 409
26445
27877
  title: INVALID_SOURCE_STATE
26446
27878
  type: urn:gala:problem:invalid-source-state
27879
+ PLAN_REQUIRED:
27880
+ summary: PLAN_REQUIRED
27881
+ value:
27882
+ code: PLAN_REQUIRED
27883
+ correlationId: 018f0000-0000-7000-8000-000000000001
27884
+ detail: The organization's plan allows no more collaborators. See the operation contract.
27885
+ errors: []
27886
+ retryable: false
27887
+ schemaId: urn:gala:schema:problem:2.0.0
27888
+ schemaVersion: 2.0.0
27889
+ status: 409
27890
+ title: PLAN_REQUIRED
27891
+ type: urn:gala:problem:plan-required
26447
27892
  schema:
26448
27893
  $ref: "#/components/schemas/Problem"
26449
- description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
27894
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE, PLAN_REQUIRED
26450
27895
  headers:
26451
27896
  Cache-Control:
26452
27897
  $ref: "#/components/headers/CacheControlNoStore"
@@ -26455,6 +27900,7 @@ paths:
26455
27900
  x-gala-problem-codes:
26456
27901
  - COMMAND_REPLAY_CONFLICT
26457
27902
  - INVALID_SOURCE_STATE
27903
+ - PLAN_REQUIRED
26458
27904
  "422":
26459
27905
  content:
26460
27906
  application/problem+json:
@@ -26501,6 +27947,7 @@ paths:
26501
27947
  - AUTHORIZATION_DENIED
26502
27948
  - COMMAND_REPLAY_CONFLICT
26503
27949
  - INVALID_SOURCE_STATE
27950
+ - PLAN_REQUIRED
26504
27951
  - REAUTH_REQUIRED
26505
27952
  - REQUEST_FIELD_UNKNOWN
26506
27953
  - RESOURCE_NOT_FOUND
@@ -30434,6 +31881,111 @@ paths:
30434
31881
  - NONE
30435
31882
  x-gala-success-category: protocol
30436
31883
  x-gala-tenant-scope: ORGANIZATION_PATH
31884
+ /v2/organizations/{organizationId}/plan:
31885
+ get:
31886
+ description: |
31887
+ Needs `organization.view`, so any member of the organization may read it.
31888
+ The organization's plan tier, how many collaborators it may have and how
31889
+ many it has, and what the plan includes: a `name.galascribe.com`
31890
+ address, one included domain and Galascribe hosting. `collaborators.limit`
31891
+ is null when the plan has no limit; `collaborators.used` counts the active
31892
+ members other than owners plus the invitations still `PENDING`.
31893
+ `galascribeAddressZone` is the zone Galascribe addresses are created in and
31894
+ is absent when Galascribe addresses are not configured, so a client hides
31895
+ the option.
31896
+ operationId: getOrganizationsByOrganizationIdPlan
31897
+ parameters:
31898
+ - $ref: "#/components/parameters/XCorrelationId"
31899
+ - example: 018f0000-0000-7000-8000-000000000001
31900
+ in: path
31901
+ name: organizationId
31902
+ required: true
31903
+ schema:
31904
+ format: uuid
31905
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
31906
+ type: string
31907
+ responses:
31908
+ "200":
31909
+ content:
31910
+ application/json:
31911
+ examples:
31912
+ nominal:
31913
+ summary: Nominal successful response
31914
+ value:
31915
+ collaborators:
31916
+ limit: null
31917
+ used: 2
31918
+ entitlements:
31919
+ galascribeAddress: true
31920
+ galascribeHosting: true
31921
+ includedDomain: false
31922
+ galascribeAddressZone: galascribe.com
31923
+ tier: PRO
31924
+ schema:
31925
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPlanResponse"
31926
+ description: read an organization's plan succeeded
31927
+ headers:
31928
+ Cache-Control:
31929
+ $ref: "#/components/headers/CacheControlNoStore"
31930
+ X-Correlation-Id:
31931
+ $ref: "#/components/headers/XCorrelationId"
31932
+ "400":
31933
+ $ref: "#/components/responses/ValidationFailed"
31934
+ "401":
31935
+ content:
31936
+ application/problem+json:
31937
+ examples:
31938
+ AUTHENTICATION_REQUIRED:
31939
+ summary: AUTHENTICATION_REQUIRED
31940
+ value:
31941
+ code: AUTHENTICATION_REQUIRED
31942
+ correlationId: 018f0000-0000-7000-8000-000000000001
31943
+ detail: See the operation contract.
31944
+ errors: []
31945
+ retryable: false
31946
+ schemaId: urn:gala:schema:problem:2.0.0
31947
+ schemaVersion: 2.0.0
31948
+ status: 401
31949
+ title: AUTHENTICATION_REQUIRED
31950
+ type: urn:gala:problem:authentication-required
31951
+ schema:
31952
+ $ref: "#/components/schemas/Problem"
31953
+ description: AUTHENTICATION_REQUIRED
31954
+ headers:
31955
+ Cache-Control:
31956
+ $ref: "#/components/headers/CacheControlNoStore"
31957
+ X-Correlation-Id:
31958
+ $ref: "#/components/headers/XCorrelationId"
31959
+ x-gala-problem-codes:
31960
+ - AUTHENTICATION_REQUIRED
31961
+ "403":
31962
+ $ref: "#/components/responses/AuthorizationDenied"
31963
+ "404":
31964
+ $ref: "#/components/responses/ResourceNotFound"
31965
+ security:
31966
+ - browserSession: []
31967
+ summary: read an organization's plan
31968
+ tags:
31969
+ - organizations
31970
+ x-gala-activation-gate: MVP
31971
+ x-gala-activation-guards:
31972
+ - NONE
31973
+ x-gala-capability-key: organization.view
31974
+ x-gala-concurrency: authorization-epoch
31975
+ x-gala-conditional-capabilities: []
31976
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
31977
+ x-gala-nullability: required-and-nullable-are-explicit
31978
+ x-gala-purpose: read an organization's plan
31979
+ x-gala-reachable-problems:
31980
+ - AUTHENTICATION_REQUIRED
31981
+ - AUTHORIZATION_DENIED
31982
+ - RESOURCE_NOT_FOUND
31983
+ - VALIDATION_FAILED
31984
+ x-gala-replay-identity: safe-query
31985
+ x-gala-state-guards:
31986
+ - NONE
31987
+ x-gala-success-category: query
31988
+ x-gala-tenant-scope: ORGANIZATION_PATH
30437
31989
  /v2/organizations/{organizationId}/publication-imports:
30438
31990
  get:
30439
31991
  description: |
@@ -35102,45 +36654,122 @@ paths:
35102
36654
  - NONE
35103
36655
  x-gala-success-category: query
35104
36656
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
35105
- /v2/organizations/{organizationId}/publications/{publicationId}/changes:publish:
36657
+ /v2/organizations/{organizationId}/publications/{publicationId}/assistance-requests:
36658
+ get:
36659
+ description: |
36660
+ Needs `publication.view`. The requests this site has made to the Galascribe
36661
+ team (`AssistanceRequest`), newest first, open and closed. At most 100.
36662
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequests
36663
+ parameters:
36664
+ - $ref: "#/components/parameters/XCorrelationId"
36665
+ - example: 018f0000-0000-7000-8000-000000000001
36666
+ in: path
36667
+ name: organizationId
36668
+ required: true
36669
+ schema:
36670
+ format: uuid
36671
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
36672
+ type: string
36673
+ - example: 018f0000-0000-7000-8000-000000000001
36674
+ in: path
36675
+ name: publicationId
36676
+ required: true
36677
+ schema:
36678
+ format: uuid
36679
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
36680
+ type: string
36681
+ responses:
36682
+ "200":
36683
+ content:
36684
+ application/json:
36685
+ examples:
36686
+ nominal:
36687
+ summary: Nominal successful response
36688
+ value:
36689
+ items:
36690
+ - createdAt: "2026-11-02T09:00:00.000Z"
36691
+ findingCodes:
36692
+ - LARGE_FILE
36693
+ kind: GALASCRIBE_HOSTING
36694
+ requestId: 018f0000-0000-7000-8000-000000000001
36695
+ state: OPEN
36696
+ schema:
36697
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsResponse"
36698
+ description: list a site's requests for help succeeded
36699
+ headers:
36700
+ Cache-Control:
36701
+ $ref: "#/components/headers/CacheControlNoStore"
36702
+ X-Correlation-Id:
36703
+ $ref: "#/components/headers/XCorrelationId"
36704
+ "400":
36705
+ $ref: "#/components/responses/ValidationFailed"
36706
+ "401":
36707
+ content:
36708
+ application/problem+json:
36709
+ examples:
36710
+ AUTHENTICATION_REQUIRED:
36711
+ summary: AUTHENTICATION_REQUIRED
36712
+ value:
36713
+ code: AUTHENTICATION_REQUIRED
36714
+ correlationId: 018f0000-0000-7000-8000-000000000001
36715
+ detail: See the operation contract.
36716
+ errors: []
36717
+ retryable: false
36718
+ schemaId: urn:gala:schema:problem:2.0.0
36719
+ schemaVersion: 2.0.0
36720
+ status: 401
36721
+ title: AUTHENTICATION_REQUIRED
36722
+ type: urn:gala:problem:authentication-required
36723
+ schema:
36724
+ $ref: "#/components/schemas/Problem"
36725
+ description: AUTHENTICATION_REQUIRED
36726
+ headers:
36727
+ Cache-Control:
36728
+ $ref: "#/components/headers/CacheControlNoStore"
36729
+ X-Correlation-Id:
36730
+ $ref: "#/components/headers/XCorrelationId"
36731
+ x-gala-problem-codes:
36732
+ - AUTHENTICATION_REQUIRED
36733
+ "403":
36734
+ $ref: "#/components/responses/AuthorizationDenied"
36735
+ "404":
36736
+ $ref: "#/components/responses/ResourceNotFound"
36737
+ security:
36738
+ - browserSession: []
36739
+ summary: list a site's requests for help
36740
+ tags:
36741
+ - organizations
36742
+ x-gala-activation-gate: MVP
36743
+ x-gala-activation-guards:
36744
+ - NONE
36745
+ x-gala-capability-key: publication.view
36746
+ x-gala-concurrency: authorization-and-publication-epochs
36747
+ x-gala-conditional-capabilities: []
36748
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
36749
+ x-gala-nullability: required-and-nullable-are-explicit
36750
+ x-gala-purpose: list a site's requests for help
36751
+ x-gala-reachable-problems:
36752
+ - AUTHENTICATION_REQUIRED
36753
+ - AUTHORIZATION_DENIED
36754
+ - RESOURCE_NOT_FOUND
36755
+ - VALIDATION_FAILED
36756
+ x-gala-replay-identity: safe-query
36757
+ x-gala-state-guards:
36758
+ - NONE
36759
+ x-gala-success-category: query
36760
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
35106
36761
  post:
35107
36762
  description: |
35108
- Publishes the named repository changes together. For each change, in order:
35109
-
35110
- 1. If the change is behind the main branch head it is brought up to date automatically when that is clean (the same file-level merge as `:bring-up-to-date`). When it is not clean nothing is written for any change and the response is `409 INVALID_SOURCE_STATE` with one error per conflicting path (`code: CONTENT_CONFLICT`, `pointer: /documents/<path>` or `/assets/<path>`) and the live head on `X-Gala-Current-Head`.
35111
- 2. If the publication's `publishingPolicy.requireReview` is true and the change has no approval, `409 INVALID_SOURCE_STATE` with `errors[].code REVIEW_REQUIRED` pointed at `/changeIds/<index>`.
35112
- 3. If `publishingPolicy.galascribeMerges` is true (the default) the server opens and merges the pull request itself through the GitHub App. Otherwise each change must already be merged on GitHub; one that is not is `409 INVALID_SOURCE_STATE` with `errors[].code SOURCE_NOT_MERGED` pointed at `/changeIds/<index>`.
35113
-
35114
- Then ONE deploy of the resulting main head is started. Success is `202` with the accepted operation (kind `publish`; `publishId` names it, and the operation's `subject.generationId` names the generation once it exists). `scheduledFor` schedules the deploy instead of starting it now and additionally needs `publication.schedule`; it is cancelled with `:cancel` on the publish. `Idempotency-Key` replays the same acceptance. Whole-request validation happens before any change is merged: a refused request merges nothing.
35115
-
35116
- SCHEMA-3.3.0 scheduling: with `scheduledFor` the request is validated
35117
- exactly as an immediate publish (changes publishable, review state,
35118
- repository set up, binding active, no publish in flight) and nothing is
35119
- merged now; the named changes are merged and deployed at `scheduledFor`,
35120
- after the same checks run again. `scheduledFor` must be at least 5
35121
- minutes and at most 366 days ahead, else `422 VALIDATION_FAILED` pointed
35122
- at `/scheduledFor`. One schedule per publication: `409 SCHEDULE_EXISTS`
35123
- while another is pending (its `publishId` is in the problem `detail` and
35124
- in the site read's `schedule`). `409 CANONICAL_BASE_MISMATCH` when the
35125
- merged head's `gala/publication.json` `canonicalBase` is not the address
35126
- the site is served at (the active custom domain, else the github.io
35127
- address); the problem `detail` names the expected value.
35128
-
35129
- SCHEMA-3.17.0: that problem also carries the optional members
35130
- `expectedBase` (the address the site is served at, an https URL),
35131
- `profileBase` (the base the profile carries now, as written),
35132
- `domainState` (the custom domain's state that decided the expected
35133
- base, absent without a domain) and `remedy` (one sentence for the
35134
- author), so a client names both addresses and renders the `remedy`
35135
- without parsing `detail`. The server first includes the pending "Site
35136
- address" change in the publish, or proposes one inside the request, and
35137
- returns the problem only when it cannot. `409 INVALID_SOURCE_STATE`
35138
- with `errors[].code DOMAIN_NOT_READY` is returned while
35139
- a custom domain is part-way through its switch and no address can be
35140
- verified (after the Pages CNAME is set and before the certificate
35141
- serves); it resolves on its own, and the domain read's `nextStep` says
35142
- what is being waited on.
35143
- operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublish
36763
+ Needs `publication.settings.manage`. Paid plans only: `409 PLAN_REQUIRED`
36764
+ on the Free plan. Asks the Galascribe team to do something by hand for the
36765
+ site: `GALASCRIBE_HOSTING` (host what GitHub does not allow, with the
36766
+ `findingCodes` of the hosting check), `DOMAIN_REGISTRATION` (register the
36767
+ included domain `domainName` for the author) or `DOMAIN_MOVE` (move the
36768
+ domain `domainName` to the author's own account). The request is `OPEN`
36769
+ until an operator closes it. When a request of the same `kind` is already
36770
+ `OPEN` for the site, that request is returned with `200` and nothing new
36771
+ is created.
36772
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequests
35144
36773
  parameters:
35145
36774
  - $ref: "#/components/parameters/XCorrelationId"
35146
36775
  - example: 018f0000-0000-7000-8000-000000000001
@@ -35168,74 +36797,293 @@ paths:
35168
36797
  nominal:
35169
36798
  summary: Nominal valid request
35170
36799
  value:
35171
- changeIds:
35172
- - 018f0000-0000-7000-8000-000000000001
36800
+ findingCodes:
36801
+ - LARGE_FILE
36802
+ kind: GALASCRIBE_HOSTING
36803
+ note: The tour video is 60 MB.
35173
36804
  schema:
35174
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest"
36805
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsRequest"
35175
36806
  required: true
35176
36807
  responses:
35177
- "202":
36808
+ "200":
35178
36809
  content:
35179
36810
  application/json:
35180
36811
  examples:
35181
36812
  nominal:
35182
- summary: Nominal successful response
36813
+ summary: The request of this kind that is already open
35183
36814
  value:
35184
- commandId: 018f0000-0000-7000-8000-000000000001
35185
- operationId: 018f0000-0000-7000-8000-000000000001
35186
- phase: accepted
35187
- publishId: 018f0000-0000-7000-8000-000000000003
35188
- resourceVersion: 0
35189
- statusUrl: /v2/organizations/018f0000-0000-7000-8000-000000000001/operations/018f0000-0000-7000-8000-000000000002
36815
+ createdAt: "2026-11-02T09:00:00.000Z"
36816
+ findingCodes:
36817
+ - LARGE_FILE
36818
+ kind: GALASCRIBE_HOSTING
36819
+ requestId: 018f0000-0000-7000-8000-000000000001
36820
+ state: OPEN
35190
36821
  schema:
35191
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse"
35192
- description: publish a batch of changes with one deploy of the resulting main head succeeded
36822
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsResponse"
36823
+ description: a request of the same kind is already open for the site
35193
36824
  headers:
35194
36825
  Cache-Control:
35195
36826
  $ref: "#/components/headers/CacheControlNoStore"
35196
36827
  X-Correlation-Id:
35197
36828
  $ref: "#/components/headers/XCorrelationId"
35198
- "400":
36829
+ "201":
35199
36830
  content:
35200
- application/problem+json:
36831
+ application/json:
35201
36832
  examples:
35202
- REQUEST_FIELD_UNKNOWN:
35203
- summary: REQUEST_FIELD_UNKNOWN
35204
- value:
35205
- code: REQUEST_FIELD_UNKNOWN
35206
- correlationId: 018f0000-0000-7000-8000-000000000001
35207
- detail: See the operation contract.
35208
- errors: []
35209
- retryable: false
35210
- schemaId: urn:gala:schema:problem:2.0.0
35211
- schemaVersion: 2.0.0
35212
- status: 400
35213
- title: REQUEST_FIELD_UNKNOWN
35214
- type: urn:gala:problem:request-field-unknown
35215
- VALIDATION_FAILED:
35216
- summary: VALIDATION_FAILED
36833
+ nominal:
36834
+ summary: Nominal successful response
35217
36835
  value:
35218
- code: VALIDATION_FAILED
35219
- correlationId: 018f0000-0000-7000-8000-000000000001
35220
- detail: See the operation contract.
35221
- errors: []
35222
- retryable: false
35223
- schemaId: urn:gala:schema:problem:2.0.0
35224
- schemaVersion: 2.0.0
35225
- status: 400
35226
- title: VALIDATION_FAILED
35227
- type: urn:gala:problem:validation-failed
36836
+ createdAt: "2026-11-02T09:00:00.000Z"
36837
+ findingCodes:
36838
+ - LARGE_FILE
36839
+ kind: GALASCRIBE_HOSTING
36840
+ requestId: 018f0000-0000-7000-8000-000000000001
36841
+ state: OPEN
35228
36842
  schema:
35229
- $ref: "#/components/schemas/Problem"
35230
- description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
36843
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdAssistanceRequestsResponse"
36844
+ description: ask Galascribe for help with a site succeeded
35231
36845
  headers:
35232
36846
  Cache-Control:
35233
36847
  $ref: "#/components/headers/CacheControlNoStore"
36848
+ Location:
36849
+ $ref: "#/components/headers/Location"
35234
36850
  X-Correlation-Id:
35235
36851
  $ref: "#/components/headers/XCorrelationId"
35236
- x-gala-problem-codes:
35237
- - REQUEST_FIELD_UNKNOWN
35238
- - VALIDATION_FAILED
36852
+ "400":
36853
+ $ref: "#/components/responses/RequestInvalid"
36854
+ "401":
36855
+ content:
36856
+ application/problem+json:
36857
+ examples:
36858
+ AUTHENTICATION_REQUIRED:
36859
+ summary: AUTHENTICATION_REQUIRED
36860
+ value:
36861
+ code: AUTHENTICATION_REQUIRED
36862
+ correlationId: 018f0000-0000-7000-8000-000000000001
36863
+ detail: See the operation contract.
36864
+ errors: []
36865
+ retryable: false
36866
+ schemaId: urn:gala:schema:problem:2.0.0
36867
+ schemaVersion: 2.0.0
36868
+ status: 401
36869
+ title: AUTHENTICATION_REQUIRED
36870
+ type: urn:gala:problem:authentication-required
36871
+ schema:
36872
+ $ref: "#/components/schemas/Problem"
36873
+ description: AUTHENTICATION_REQUIRED
36874
+ headers:
36875
+ Cache-Control:
36876
+ $ref: "#/components/headers/CacheControlNoStore"
36877
+ X-Correlation-Id:
36878
+ $ref: "#/components/headers/XCorrelationId"
36879
+ x-gala-problem-codes:
36880
+ - AUTHENTICATION_REQUIRED
36881
+ "403":
36882
+ $ref: "#/components/responses/AuthorizationDenied"
36883
+ "404":
36884
+ $ref: "#/components/responses/ResourceNotFound"
36885
+ "409":
36886
+ content:
36887
+ application/problem+json:
36888
+ examples:
36889
+ COMMAND_REPLAY_CONFLICT:
36890
+ summary: COMMAND_REPLAY_CONFLICT
36891
+ value:
36892
+ code: COMMAND_REPLAY_CONFLICT
36893
+ correlationId: 018f0000-0000-7000-8000-000000000001
36894
+ detail: See the operation contract.
36895
+ errors: []
36896
+ retryable: false
36897
+ schemaId: urn:gala:schema:problem:2.0.0
36898
+ schemaVersion: 2.0.0
36899
+ status: 409
36900
+ title: COMMAND_REPLAY_CONFLICT
36901
+ type: urn:gala:problem:command-replay-conflict
36902
+ PLAN_REQUIRED:
36903
+ summary: PLAN_REQUIRED
36904
+ value:
36905
+ code: PLAN_REQUIRED
36906
+ correlationId: 018f0000-0000-7000-8000-000000000001
36907
+ detail: The organization's plan does not include asking Galascribe for help. See the operation contract.
36908
+ errors: []
36909
+ retryable: false
36910
+ schemaId: urn:gala:schema:problem:2.0.0
36911
+ schemaVersion: 2.0.0
36912
+ status: 409
36913
+ title: PLAN_REQUIRED
36914
+ type: urn:gala:problem:plan-required
36915
+ schema:
36916
+ $ref: "#/components/schemas/Problem"
36917
+ description: COMMAND_REPLAY_CONFLICT, PLAN_REQUIRED
36918
+ headers:
36919
+ Cache-Control:
36920
+ $ref: "#/components/headers/CacheControlNoStore"
36921
+ X-Correlation-Id:
36922
+ $ref: "#/components/headers/XCorrelationId"
36923
+ x-gala-problem-codes:
36924
+ - COMMAND_REPLAY_CONFLICT
36925
+ - PLAN_REQUIRED
36926
+ security:
36927
+ - browserSession: []
36928
+ summary: ask Galascribe for help with a site
36929
+ tags:
36930
+ - organizations
36931
+ x-gala-activation-gate: MVP
36932
+ x-gala-activation-guards:
36933
+ - NONE
36934
+ x-gala-capability-key: publication.settings.manage
36935
+ x-gala-concurrency: none
36936
+ x-gala-conditional-capabilities: []
36937
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
36938
+ x-gala-nullability: required-and-nullable-are-explicit
36939
+ x-gala-purpose: ask Galascribe for help with a site
36940
+ x-gala-reachable-problems:
36941
+ - AUTHENTICATION_REQUIRED
36942
+ - AUTHORIZATION_DENIED
36943
+ - COMMAND_REPLAY_CONFLICT
36944
+ - PLAN_REQUIRED
36945
+ - REQUEST_FIELD_UNKNOWN
36946
+ - RESOURCE_NOT_FOUND
36947
+ - VALIDATION_FAILED
36948
+ x-gala-replay-identity: idempotency-key
36949
+ x-gala-state-guards:
36950
+ - NONE
36951
+ x-gala-success-category: create
36952
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
36953
+ /v2/organizations/{organizationId}/publications/{publicationId}/changes:publish:
36954
+ post:
36955
+ description: |
36956
+ Publishes the named repository changes together. For each change, in order:
36957
+
36958
+ 1. If the change is behind the main branch head it is brought up to date automatically when that is clean (the same file-level merge as `:bring-up-to-date`). When it is not clean nothing is written for any change and the response is `409 INVALID_SOURCE_STATE` with one error per conflicting path (`code: CONTENT_CONFLICT`, `pointer: /documents/<path>` or `/assets/<path>`) and the live head on `X-Gala-Current-Head`.
36959
+ 2. If the publication's `publishingPolicy.requireReview` is true and the change has no approval, `409 INVALID_SOURCE_STATE` with `errors[].code REVIEW_REQUIRED` pointed at `/changeIds/<index>`.
36960
+ 3. If `publishingPolicy.galascribeMerges` is true (the default) the server opens and merges the pull request itself through the GitHub App. Otherwise each change must already be merged on GitHub; one that is not is `409 INVALID_SOURCE_STATE` with `errors[].code SOURCE_NOT_MERGED` pointed at `/changeIds/<index>`.
36961
+
36962
+ Then ONE deploy of the resulting main head is started. Success is `202` with the accepted operation (kind `publish`; `publishId` names it, and the operation's `subject.generationId` names the generation once it exists). `scheduledFor` schedules the deploy instead of starting it now and additionally needs `publication.schedule`; it is cancelled with `:cancel` on the publish. `Idempotency-Key` replays the same acceptance. Whole-request validation happens before any change is merged: a refused request merges nothing.
36963
+
36964
+ SCHEMA-3.3.0 scheduling: with `scheduledFor` the request is validated
36965
+ exactly as an immediate publish (changes publishable, review state,
36966
+ repository set up, binding active, no publish in flight) and nothing is
36967
+ merged now; the named changes are merged and deployed at `scheduledFor`,
36968
+ after the same checks run again. `scheduledFor` must be at least 5
36969
+ minutes and at most 366 days ahead, else `422 VALIDATION_FAILED` pointed
36970
+ at `/scheduledFor`. One schedule per publication: `409 SCHEDULE_EXISTS`
36971
+ while another is pending (its `publishId` is in the problem `detail` and
36972
+ in the site read's `schedule`). `409 CANONICAL_BASE_MISMATCH` when the
36973
+ merged head's `gala/publication.json` `canonicalBase` is not the address
36974
+ the site is served at (the active custom domain, else the github.io
36975
+ address); the problem `detail` names the expected value.
36976
+
36977
+ SCHEMA-3.17.0: that problem also carries the optional members
36978
+ `expectedBase` (the address the site is served at, an https URL),
36979
+ `profileBase` (the base the profile carries now, as written),
36980
+ `domainState` (the custom domain's state that decided the expected
36981
+ base, absent without a domain) and `remedy` (one sentence for the
36982
+ author), so a client names both addresses and renders the `remedy`
36983
+ without parsing `detail`. The server first includes the pending "Site
36984
+ address" change in the publish, or proposes one inside the request, and
36985
+ returns the problem only when it cannot. `409 INVALID_SOURCE_STATE`
36986
+ with `errors[].code DOMAIN_NOT_READY` is returned while
36987
+ a custom domain is part-way through its switch and no address can be
36988
+ verified (after the Pages CNAME is set and before the certificate
36989
+ serves); it resolves on its own, and the domain read's `nextStep` says
36990
+ what is being waited on.
36991
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublish
36992
+ parameters:
36993
+ - $ref: "#/components/parameters/XCorrelationId"
36994
+ - example: 018f0000-0000-7000-8000-000000000001
36995
+ in: path
36996
+ name: organizationId
36997
+ required: true
36998
+ schema:
36999
+ format: uuid
37000
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
37001
+ type: string
37002
+ - example: 018f0000-0000-7000-8000-000000000001
37003
+ in: path
37004
+ name: publicationId
37005
+ required: true
37006
+ schema:
37007
+ format: uuid
37008
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
37009
+ type: string
37010
+ - $ref: "#/components/parameters/IdempotencyKey"
37011
+ - $ref: "#/components/parameters/XCsrfToken"
37012
+ requestBody:
37013
+ content:
37014
+ application/json:
37015
+ examples:
37016
+ nominal:
37017
+ summary: Nominal valid request
37018
+ value:
37019
+ changeIds:
37020
+ - 018f0000-0000-7000-8000-000000000001
37021
+ schema:
37022
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest"
37023
+ required: true
37024
+ responses:
37025
+ "202":
37026
+ content:
37027
+ application/json:
37028
+ examples:
37029
+ nominal:
37030
+ summary: Nominal successful response
37031
+ value:
37032
+ commandId: 018f0000-0000-7000-8000-000000000001
37033
+ operationId: 018f0000-0000-7000-8000-000000000001
37034
+ phase: accepted
37035
+ publishId: 018f0000-0000-7000-8000-000000000003
37036
+ resourceVersion: 0
37037
+ statusUrl: /v2/organizations/018f0000-0000-7000-8000-000000000001/operations/018f0000-0000-7000-8000-000000000002
37038
+ schema:
37039
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse"
37040
+ description: publish a batch of changes with one deploy of the resulting main head succeeded
37041
+ headers:
37042
+ Cache-Control:
37043
+ $ref: "#/components/headers/CacheControlNoStore"
37044
+ X-Correlation-Id:
37045
+ $ref: "#/components/headers/XCorrelationId"
37046
+ "400":
37047
+ content:
37048
+ application/problem+json:
37049
+ examples:
37050
+ REQUEST_FIELD_UNKNOWN:
37051
+ summary: REQUEST_FIELD_UNKNOWN
37052
+ value:
37053
+ code: REQUEST_FIELD_UNKNOWN
37054
+ correlationId: 018f0000-0000-7000-8000-000000000001
37055
+ detail: See the operation contract.
37056
+ errors: []
37057
+ retryable: false
37058
+ schemaId: urn:gala:schema:problem:2.0.0
37059
+ schemaVersion: 2.0.0
37060
+ status: 400
37061
+ title: REQUEST_FIELD_UNKNOWN
37062
+ type: urn:gala:problem:request-field-unknown
37063
+ VALIDATION_FAILED:
37064
+ summary: VALIDATION_FAILED
37065
+ value:
37066
+ code: VALIDATION_FAILED
37067
+ correlationId: 018f0000-0000-7000-8000-000000000001
37068
+ detail: See the operation contract.
37069
+ errors: []
37070
+ retryable: false
37071
+ schemaId: urn:gala:schema:problem:2.0.0
37072
+ schemaVersion: 2.0.0
37073
+ status: 400
37074
+ title: VALIDATION_FAILED
37075
+ type: urn:gala:problem:validation-failed
37076
+ schema:
37077
+ $ref: "#/components/schemas/Problem"
37078
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
37079
+ headers:
37080
+ Cache-Control:
37081
+ $ref: "#/components/headers/CacheControlNoStore"
37082
+ X-Correlation-Id:
37083
+ $ref: "#/components/headers/XCorrelationId"
37084
+ x-gala-problem-codes:
37085
+ - REQUEST_FIELD_UNKNOWN
37086
+ - VALIDATION_FAILED
35239
37087
  "401":
35240
37088
  content:
35241
37089
  application/problem+json:
@@ -38203,9 +40051,26 @@ paths:
38203
40051
  - NONE
38204
40052
  x-gala-success-category: query
38205
40053
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
38206
- /v2/organizations/{organizationId}/publications/{publicationId}/deployments:
40054
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/preview-context:
38207
40055
  get:
38208
- operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdDeployments
40056
+ description: |
40057
+ Needs `publication.view`. The facts the published page reads from the
40058
+ site's repository besides the post itself, so the App's draft preview
40059
+ can render the site's real header menu, footer and author cards:
40060
+ `navigation` (`gala/navigation.json`), `publication`
40061
+ (`gala/publication.json`) and `authors` (every `gala/authors/*.json`).
40062
+ This is the one read of those `gala/` files; `GET .../content/documents`
40063
+ still refuses them. `revision` omitted reads the linked repository's
40064
+ current main head; a supplied `revision` is checked exactly as the
40065
+ documents read checks it, and any other value is `404
40066
+ RESOURCE_NOT_FOUND`. The read is best-effort per member: a file that is
40067
+ absent, unreadable, larger than 256 KiB or invalid against its schema
40068
+ is `null` (`navigation`, `publication`) or left out (`authors`, at most
40069
+ 200, in file-name order), and never fails the read. The response
40070
+ carries a strong `ETag` and honours `If-None-Match` with `304` and no
40071
+ body; `Cache-Control` is `private, no-cache`, so a browser stores the
40072
+ body and revalidates it on every use.
40073
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContext
38209
40074
  parameters:
38210
40075
  - $ref: "#/components/parameters/XCorrelationId"
38211
40076
  - example: 018f0000-0000-7000-8000-000000000001
@@ -38224,8 +40089,21 @@ paths:
38224
40089
  format: uuid
38225
40090
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
38226
40091
  type: string
38227
- - $ref: "#/components/parameters/Cursor"
38228
- - $ref: "#/components/parameters/Limit"
40092
+ - example: sha1:0000000000000000000000000000000000000000
40093
+ in: query
40094
+ name: revision
40095
+ required: false
40096
+ schema:
40097
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
40098
+ type: string
40099
+ - description: A previously returned `ETag`; a match answers `304`.
40100
+ example: '"a1b2c3d4"'
40101
+ in: header
40102
+ name: If-None-Match
40103
+ required: false
40104
+ schema:
40105
+ maxLength: 256
40106
+ type: string
38229
40107
  responses:
38230
40108
  "200":
38231
40109
  content:
@@ -38234,18 +40112,316 @@ paths:
38234
40112
  nominal:
38235
40113
  summary: Nominal successful response
38236
40114
  value:
38237
- hasMore: false
38238
- items: []
40115
+ authors:
40116
+ - biography: Writes about the craft of publishing.
40117
+ displayName: Example Author
40118
+ extensions: {}
40119
+ id: 018f0000-0000-7000-8000-000000000001
40120
+ links:
40121
+ - type: website
40122
+ uri: https://example.com/
40123
+ localized: []
40124
+ schemaId: urn:gala:schema:author:2.0.0
40125
+ schemaVersion: 2.0.0
40126
+ navigation:
40127
+ extensions: {}
40128
+ footerItems: []
40129
+ items:
40130
+ - children: []
40131
+ label: About
40132
+ route: /about/
40133
+ type: internal
40134
+ schemaId: urn:gala:schema:navigation:2.0.0
40135
+ schemaVersion: 2.0.0
40136
+ publication:
40137
+ authors:
40138
+ - gala/authors/example-author.json
40139
+ canonicalBase: https://example.com/
40140
+ defaultLanguage: en
40141
+ description: A site about the craft of publishing.
40142
+ extensions: {}
40143
+ id: 018f0000-0000-7000-8000-000000000001
40144
+ schemaId: urn:gala:schema:publication:2.0.0
40145
+ schemaVersion: 2.0.0
40146
+ slug: example
40147
+ socialLinks: []
40148
+ title: Example
40149
+ revision: sha1:0000000000000000000000000000000000000000
38239
40150
  schema:
38240
- $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsResponse"
38241
- description: read generation and digest history without artifact bytes succeeded
40151
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentPreviewContextResponse"
40152
+ description: read the preview context succeeded
38242
40153
  headers:
38243
40154
  Cache-Control:
38244
- $ref: "#/components/headers/CacheControlNoStore"
40155
+ $ref: "#/components/headers/CacheControlPrivateNoCache"
40156
+ ETag:
40157
+ description: Strong validator of this response body.
40158
+ required: true
40159
+ schema:
40160
+ maxLength: 256
40161
+ type: string
40162
+ X-Correlation-Id:
40163
+ $ref: "#/components/headers/XCorrelationId"
40164
+ "304":
40165
+ description: the caller's `If-None-Match` still matches; no body
40166
+ headers:
40167
+ Cache-Control:
40168
+ $ref: "#/components/headers/CacheControlPrivateNoCache"
40169
+ ETag:
40170
+ description: Strong validator of this response body.
40171
+ required: true
40172
+ schema:
40173
+ maxLength: 256
40174
+ type: string
38245
40175
  X-Correlation-Id:
38246
40176
  $ref: "#/components/headers/XCorrelationId"
38247
40177
  "400":
38248
- $ref: "#/components/responses/ValidationFailed"
40178
+ content:
40179
+ application/problem+json:
40180
+ examples:
40181
+ VALIDATION_FAILED:
40182
+ summary: VALIDATION_FAILED
40183
+ value:
40184
+ code: VALIDATION_FAILED
40185
+ correlationId: 018f0000-0000-7000-8000-000000000001
40186
+ detail: See the operation contract.
40187
+ errors: []
40188
+ retryable: false
40189
+ schemaId: urn:gala:schema:problem:2.0.0
40190
+ schemaVersion: 2.0.0
40191
+ status: 400
40192
+ title: VALIDATION_FAILED
40193
+ type: urn:gala:problem:validation-failed
40194
+ schema:
40195
+ $ref: "#/components/schemas/Problem"
40196
+ description: VALIDATION_FAILED
40197
+ headers:
40198
+ Cache-Control:
40199
+ $ref: "#/components/headers/CacheControlNoStore"
40200
+ X-Correlation-Id:
40201
+ $ref: "#/components/headers/XCorrelationId"
40202
+ x-gala-problem-codes:
40203
+ - VALIDATION_FAILED
40204
+ "401":
40205
+ content:
40206
+ application/problem+json:
40207
+ examples:
40208
+ AUTHENTICATION_REQUIRED:
40209
+ summary: AUTHENTICATION_REQUIRED
40210
+ value:
40211
+ code: AUTHENTICATION_REQUIRED
40212
+ correlationId: 018f0000-0000-7000-8000-000000000001
40213
+ detail: See the operation contract.
40214
+ errors: []
40215
+ retryable: false
40216
+ schemaId: urn:gala:schema:problem:2.0.0
40217
+ schemaVersion: 2.0.0
40218
+ status: 401
40219
+ title: AUTHENTICATION_REQUIRED
40220
+ type: urn:gala:problem:authentication-required
40221
+ schema:
40222
+ $ref: "#/components/schemas/Problem"
40223
+ description: AUTHENTICATION_REQUIRED
40224
+ headers:
40225
+ Cache-Control:
40226
+ $ref: "#/components/headers/CacheControlNoStore"
40227
+ X-Correlation-Id:
40228
+ $ref: "#/components/headers/XCorrelationId"
40229
+ x-gala-problem-codes:
40230
+ - AUTHENTICATION_REQUIRED
40231
+ "403":
40232
+ content:
40233
+ application/problem+json:
40234
+ examples:
40235
+ AUTHORIZATION_DENIED:
40236
+ summary: AUTHORIZATION_DENIED
40237
+ value:
40238
+ code: AUTHORIZATION_DENIED
40239
+ correlationId: 018f0000-0000-7000-8000-000000000001
40240
+ detail: See the operation contract.
40241
+ errors: []
40242
+ retryable: false
40243
+ schemaId: urn:gala:schema:problem:2.0.0
40244
+ schemaVersion: 2.0.0
40245
+ status: 403
40246
+ title: AUTHORIZATION_DENIED
40247
+ type: urn:gala:problem:authorization-denied
40248
+ schema:
40249
+ $ref: "#/components/schemas/Problem"
40250
+ description: AUTHORIZATION_DENIED
40251
+ headers:
40252
+ Cache-Control:
40253
+ $ref: "#/components/headers/CacheControlNoStore"
40254
+ X-Correlation-Id:
40255
+ $ref: "#/components/headers/XCorrelationId"
40256
+ x-gala-problem-codes:
40257
+ - AUTHORIZATION_DENIED
40258
+ "404":
40259
+ content:
40260
+ application/problem+json:
40261
+ examples:
40262
+ RESOURCE_NOT_FOUND:
40263
+ summary: RESOURCE_NOT_FOUND
40264
+ value:
40265
+ code: RESOURCE_NOT_FOUND
40266
+ correlationId: 018f0000-0000-7000-8000-000000000001
40267
+ detail: See the operation contract.
40268
+ errors: []
40269
+ retryable: false
40270
+ schemaId: urn:gala:schema:problem:2.0.0
40271
+ schemaVersion: 2.0.0
40272
+ status: 404
40273
+ title: RESOURCE_NOT_FOUND
40274
+ type: urn:gala:problem:resource-not-found
40275
+ schema:
40276
+ $ref: "#/components/schemas/Problem"
40277
+ description: RESOURCE_NOT_FOUND
40278
+ headers:
40279
+ Cache-Control:
40280
+ $ref: "#/components/headers/CacheControlNoStore"
40281
+ X-Correlation-Id:
40282
+ $ref: "#/components/headers/XCorrelationId"
40283
+ x-gala-problem-codes:
40284
+ - RESOURCE_NOT_FOUND
40285
+ "429":
40286
+ content:
40287
+ application/problem+json:
40288
+ examples:
40289
+ RATE_LIMITED:
40290
+ summary: RATE_LIMITED
40291
+ value:
40292
+ code: RATE_LIMITED
40293
+ correlationId: 018f0000-0000-7000-8000-000000000001
40294
+ detail: See the operation contract.
40295
+ errors: []
40296
+ retryable: true
40297
+ schemaId: urn:gala:schema:problem:2.0.0
40298
+ schemaVersion: 2.0.0
40299
+ status: 429
40300
+ title: RATE_LIMITED
40301
+ type: urn:gala:problem:rate-limited
40302
+ schema:
40303
+ $ref: "#/components/schemas/Problem"
40304
+ description: RATE_LIMITED
40305
+ headers:
40306
+ Cache-Control:
40307
+ $ref: "#/components/headers/CacheControlNoStore"
40308
+ Retry-After:
40309
+ $ref: "#/components/headers/RetryAfter"
40310
+ X-Correlation-Id:
40311
+ $ref: "#/components/headers/XCorrelationId"
40312
+ x-gala-problem-codes:
40313
+ - RATE_LIMITED
40314
+ "503":
40315
+ content:
40316
+ application/problem+json:
40317
+ examples:
40318
+ CAPABILITY_UNAVAILABLE:
40319
+ summary: CAPABILITY_UNAVAILABLE
40320
+ value:
40321
+ code: CAPABILITY_UNAVAILABLE
40322
+ correlationId: 018f0000-0000-7000-8000-000000000001
40323
+ detail: See the operation contract.
40324
+ errors: []
40325
+ retryable: false
40326
+ schemaId: urn:gala:schema:problem:2.0.0
40327
+ schemaVersion: 2.0.0
40328
+ status: 503
40329
+ title: CAPABILITY_UNAVAILABLE
40330
+ type: urn:gala:problem:capability-unavailable
40331
+ DEPENDENCY_UNAVAILABLE:
40332
+ summary: DEPENDENCY_UNAVAILABLE
40333
+ value:
40334
+ code: DEPENDENCY_UNAVAILABLE
40335
+ correlationId: 018f0000-0000-7000-8000-000000000001
40336
+ detail: See the operation contract.
40337
+ errors: []
40338
+ retryable: true
40339
+ schemaId: urn:gala:schema:problem:2.0.0
40340
+ schemaVersion: 2.0.0
40341
+ status: 503
40342
+ title: DEPENDENCY_UNAVAILABLE
40343
+ type: urn:gala:problem:dependency-unavailable
40344
+ schema:
40345
+ $ref: "#/components/schemas/Problem"
40346
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
40347
+ headers:
40348
+ Cache-Control:
40349
+ $ref: "#/components/headers/CacheControlNoStore"
40350
+ X-Correlation-Id:
40351
+ $ref: "#/components/headers/XCorrelationId"
40352
+ x-gala-problem-codes:
40353
+ - CAPABILITY_UNAVAILABLE
40354
+ - DEPENDENCY_UNAVAILABLE
40355
+ security:
40356
+ - browserSession: []
40357
+ summary: read the preview context
40358
+ tags:
40359
+ - organizations
40360
+ x-gala-activation-gate: MVP
40361
+ x-gala-activation-guards:
40362
+ - Active repository binding and configured GitHub App identity capability
40363
+ x-gala-capability-key: publication.view
40364
+ x-gala-concurrency: binding-epoch
40365
+ x-gala-conditional-capabilities: []
40366
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
40367
+ x-gala-nullability: required-and-nullable-are-explicit
40368
+ x-gala-purpose: read the preview context
40369
+ x-gala-reachable-problems:
40370
+ - AUTHENTICATION_REQUIRED
40371
+ - AUTHORIZATION_DENIED
40372
+ - CAPABILITY_UNAVAILABLE
40373
+ - DEPENDENCY_UNAVAILABLE
40374
+ - RATE_LIMITED
40375
+ - RESOURCE_NOT_FOUND
40376
+ - VALIDATION_FAILED
40377
+ x-gala-replay-identity: safe-query
40378
+ x-gala-state-guards:
40379
+ - NONE
40380
+ x-gala-success-category: query
40381
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40382
+ /v2/organizations/{organizationId}/publications/{publicationId}/deployments:
40383
+ get:
40384
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdDeployments
40385
+ parameters:
40386
+ - $ref: "#/components/parameters/XCorrelationId"
40387
+ - example: 018f0000-0000-7000-8000-000000000001
40388
+ in: path
40389
+ name: organizationId
40390
+ required: true
40391
+ schema:
40392
+ format: uuid
40393
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40394
+ type: string
40395
+ - example: 018f0000-0000-7000-8000-000000000001
40396
+ in: path
40397
+ name: publicationId
40398
+ required: true
40399
+ schema:
40400
+ format: uuid
40401
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40402
+ type: string
40403
+ - $ref: "#/components/parameters/Cursor"
40404
+ - $ref: "#/components/parameters/Limit"
40405
+ responses:
40406
+ "200":
40407
+ content:
40408
+ application/json:
40409
+ examples:
40410
+ nominal:
40411
+ summary: Nominal successful response
40412
+ value:
40413
+ hasMore: false
40414
+ items: []
40415
+ schema:
40416
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsResponse"
40417
+ description: read generation and digest history without artifact bytes succeeded
40418
+ headers:
40419
+ Cache-Control:
40420
+ $ref: "#/components/headers/CacheControlNoStore"
40421
+ X-Correlation-Id:
40422
+ $ref: "#/components/headers/XCorrelationId"
40423
+ "400":
40424
+ $ref: "#/components/responses/ValidationFailed"
38249
40425
  "401":
38250
40426
  content:
38251
40427
  application/problem+json:
@@ -39768,6 +41944,591 @@ paths:
39768
41944
  - PublicationDestination:UNSET|SET
39769
41945
  x-gala-success-category: update
39770
41946
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
41947
+ /v2/organizations/{organizationId}/publications/{publicationId}/domain-registrations:
41948
+ get:
41949
+ description: |
41950
+ Needs `publication.view`. The registrations made for this site, newest
41951
+ first (`DomainRegistration`). At most 20.
41952
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrations
41953
+ parameters:
41954
+ - $ref: "#/components/parameters/XCorrelationId"
41955
+ - example: 018f0000-0000-7000-8000-000000000001
41956
+ in: path
41957
+ name: organizationId
41958
+ required: true
41959
+ schema:
41960
+ format: uuid
41961
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
41962
+ type: string
41963
+ - example: 018f0000-0000-7000-8000-000000000001
41964
+ in: path
41965
+ name: publicationId
41966
+ required: true
41967
+ schema:
41968
+ format: uuid
41969
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
41970
+ type: string
41971
+ responses:
41972
+ "200":
41973
+ content:
41974
+ application/json:
41975
+ examples:
41976
+ nominal:
41977
+ summary: Nominal successful response
41978
+ value:
41979
+ items:
41980
+ - createdAt: "2026-11-02T09:00:00.000Z"
41981
+ domainName: mayawrites.com
41982
+ registrationId: 018f0000-0000-7000-8000-000000000001
41983
+ state: REGISTERING
41984
+ updatedAt: "2026-11-02T09:00:00.000Z"
41985
+ schema:
41986
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsResponse"
41987
+ description: list the domain registrations of a site succeeded
41988
+ headers:
41989
+ Cache-Control:
41990
+ $ref: "#/components/headers/CacheControlNoStore"
41991
+ X-Correlation-Id:
41992
+ $ref: "#/components/headers/XCorrelationId"
41993
+ "400":
41994
+ $ref: "#/components/responses/ValidationFailed"
41995
+ "401":
41996
+ content:
41997
+ application/problem+json:
41998
+ examples:
41999
+ AUTHENTICATION_REQUIRED:
42000
+ summary: AUTHENTICATION_REQUIRED
42001
+ value:
42002
+ code: AUTHENTICATION_REQUIRED
42003
+ correlationId: 018f0000-0000-7000-8000-000000000001
42004
+ detail: See the operation contract.
42005
+ errors: []
42006
+ retryable: false
42007
+ schemaId: urn:gala:schema:problem:2.0.0
42008
+ schemaVersion: 2.0.0
42009
+ status: 401
42010
+ title: AUTHENTICATION_REQUIRED
42011
+ type: urn:gala:problem:authentication-required
42012
+ schema:
42013
+ $ref: "#/components/schemas/Problem"
42014
+ description: AUTHENTICATION_REQUIRED
42015
+ headers:
42016
+ Cache-Control:
42017
+ $ref: "#/components/headers/CacheControlNoStore"
42018
+ X-Correlation-Id:
42019
+ $ref: "#/components/headers/XCorrelationId"
42020
+ x-gala-problem-codes:
42021
+ - AUTHENTICATION_REQUIRED
42022
+ "403":
42023
+ $ref: "#/components/responses/AuthorizationDenied"
42024
+ "404":
42025
+ $ref: "#/components/responses/ResourceNotFound"
42026
+ security:
42027
+ - browserSession: []
42028
+ summary: list the domain registrations of a site
42029
+ tags:
42030
+ - domains
42031
+ x-gala-activation-gate: MVP
42032
+ x-gala-activation-guards:
42033
+ - NONE
42034
+ x-gala-capability-key: publication.view
42035
+ x-gala-concurrency: publication-and-destination-epochs
42036
+ x-gala-conditional-capabilities: []
42037
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
42038
+ x-gala-nullability: required-and-nullable-are-explicit
42039
+ x-gala-purpose: list the domain registrations of a site
42040
+ x-gala-reachable-problems:
42041
+ - AUTHENTICATION_REQUIRED
42042
+ - AUTHORIZATION_DENIED
42043
+ - RESOURCE_NOT_FOUND
42044
+ - VALIDATION_FAILED
42045
+ x-gala-replay-identity: safe-query
42046
+ x-gala-state-guards:
42047
+ - NONE
42048
+ x-gala-success-category: query
42049
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
42050
+ post:
42051
+ description: |
42052
+ Needs `publication.settings.manage`. Registers `domainName` for the
42053
+ organization as its one included domain and attaches it to this site.
42054
+ Galascribe re-checks the name, registers it with `registrant` as the
42055
+ domain's owner, then writes the DNS records and attaches the domain, so the
42056
+ person adds no records. The answer is `202` with a `DomainRegistration`
42057
+ that moves through its `state` while the work runs; read it again to follow
42058
+ it. `registrant` is sent to the registrar and is never stored, logged or
42059
+ returned. `409 PLAN_REQUIRED` when the plan has no included domain;
42060
+ `409 INVALID_SOURCE_STATE` when the organization already used its included
42061
+ domain; `422 VALIDATION_FAILED` for a name or registrant field that is not
42062
+ valid; `503 CAPABILITY_UNAVAILABLE` when registration is not set up.
42063
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrations
42064
+ parameters:
42065
+ - $ref: "#/components/parameters/XCorrelationId"
42066
+ - example: 018f0000-0000-7000-8000-000000000001
42067
+ in: path
42068
+ name: organizationId
42069
+ required: true
42070
+ schema:
42071
+ format: uuid
42072
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42073
+ type: string
42074
+ - example: 018f0000-0000-7000-8000-000000000001
42075
+ in: path
42076
+ name: publicationId
42077
+ required: true
42078
+ schema:
42079
+ format: uuid
42080
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42081
+ type: string
42082
+ - $ref: "#/components/parameters/IdempotencyKey"
42083
+ - $ref: "#/components/parameters/XCsrfToken"
42084
+ requestBody:
42085
+ content:
42086
+ application/json:
42087
+ examples:
42088
+ nominal:
42089
+ summary: Nominal valid request
42090
+ value:
42091
+ domainName: mayawrites.com
42092
+ registrant:
42093
+ address:
42094
+ city: Portland
42095
+ countryCode: US
42096
+ postalCode: "97201"
42097
+ region: OR
42098
+ street: 12 Example Street
42099
+ email: maya@example.com
42100
+ name: Maya Example
42101
+ phone: "+1.5555555555"
42102
+ schema:
42103
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsRequest"
42104
+ required: true
42105
+ responses:
42106
+ "202":
42107
+ content:
42108
+ application/json:
42109
+ examples:
42110
+ nominal:
42111
+ summary: Nominal successful response
42112
+ value:
42113
+ createdAt: "2026-11-02T09:00:00.000Z"
42114
+ domainName: mayawrites.com
42115
+ registrationId: 018f0000-0000-7000-8000-000000000001
42116
+ state: REGISTERING
42117
+ updatedAt: "2026-11-02T09:00:00.000Z"
42118
+ schema:
42119
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsResponse"
42120
+ description: register the included domain succeeded
42121
+ headers:
42122
+ Cache-Control:
42123
+ $ref: "#/components/headers/CacheControlNoStore"
42124
+ X-Correlation-Id:
42125
+ $ref: "#/components/headers/XCorrelationId"
42126
+ "400":
42127
+ $ref: "#/components/responses/RequestInvalid"
42128
+ "401":
42129
+ content:
42130
+ application/problem+json:
42131
+ examples:
42132
+ AUTHENTICATION_REQUIRED:
42133
+ summary: AUTHENTICATION_REQUIRED
42134
+ value:
42135
+ code: AUTHENTICATION_REQUIRED
42136
+ correlationId: 018f0000-0000-7000-8000-000000000001
42137
+ detail: See the operation contract.
42138
+ errors: []
42139
+ retryable: false
42140
+ schemaId: urn:gala:schema:problem:2.0.0
42141
+ schemaVersion: 2.0.0
42142
+ status: 401
42143
+ title: AUTHENTICATION_REQUIRED
42144
+ type: urn:gala:problem:authentication-required
42145
+ schema:
42146
+ $ref: "#/components/schemas/Problem"
42147
+ description: AUTHENTICATION_REQUIRED
42148
+ headers:
42149
+ Cache-Control:
42150
+ $ref: "#/components/headers/CacheControlNoStore"
42151
+ X-Correlation-Id:
42152
+ $ref: "#/components/headers/XCorrelationId"
42153
+ x-gala-problem-codes:
42154
+ - AUTHENTICATION_REQUIRED
42155
+ "403":
42156
+ $ref: "#/components/responses/AuthorizationDenied"
42157
+ "404":
42158
+ $ref: "#/components/responses/ResourceNotFound"
42159
+ "409":
42160
+ content:
42161
+ application/problem+json:
42162
+ examples:
42163
+ COMMAND_REPLAY_CONFLICT:
42164
+ summary: COMMAND_REPLAY_CONFLICT
42165
+ value:
42166
+ code: COMMAND_REPLAY_CONFLICT
42167
+ correlationId: 018f0000-0000-7000-8000-000000000001
42168
+ detail: See the operation contract.
42169
+ errors: []
42170
+ retryable: false
42171
+ schemaId: urn:gala:schema:problem:2.0.0
42172
+ schemaVersion: 2.0.0
42173
+ status: 409
42174
+ title: COMMAND_REPLAY_CONFLICT
42175
+ type: urn:gala:problem:command-replay-conflict
42176
+ INVALID_SOURCE_STATE:
42177
+ summary: INVALID_SOURCE_STATE
42178
+ value:
42179
+ code: INVALID_SOURCE_STATE
42180
+ correlationId: 018f0000-0000-7000-8000-000000000001
42181
+ detail: See the operation contract.
42182
+ errors: []
42183
+ retryable: false
42184
+ schemaId: urn:gala:schema:problem:2.0.0
42185
+ schemaVersion: 2.0.0
42186
+ status: 409
42187
+ title: INVALID_SOURCE_STATE
42188
+ type: urn:gala:problem:invalid-source-state
42189
+ PLAN_REQUIRED:
42190
+ summary: PLAN_REQUIRED
42191
+ value:
42192
+ code: PLAN_REQUIRED
42193
+ correlationId: 018f0000-0000-7000-8000-000000000001
42194
+ detail: The organization's plan does not include a domain. See the operation contract.
42195
+ errors: []
42196
+ retryable: false
42197
+ schemaId: urn:gala:schema:problem:2.0.0
42198
+ schemaVersion: 2.0.0
42199
+ status: 409
42200
+ title: PLAN_REQUIRED
42201
+ type: urn:gala:problem:plan-required
42202
+ schema:
42203
+ $ref: "#/components/schemas/Problem"
42204
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE, PLAN_REQUIRED
42205
+ headers:
42206
+ Cache-Control:
42207
+ $ref: "#/components/headers/CacheControlNoStore"
42208
+ X-Correlation-Id:
42209
+ $ref: "#/components/headers/XCorrelationId"
42210
+ x-gala-problem-codes:
42211
+ - COMMAND_REPLAY_CONFLICT
42212
+ - INVALID_SOURCE_STATE
42213
+ - PLAN_REQUIRED
42214
+ "422":
42215
+ content:
42216
+ application/problem+json:
42217
+ examples:
42218
+ VALIDATION_FAILED:
42219
+ summary: VALIDATION_FAILED
42220
+ value:
42221
+ code: VALIDATION_FAILED
42222
+ correlationId: 018f0000-0000-7000-8000-000000000001
42223
+ detail: See the operation contract.
42224
+ errors: []
42225
+ retryable: false
42226
+ schemaId: urn:gala:schema:problem:2.0.0
42227
+ schemaVersion: 2.0.0
42228
+ status: 422
42229
+ title: VALIDATION_FAILED
42230
+ type: urn:gala:problem:validation-failed
42231
+ schema:
42232
+ $ref: "#/components/schemas/Problem"
42233
+ description: VALIDATION_FAILED
42234
+ headers:
42235
+ Cache-Control:
42236
+ $ref: "#/components/headers/CacheControlNoStore"
42237
+ X-Correlation-Id:
42238
+ $ref: "#/components/headers/XCorrelationId"
42239
+ x-gala-problem-codes:
42240
+ - VALIDATION_FAILED
42241
+ "503":
42242
+ content:
42243
+ application/problem+json:
42244
+ examples:
42245
+ CAPABILITY_UNAVAILABLE:
42246
+ summary: CAPABILITY_UNAVAILABLE
42247
+ value:
42248
+ code: CAPABILITY_UNAVAILABLE
42249
+ correlationId: 018f0000-0000-7000-8000-000000000001
42250
+ detail: See the operation contract.
42251
+ errors: []
42252
+ retryable: false
42253
+ schemaId: urn:gala:schema:problem:2.0.0
42254
+ schemaVersion: 2.0.0
42255
+ status: 503
42256
+ title: CAPABILITY_UNAVAILABLE
42257
+ type: urn:gala:problem:capability-unavailable
42258
+ schema:
42259
+ $ref: "#/components/schemas/Problem"
42260
+ description: CAPABILITY_UNAVAILABLE
42261
+ headers:
42262
+ Cache-Control:
42263
+ $ref: "#/components/headers/CacheControlNoStore"
42264
+ X-Correlation-Id:
42265
+ $ref: "#/components/headers/XCorrelationId"
42266
+ x-gala-problem-codes:
42267
+ - CAPABILITY_UNAVAILABLE
42268
+ security:
42269
+ - browserSession: []
42270
+ summary: register the included domain
42271
+ tags:
42272
+ - domains
42273
+ x-gala-activation-gate: MVP
42274
+ x-gala-activation-guards:
42275
+ - DOMAIN_REGISTRATION_ENABLED
42276
+ x-gala-capability-key: publication.settings.manage
42277
+ x-gala-concurrency: organization-version
42278
+ x-gala-conditional-capabilities: []
42279
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
42280
+ x-gala-nullability: required-and-nullable-are-explicit
42281
+ x-gala-purpose: register the included domain
42282
+ x-gala-reachable-problems:
42283
+ - AUTHENTICATION_REQUIRED
42284
+ - AUTHORIZATION_DENIED
42285
+ - CAPABILITY_UNAVAILABLE
42286
+ - COMMAND_REPLAY_CONFLICT
42287
+ - INVALID_SOURCE_STATE
42288
+ - PLAN_REQUIRED
42289
+ - REQUEST_FIELD_UNKNOWN
42290
+ - RESOURCE_NOT_FOUND
42291
+ - VALIDATION_FAILED
42292
+ x-gala-replay-identity: idempotency-key
42293
+ x-gala-state-guards:
42294
+ - Organization:INCLUDED_DOMAIN_UNUSED
42295
+ x-gala-success-category: async
42296
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
42297
+ /v2/organizations/{organizationId}/publications/{publicationId}/domain-registrations/{registrationId}:
42298
+ get:
42299
+ description: |
42300
+ Needs `publication.view`. One registration made for this site. `state`
42301
+ follows the work: `REQUESTED`, `REGISTERING`, `REGISTERED` (bought, records
42302
+ not yet written) and `ATTACHED` (the site uses it; `domainId` names the
42303
+ binding), or `ACTION_REQUIRED` and `FAILED` (`failure` says what happened and
42304
+ the person may ask Galascribe for help).
42305
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsByRegistrationId
42306
+ parameters:
42307
+ - $ref: "#/components/parameters/XCorrelationId"
42308
+ - example: 018f0000-0000-7000-8000-000000000001
42309
+ in: path
42310
+ name: organizationId
42311
+ required: true
42312
+ schema:
42313
+ format: uuid
42314
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42315
+ type: string
42316
+ - example: 018f0000-0000-7000-8000-000000000001
42317
+ in: path
42318
+ name: publicationId
42319
+ required: true
42320
+ schema:
42321
+ format: uuid
42322
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42323
+ type: string
42324
+ - example: 018f0000-0000-7000-8000-000000000001
42325
+ in: path
42326
+ name: registrationId
42327
+ required: true
42328
+ schema:
42329
+ format: uuid
42330
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42331
+ type: string
42332
+ responses:
42333
+ "200":
42334
+ content:
42335
+ application/json:
42336
+ examples:
42337
+ nominal:
42338
+ summary: Nominal successful response
42339
+ value:
42340
+ createdAt: "2026-11-02T09:00:00.000Z"
42341
+ domainId: 018f0000-0000-7000-8000-000000000001
42342
+ domainName: mayawrites.com
42343
+ registrationId: 018f0000-0000-7000-8000-000000000001
42344
+ state: ATTACHED
42345
+ updatedAt: "2026-11-02T09:00:00.000Z"
42346
+ schema:
42347
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsByRegistrationIdResponse"
42348
+ description: read a domain registration succeeded
42349
+ headers:
42350
+ Cache-Control:
42351
+ $ref: "#/components/headers/CacheControlNoStore"
42352
+ X-Correlation-Id:
42353
+ $ref: "#/components/headers/XCorrelationId"
42354
+ "400":
42355
+ $ref: "#/components/responses/ValidationFailed"
42356
+ "401":
42357
+ content:
42358
+ application/problem+json:
42359
+ examples:
42360
+ AUTHENTICATION_REQUIRED:
42361
+ summary: AUTHENTICATION_REQUIRED
42362
+ value:
42363
+ code: AUTHENTICATION_REQUIRED
42364
+ correlationId: 018f0000-0000-7000-8000-000000000001
42365
+ detail: See the operation contract.
42366
+ errors: []
42367
+ retryable: false
42368
+ schemaId: urn:gala:schema:problem:2.0.0
42369
+ schemaVersion: 2.0.0
42370
+ status: 401
42371
+ title: AUTHENTICATION_REQUIRED
42372
+ type: urn:gala:problem:authentication-required
42373
+ schema:
42374
+ $ref: "#/components/schemas/Problem"
42375
+ description: AUTHENTICATION_REQUIRED
42376
+ headers:
42377
+ Cache-Control:
42378
+ $ref: "#/components/headers/CacheControlNoStore"
42379
+ X-Correlation-Id:
42380
+ $ref: "#/components/headers/XCorrelationId"
42381
+ x-gala-problem-codes:
42382
+ - AUTHENTICATION_REQUIRED
42383
+ "403":
42384
+ $ref: "#/components/responses/AuthorizationDenied"
42385
+ "404":
42386
+ $ref: "#/components/responses/ResourceNotFound"
42387
+ security:
42388
+ - browserSession: []
42389
+ summary: read a domain registration
42390
+ tags:
42391
+ - domains
42392
+ x-gala-activation-gate: MVP
42393
+ x-gala-activation-guards:
42394
+ - NONE
42395
+ x-gala-capability-key: publication.view
42396
+ x-gala-concurrency: publication-and-destination-epochs
42397
+ x-gala-conditional-capabilities: []
42398
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
42399
+ x-gala-nullability: required-and-nullable-are-explicit
42400
+ x-gala-purpose: read a domain registration
42401
+ x-gala-reachable-problems:
42402
+ - AUTHENTICATION_REQUIRED
42403
+ - AUTHORIZATION_DENIED
42404
+ - RESOURCE_NOT_FOUND
42405
+ - VALIDATION_FAILED
42406
+ x-gala-replay-identity: safe-query
42407
+ x-gala-state-guards:
42408
+ - NONE
42409
+ x-gala-success-category: query
42410
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
42411
+ /v2/organizations/{organizationId}/publications/{publicationId}/domain-registrations:check:
42412
+ post:
42413
+ description: |
42414
+ Needs `publication.settings.manage`. Asks whether `name` can be registered
42415
+ for the organization as its included domain, without registering it. Always
42416
+ `200`: `registrable` is true, or `reason` says why not. `UNAVAILABLE`:
42417
+ already registered. `EXTENSION_NOT_SUPPORTED`: Galascribe cannot register
42418
+ that ending. `PREMIUM`: a premium name, which the included domain does
42419
+ not cover. `OVER_PRICE_CAP`: its first-year price is above what the
42420
+ included domain covers. `INVALID_NAME`: not a usable domain name.
42421
+ `PLAN_REQUIRED`: the plan has no included domain. `ALREADY_USED`: the
42422
+ organization already used its included domain. `NOT_CONFIGURED`:
42423
+ registration is not set up on this deployment. The response carries no
42424
+ price: the domain is included in the plan.
42425
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsCheck
42426
+ parameters:
42427
+ - $ref: "#/components/parameters/XCorrelationId"
42428
+ - example: 018f0000-0000-7000-8000-000000000001
42429
+ in: path
42430
+ name: organizationId
42431
+ required: true
42432
+ schema:
42433
+ format: uuid
42434
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42435
+ type: string
42436
+ - example: 018f0000-0000-7000-8000-000000000001
42437
+ in: path
42438
+ name: publicationId
42439
+ required: true
42440
+ schema:
42441
+ format: uuid
42442
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
42443
+ type: string
42444
+ - $ref: "#/components/parameters/XCsrfToken"
42445
+ requestBody:
42446
+ content:
42447
+ application/json:
42448
+ examples:
42449
+ nominal:
42450
+ summary: Nominal valid request
42451
+ value:
42452
+ name: mayawrites.com
42453
+ schema:
42454
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsCheckRequest"
42455
+ required: true
42456
+ responses:
42457
+ "200":
42458
+ content:
42459
+ application/json:
42460
+ examples:
42461
+ nominal:
42462
+ summary: Nominal successful response
42463
+ value:
42464
+ name: mayawrites.com
42465
+ registrable: true
42466
+ schema:
42467
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainRegistrationsCheckResponse"
42468
+ description: check a domain name for registration succeeded
42469
+ headers:
42470
+ Cache-Control:
42471
+ $ref: "#/components/headers/CacheControlNoStore"
42472
+ X-Correlation-Id:
42473
+ $ref: "#/components/headers/XCorrelationId"
42474
+ "400":
42475
+ $ref: "#/components/responses/RequestInvalid"
42476
+ "401":
42477
+ content:
42478
+ application/problem+json:
42479
+ examples:
42480
+ AUTHENTICATION_REQUIRED:
42481
+ summary: AUTHENTICATION_REQUIRED
42482
+ value:
42483
+ code: AUTHENTICATION_REQUIRED
42484
+ correlationId: 018f0000-0000-7000-8000-000000000001
42485
+ detail: See the operation contract.
42486
+ errors: []
42487
+ retryable: false
42488
+ schemaId: urn:gala:schema:problem:2.0.0
42489
+ schemaVersion: 2.0.0
42490
+ status: 401
42491
+ title: AUTHENTICATION_REQUIRED
42492
+ type: urn:gala:problem:authentication-required
42493
+ schema:
42494
+ $ref: "#/components/schemas/Problem"
42495
+ description: AUTHENTICATION_REQUIRED
42496
+ headers:
42497
+ Cache-Control:
42498
+ $ref: "#/components/headers/CacheControlNoStore"
42499
+ X-Correlation-Id:
42500
+ $ref: "#/components/headers/XCorrelationId"
42501
+ x-gala-problem-codes:
42502
+ - AUTHENTICATION_REQUIRED
42503
+ "403":
42504
+ $ref: "#/components/responses/AuthorizationDenied"
42505
+ "404":
42506
+ $ref: "#/components/responses/ResourceNotFound"
42507
+ security:
42508
+ - browserSession: []
42509
+ summary: check a domain name for registration
42510
+ tags:
42511
+ - domains
42512
+ x-gala-activation-gate: MVP
42513
+ x-gala-activation-guards:
42514
+ - NONE
42515
+ x-gala-capability-key: publication.settings.manage
42516
+ x-gala-concurrency: none
42517
+ x-gala-conditional-capabilities: []
42518
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
42519
+ x-gala-nullability: required-and-nullable-are-explicit
42520
+ x-gala-purpose: check a domain name for registration
42521
+ x-gala-reachable-problems:
42522
+ - AUTHENTICATION_REQUIRED
42523
+ - AUTHORIZATION_DENIED
42524
+ - REQUEST_FIELD_UNKNOWN
42525
+ - RESOURCE_NOT_FOUND
42526
+ - VALIDATION_FAILED
42527
+ x-gala-replay-identity: safe-query
42528
+ x-gala-state-guards:
42529
+ - NONE
42530
+ x-gala-success-category: protocol
42531
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
39771
42532
  /v2/organizations/{organizationId}/publications/{publicationId}/domains:
39772
42533
  get:
39773
42534
  description: |
@@ -42412,6 +45173,389 @@ paths:
42412
45173
  - NONE
42413
45174
  x-gala-success-category: update
42414
45175
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
45176
+ /v2/organizations/{organizationId}/publications/{publicationId}/domains:check-galascribe-address:
45177
+ post:
45178
+ description: |
45179
+ Needs `publication.settings.manage`. Asks whether `label` can become this
45180
+ site's `label.galascribe.com` address, without reserving it. Always
45181
+ `200`: `available` is true, or `reason` says why not. `INVALID`: not a
45182
+ usable label (3 to 63 lowercase letters, digits and hyphens, not starting
45183
+ or ending with a hyphen). `RESERVED`: a name Galascribe keeps for itself.
45184
+ `TAKEN`: another site has it or something already exists at that name.
45185
+ `PLAN_REQUIRED`: the organization's plan has no Galascribe address.
45186
+ `NOT_CONFIGURED`: Galascribe addresses are not set up on this deployment.
45187
+ `ALREADY_HAS_DOMAIN`: the site already has a domain that is not detached.
45188
+ `hostname` is the full address when the label is well formed.
45189
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsCheckGalascribeAddress
45190
+ parameters:
45191
+ - $ref: "#/components/parameters/XCorrelationId"
45192
+ - example: 018f0000-0000-7000-8000-000000000001
45193
+ in: path
45194
+ name: organizationId
45195
+ required: true
45196
+ schema:
45197
+ format: uuid
45198
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
45199
+ type: string
45200
+ - example: 018f0000-0000-7000-8000-000000000001
45201
+ in: path
45202
+ name: publicationId
45203
+ required: true
45204
+ schema:
45205
+ format: uuid
45206
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
45207
+ type: string
45208
+ - $ref: "#/components/parameters/XCsrfToken"
45209
+ requestBody:
45210
+ content:
45211
+ application/json:
45212
+ examples:
45213
+ nominal:
45214
+ summary: Nominal valid request
45215
+ value:
45216
+ label: maya
45217
+ schema:
45218
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsCheckGalascribeAddressRequest"
45219
+ required: true
45220
+ responses:
45221
+ "200":
45222
+ content:
45223
+ application/json:
45224
+ examples:
45225
+ nominal:
45226
+ summary: Nominal successful response
45227
+ value:
45228
+ available: true
45229
+ hostname: maya.galascribe.com
45230
+ label: maya
45231
+ schema:
45232
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsCheckGalascribeAddressResponse"
45233
+ description: check a Galascribe address succeeded
45234
+ headers:
45235
+ Cache-Control:
45236
+ $ref: "#/components/headers/CacheControlNoStore"
45237
+ X-Correlation-Id:
45238
+ $ref: "#/components/headers/XCorrelationId"
45239
+ "400":
45240
+ $ref: "#/components/responses/RequestInvalid"
45241
+ "401":
45242
+ content:
45243
+ application/problem+json:
45244
+ examples:
45245
+ AUTHENTICATION_REQUIRED:
45246
+ summary: AUTHENTICATION_REQUIRED
45247
+ value:
45248
+ code: AUTHENTICATION_REQUIRED
45249
+ correlationId: 018f0000-0000-7000-8000-000000000001
45250
+ detail: See the operation contract.
45251
+ errors: []
45252
+ retryable: false
45253
+ schemaId: urn:gala:schema:problem:2.0.0
45254
+ schemaVersion: 2.0.0
45255
+ status: 401
45256
+ title: AUTHENTICATION_REQUIRED
45257
+ type: urn:gala:problem:authentication-required
45258
+ schema:
45259
+ $ref: "#/components/schemas/Problem"
45260
+ description: AUTHENTICATION_REQUIRED
45261
+ headers:
45262
+ Cache-Control:
45263
+ $ref: "#/components/headers/CacheControlNoStore"
45264
+ X-Correlation-Id:
45265
+ $ref: "#/components/headers/XCorrelationId"
45266
+ x-gala-problem-codes:
45267
+ - AUTHENTICATION_REQUIRED
45268
+ "403":
45269
+ $ref: "#/components/responses/AuthorizationDenied"
45270
+ "404":
45271
+ $ref: "#/components/responses/ResourceNotFound"
45272
+ security:
45273
+ - browserSession: []
45274
+ summary: check a Galascribe address
45275
+ tags:
45276
+ - domains
45277
+ x-gala-activation-gate: MVP
45278
+ x-gala-activation-guards:
45279
+ - NONE
45280
+ x-gala-capability-key: publication.settings.manage
45281
+ x-gala-concurrency: none
45282
+ x-gala-conditional-capabilities: []
45283
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
45284
+ x-gala-nullability: required-and-nullable-are-explicit
45285
+ x-gala-purpose: check a Galascribe address
45286
+ x-gala-reachable-problems:
45287
+ - AUTHENTICATION_REQUIRED
45288
+ - AUTHORIZATION_DENIED
45289
+ - REQUEST_FIELD_UNKNOWN
45290
+ - RESOURCE_NOT_FOUND
45291
+ - VALIDATION_FAILED
45292
+ x-gala-replay-identity: safe-query
45293
+ x-gala-state-guards:
45294
+ - NONE
45295
+ x-gala-success-category: protocol
45296
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
45297
+ /v2/organizations/{organizationId}/publications/{publicationId}/domains:claim-galascribe-address:
45298
+ post:
45299
+ description: |
45300
+ Needs `publication.settings.manage`. Makes `label.galascribe.com` this
45301
+ site's custom domain. Galascribe owns the DNS records, so the returned
45302
+ `DomainBinding` carries `galascribeManaged` and the person is never asked
45303
+ to add records; the binding then follows the usual domain steps (Pages
45304
+ domain, certificate, base move). `409 PLAN_REQUIRED` when the plan has no
45305
+ Galascribe address; `409 INVALID_SOURCE_STATE` when the site already has a
45306
+ domain that is not detached; `422 VALIDATION_FAILED` pointed at `/label`
45307
+ when the label is `INVALID`, `RESERVED` or `TAKEN` (the reasons of the check
45308
+ read, which tells a client which one); `503 CAPABILITY_UNAVAILABLE` when
45309
+ Galascribe addresses are not configured.
45310
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsClaimGalascribeAddress
45311
+ parameters:
45312
+ - $ref: "#/components/parameters/XCorrelationId"
45313
+ - example: 018f0000-0000-7000-8000-000000000001
45314
+ in: path
45315
+ name: organizationId
45316
+ required: true
45317
+ schema:
45318
+ format: uuid
45319
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
45320
+ type: string
45321
+ - example: 018f0000-0000-7000-8000-000000000001
45322
+ in: path
45323
+ name: publicationId
45324
+ required: true
45325
+ schema:
45326
+ format: uuid
45327
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
45328
+ type: string
45329
+ - $ref: "#/components/parameters/IdempotencyKey"
45330
+ - $ref: "#/components/parameters/XCsrfToken"
45331
+ requestBody:
45332
+ content:
45333
+ application/json:
45334
+ examples:
45335
+ nominal:
45336
+ summary: Nominal valid request
45337
+ value:
45338
+ label: maya
45339
+ schema:
45340
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsClaimGalascribeAddressRequest"
45341
+ required: true
45342
+ responses:
45343
+ "201":
45344
+ content:
45345
+ application/json:
45346
+ examples:
45347
+ nominal:
45348
+ summary: Nominal successful response
45349
+ value:
45350
+ canonicalBase:
45351
+ current: https://rathnastest.github.io/g11/
45352
+ published: false
45353
+ target: https://maya.galascribe.com/
45354
+ certificate:
45355
+ state: NONE
45356
+ createdAt: "2026-11-02T09:00:00.000Z"
45357
+ dns:
45358
+ observed:
45359
+ addresses: []
45360
+ pointsToGithub: false
45361
+ resolves: false
45362
+ records: []
45363
+ domainId: 018f0000-0000-7000-8000-000000000001
45364
+ galascribeManaged:
45365
+ kind: GALASCRIBE_ADDRESS
45366
+ hostname: maya.galascribe.com
45367
+ kind: SUBDOMAIN
45368
+ nextStep:
45369
+ code: WAIT_FOR_DNS
45370
+ detail: Galascribe is setting this up.
45371
+ routing:
45372
+ httpsEnforced: false
45373
+ probeOk: false
45374
+ servedByPages: false
45375
+ state: OWNERSHIP_PENDING
45376
+ updatedAt: "2026-11-02T09:00:00.000Z"
45377
+ version: 0
45378
+ schema:
45379
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdDomainsClaimGalascribeAddressResponse"
45380
+ description: claim a Galascribe address succeeded
45381
+ headers:
45382
+ Cache-Control:
45383
+ $ref: "#/components/headers/CacheControlNoStore"
45384
+ Location:
45385
+ $ref: "#/components/headers/Location"
45386
+ X-Correlation-Id:
45387
+ $ref: "#/components/headers/XCorrelationId"
45388
+ "400":
45389
+ $ref: "#/components/responses/RequestInvalid"
45390
+ "401":
45391
+ content:
45392
+ application/problem+json:
45393
+ examples:
45394
+ AUTHENTICATION_REQUIRED:
45395
+ summary: AUTHENTICATION_REQUIRED
45396
+ value:
45397
+ code: AUTHENTICATION_REQUIRED
45398
+ correlationId: 018f0000-0000-7000-8000-000000000001
45399
+ detail: See the operation contract.
45400
+ errors: []
45401
+ retryable: false
45402
+ schemaId: urn:gala:schema:problem:2.0.0
45403
+ schemaVersion: 2.0.0
45404
+ status: 401
45405
+ title: AUTHENTICATION_REQUIRED
45406
+ type: urn:gala:problem:authentication-required
45407
+ schema:
45408
+ $ref: "#/components/schemas/Problem"
45409
+ description: AUTHENTICATION_REQUIRED
45410
+ headers:
45411
+ Cache-Control:
45412
+ $ref: "#/components/headers/CacheControlNoStore"
45413
+ X-Correlation-Id:
45414
+ $ref: "#/components/headers/XCorrelationId"
45415
+ x-gala-problem-codes:
45416
+ - AUTHENTICATION_REQUIRED
45417
+ "403":
45418
+ $ref: "#/components/responses/AuthorizationDenied"
45419
+ "404":
45420
+ $ref: "#/components/responses/ResourceNotFound"
45421
+ "409":
45422
+ content:
45423
+ application/problem+json:
45424
+ examples:
45425
+ COMMAND_REPLAY_CONFLICT:
45426
+ summary: COMMAND_REPLAY_CONFLICT
45427
+ value:
45428
+ code: COMMAND_REPLAY_CONFLICT
45429
+ correlationId: 018f0000-0000-7000-8000-000000000001
45430
+ detail: See the operation contract.
45431
+ errors: []
45432
+ retryable: false
45433
+ schemaId: urn:gala:schema:problem:2.0.0
45434
+ schemaVersion: 2.0.0
45435
+ status: 409
45436
+ title: COMMAND_REPLAY_CONFLICT
45437
+ type: urn:gala:problem:command-replay-conflict
45438
+ INVALID_SOURCE_STATE:
45439
+ summary: INVALID_SOURCE_STATE
45440
+ value:
45441
+ code: INVALID_SOURCE_STATE
45442
+ correlationId: 018f0000-0000-7000-8000-000000000001
45443
+ detail: See the operation contract.
45444
+ errors: []
45445
+ retryable: false
45446
+ schemaId: urn:gala:schema:problem:2.0.0
45447
+ schemaVersion: 2.0.0
45448
+ status: 409
45449
+ title: INVALID_SOURCE_STATE
45450
+ type: urn:gala:problem:invalid-source-state
45451
+ PLAN_REQUIRED:
45452
+ summary: PLAN_REQUIRED
45453
+ value:
45454
+ code: PLAN_REQUIRED
45455
+ correlationId: 018f0000-0000-7000-8000-000000000001
45456
+ detail: The organization's plan does not include a Galascribe address. See the operation contract.
45457
+ errors: []
45458
+ retryable: false
45459
+ schemaId: urn:gala:schema:problem:2.0.0
45460
+ schemaVersion: 2.0.0
45461
+ status: 409
45462
+ title: PLAN_REQUIRED
45463
+ type: urn:gala:problem:plan-required
45464
+ schema:
45465
+ $ref: "#/components/schemas/Problem"
45466
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE, PLAN_REQUIRED
45467
+ headers:
45468
+ Cache-Control:
45469
+ $ref: "#/components/headers/CacheControlNoStore"
45470
+ X-Correlation-Id:
45471
+ $ref: "#/components/headers/XCorrelationId"
45472
+ x-gala-problem-codes:
45473
+ - COMMAND_REPLAY_CONFLICT
45474
+ - INVALID_SOURCE_STATE
45475
+ - PLAN_REQUIRED
45476
+ "422":
45477
+ content:
45478
+ application/problem+json:
45479
+ examples:
45480
+ VALIDATION_FAILED:
45481
+ summary: VALIDATION_FAILED
45482
+ value:
45483
+ code: VALIDATION_FAILED
45484
+ correlationId: 018f0000-0000-7000-8000-000000000001
45485
+ detail: That address is reserved. Choose another. See the operation contract.
45486
+ errors: []
45487
+ retryable: false
45488
+ schemaId: urn:gala:schema:problem:2.0.0
45489
+ schemaVersion: 2.0.0
45490
+ status: 422
45491
+ title: VALIDATION_FAILED
45492
+ type: urn:gala:problem:validation-failed
45493
+ schema:
45494
+ $ref: "#/components/schemas/Problem"
45495
+ description: VALIDATION_FAILED
45496
+ headers:
45497
+ Cache-Control:
45498
+ $ref: "#/components/headers/CacheControlNoStore"
45499
+ X-Correlation-Id:
45500
+ $ref: "#/components/headers/XCorrelationId"
45501
+ x-gala-problem-codes:
45502
+ - VALIDATION_FAILED
45503
+ "503":
45504
+ content:
45505
+ application/problem+json:
45506
+ examples:
45507
+ CAPABILITY_UNAVAILABLE:
45508
+ summary: CAPABILITY_UNAVAILABLE
45509
+ value:
45510
+ code: CAPABILITY_UNAVAILABLE
45511
+ correlationId: 018f0000-0000-7000-8000-000000000001
45512
+ detail: See the operation contract.
45513
+ errors: []
45514
+ retryable: false
45515
+ schemaId: urn:gala:schema:problem:2.0.0
45516
+ schemaVersion: 2.0.0
45517
+ status: 503
45518
+ title: CAPABILITY_UNAVAILABLE
45519
+ type: urn:gala:problem:capability-unavailable
45520
+ schema:
45521
+ $ref: "#/components/schemas/Problem"
45522
+ description: CAPABILITY_UNAVAILABLE
45523
+ headers:
45524
+ Cache-Control:
45525
+ $ref: "#/components/headers/CacheControlNoStore"
45526
+ X-Correlation-Id:
45527
+ $ref: "#/components/headers/XCorrelationId"
45528
+ x-gala-problem-codes:
45529
+ - CAPABILITY_UNAVAILABLE
45530
+ security:
45531
+ - browserSession: []
45532
+ summary: claim a Galascribe address
45533
+ tags:
45534
+ - domains
45535
+ x-gala-activation-gate: MVP
45536
+ x-gala-activation-guards:
45537
+ - GALASCRIBE_ADDRESS_ZONE_CONFIGURED
45538
+ x-gala-capability-key: publication.settings.manage
45539
+ x-gala-concurrency: binding-epoch
45540
+ x-gala-conditional-capabilities: []
45541
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
45542
+ x-gala-nullability: required-and-nullable-are-explicit
45543
+ x-gala-purpose: claim a Galascribe address
45544
+ x-gala-reachable-problems:
45545
+ - AUTHENTICATION_REQUIRED
45546
+ - AUTHORIZATION_DENIED
45547
+ - CAPABILITY_UNAVAILABLE
45548
+ - COMMAND_REPLAY_CONFLICT
45549
+ - INVALID_SOURCE_STATE
45550
+ - PLAN_REQUIRED
45551
+ - REQUEST_FIELD_UNKNOWN
45552
+ - RESOURCE_NOT_FOUND
45553
+ - VALIDATION_FAILED
45554
+ x-gala-replay-identity: idempotency-key
45555
+ x-gala-state-guards:
45556
+ - PublicationDomain:NONE -> OWNERSHIP_PENDING
45557
+ x-gala-success-category: create
45558
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
42415
45559
  /v2/organizations/{organizationId}/publications/{publicationId}/followers:
42416
45560
  get:
42417
45561
  description: Needs `publication.audience.read`. `total` is every follow of the site, `authors` the count per author, and `items` the followers newest first as display names, one keyset page at a time. There is no public follower count; this list is for the site's owners and admins.
@@ -55252,6 +58396,199 @@ paths:
55252
58396
  - NONE
55253
58397
  x-gala-success-category: query
55254
58398
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
58399
+ /v2/organizations/{organizationId}/publications/{publicationId}/site/hosting-check:
58400
+ get:
58401
+ description: |
58402
+ Needs `publication.view`. What the site's repository contains that GitHub
58403
+ Pages limits or does not allow, as a `SiteHostingCheck`, computed for the
58404
+ default branch's current commit (`revision`) from the repository's file
58405
+ tree and a bounded scan of its pages. It is advice and never blocks
58406
+ publishing: a `LIMIT` finding is something GitHub will refuse or stop
58407
+ serving, a `WARNING` is a risk. `offers` is empty when there is no
58408
+ finding, `UPGRADE` on the Free plan and `REQUEST_GALASCRIBE_HOSTING` on a
58409
+ paid plan. The response carries a strong `ETag` and honours
58410
+ `If-None-Match` with `304` and no body; `Cache-Control` is `private,
58411
+ no-cache`, so a browser stores the body and revalidates it on every use.
58412
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdSiteHostingCheck
58413
+ parameters:
58414
+ - $ref: "#/components/parameters/XCorrelationId"
58415
+ - example: 018f0000-0000-7000-8000-000000000001
58416
+ in: path
58417
+ name: organizationId
58418
+ required: true
58419
+ schema:
58420
+ format: uuid
58421
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
58422
+ type: string
58423
+ - example: 018f0000-0000-7000-8000-000000000001
58424
+ in: path
58425
+ name: publicationId
58426
+ required: true
58427
+ schema:
58428
+ format: uuid
58429
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
58430
+ type: string
58431
+ - description: A previously returned `ETag`; a match answers `304`.
58432
+ example: '"1"'
58433
+ in: header
58434
+ name: If-None-Match
58435
+ required: false
58436
+ schema:
58437
+ maxLength: 256
58438
+ type: string
58439
+ responses:
58440
+ "200":
58441
+ content:
58442
+ application/json:
58443
+ examples:
58444
+ nominal:
58445
+ summary: Nominal successful response
58446
+ value:
58447
+ checkedAt: "2026-11-02T09:00:00.000Z"
58448
+ findings:
58449
+ - bytes: 62914560
58450
+ code: LARGE_FILE
58451
+ items:
58452
+ - bytes: 62914560
58453
+ path: media/launch-tour.mp4
58454
+ limitBytes: 52428800
58455
+ pathCount: 1
58456
+ severity: WARNING
58457
+ - code: COMMERCE_PAGE
58458
+ items:
58459
+ - path: pages/shop.md
58460
+ title: Shop
58461
+ pathCount: 1
58462
+ severity: WARNING
58463
+ signals:
58464
+ - CHECKOUT_LINK
58465
+ - SHOP_WORDS
58466
+ host: GITHUB_PAGES
58467
+ limits:
58468
+ directoryEntries: 3000
58469
+ fileMaxBytes: 104857600
58470
+ fileWarningBytes: 52428800
58471
+ mediaWarningBytes: 524288000
58472
+ siteBytes: 1073741824
58473
+ offers:
58474
+ - UPGRADE
58475
+ planTier: FREE
58476
+ revision: sha1:0000000000000000000000000000000000000000
58477
+ totals:
58478
+ files: 142
58479
+ mediaBytes: 83886080
58480
+ mediaFiles: 12
58481
+ siteBytes: 125829120
58482
+ schema:
58483
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteHostingCheckResponse"
58484
+ description: read a site's hosting check succeeded
58485
+ headers:
58486
+ Cache-Control:
58487
+ $ref: "#/components/headers/CacheControlPrivateNoCache"
58488
+ ETag:
58489
+ description: Strong validator of this response body.
58490
+ required: true
58491
+ schema:
58492
+ maxLength: 256
58493
+ type: string
58494
+ X-Correlation-Id:
58495
+ $ref: "#/components/headers/XCorrelationId"
58496
+ "304":
58497
+ description: the caller's `If-None-Match` still matches; no body
58498
+ headers:
58499
+ ETag:
58500
+ description: Strong validator of this response body.
58501
+ required: true
58502
+ schema:
58503
+ maxLength: 256
58504
+ type: string
58505
+ X-Correlation-Id:
58506
+ $ref: "#/components/headers/XCorrelationId"
58507
+ "400":
58508
+ $ref: "#/components/responses/ValidationFailed"
58509
+ "401":
58510
+ content:
58511
+ application/problem+json:
58512
+ examples:
58513
+ AUTHENTICATION_REQUIRED:
58514
+ summary: AUTHENTICATION_REQUIRED
58515
+ value:
58516
+ code: AUTHENTICATION_REQUIRED
58517
+ correlationId: 018f0000-0000-7000-8000-000000000001
58518
+ detail: See the operation contract.
58519
+ errors: []
58520
+ retryable: false
58521
+ schemaId: urn:gala:schema:problem:2.0.0
58522
+ schemaVersion: 2.0.0
58523
+ status: 401
58524
+ title: AUTHENTICATION_REQUIRED
58525
+ type: urn:gala:problem:authentication-required
58526
+ schema:
58527
+ $ref: "#/components/schemas/Problem"
58528
+ description: AUTHENTICATION_REQUIRED
58529
+ headers:
58530
+ Cache-Control:
58531
+ $ref: "#/components/headers/CacheControlNoStore"
58532
+ X-Correlation-Id:
58533
+ $ref: "#/components/headers/XCorrelationId"
58534
+ x-gala-problem-codes:
58535
+ - AUTHENTICATION_REQUIRED
58536
+ "403":
58537
+ $ref: "#/components/responses/AuthorizationDenied"
58538
+ "404":
58539
+ $ref: "#/components/responses/ResourceNotFound"
58540
+ "503":
58541
+ content:
58542
+ application/problem+json:
58543
+ examples:
58544
+ DEPENDENCY_UNAVAILABLE:
58545
+ summary: DEPENDENCY_UNAVAILABLE
58546
+ value:
58547
+ code: DEPENDENCY_UNAVAILABLE
58548
+ correlationId: 018f0000-0000-7000-8000-000000000001
58549
+ detail: See the operation contract.
58550
+ errors: []
58551
+ retryable: true
58552
+ schemaId: urn:gala:schema:problem:2.0.0
58553
+ schemaVersion: 2.0.0
58554
+ status: 503
58555
+ title: DEPENDENCY_UNAVAILABLE
58556
+ type: urn:gala:problem:dependency-unavailable
58557
+ schema:
58558
+ $ref: "#/components/schemas/Problem"
58559
+ description: DEPENDENCY_UNAVAILABLE
58560
+ headers:
58561
+ Cache-Control:
58562
+ $ref: "#/components/headers/CacheControlNoStore"
58563
+ X-Correlation-Id:
58564
+ $ref: "#/components/headers/XCorrelationId"
58565
+ x-gala-problem-codes:
58566
+ - DEPENDENCY_UNAVAILABLE
58567
+ security:
58568
+ - browserSession: []
58569
+ summary: read a site's hosting check
58570
+ tags:
58571
+ - organizations
58572
+ x-gala-activation-gate: MVP
58573
+ x-gala-activation-guards:
58574
+ - NONE
58575
+ x-gala-capability-key: publication.view
58576
+ x-gala-concurrency: authorization-and-publication-epochs
58577
+ x-gala-conditional-capabilities: []
58578
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
58579
+ x-gala-nullability: required-and-nullable-are-explicit
58580
+ x-gala-purpose: read a site's hosting check
58581
+ x-gala-reachable-problems:
58582
+ - AUTHENTICATION_REQUIRED
58583
+ - AUTHORIZATION_DENIED
58584
+ - DEPENDENCY_UNAVAILABLE
58585
+ - RESOURCE_NOT_FOUND
58586
+ - VALIDATION_FAILED
58587
+ x-gala-replay-identity: safe-query
58588
+ x-gala-state-guards:
58589
+ - NONE
58590
+ x-gala-success-category: query
58591
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
55255
58592
  /v2/organizations/{organizationId}/publications/{publicationId}/site:publish-update:
55256
58593
  post:
55257
58594
  description: |
@@ -59415,6 +62752,168 @@ paths:
59415
62752
  - NONE
59416
62753
  x-gala-success-category: update
59417
62754
  x-gala-tenant-scope: NONE
62755
+ /v2/platform/assistance-requests:
62756
+ get:
62757
+ description: |
62758
+ Operators only, with recent authentication. Keyset-paged requests that
62759
+ authors made for help with their sites, newest first. `state` limits the
62760
+ list to `OPEN` or `CLOSED` requests. Each item names the organization and
62761
+ site, the GitHub login that asked and the optional note.
62762
+ operationId: getPlatformAssistanceRequests
62763
+ parameters:
62764
+ - $ref: "#/components/parameters/XCorrelationId"
62765
+ - description: Which requests to list. Absent lists both.
62766
+ example: OPEN
62767
+ in: query
62768
+ name: state
62769
+ required: false
62770
+ schema:
62771
+ enum:
62772
+ - OPEN
62773
+ - CLOSED
62774
+ type: string
62775
+ - $ref: "#/components/parameters/Cursor"
62776
+ - $ref: "#/components/parameters/Limit"
62777
+ responses:
62778
+ "200":
62779
+ content:
62780
+ application/json:
62781
+ examples:
62782
+ nominal:
62783
+ summary: Nominal successful response
62784
+ value:
62785
+ hasMore: false
62786
+ items:
62787
+ - createdAt: "2026-11-02T09:00:00.000Z"
62788
+ findingCodes:
62789
+ - LARGE_FILE
62790
+ kind: GALASCRIBE_HOSTING
62791
+ note: The tour video is 60 MB.
62792
+ organizationId: 018f0000-0000-7000-8000-000000000001
62793
+ organizationName: Maya Studio
62794
+ publicationId: 018f0000-0000-7000-8000-000000000001
62795
+ publicationName: Maya Writes
62796
+ requestId: 018f0000-0000-7000-8000-000000000001
62797
+ requestedByLogin: maya
62798
+ state: OPEN
62799
+ schema:
62800
+ $ref: "#/components/schemas/GetPlatformAssistanceRequestsResponse"
62801
+ description: list assistance requests succeeded
62802
+ headers:
62803
+ Cache-Control:
62804
+ $ref: "#/components/headers/CacheControlNoStore"
62805
+ X-Correlation-Id:
62806
+ $ref: "#/components/headers/XCorrelationId"
62807
+ "400":
62808
+ $ref: "#/components/responses/ValidationFailed"
62809
+ "401":
62810
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
62811
+ "403":
62812
+ $ref: "#/components/responses/AuthorizationDenied"
62813
+ security:
62814
+ - browserSession: []
62815
+ summary: list assistance requests
62816
+ tags:
62817
+ - platform
62818
+ x-gala-activation-gate: MVP
62819
+ x-gala-activation-guards:
62820
+ - NONE
62821
+ x-gala-capability-key: platform.users.view
62822
+ x-gala-concurrency: none
62823
+ x-gala-conditional-capabilities: []
62824
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
62825
+ x-gala-nullability: required-and-nullable-are-explicit
62826
+ x-gala-purpose: list assistance requests
62827
+ x-gala-reachable-problems:
62828
+ - AUTHENTICATION_REQUIRED
62829
+ - AUTHORIZATION_DENIED
62830
+ - REAUTH_REQUIRED
62831
+ - VALIDATION_FAILED
62832
+ x-gala-replay-identity: safe-query
62833
+ x-gala-state-guards:
62834
+ - NONE
62835
+ x-gala-success-category: query
62836
+ x-gala-tenant-scope: NONE
62837
+ /v2/platform/assistance-requests/{requestId}:close:
62838
+ post:
62839
+ description: |
62840
+ Operators only, with recent authentication. Marks the request `CLOSED`
62841
+ once the operator has done the work, and returns it. Closing a request that
62842
+ is already closed returns it unchanged.
62843
+ operationId: postPlatformAssistanceRequestsByRequestIdClose
62844
+ parameters:
62845
+ - $ref: "#/components/parameters/XCorrelationId"
62846
+ - example: 018f0000-0000-7000-8000-000000000001
62847
+ in: path
62848
+ name: requestId
62849
+ required: true
62850
+ schema:
62851
+ format: uuid
62852
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
62853
+ type: string
62854
+ - $ref: "#/components/parameters/XCsrfToken"
62855
+ responses:
62856
+ "200":
62857
+ content:
62858
+ application/json:
62859
+ examples:
62860
+ nominal:
62861
+ summary: Nominal successful response
62862
+ value:
62863
+ closedAt: "2026-11-02T09:00:00.000Z"
62864
+ createdAt: "2026-11-02T09:00:00.000Z"
62865
+ findingCodes:
62866
+ - LARGE_FILE
62867
+ kind: GALASCRIBE_HOSTING
62868
+ note: The tour video is 60 MB.
62869
+ organizationId: 018f0000-0000-7000-8000-000000000001
62870
+ organizationName: Maya Studio
62871
+ publicationId: 018f0000-0000-7000-8000-000000000001
62872
+ publicationName: Maya Writes
62873
+ requestId: 018f0000-0000-7000-8000-000000000001
62874
+ requestedByLogin: maya
62875
+ state: CLOSED
62876
+ schema:
62877
+ $ref: "#/components/schemas/PostPlatformAssistanceRequestsByRequestIdCloseResponse"
62878
+ description: close an assistance request succeeded
62879
+ headers:
62880
+ Cache-Control:
62881
+ $ref: "#/components/headers/CacheControlNoStore"
62882
+ X-Correlation-Id:
62883
+ $ref: "#/components/headers/XCorrelationId"
62884
+ "400":
62885
+ $ref: "#/components/responses/ValidationFailed"
62886
+ "401":
62887
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
62888
+ "403":
62889
+ $ref: "#/components/responses/AuthorizationDenied"
62890
+ "404":
62891
+ $ref: "#/components/responses/ResourceNotFound"
62892
+ security:
62893
+ - browserSession: []
62894
+ summary: close an assistance request
62895
+ tags:
62896
+ - platform
62897
+ x-gala-activation-gate: MVP
62898
+ x-gala-activation-guards:
62899
+ - NONE
62900
+ x-gala-capability-key: platform.users.contact
62901
+ x-gala-concurrency: none
62902
+ x-gala-conditional-capabilities: []
62903
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
62904
+ x-gala-nullability: required-and-nullable-are-explicit
62905
+ x-gala-purpose: close an assistance request
62906
+ x-gala-reachable-problems:
62907
+ - AUTHENTICATION_REQUIRED
62908
+ - AUTHORIZATION_DENIED
62909
+ - REAUTH_REQUIRED
62910
+ - RESOURCE_NOT_FOUND
62911
+ - VALIDATION_FAILED
62912
+ x-gala-replay-identity: natural-idempotent-state
62913
+ x-gala-state-guards:
62914
+ - NONE
62915
+ x-gala-success-category: protocol
62916
+ x-gala-tenant-scope: NONE
59418
62917
  /v2/platform/audit-events:
59419
62918
  get:
59420
62919
  description: |
@@ -60894,7 +64393,9 @@ paths:
60894
64393
  its sites may turn on Listen, the audio version of posts). Defaults of
60895
64394
  the first release: FREE 50 and no contact form, PRO 500 and a contact
60896
64395
  form, BUSINESS 2000 and a contact form. Listen defaults: FREE no, PRO
60897
- and BUSINESS yes.
64396
+ and BUSINESS yes. `collaboratorLimit` (SCHEMA-3.30.0) is the most
64397
+ collaborators an organization on the plan may have, 0 meaning no limit:
64398
+ FREE 1, PRO and BUSINESS no limit.
60898
64399
  operationId: getPlatformPlans
60899
64400
  parameters:
60900
64401
  - $ref: "#/components/parameters/XCorrelationId"
@@ -60908,17 +64409,20 @@ paths:
60908
64409
  value:
60909
64410
  effectiveAt: "2026-10-10T00:00:04.000Z"
60910
64411
  items:
60911
- - contactForm: false
64412
+ - collaboratorLimit: 1
64413
+ contactForm: false
60912
64414
  listen: false
60913
64415
  newsletterSubscriberLimit: 50
60914
64416
  planKey: FREE
60915
64417
  publicationLimit: 1
60916
- - contactForm: true
64418
+ - collaboratorLimit: 0
64419
+ contactForm: true
60917
64420
  listen: true
60918
64421
  newsletterSubscriberLimit: 500
60919
64422
  planKey: PRO
60920
64423
  publicationLimit: 10
60921
- - contactForm: true
64424
+ - collaboratorLimit: 0
64425
+ contactForm: true
60922
64426
  listen: true
60923
64427
  newsletterSubscriberLimit: 2000
60924
64428
  planKey: BUSINESS
@@ -60968,8 +64472,8 @@ paths:
60968
64472
  Operators only, with recent authentication. Atomically replaces the
60969
64473
  complete publication-capacity release, changing the named plan's limits
60970
64474
  while retaining the other two, at the release version in `If-Match`.
60971
- `newsletterSubscriberLimit`, `contactForm` and `listen` are optional:
60972
- absent keeps the plan's current value. The invariant FREE <= PRO <=
64475
+ `newsletterSubscriberLimit`, `contactForm`, `listen` and
64476
+ `collaboratorLimit` are optional: absent keeps the plan's current value. The invariant FREE <= PRO <=
60973
64477
  BUSINESS is enforced on `publicationLimit` only. `reason` is a
60974
64478
  non-sensitive operator reason code recorded in the audit event.
60975
64479
  operationId: putPlatformPlansByPlanKey
@@ -61006,17 +64510,20 @@ paths:
61006
64510
  value:
61007
64511
  effectiveAt: "2026-10-10T12:00:00.000Z"
61008
64512
  items:
61009
- - contactForm: false
64513
+ - collaboratorLimit: 1
64514
+ contactForm: false
61010
64515
  listen: false
61011
64516
  newsletterSubscriberLimit: 50
61012
64517
  planKey: FREE
61013
64518
  publicationLimit: 1
61014
- - contactForm: true
64519
+ - collaboratorLimit: 0
64520
+ contactForm: true
61015
64521
  listen: true
61016
64522
  newsletterSubscriberLimit: 500
61017
64523
  planKey: PRO
61018
64524
  publicationLimit: 12
61019
- - contactForm: true
64525
+ - collaboratorLimit: 0
64526
+ contactForm: true
61020
64527
  listen: true
61021
64528
  newsletterSubscriberLimit: 2000
61022
64529
  planKey: BUSINESS